🔬 16h 自主準度研究 — 5 主力模型(2026-06-10)
12:38–04:38 CST · 5090-2 雙卡 · 全程同 test 集對照 · 產物全留本機未部署(operator 決定上版)
TL;DR — 四個模型有可上版候選,一個(safety_rope)結論是「主槓桿在上游」:
- 🚪 door_state:
512aug 單模 mAP 0.9929(vs v608 0.9817, +0.011),閾值校準同時修好 — 最乾淨的勝利
- 👷 PPE:v608 退步真因 = patience 16→8 + 稀有 attr run-variance。三模 ensemble mAP 0.9633(vs v605 +0.004)且無 attr 崩盤
- 🔥 fire_smoke:hard-neg 重訓乾淨負樣本 smoke FP −36%(AP 持平);另發現測試集 smoke FP 帳面數字 56-60% 是標註缺漏
- 👤 person:yolo26m@1280 截斷訓練已超 26s 全程(val 0.8315 vs 0.8271)— 最終數字見 §6
- 🦺 safety_rope:classifier 端 ensemble 只有 −5% FP;證據指向 person conf≥0.4 gate(−41% 假框 / −3% TP)才是 e2e 主槓桿
🎯 0. 總表 — 上版建議(全部同 test 集對照)
| 模型 | production 基線 | 本日最佳候選 | 主指標 | Δ | 建議 | ckpt |
| door_state | v20260608 (mAP 0.9817*) | 512aug 單模 | mAP 0.9929 | +0.011 | 建議上版場域驗證 thr open 0.5 / close 0.7 | ~/factory_ppe/runs/hatch_r16h_512aug/best.pt |
| PPE 22-attr | v20260605 (mAP 0.9595) | ens(v605+p16+p16nw) | mAP 0.9633 | +0.004 | 可選3× mobilenetv3 推論成本;或維持 v605 | runs/factory_ppe_r16h_p16{,nw}/best.pt + v605 |
| fire_smoke | v20260608 (已上版) | hardneg 單模 或 ens(v608+hardneg) | smoke 乾淨FP@R90 −36% | AP 持平 | 建議上版(hardneg 單模) fire 高 recall 端略差見 §3 | ~/factory_ppe/runs/fire_smoke_r16h_hardneg/best.pt |
| person | 26s v608 (test mAP50 0.918@1280) | yolo26m@1280(截斷40ep) | test mAP50 0.9271 | +0.009 | 建議續訓全量後上版40ep 已全面超車;上版前須場域 conf 重掃(規則17) | ~/runs_new/person_yolo26m_r16h_1280/run/weights/best.pt |
| safety_rope | v20260608 (AP 0.9099) | ens(608+605+erase) | AP 0.9162 / R86 FP −5.4% | +0.006 | 不建議單獨上主槓桿在 person gate(§5) | — |
* 全文 AP 一律 sklearn average_precision_score 重算(同一份 dump、同一套程式),與各 run summary.json 內建數字可能有 ±0.005 出入;同表內數字保證可比。door_state mAP = (open+close)/2。
👷 1. PPE 22-attr — v608 退步根因 + 修復
1.1 根因鑑定(推翻「新場域 noisy」假設)
v608 (0.9413) vs v605 (0.9595) 的 −0.018 不是資料問題:
- test 集兩版 完全相同(67 task 全同);v608 manifest 僅 +110 train rows(task 5405/5450,全 safety_vest 標註)— 對退步的 4 個 attr 零新標
- 退步全集中 4 attr:sleeves −0.311 / cotton_gloves −0.087 / safety_shoes −0.044 / heartbeat −0.029;其餘 18 attr 持平或進步(hair_cover +0.063、safety_vest +0.013)
- 唯一 hyperparam diff:patience 16→8。v608 早停 ep17(best ep9),v605 跑滿 40(best ep35)
- 深層問題:稀有 attr(test pos<200:sleeves 94 / hair_cover 78 / cotton_gloves 179)val AP 逐 epoch 波動 ±0.3(v605 history: sleeves 0.46→0.96→0.64),單次 run 的稀有 attr AP 是抽籤
1.2 實驗(v608 資料、同 test 集)
| run | 變因 | mAP | sleeves | cotton_gl | hair_cover | heartbeat | safety_shoes |
| v605(基線) | — | 0.9595 | 0.910 | 0.777 | 0.819 | 0.906 | 0.924 |
| v608 | patience 8 | 0.9413 | 0.599 | 0.690 | 0.882 | 0.877 | 0.880 |
| r16h_p16 | patience 16/40ep | 0.9516 | 0.811 | 0.858 | 0.623 | 0.885 | 0.940 |
| r16h_p16nw | +negweight 弱attr | 0.9548 | 0.757 | 0.823 | 0.815 | 0.879 | 0.934 |
| ens(v605+p16+p16nw) | 3 模平均 | 0.9633 | 0.892 | 0.828 | 0.789 | 0.904 | 0.940 |
| ens(v605+v608) | 2 模平均 | 0.9530 | 0.646 | v608 sleeves 0.599 是毒丸 — ensemble 也救不动 |
| r16h_p16b | p16 同配方重跑(變因=隨機性) | 0.9377 | 0.569 | 0.858 | 0.659 | 0.823 | 0.943 |
1.3 結論 / 建議
- 立刻做:train_p9_attr 預設 patience 改回 16(一行)
- 上版選項:ens(v605+p16+p16nw) mAP 0.9633、所有 attr ≥0.79;或保守維持 v605
- 根治:sleeves/cotton_gloves/hair_cover 補標到 pos>500(目前訓練端已到 variance 天花板,單 run ±0.02 mAP 等級互比是噪音)
- variance 鐵證:p16 與 p16b 配方完全相同只差隨機性,mAP 差 0.014(sleeves 0.811 vs 0.569)→ 今後 PPE 單 run 對比 <0.015 不應做上版/退版決策;4 模 ensemble(含弱 run p16b)反而降到 0.9593 — ensemble 成員品質也要篩
🔥 2. fire_smoke — temporal 收尾判決 + 標註缺漏 + hard-neg
2.1 temporal 頭收尾(4015 test clips 同集)
| model | smoke AP | P@R90 / FP | P@R95 / FP | FP@0.5 |
| 單幀 v608 | 0.9694 | 0.950 / 84 | 0.903 / 179 | 113 |
| 單幀 v603 | 0.9584 | 0.919 / 139 | 0.863 / 265 | 145 |
| 時序頭(v602b bb) | 0.9443 | 0.877 / 223 | 0.810 / 393 | 80 |
| ens(608+時序) | 0.9636 | 0.943 / 95 | 0.893 / 201 | 72 |
| ens(608+603) | 0.9690 | 0.947 / 89 | 0.901 / 183 | 103 |
判決:temporal 路線正式關閉 — 舊版(v602b backbone)與本日重訓版(v608 backbone, val mAP 0.9553)都在固定 recall 下全面輸單幀 v608:重訓版 smoke R90 FP 153 vs 單幀 84,AP 0.9569 vs 0.9694;ens(單幀+時序) 0.9692 無增益(僅 R95 FP 179→163 邊際)。時序資訊在這個 task 上不帶來可部署的價值,後續資源不應再投入。
2.2 殘餘 FP 的真相:56–60% 是標註缺漏
v608 在 R95 工作點的 179 個 smoke FP 中 100 個(56%)其實 fire=1(thr 0.5 時 60%)。目視抽查:task 613 = 漫天濃煙的野火畫面但 smoke=0(明確標錯);task 1341 = 盆火弱煙(邊界)。
→ 建議 operator 對 fire=1 & smoke=0 的 clip 做標註 audit(task 1341/636/613/1338,約 100 clip)— 這比任何訓練手段都直接。
2.3 hard-neg 重訓(只挖 smoke=0 且 fire=0 的乾淨負樣本,1534 張 ×3 oversample)
| 視角 | model | smoke AP | R90: P / FP | R95: P / FP | FP@0.5 |
| 乾淨(排除 fire1smoke0) | v608 | 0.9837 | 0.962 / 275 | 0.937 / 493 | 323 |
| hardneg | 0.9842 | 0.975 / 176(−36%) | 0.949 / 390 | 197(−39%) |
| ens(v608+hardneg) | 0.9856 | 0.973 / 191 | 0.954 / 353 | 271 |
| 全 test(fire AP) | hardneg | 0.9750 | 0.954 / 227 | 0.898 / 570 | 776 |
| ens(v608+hardneg) | 0.9814 | 0.971 / 140 | 0.909 / 499 | 671 |
- 上版候選 A(單模、零成本):hardneg — smoke FP 大減、AP 持平;代價 fire 在 R95 高 recall 端 FP 570 vs 440
- 上版候選 B(雙模):ens(v608+hardneg) — smoke/fire 全面最佳(fire R90 FP 217→140)
- 場域 KPI 若以 smoke 誤報為主(髒鏡頭/雲),選 A 即可
- 重現性:seed2 重跑 smoke 乾淨 FP@R90 −28%(seed1 −36%)→ smoke 增益跨 seed 成立;fire 端波動較大(seed2 R90 FP 374)→ 上版用 seed1 ckpt,或 ens 抹平
🚪 3. door_state — 校準病灶 + 一次到位的修復
3.1 根因
v608 的 has_close thr=0.0008(F1 最佳化選到病態近零值)表象下是兩個問題:
- 場景級系統性誤判:close FP 81% 集中 4 task — 目視確認 1973/1972 是工地電梯井的鐵網安全閘門被看成關門(thr 0.5 時 1972 仍 28/28 全 FP);2878 是門板斜角大面占畫面(同 task 也是 has_open 最大 FN:模型把「開」看成「關」)
- close 負樣本只有 358 個且集中少數場景 → 校準被這幾個場景綁架
3.2 實驗(同 test 集, sklearn AP)
| run | 變因 | has_open AP | has_close AP | mAP | thr 校準 |
| v608 | 384 / no aug | 0.9929 | 0.9704 | 0.9817 | close 病態 0.001 |
| img512 | 512 | 0.9950 | 0.9733 | 0.9842 | 正常 (0.4/0.5) |
| aug | 384 + strong aug | 0.9703 | 0.9878 | 0.9746 | — |
| 512aug | 512 + strong aug | 0.9956 | 0.9901 | 0.9929 | 正常 (0.5/0.7, F1 0.967/0.952) |
| 512aug seed2 | 同上重跑(驗證) | 0.9918 | 0.9937 | 0.9928 | 重現 +0.011 ✓(雙 seed ens 可再到 0.9952) |
- 512aug 連鐵網 task 1973 的 close FP 都從 70/70 → 27/70(1972 的 28/28 仍在 — 結構性難例,要補同型場景訓練資料才有解)
- 免訓練備案(若不想上新模):
p_close×(1−0.3×p_open) gate, close AP +0.008
- 建議:上 512aug(25 min 可重現),場域驗證 thr open 0.5 / close 0.7;512 推論成本 vs 384 約 +75%(mobilenetv3 4.2M 仍輕)
🦺 4. safety_rope — classifier 端到頂,主槓桿在上游
4.1 同集對照(manifest_v608 test, n=5904, pos=2232)
| model | AP | P@R86 / FP | P@R90 / FP |
| v608(production) | 0.9099 | 0.825 / 408 | 0.805 / 487 |
| v605 | 0.9067 | 0.807 / 458 | 0.764 / 622 |
| r16h_erase(erase0.4 變體) | 0.8909 | 0.811 / 448 | 0.767 / 610 |
| ens(608+605+erase) | 0.9162 | 0.833 / 386(−5.4%) | 0.812 / 464(−4.7%) |
0530 研究的「ensemble FP −19%」在本 test 集重現不了(−5%),且 e2e audit 早已指出 78% FP 來自 person 假框、97% 漏報來自 person 漏框。safety_rope 準度問題的答案不在 classifier。
4.2 上游 person gate(本日量化)
- person v608 test 的 1376 個 FP box:41% conf<0.4、16% area<1500px²
- conf≥0.4 gate:砍 41% 假框、只損 3.0% TP(area gate 損 7.3% 不划算)
- FP-rate>0.4 的 rope 場景(2490: 71%、task_2575: 83%)標註模糊嫌疑 → 建議 human audit
- 建議優先序:① ppe-demo rope pipeline 加 person conf≥0.4 gate(規則17: 場域掃 0.3/0.4/0.5 驗證)② audit 模糊場景 ③ 才考慮 3 模 ensemble(−5%, 3× ViT-S 成本)
👤 5. person — 26m@1280 升級實驗
5.1 基線(26s v608, test 5984 imgs @1280, conf .001)
- test mAP50 0.918 / mAP50-95 0.788 / P 0.929 / R 0.842
- FP/FN 高度集中:t560(FN 719, 該 task R 僅 0.59)、t262(FP 325 / FN 592)、t532 — 三 task 佔 40% FP、66% FN → 補標/補訓這三個場域比換 arch 更有空間
5.2 yolo26m@1280(batch12, 40ep 排程, 23:00 截斷取 best.pt)
| model | 訓練量 | val mAP50 | test mAP50 | test mAP50-95 | test P / R |
| 26s v608 | 100 ep | 0.8271 | 0.918 | 0.788 | 0.929 / 0.842 |
| 26m r16h | 40 ep(截斷) | 0.8447 | 0.9271 | 0.927195 | 0.9305 / 0.8523 |
結論:26m@1280 僅 40ep 即全面超過 26s@100ep(mAP50 +0.009 / mAP50-95 +0.011 / R +0.010)。
per-task: conf .25 下 26m 多找回 206 人(FN 2337→2131)但 raw FP +322 — 大模型在同 conf 下更敢報,上版前必須場域 conf 重掃(規則17)。
t560 FN 719→714 幾乎不動 → 該場域是標註/可視性問題非模型容量, 補標優先。
建議:跑 26m 全量 100ep(~20h, 預期再 +0.005~0.01)後走正式上版流程;屆時 PPE/safety_rope cascade 全家受益。
注意(規則16/17):cascade 推論 imgsz 固定 1280;若換模上版,需對代表場域影片掃 conf 0.1/0.15/0.25 重驗門檻。訓練 imgsz=1280 / 推論 imgsz=1280。
📋 6. 標註問題清單(給標註團隊,比訓練更高 ROI)
| # | 資料集 | 問題 | 範圍 | 影響 |
| 1 | fire_smoke cvat #2 | 有火沒標煙(fire=1, smoke=0) | test task 1341/636/613/1338 約 100 clip;train 端未量化 | smoke 帳面 FP 高估 ~2×;hard-neg mining 會教壞模型(本日已繞開) |
| 2 | safety_rope cvat #10+8 | FP-rate>0.4 場景標註模糊 | 2490(71%)、task_2575(83%)、task_2554(62%) | 不可消除的 FP 上限 |
| 3 | door_state cvat #11 | 鐵網安全閘門場景缺訓練樣本 | test task 1972/2878 同型場景 | close 結構性 FP(512aug 也只治一半) |
| 4 | PPE cvat #12 | 稀有 attr 正樣本不足 | sleeves 94 / hair_cover 78 / cotton_gloves 179(test pos) | 單 run AP 抽籤 ±0.1~0.3, 訓練端無解 |
| 5 | person cvat #1 | t560/t262/t532 三場域 FN/FP 集中 | 66% FN 來自三 task | cascade 全家(PPE/rope)漏報上限 |
📦 模型下載(R2)
🧪 7. 方法論注記
- 所有對照 = 同一份 manifest 的 test split、同一 dump 程式、sklearn AP;跨表數字不可混比
- 實驗 ckpt 全在 5090-2 本機(
~/factory_ppe/runs/*r16h*, ~/runs_new/*r16h*),未上 R2/Pages/ppe-demo,未 push
- per-row probs dump 留在
/tmp/r16h_*.csv;分析腳本 ~/factory_ppe/scripts/r16h/;過程 log ~/runs_new/research_16h.log
- 踩坑記錄:train_fs.py 的 tag 是 --tag flag;train_hatch_v2 run dir 會加 hatch_ 前綴;yolo26m@1280 batch16 OOM(30.4G)→ batch12;tmux 開 queue session 會被回收 → setsid nohup
產出:16h 自主研究 session(Claude)· 2026-06-10 12:38 起 · 過程 log ~/runs_new/research_16h.log