🚜 堆高機 PPE(安全帽 / 背心)三鏡頭 audit

2026-06-05 · 鏡頭:TC-1-102 / 頻道4-倉庫進料區 / 頻道5-倉庫大門口 · 模型:factory_ppe_v20260603 · cvat2 #12

📌 一句話結論

堆高機場域判斷不準的根因不在模型、不在資料管線(已查證:export 沒 polygon bug、23/24 task 都進了 v603 訓練),而在標註的分布:① 安全帽「有戴」樣本太少且場域難(堆高機駕駛坐姿是分布外)→ 漏報;② 背心在頻道4/頻道5 大量沒標(unknown)且沒有「沒穿」樣本,模型學不到判別界線。先補標(尤其頻道4/5 的背心)+ 推廣 not_visible 值,再 per-site 微調。

1. cvat 標註值定義(4 種)

意義訓練處理
yes有(戴帽 / 穿背心)正樣本
no負樣本
not_visible有看過但無法識別(太遠/遮擋/糊)— 新加應 mask 不算 loss
unknown沒標記(cvat 預設值,標註者沒碰)mask 不算 loss

⚠️ not_visible 目前全 0——這個新值標註團隊還沒開始用。建議把「太遠/糊看不出」的人改標 not_visible(現在這些多半是 unknown 或被勉強標 yes/no,兩者都會污染訓練/評估)。

2. 排查過程(含一個已排除的誤判)

排查時一度懷疑「polygon 標註被 export 丟掉」,查證後排除export_p12bbox_of() 正確處理 polygon(外接 bbox),三鏡頭 23/24 task 都進了 v603 訓練。polygon 佔全 #12 的 30% 但全部正確進訓練。→ 問題在標註分布,不在資料管線。

3. 模型在三鏡頭實測(hard_hat)

cvat GT person bbox → factory_ppe_v603 推論 → 比對。注意:safety_vest 因小框被 eval skip、不足採信,請看下方「標註分布」

鏡頭hard_hat 有效樣本APPrecisionRecallFP / FN
TC-1-1024720.930.960.687 / 73
頻道4-進料區3381.001.000.840 / 5
頻道5-大門口6600.990.970.882 / 9

AP 不差(0.93~1.0),但固定門檻 recall 偏低,TC-1-102 漏 32% 戴帽者。原因見下方 FN 案例。

4. 漏報長什麼樣(FN 案例)

🪖 TC-1-102 安全帽漏報(戴帽駕駛被判沒戴)

一排堆高機駕駛坐姿,戴著黃色安全帽卻被判 no(信心 0.25)。crop 含大量方向盤/駕駛艙背景。→ 「坐姿駕駛 + 側面 + 駕駛艙」是訓練集罕見構圖(通用樣本多是站姿正面行人),分布外 → 漏報。

5. ⭐ 標註分布(per-task 明細)

格式:yes / no / not_visible / unknown(未標)。可訓 = yes+no。

task鏡頭subsetsizehard_hatsafety_vest
4963TC-1-102Train57429/95/0/130/137/0/0
4965TC-1-102Val1072180/176/0/540/410/0/0
5171/5172/5173TC-1-102Tr/Val16×347/0/0/047/0/0/0
2823頻道4-進料區Val910/0/0/610/0/0/61
4864頻道4-進料區Train10600/228/0/610/0/0/289
4868頻道4-進料區(空)2350/0/0/00/0/0/0
4875頻道4-進料區Test7060/24/0/800/0/0/104
4903頻道4-進料區Train910/54/0/90/0/0/63
5160/5161頻道4-進料區Tr/Val16×232/0/0/032/0/0/0
2824/2825頻道5-大門口Train64/950/0/0/3060/0/0/306
4860頻道5-大門口Train2840/401/0/10/0/0/402
4866頻道5-大門口Train1780/0/0/320/0/0/32
4870頻道5-大門口Train1560/28/0/550/0/0/83
4886頻道5-大門口Train2730/95/0/2120/0/0/307
4901頻道5-大門口Val1750/98/0/1450/0/0/243
5162/5163頻道5-大門口Tr/Val16×232/0/0/032/0/0/0
5177/5178/5179頻道5-大門口Tr/Val16×344/0/0/200/0/0/64

各鏡頭彙總

鏡頭hard_hat(Y/N/未標)safety_vest(Y/N/未標)safety_vest 狀況
TC-1-102256 / 271 / 6747 / 547 / 0✅ 標註完整、有負樣本
頻道4-進料區32 / 306 / 21132 / 0 / 517🔴 缺 no + 海量未標
頻道5-大門口76 / 622 / 77132 / 0 / 1437🔴 缺 no + 海量未標

6. 結構性問題(修正版)

  1. 🟠 hard_hat 三鏡頭都有 yes/no,但頻道4/5「有戴」樣本少(32/76)+ 駕駛坐姿難 → recall 低。TC-1-102 樣本最足但 recall 仍 0.68,是構圖難(駕駛坐姿)非樣本量。
  2. 🔴 背心:頻道4 / 頻道5 沒有任何「沒穿」標註,且 517 / 1437 個 person 完全沒標(unknown)。這兩鏡頭背心無法學、無法評。(TC-1-102 背心其實標得完整,有 547 個 no,不缺。)
  3. 🟡 not_visible 全 0:太遠/糊的人現在被標 unknown 或勉強標 yes/no,污染資料。應改用 not_visible。
  4. 🟠 Test split 殘缺:只有頻道4 有 Test(且 hard_hat 全 no、vest 全未標),其餘無獨立 Test → 難正規驗證。

7. 建議行動(順序很重要)

優先缺口具體 task / 動作
P0頻道4/5 背心海量未標補標 #4864/#4875/#4886/#4901/#4860 等的 safety_vest(共 ~2700 個 person 待標)
P0頻道4/5 背心無負樣本補標時務必涵蓋「沒穿背心」的人(搬運工/訪客)
P1not_visible 沒人用太遠/遮擋/糊看不出的人改標 not_visible(全場域適用,不只這三鏡頭)
P1hard_hat 頻道4/5「有戴」少補標更多戴帽 frame,尤其駕駛坐姿
P1Test split 缺每鏡頭切獨立 Test(時序分割禁 hash)
P2駕駛坐姿分布外補標後 v603 base + 該場域 oversample 微調

💡 給團隊討論的決策點

  1. 背心補標範圍:頻道4/5 有 ~2700 person 沒標 vest,要不要全補?至少 Test 集要完整 + 涵蓋「沒穿」。
  2. not_visible 啟用:要不要正式啟用這個值 + 給標註團隊「什麼情況標 not_visible」的準則?(影響全場域資料品質)
  3. 場域驗收門檻:每鏡頭設 hard_hat / safety_vest 的 recall 目標(如 ≥0.9)作為微調驗收。

資料來源:cvat2 #12 全 789 task 掃描 + factory_ppe_v20260603 推論。eval 工具 5090-2 eval_3cam.py / dist_detail.py 可複現。本版已修正前一版 safety_vest 統計錯誤(TC-1-102 實際有完整負樣本)。