📢 公告:OpenCV 系列文章重構完成(75%)。專案實作篇仍在製作中,完成時間未定,敬請期待!→ 查看文章索引

Like Share Discussion Bookmark Smile

J.J. Huang   2026-04-09   Python OpenCV 07.物件偵測與辨識篇   瀏覽次數:次   DMCA.com Protection Status

Python | OpenCV YOLOv8 訓練進階設定

📚 前言

在上一篇 YOLOv8 模型訓練 中,我們完成了基本的訓練流程設定。

但「能訓練」和「訓練得好」是兩回事。

這一篇將介紹兩個非常重要的進階主題:

  • 資料增強:讓模型看到更多變化,幫助它學得更好
  • 防止過擬合:避免模型死背訓練資料,真正具備泛化能力

掌握這些設定後,你的模型訓練效果會明顯提升。

💻 內建資料增強設定

YOLOv8 在訓練時內建了豐富的資料增強,預設已自動啟用,不需要額外撰寫增強程式碼。
一般情況下預設值已夠用,不需要動。但以下幾種情況可能需要調整:

  • 資料集很小(< 100 張):可以加強增強強度,讓模型看到更多變化,減少過擬合
  • 物件方向固定(如俯視圖):可以關閉 fliplrflipud,避免產生現實中不存在的翻轉角度
  • 室內固定光源場景hsv_shsv_v 可以調低,不需要大幅模擬色彩變化
  • 訓練結果不穩定或 mAP 很低:可以嘗試設 mosaic=0.0,有時過強的增強反而干擾學習

可透過參數調整增強強度:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# augmentation_params.py
import torch
from ultralytics import YOLO

model = YOLO("yolov8n.pt")

model.train(
data="data.yaml",
epochs=100,
device=0 if torch.cuda.is_available() else "cpu",
# 幾何增強
fliplr=0.5, # 水平翻轉機率(預設 0.5)
flipud=0.0, # 垂直翻轉機率(預設 0.0,通常不需要)
degrees=0.0, # 旋轉角度範圍 ±degrees
translate=0.1, # 平移比例
scale=0.5, # 縮放範圍(0.5 表示 0.5x ~ 1.5x)
shear=0.0, # 剪切角度
perspective=0.0, # 透視變換
# 色彩增強
hsv_h=0.015, # 色相抖動
hsv_s=0.7, # 飽和度抖動
hsv_v=0.4, # 明度抖動
# 進階增強
mosaic=1.0, # Mosaic 增強(將 4 張圖拼成 1 張,1.0 = 100% 啟用)
mixup=0.0, # MixUp 增強機率
copy_paste=0.0, # Copy-Paste 增強機率
)

💡 Mosaic 增強是 YOLO 的招牌技術,將 4 張圖片拼接在一起,讓模型學習更多背景多樣性,對偵測小物件特別有效。

💻 防止過擬合設定

過擬合是指模型在訓練集表現很好,但在驗證集表現變差。

YOLOv8 提供了以下常見防過擬合機制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# anti_overfit_example.py
import torch
from ultralytics import YOLO

model = YOLO("yolov8n.pt")

model.train(
data="data.yaml",
epochs=150,
imgsz=640,
batch=16,
device=0 if torch.cuda.is_available() else "cpu",

# === 防過擬合核心參數 ===
patience=30, # 連續 30 個 epoch 驗證指標沒改善就自動停止(Early Stopping)
weight_decay=0.0005, # L2 正規化,防止權重過大
dropout=0.0, # Dropout(過擬合嚴重時可試 0.1 ~ 0.3)

# 其他常用設定
lr0=0.01, # 初始學習率
lrf=0.01, # 最終學習率比例
)

💡 如何判斷是否過擬合、怎麼讀懂訓練曲線,將在 YOLOv8 訓練結果分析 中完整說明。

💻 完整訓練範例

整合基本參數、資料增強與防過擬合設定:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# train_full.py
import time
import torch
from ultralytics import YOLO

print(f"使用裝置:{'GPU - ' + torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'CPU'}")

model = YOLO("yolov8s.pt")

start = time.time()

model.train(
data="data.yaml",
epochs=120,
imgsz=640,
batch=16,
device=0 if torch.cuda.is_available() else "cpu",
workers=0, # Windows 必須設 0
name="custom_detector",

# 防過擬合
patience=30,
weight_decay=0.0005,

# 資料增強
mosaic=1.0,
fliplr=0.5,
hsv_h=0.015,
hsv_s=0.7,
hsv_v=0.4,

# 其他實用設定
save_period=10, # 每 10 個 epoch 存一次
plots=True, # 產生訓練曲線圖
verbose=True
)

elapsed = time.time() - start
print(f"訓練完成,總耗時:{elapsed // 3600:.0f}{elapsed % 3600 // 60:.0f}{elapsed % 60:.0f} 秒")
print("最佳模型:runs/detect/custom_detector/weights/best.pt")


圖:完整訓練範例,整合資料增強、Early Stopping、定期儲存等設定並輸出最佳模型路徑

⚠️ 注意事項

  • patience 不要設太小:YOLOv8 訓練初期的 mAP 可能波動較大,patience=10 可能會太早停止。建議至少設 20~30。
  • 增強設定需配合資料集特性:並非增強越強越好,過強的增強(例如對方向固定的物件開啟翻轉)反而會讓模型學到錯誤的模式。
  • 先用小 epochs 測試:正式訓練前,建議先用 epochs=10 跑一次,確認參數設定合理後再調高。

🎯 結語

資料增強與防過擬合是讓模型從「能跑」進化到「訓練得好」的關鍵設定。
適當調整這些參數,能讓你的模型在資料量有限的情況下,仍然獲得不錯的泛化能力。
下一步是 YOLOv8 訓練結果分析,學習如何看懂訓練過程產生的各種圖表與指標,判斷模型是否真的學好了。

📖 如在學習過程中遇到疑問,或是想了解更多相關主題,建議回顧一下 Python | OpenCV 系列導讀,掌握完整的章節目錄,方便快速找到你需要的內容。

註:以上參考了
Ultralytics YOLOv8 官方文件 — Train
Ultralytics YOLOv8 官方文件 — Configuration
Ultralytics YOLOv8 官方文件 — Augmentation