2026-06-03 · 5090-2 · 凍結 v602b 單幀 backbone + Transformer 時序頭 · 已上 ppe-demo
單幀分類器看一張圖,鏡頭髒汙、靜止薄雲跟真煙特徵很近會誤報;但連續畫面下「真煙會升騰演變、髒汙/靜雲不動」一看就分得出。時序頭把單幀 backbone 的 8 幀特徵序列丟進 Transformer 學「是否演變」,當二段確認壓制靜止型誤報。
結果:靜止髒汙場景 FP 大幅壓低(task 979 單幀 max 0.913 → 時序 0.154;飯店 task 5230 0.309 → 0.003),整體 negative FP −30%。
逐幀:單幀 v602b backbone → smoke/fire prob,同時抽 1280-d feature 進 8 幀 ring buffer
觸發:單幀 smoke ≥ 0.5(會報警時才檢查,低分不動、省算力)且 buffer 滿 8 幀
確認:時序頭看 8 幀序列 → smoke_temporal
smoke_temporal < 0.10 → 判「靜止髒汙/靜雲」→ 壓制 smoke 分數
smoke_temporal ≥ 0.10 → 確認真在演變 → 保留
fire 不過時序(單幀已準、非髒汙問題);冷啟動 buffer 未滿 → fallback 單幀(寧報不漏)
切換影片 / RTSP 時 reset_tracking 清 buffer。backbone 完全複用已部署的 v602b(不換單幀模型),只外掛時序頭。
| 指標 | 時序二段確認 | 單幀 v602b | 說明 |
|---|---|---|---|
| clip-level smoke AP | 0.944 | 0.961 | 整體略輸(多數 test 是正常抽幀 in-distribution,時序無優勢) |
| negative FP @thr0.5 | 80 | 115 | 時序 −30% |
| negative FP @thr0.3 | 116 | 170 | 時序 −32% |
| task | negative clips | 時序 max smoke | 單幀 max smoke |
|---|---|---|---|
| 5230(嘉義福容飯店 玻璃反光/髒汙) | 58 | 0.003 | 0.309 |
| 979(靜止場景) | 151 | 0.154 | 0.913 ⚠️ 嚴重假陽 |
判讀:時序頭達成設計目的——把單幀會搞混的「靜止髒汙/靜雲」FP 壓死(979 單幀 0.913 → 時序 0.154)。整體 clip AP 略輸是因為多數 test 是正常抽幀、真煙緩變的 positive recall 略降。所以採「二段確認」而非取代:單幀照常偵測,只在報警時用時序確認、壓掉靜止型假陽,既保留單幀靈敏度又砍髒汙誤報。
backbone: mobilenetv3_large_100(凍結 = fire_smoke_v602b best.pt,不微調) 時序頭: CLS token + 2-layer TransformerEncoder(nhead 4, ffn 2×) + LayerNorm + Linear(1280→2) clip: 8 幀 sliding window / stride 4(變 stride 無妨,時序頭靠「是否演變」不靠固定 fps) 訓練: 36803 clips(train 30804 / val 1984 / test 4015)| epochs 25 | batch 16 | lr 3e-4 OneCycle | AdamW 推論門檻: confirm_trigger 0.5(單幀觸發)| temp_confirm_thr 0.10(時序確認) test: mAP 0.948 / smoke AP 0.936 / fire AP 0.959
已上 ppe-demo gx10,model key fire_smoke_temporal(🔥 火煙 | 時序二段確認 v20260603)。單幀 production 主力 fire_smoke(v527) / fire_smoke_v602b 不動,時序版並列供髒汙場域實測。UI histogram 會多顯示「時序確認」值。gx10-4t 待 cloudflared 恢復補。
fire_smoke_temporal_v20260603/best.pt ⬇(105 MB,時序頭;backbone 複用 v602b)