Feature #190
進行中實作 YOLOv11 訓練腳本並完成兩次訓練迭代
100%
概述
開發 train.py 訓練腳本,支援命令列參數設定(epochs, batch, device, name)。
第一次 Baseline 訓練(預設參數)取得 mAP50=0.445;分析問題後進行第二次優化訓練(freeze=10, lr0=0.001, mixup=0.3, copy_paste=0.3, degrees=15.0),mAP50 提升至 0.786(+76.6%),Recall 從 0.240 提升至 0.619(+157.9%)。保存兩次訓練的模型權重與完整結果。
SC 是由 Sashiba Chou 於 1 天 前更新
h2. 背景
本專案使用 YOLOv11 Nano( @yolo11n.pt@ ,約 2.6M 參數)作為基礎模型,在僅有 33
張喉鏡影像的極小資料集上,透過遷移學習進行微調。由於資料量極少,訓練策略的設計是決定模型效能的關鍵因素。
h2. 實作內容
h3. 1. 訓練腳本 train.py
- 支援命令列參數: @--model@ , @--epochs@ , @--imgsz@ , @--batch@ , @--device@ , @--name@
- 內建小資料集優化參數(凍結 Backbone、低學習率、多種資料增強)
- 訓練結束後自動執行驗證並輸出 mAP50 / mAP50-95
- 自動儲存訓練過程的曲線圖、混淆矩陣、PR 曲線等視覺化圖表
h3. 2. 第一次訓練(Baseline)— runs/detect/vocal_cord/
使用 YOLO 預設超參數建立基線,觀察模型在此資料集上的學習行為:
- 參數:epochs=100, batch=16, patience=20, lr0=0.01, 不凍結 Backbone, 無額外增強
- 模型在第 38 epoch 被早停終止
- 結果:mAP50=0.445, Precision=0.700, Recall=0.240
- 發現問題:
** Recall 僅 0.240(漏掉 76% 的目標)
** Epoch 20→30 Recall 從 0.794 驟降至 0.264,訓練嚴重震盪
** 學習率 0.01 過高,預訓練特徵被破壞
** 26 張訓練圖缺乏增強,過擬合嚴重
h3. 3. 問題診斷與優化策略
|. 診斷問題 |. 優化策略 |_. 具體調整 |
| 預訓練特徵被全層更新覆寫 | 凍結 Backbone | freeze: 無 → 10 |
| 學習率過高導致訓練震盪 | 降低學習率 | lr0: 0.01 → 0.001(降低 10 倍) |
| 資料太少導致過擬合 | 大幅強化資料增強 | mixup=0.3, copy_paste=0.3, degrees=15.0, flipud=0.2 |
| 收斂時間不足 | 延長訓練與早停容忍 | epochs: 100→300, patience: 20→50 |
| 梯度更新過於粗糙 | 減小 batch size | batch: 16→8(每 epoch 從 2 步增為 ~4 步) |
h3. 4. 第二次訓練(優化版)— runs/detect/vocal_cord_v2/
套用全部優化策略後重新訓練:
- 參數:epochs=300, batch=8, patience=50, lr0=0.001, freeze=10, augment=true, mosaic=1.0, mixup=0.3, copy_paste=0.3, degrees=15.0, scale=0.5,
fliplr=0.5, flipud=0.2 - 模型在第 195 epoch 被早停終止,最佳表現出現在第 147 epoch
- 學習曲線四個階段:
** Epoch 1-25:初始學習,mAP50 從 0.01 升至 0.30(凍結 Backbone,慢但穩定)
** Epoch 25-75:快速提升,mAP50 從 0.30 升至 0.58
** Epoch 75-147:穩定優化,mAP50 從 0.58 緩慢爬升至 0.786(最佳)
** Epoch 147-195:過擬合跡象,指標開始下降,觸發早停 - 最終結果:mAP50=0.786, mAP50-95=0.423, Precision=0.900, Recall=0.619
h3. 5. 兩次訓練成果對比
|. 指標 |. Baseline |. 優化版 |. 提升 |
| mAP50 | 0.445 | 0.786 | +76.6% |
| mAP50-95 | 0.239 | 0.423 | +77.0% |
| Precision | 0.700 | 0.900 | +28.6% |
| Recall | 0.240 | 0.619 | +157.9% |
| 訓練時間 | ~497 秒 | ~2,376 秒 | — |
h3. 6. 輸出成品
- @runs/detect/vocal_cord/weights/best.pt@ :Baseline 最佳模型
- @runs/detect/vocal_cord_v2/weights/best.pt@ :優化版最佳模型(5.3MB,正式模型)
- 每次訓練包含完整視覺化:results.png, confusion_matrix.png, BoxPR_curve.png, BoxF1_curve.png, val_batch0_pred.jpg 等