🦺 Safety Rope v20260502 — Ablation 比較報告

RoI Align mobilenetv3-large cvat2 project 8 + 10 jitter v2 augment 訓練日期:2026-05-02 | 5090-2 GPU1 batch 16-32 | epochs 40 (early stop)

📊 主要結論

Best AP (Test)
0.890
Best F1 (Test)
0.843
Best Precision
0.831
Best Recall
0.876
結論v20260502_p10_hd(1280×720 + 外擴)為本次冠軍,已上線 ppe-demo 主版。 HD 較 640 提升 4.5 pp AP;外擴消融顯示外擴貢獻 +1.2 pp AP 與 +4 pp Precision(FP 從 395 降到 293)。

📋 5 路對比(Test 集 4560 person rows)

模型全圖外擴 (X / Y_top / Y_bot)APF1PR備註
v20260502_p10640×6401.0 / 0.2 / 1.5 0.84500.81620.7500.895 640 × 640,外擴 1.0/0.2/1.5
v20260502_p10_hd1280×7201.0 / 0.2 / 1.5 0.88980.84260.8310.854 1280 × 720,外擴 1.0/0.2/1.5
v20260502_p10_hd_noexp1280×7200.0 / 0.0 / 0.0 0.87760.83050.7900.876 1280 × 720,不外擴 0/0/0
CLIP zero-shot — per-person crop 0.67340.6613 0.6030.732 不訓練、CLIP ViT-B/16 + 多 prompt 集成
CLIP zero-shot — 全圖紅框指認 0.53230.5859 0.4480.846 同上,但餵全圖 + 紅框

📈 訓練曲線(3 個 RoI Align 變體對照)

🎯 為什麼外擴重要?

RoI Align 不是「全圖看完 → 分類」,是「從 backbone feature map 嚴格按 ROI 範圍 pool cells」。 mobilenetv3 stride 16 → 1280×720 圖產出 80×45 feature grid,每個 cell 雖有大 receptive field,但 pooling 階段嚴格依 person bbox 範圍取對應 cells,bbox 外的 cells 不會進到分類 head。

繩子的關鍵視覺證據常在 person bbox 外

本次 ablation 證實: 即便 mobilenetv3 receptive field 大、不外擴版仍能拿到部分 context(test AP 0.878),但 外擴版精準度高 4 pp(Precision 0.831 vs 0.790),FP 從 395 降到 293,這在實務通報場景至關重要。

🤖 CLIP Zero-shot 結果

測試 CLIP ViT-B/16 不經訓練、直接用 prompt 推論的效果(4 條 positive prompt + 4 條 negative 集成):

意義:CLIP zero-shot 距 fine-tuned mobilenetv3 還有 0.22 AP gap,無法直接取代。但作為 prompt-aware 模型路徑(給「點」即可), 真正可行需 CLIP image encoder + RoI Align + 重訓 head 或走 SAM-style prompt encoder(未來實驗)。

🔁 推論 Pipeline(Cascade)

1Person YOLO11n v20260501:偵測畫面所有 person 取 bbox
2Bbox 外擴:x ±1.0×W、y_top -0.2×H、y_bot +1.5×H
3整圖 resize 到 1280×720 過 mobilenetv3 backbone 產 feature map
4RoI Align 從 feature map 上 pool 出 expanded bbox 範圍 → MLP 二分類
5輸出 safety_rope_correct 機率(≥ thr 0.459 視為正確使用)

🚀 模型用法

import torch
from ultralytics import YOLO

# load
ckpt = torch.load("safety_rope_v20260502_p10_hd.pt", map_location="cuda", weights_only=False)
img_w, img_h = ckpt["img_size"]   # (1280, 720)
expand = (ckpt["expand_x"], ckpt["expand_y_top"], ckpt["expand_y_bot"])  # (1.0, 0.2, 1.5)
thr = ckpt["thr"]   # 0.459

# 詳細 cascade 邏輯參見 model_viewer/app.py SafetyRopeHandler

📦 R2 公開下載

🔬 線上比較

ppe-demo 同時上線 3 版 safety_rope,可即時切換比對: