📦 模型下載https://pub-478929a98a5c440cb22c2241c0bde314.r2.dev/factory_ppe_v20260521/best.pt

👷 Factory PPE 22-attr v20260521

訓練日期 2026-05-22 · 5090-2 單卡 batch 128 · MobileNetV3-L + camaug + partial-label BCE + mixup

⭐ 大幅進步:+2.4pp val_mAP / +0.7pp test mAP

v521 修了 export_p12 pagination bug:v519 export 用 page_size=100 沒做 pagination loop,**只 fetch cvat #12 前 100 個 task**(cvat #12 現有 704 task)導致 v519 訓練 dataset 嚴重不完整。v521 加 pagination 後 fetch 全 704 task / 27,844 manifest rows,best_val_mAP 0.9741 vs v519 0.9503(+2.4pp)。

📊 核心指標

0.9741
best val_mAP
0.9575
test mAP
0.9336
test macro_f1
19
epochs (early stop)

🆚 v519 vs v521 對比

指標v519v521Δ
best_val_mAP0.95030.9741+2.4pp
test mAP0.95050.9575+0.7pp
test macro_f10.92140.9336+1.2pp
cvat #12 task fetched100(截斷 bug)704(完整)
train_time1863s (~31 min)
epochs_run19 (early stop)

🚨 v519 訓練資料 bug(v521 修復後揭露)

Bugexport_p12_v519.py line 96:

tasks = s.get(f"{CVAT2}/api/tasks",
              params={"project_id": 12, "page_size": 100, "ordering": "id"}).json()["results"]
# 只 fetch 第一頁 100 task,沒做 while next pagination loop

結果 v519 訓練實際只用 96 unique task(cvat #12 當時剛好 task < 100),manifest 123k rows 看似充足但 task 多樣性大幅缺失。隨 cvat #12 task 累積到 704(許多後加 task ID > 4000 高於 page 1),v519 重跑 export 變得越來越不完整。

v521 修復:加 while page+=1 paginated loop fetch 全部 task:

tasks, page = [], 1
while True:
    r = s.get(f"{CVAT2}/api/tasks",
              params={"project_id": 12, "page_size": 500, "page": page, "ordering": "id"}).json()
    tasks += r.get("results", [])
    if not r.get("next"): break
    page += 1

同樣 bug pattern 已寫進 SOP(一般 cvat API 都該 paginate)。

🎯 per-attribute AP(test set)

Attributev519 APv521 APΔv521 F1v521 P / R
hard_hat0.99480.9931-0.0020.9680.965 / 0.970
no_head_protection0.97440.9917+1.7pp0.9640.962 / 0.966
full_face_mask0.99340.9908-0.0030.9490.938 / 0.961
face_mask0.99010.9895-0.0010.9510.940 / 0.963
no_gloves0.99500.9991+0.4pp0.9870.990 / 0.985
cotton_gloves0.86040.8872+2.7pp0.8330.784 / 0.889
rubber_gloves0.99990.9996-0.0000.9960.993 / 1.000
no_protective_clothing0.99700.9998+0.3pp0.9970.998 / 0.996
cleanroom_suit1.00000.999700.9940.987 / 1.000
splash_proof_gown1.00001.00001.0001.000 / 1.000
safety_vest0.96370.9609-0.0030.9280.911 / 0.945
safety_shoes0.95990.8022-15.8pp0.7770.651 / 0.963
no_safety_shoes0.86530.9997+13.4pp0.9940.998 / 0.990
no_sleeves0.95050.9998+4.9pp0.9930.991 / 0.994
heartbeat0.88190.9014+2.0pp0.8580.839 / 0.878
sleeves0.71210.8041+9.2pp0.7390.872 / 0.641
safety_glasses0.96590.9628-0.0030.9010.928 / 0.876
hair_cover0.92120.8872-3.4pp0.9280.875 / 0.987
helmet_goggles0.98620.9972+1.1pp0.9780.990 / 0.965
harness0.92540.9236-0.0020.8550.874 / 0.838
fall0.97390.9755+0.0020.9500.936 / 0.964
aluminized_apron1.00001.00001.0001.000 / 1.000

🔍 解讀 per-attr 差異

📂 Dataset

Splitv519v521Δ
total rows123,907~28,000 (修 bug 後)不同採樣 + 9 個新 RAI/JUJIA/IRODA task
cvat #12 tasks fetched100704 (修 pagination)

注:v521 manifest 行數較少是因 v521 重新從修好的 cvat #12 fetch(task 完整但部分 task subset 為空被 export 跳過);v519 看似 123k rows 是用舊 task 一直 frame×person 累加,但 task 多樣性不足。

📦 模型下載

factory_ppe_v20260521/best.pt ⬇ · 17 MB

⚙️ Hyperparams(完全沿用 v519 baseline)

backbone: mobilenetv3_large_100.ra_in1k (4.23M params)
img_size: 384×192
batch: 128, epochs: 40, patience: 8, lr: 3e-4, wd: 0.01
aug: camaug, mixup: 0.2

attr_neg_weight: {harness: 2.0, hard_hat: 1.3, safety_vest: 1.3, 其餘: 1.0}

22 attrs(21 原 + aluminized_apron)
partial-label BCE,unknown → mask=0 不算 loss

# Export 修了 pagination bug,現在 fetch cvat #12 全 704 task
manifest: /home/ubuntu/factory_ppe/crops_v521/manifest_v521.csv

← 訓練報告目錄 · 前版 v20260519 · 訓練 SOP