YOLO 模型訓練基礎測驗
測驗結果
前言
在前幾篇文章中,我們學會了如何使用預訓練的 YOLO 模型進行推論,也了解了資料標註的流程。現在,是時候將這些知識結合起來,訓練一個專屬於你的 YOLO 模型了。
本篇文章將帶你走過完整的訓練流程,從啟動訓練指令到解讀訓練結果,讓你能夠獨立完成模型訓練。
訓練的基本指令
訓練 YOLO 模型只需要一行指令:
yolo train data=data.yaml model=yolov8n.pt epochs=100
讓我們拆解這個指令的每個部分:
| 參數 | 說明 | 範例值 |
|---|---|---|
data |
資料集設定檔路徑 | data.yaml |
model |
預訓練權重或模型架構 | yolov8n.pt |
epochs |
訓練週期數 | 100 |
data.yaml 的結構
這個檔案告訴 YOLO 你的資料集在哪裡:
# data.yaml
path: /path/to/dataset # 資料集根目錄
train: images/train # 訓練圖片目錄(相對於 path)
val: images/val # 驗證圖片目錄
test: images/test # 測試圖片目錄(選填)
# 類別定義
names:
0: person
1: car
2: dog
Code language: PHP (php)
當你看到這個檔案時,重點關注:
path:確認這個路徑是否正確指向你的資料集names:類別 ID 必須從 0 開始,且與標註檔案中的 ID 一致
預訓練權重:遷移學習的起點
什麼是遷移學習?
遷移學習是指利用已經在大量資料上訓練好的模型,作為你自己任務的起點。
從頭訓練 遷移學習
隨機權重 預訓練權重
| |
v v
需要 需要
大量資料 較少資料
長時間訓練 短時間微調
預訓練權重的選擇
YOLOv8 提供不同大小的預訓練模型:
# 最小最快(推薦新手開始)
yolo train model=yolov8n.pt ...
# 中等大小
yolo train model=yolov8s.pt ...
yolo train model=yolov8m.pt ...
# 最大最準(需要更多資源)
yolo train model=yolov8l.pt ...
yolo train model=yolov8x.pt ...
Code language: PHP (php)
選擇建議:
- 資料集 < 1000 張:使用
yolov8n.pt或yolov8s.pt - 資料集 1000-5000 張:使用
yolov8s.pt或yolov8m.pt - 資料集 > 5000 張:可以嘗試更大的模型
從頭訓練 vs 遷移學習
# 遷移學習:使用預訓練權重(.pt 檔案)
yolo train model=yolov8n.pt data=data.yaml
# 從頭訓練:只使用模型架構(.yaml 檔案)
yolo train model=yolov8n.yaml data=data.yaml
Code language: PHP (php)
實務上,除非你的任務非常特殊(例如醫療影像),否則幾乎都應該使用遷移學習。
重要的超參數
超參數是訓練前需要設定的參數,它們會影響訓練的效果和速度。
epochs(訓練週期)
yolo train ... epochs=100
- 意義:模型會看過整個資料集幾次
- 太少:模型還沒學好(欠擬合)
- 太多:模型記住訓練資料但無法泛化(過擬合)
- 建議起始值:100-300
batch(批次大小)
yolo train ... batch=16
- 意義:每次更新權重前,模型會看幾張圖片
- 太小:訓練不穩定,權重更新方向不準
- 太大:需要更多 GPU 記憶體
- 建議:根據 GPU 記憶體選擇(8GB GPU 約用 batch=8-16)
使用自動批次大小:
yolo train ... batch=-1 # 自動選擇最大可用 batch size
Code language: PHP (php)
imgsz(圖片尺寸)
yolo train ... imgsz=640
- 意義:訓練時將圖片縮放到的尺寸
- 較大:能偵測更小的物件,但需要更多記憶體
- 較小:訓練更快,但可能遺漏小物件
- 常見值:640(預設)、416、320
lr0(初始學習率)
yolo train ... lr0=0.01
- 意義:每次權重更新的幅度
- 太大:訓練不穩定,loss 跳動
- 太小:訓練太慢,可能卡在局部最小值
- 建議:通常不需調整,預設值經過優化
完整的訓練指令範例
yolo train \
data=my_dataset.yaml \
model=yolov8s.pt \
epochs=150 \
batch=16 \
imgsz=640 \
patience=50 \
project=runs/detect \
name=my_experiment
新增的參數說明:
patience=50:如果驗證指標 50 個 epoch 沒進步,提前停止project和name:指定訓練結果的儲存位置
訓練過程監控
當訓練開始後,你會看到類似這樣的輸出:
Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size
1/100 3.42G 1.234 2.156 1.532 142 640
2/100 3.42G 1.198 1.987 1.489 156 640
...
理解 Loss 數值
YOLO 的訓練會顯示三種 loss:
box_loss 物件框定位的損失
↓ 數值越低,框的位置越準
cls_loss 分類的損失
↓ 數值越低,類別判斷越準
dfl_loss 分佈焦點損失(YOLOv8 特有)
↓ 數值越低,框的邊界越精確
健康的訓練趨勢:
- 三種 loss 都應該逐漸下降
- 下降速度會越來越慢(這是正常的)
- 如果 loss 突然上升或劇烈震盪,可能需要調整學習率
解讀 mAP 指標
每個 epoch 結束後,YOLO 會在驗證集上計算 mAP:
Class Images Instances Box(P R mAP50 mAP50-95)
all 200 542 0.812 0.756 0.789 0.523
person 200 312 0.856 0.801 0.834 0.578
car 200 230 0.768 0.711 0.744 0.468
Code language: CSS (css)
| 指標 | 意義 | 好的數值 |
|---|---|---|
| P(Precision) | 預測為正確的準確率 | > 0.7 |
| R(Recall) | 找到所有目標的比例 | > 0.7 |
| mAP50 | IoU 50% 時的平均精度 | > 0.7 |
| mAP50-95 | 多個 IoU 閾值的平均 | > 0.5 |
mAP50-95 是最嚴格的指標,通常數值會比 mAP50 低 0.2-0.3。
驗證與測試
val 和 test 的差別
訓練集 (train)
├── 用於訓練模型
└── 模型直接從這裡學習
驗證集 (val)
├── 用於訓練中的評估
├── 影響 early stopping
└── 幫助調整超參數
測試集 (test)
├── 完全不參與訓練
├── 最後評估模型真實能力
└── 模擬實際應用場景
訓練完成後的驗證
# 使用驗證集評估
yolo val model=runs/detect/my_experiment/weights/best.pt data=data.yaml
# 使用測試集評估(如果有的話)
yolo val model=best.pt data=data.yaml split=test
Code language: PHP (php)
訓練結果解讀
訓練完成後,YOLO 會在指定目錄產生以下檔案:
runs/detect/my_experiment/
├── weights/
│ ├── best.pt # 驗證集上表現最好的權重
│ └── last.pt # 最後一個 epoch 的權重
├── results.csv # 每個 epoch 的指標
├── results.png # 訓練曲線圖
├── confusion_matrix.png # 混淆矩陣
├── F1_curve.png # F1 分數曲線
├── PR_curve.png # Precision-Recall 曲線
└── ...
Code language: PHP (php)
關鍵檔案說明
best.pt vs last.pt
best.pt → 驗證集上 mAP 最高的那個 epoch 的權重
(推薦用於部署)
last.pt → 訓練結束時的權重
(用於繼續訓練)
Code language: CSS (css)
results.png 訓練曲線
這張圖包含多個子圖,重點關注:
- Loss 曲線:應該穩定下降
- mAP 曲線:應該穩定上升
- train vs val:兩者的差距反映過擬合程度
常見問題排解
過擬合(Overfitting)
症狀:
- 訓練 loss 持續下降
- 驗證 loss 開始上升
- 驗證 mAP 不再進步
解決方法:
# 1. 減少訓練週期
yolo train ... epochs=50
# 2. 增加資料增強
yolo train ... augment=True
# 3. 使用更簡單的模型
yolo train ... model=yolov8n.pt # 改用較小的模型
# 4. 增加資料集(治本方法)
Code language: PHP (php)
欠擬合(Underfitting)
症狀:
- 訓練 loss 居高不下
- 驗證 mAP 很低
解決方法:
# 1. 增加訓練週期
yolo train ... epochs=300
# 2. 使用更大的模型
yolo train ... model=yolov8m.pt
# 3. 提高學習率(小心調整)
yolo train ... lr0=0.02
# 4. 檢查資料標註是否正確
Code language: PHP (php)
訓練不穩定
症狀:
- Loss 劇烈震盪
- 訓練過程中 mAP 忽高忽低
解決方法:
# 1. 降低學習率
yolo train ... lr0=0.001
# 2. 增加 batch size(如果記憶體允許)
yolo train ... batch=32
# 3. 使用 warmup(預設已啟用)
yolo train ... warmup_epochs=3
Code language: PHP (php)
GPU 記憶體不足
錯誤訊息:CUDA out of memory
解決方法:
# 1. 減少 batch size
yolo train ... batch=4
# 2. 減少圖片尺寸
yolo train ... imgsz=416
# 3. 使用更小的模型
yolo train ... model=yolov8n.pt
Code language: PHP (php)
繼續訓練(Resume)
如果訓練中斷,可以從上次停止的地方繼續:
yolo train resume=True model=runs/detect/my_experiment/weights/last.pt
Code language: PHP (php)
這會載入 last.pt 並繼續訓練,包括:
- 權重狀態
- 優化器狀態
- 已完成的 epoch 數
實戰檢查清單
訓練前的確認事項:
□ data.yaml 路徑是否正確
□ 類別 ID 是否從 0 開始
□ 標註檔案是否與圖片對應
□ 訓練/驗證集是否有合理分割
□ GPU 記憶體是否足夠
訓練中的觀察重點:
□ Loss 是否穩定下降
□ 驗證 mAP 是否逐步提升
□ GPU 記憶體使用是否穩定
□ 沒有 NaN 或 Inf 出現
Code language: JavaScript (javascript)
訓練後的評估:
□ 使用 best.pt 而非 last.pt
□ 在測試集上驗證最終效果
□ 查看混淆矩陣找出弱點類別
□ 視覺化幾張預測結果確認品質
Code language: CSS (css)
小結
本篇文章涵蓋了 YOLO 模型訓練的完整流程:
- 基本指令:
yolo train data=... model=... epochs=... - 遷移學習:使用
.pt預訓練權重可以大幅加速訓練 - 超參數:epochs、batch、imgsz、lr0 是最重要的參數
- 監控訓練:關注 loss 下降和 mAP 上升的趨勢
- 問題排解:過擬合、欠擬合、訓練不穩定各有對策
下一篇文章,我們將學習如何將訓練好的模型部署到實際應用中。
延伸閱讀
YOLO 模型訓練進階測驗
情境分析與問題解決能力測試
2. 超參數調整策略
yolov8m.pt 訓練了 200 個 epoch。訓練結果顯示:
- 訓練集 mAP50-95:0.82
- 驗證集 mAP50-95:0.45
- 訓練曲線:訓練 loss 持續下降,驗證 loss 從 epoch 50 後開始上升
針對這個情況,最有效的改善策略是什麼?
3. data.yaml 設定問題
path: /home/user/dataset
train: train/images
val: validation/images
names:
1: cat
2: dog
3: bird0 0.5 0.5 0.3 0.4
1 0.2 0.3 0.1 0.15最可能的問題原因是什麼?
4. 訓練策略選擇
- 資料集:3000 張高解析度圖片(4000×3000)
- 瑕疵大小:通常只占圖片的 1-3%
- 硬體:單張 RTX 3080(10GB)
- 需求:高召回率(不漏檢),推論速度次要
最合適的訓練配置是什麼?
5. 訓練指標解讀
Class Images Instances P R mAP50 mAP50-95
all 500 1200 0.85 0.72 0.79 0.52
person 500 600 0.92 0.88 0.91 0.68
car 500 400 0.88 0.75 0.82 0.55
bicycle 500 200 0.75 0.53 0.64 0.33根據這個結果,最需要優先改善的是什麼?