【YOLO 物件偵測教學】#04 訓練自己的 YOLO 模型:從零開始到完成

YOLO 模型訓練基礎測驗

1. 在 YOLO 訓練指令中,data 參數的用途是什麼?

2. 使用遷移學習(預訓練權重)相比從頭訓練的主要優勢是什麼?

3. 在訓練過程中,如果發現訓練 loss 持續下降但驗證 loss 開始上升,這表示模型發生了什麼問題?

4. 訓練完成後,部署模型時應該使用哪個權重檔案?

5. 當遇到「CUDA out of memory」錯誤時,以下哪個做法無法解決問題?

測驗結果

前言

在前幾篇文章中,我們學會了如何使用預訓練的 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.ptyolov8s.pt
  • 資料集 1000-5000 張:使用 yolov8s.ptyolov8m.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 沒進步,提前停止
  • projectname:指定訓練結果的儲存位置

訓練過程監控

當訓練開始後,你會看到類似這樣的輸出:

      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 模型訓練進階測驗

情境分析與問題解決能力測試

情境分析

1. 訓練日誌分析

你正在訓練一個 YOLO 模型,觀察到以下訓練日誌:
Epoch 1/100:  box_loss=1.52, cls_loss=2.34, mAP50=0.12
Epoch 20/100: box_loss=0.85, cls_loss=1.12, mAP50=0.58
Epoch 40/100: box_loss=0.42, cls_loss=0.65, mAP50=0.72
Epoch 60/100: box_loss=0.28, cls_loss=0.41, mAP50=0.71
Epoch 80/100: box_loss=0.15, cls_loss=0.22, mAP50=0.69
Epoch 100/100: box_loss=0.08, cls_loss=0.12, mAP50=0.65

根據這份日誌,你認為最佳的模型權重應該在哪個 epoch 附近?為什麼?

問題診斷

2. 超參數調整策略

你的資料集有 800 張圖片,使用 yolov8m.pt 訓練了 200 個 epoch。訓練結果顯示:
  • 訓練集 mAP50-95:0.82
  • 驗證集 mAP50-95:0.45
  • 訓練曲線:訓練 loss 持續下降,驗證 loss 從 epoch 50 後開始上升

針對這個情況,最有效的改善策略是什麼?

實務應用

3. data.yaml 設定問題

你設定了以下 data.yaml 檔案:
path: /home/user/dataset
train: train/images
val: validation/images

names:
  1: cat
  2: dog
  3: bird
訓練開始後,模型完全無法偵測任何物件。你的標註檔案(.txt)內容格式如下:
0 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

根據這個結果,最需要優先改善的是什麼?

測驗結果

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *