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

Like Share Discussion Bookmark Smile

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

Python | OpenCV YOLOv8 常見問題 Q&A

📚 前言

在上一篇 YOLOv8 推論與匯出 中,我們完成了整個 YOLOv8 自訓練物件偵測的流程。

走完一遍之後,往往會冒出很多實際操作上的問題。本篇整理成 Q&A 格式,針對最常見的問題逐一解答。

📋 目錄

增加類別

資料集

訓練

效果診斷

標註與模型資源

❓ Q1:已訓練好 cat/dog 模型,想新增 fish 類別,可以只訓練 fish 的資料直接加進去嗎?

A:不行,因為模型的輸出格式在訓練時就已固定,沒辦法事後加欄位。

可以把它想成一張印好的表格:cat/dog 模型只有「2 個類別欄位」,要新增 fish 就得改成「3 個類別欄位」——整張表要重印,沒辦法在旁邊貼一欄上去。

面對這個情況,有兩種策略:

策略 是否需要舊資料 推論速度 適用場景
遷移學習 Fine-tuning(推薦) 需要全部 快(單模型) 有舊資料、追求精準
獨立模型 + 合併推論 只需新類別 慢(多模型) 舊資料遺失、模組化需求

❓ Q2:Fine-tuning 時,只放 fish 的資料就好了嗎?

A:不行,模型會「忘掉」cat 和 dog。

這個現象叫做災難性遺忘(Catastrophic Forgetting):模型只看 fish 資料時,原本辨識 cat/dog 的記憶會被覆蓋,訓練完就只認識 fish 了。

Fine-tuning 時,資料集必須同時包含 cat、dog、fish 三個類別的圖片。

❓ Q3:遷移學習 Fine-tuning 的做法?

步驟:

  1. 準備 fish 的圖片與標籤
  2. 把 cat/dog 原有資料與 fish 資料合併
  3. 更新 data.yaml類別順序不能改(cat=0, dog=1 維持不動)
  4. best.pt 繼續訓練
1
2
3
4
5
6
7
# data_v2.yaml
path: .
train: train_v2.txt # cat + dog + fish 的訓練圖片路徑
val: val_v2.txt # cat + dog + fish 的驗證圖片路徑

nc: 3
names: ['cat', 'dog', 'fish'] # 舊順序不能改!新類別接在後面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# finetune_add_class.py
from ultralytics import YOLO

# 類別數改變時,偵測頭會自動重建;主幹(Backbone)特徵保留
model = YOLO("runs/detect/custom_detector/weights/best.pt")

model.train(
data="data_v2.yaml",
epochs=100,
imgsz=640,
batch=16,
name="custom_detector_v2",
lr0=0.001, # 遷移學習建議用較小的起始學習率
lrf=0.01,
patience=20,
)

❓ Q4:原本的 cat/dog 訓練資料遺失了怎麼辦?

A:改用「獨立模型 + 合併推論」,只需準備新類別的資料。

先單獨訓練一個 fish 模型:

1
2
3
4
5
6
7
8
9
10
11
# train_fish.py
from ultralytics import YOLO

model = YOLO("yolov8n.pt")
model.train(
data="data_fish.yaml", # nc: 1, names: ['fish']
epochs=100,
imgsz=640,
batch=16,
name="fish_detector",
)

推論時兩個模型各跑一次,手動合併結果:

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
# inference_merged.py
from ultralytics import YOLO
import cv2

model_cat_dog = YOLO("runs/detect/custom_detector/weights/best.pt") # cat=0, dog=1
model_fish = YOLO("runs/detect/fish_detector/weights/best.pt") # fish=0

CLASS_NAMES = ["cat", "dog", "fish"]

img = cv2.imread("assets/test.jpg")
detections = []

for box in model_cat_dog(img, conf=0.5, verbose=False)[0].boxes:
cls_id = int(box.cls) # 0=cat, 1=dog,不需偏移
detections.append((cls_id, float(box.conf), list(map(int, box.xyxy[0]))))

for box in model_fish(img, conf=0.5, verbose=False)[0].boxes:
cls_id = int(box.cls) + 2 # fish=0 → 合併表中為 2
detections.append((cls_id, float(box.conf), list(map(int, box.xyxy[0]))))

for cls_id, conf, (x1, y1, x2, y2) in detections:
label = f"{CLASS_NAMES[cls_id]}: {conf:.2f}"
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.putText(img, label, (x1, y1 - 8),
cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
print(label)

cv2.imwrite("output/result_merged.jpg", img)
print("已儲存到 output/result_merged.jpg")

❓ Q5:一個類別訓練一個模型,好不好?

A:可行,但長期維護成本高,不建議作為主力做法。

面向 獨立模型 合併模型(Fine-tuning)
新增類別 只需訓練新類別 需要全部資料重訓
推論速度 慢(N 個模型各跑一次) 快(單次推論)
記憶體用量 高(同時載入多個模型)
class index 管理 需手動對齊 自動處理

❓ Q6:每個類別需要幾張圖?有最低門檻嗎?

A:沒有硬性規定,但有個參考範圍。

資料量 效果
< 50 張 容易過擬合,難以泛化
100~300 張 最低門檻,類別簡單時勉強夠用
300~500 張 效果開始穩定
1000 張以上 大多數場景都能有不錯表現

💡 比張數更重要的是「多樣性」:不同場景、不同光線、不同角度各拍 100 張,效果通常優於同一場景拍 1000 張。

❓ Q7:訓練集和驗證集的比例怎麼分?

A:常用 8:2,資料量少時可用 7:3。

資料總量 建議比例
< 500 張 7:3
500~2000 張 8:2(最常用)
> 2000 張 9:1

⚠️ 驗證集的分布要和訓練集相似,不能把所有「困難」的圖全放進驗證集,否則驗證指標會失真。

❓ Q8:圖片一定要先 resize 成 640×640 嗎?

A:不需要,YOLOv8 訓練時會自動處理。

原始圖片可以是任意解析度,框架會自動縮放並補黑邊(letterbox)維持長寬比。若圖片中有很小的目標,可以提高 imgsz=1280 保留更多細節,但訓練速度會變慢。

❓ Q9:資料增強需要自己處理嗎?YOLOv8 有內建嗎?

A:不需要,YOLOv8 訓練時預設開啟多種增強。

增強方式 說明
Mosaic 把 4 張圖拼在一起,增加場景複雜度
隨機縮放、平移、裁切 讓模型看到不同大小和位置的目標
水平翻轉 預設開啟
HSV 色彩抖動 隨機調整色調、飽和度、亮度
Copy-paste 把物件複製貼到其他圖片上

一般不需要自己處理,若想調整強度,可修改訓練參數中的 mosaicflipudfliplr 等。

❓ Q10:訓練到一半中斷了(停電、當機),可以繼續接著訓練嗎?

A:可以,用 resume=True 從中斷點繼續。

1
2
3
4
5
6
# resume_training.py
from ultralytics import YOLO

# 用 last.pt(不是 best.pt),記錄了目前訓練進度
model = YOLO("runs/detect/custom_detector/weights/last.pt")
model.train(resume=True)

💡 resume=True 會自動恢復所有訓練設定,不需要重新指定 epochs 或其他參數。

❓ Q11:沒有顯卡,用 CPU 訓練可以嗎?速度差多少?

A:可以執行,但速度非常慢。

  • CPU 比 GPU 慢 10~50 倍
  • 資料量少(100 張以下)勉強可接受
  • 資料量較大時,建議改用 Google Colab(免費 T4 GPU)

❓ Q12:yolov8n / yolov8s / yolov8m / yolov8l / yolov8x,要選哪個?

A:依速度和精準度的需求取捨。

模型 推論速度 精準度 實際案例
yolov8n 最快 最低 智慧門鈴偵測人臉、無人機即時避障
yolov8s 普通 手機 App 掃描商品、樹莓派動作偵測
yolov8m 中等 良好 安全監控客流分析、遊戲畫面人物/物品/怪物偵測
yolov8l 工廠生產線瑕疵檢測、倉庫自動盤點
yolov8x 最慢 最高 衛星影像分析、醫療影像輔助診斷

遊戲畫面偵測落在 yolov8s~yolov8m 之間:

  • 動作 RPG、FPS 等節奏快 → yolov8s(偵測必須跟上畫面)
  • 回合制、策略遊戲等節奏慢 → yolov8m(精準度更重要)

💡 建議先用 yolov8nyolov8s 跑通整個流程,再換較大的模型測試精準度是否有明顯提升。

❓ Q13:mAP 很高,但實際場景測試效果很差,為什麼?

A:通常是訓練資料和實際場景「差太多」造成的。

  • 驗證集圖片太「標準」,但實際有複雜背景、不同光線、奇怪角度
  • 模型過擬合,只記住了訓練資料的特徵
  • 實際場景的目標尺寸或角度從未出現在訓練資料中

解法:把實際場景拍攝的圖片加入訓練集。

❓ Q14:某個類別的 AP 特別低,怎麼改善?

A:先看 confusion_matrix 找出根本原因,再對症下藥。

可能原因 解法
該類別訓練資料太少 補充更多圖片
和其他類別外觀相似,常被誤認 補充更多對比性樣本
標籤品質差(框標歪、標錯) 重新檢查並修正標籤
該類別在畫面中通常很小 參考 Q16

❓ Q15:同一個物件被框了好幾個框(重複偵測),怎麼解決?

A:調低 iou 閾值,讓過濾更積極。

iou 是兩個框的重疊程度(0 = 完全不重疊,1 = 完全重疊)。預設 iou=0.7 表示「重疊超過 70% 才算重複並過濾」。若重複框明顯,往下調讓過濾條件更寬鬆:

1
2
3
4
5
6
7
8
9
10
11
12
# inference_nms.py
from ultralytics import YOLO

model = YOLO("runs/detect/custom_detector/weights/best.pt")

# iou 調低 → 過濾更積極,重複框減少
results = model("assets/test.jpg", conf=0.5, iou=0.45)

for box in results[0].boxes:
cls_id = int(box.cls)
conf = float(box.conf)
print(f"{model.names[cls_id]}: {conf:.2f}")

⚠️ 物件本身密集(如人群、排列貨物)時,不要調太低,否則會漏掉真實物件。

❓ Q16:小物件偵測效果很差,怎麼辦?

A:有幾個方向可以嘗試。

方法 說明
提高 imgsz 640 → 1280,保留更多細節(訓練更慢、更吃記憶體)
降低 conf 閾值 小物件信心度通常較低,試試 conf=0.3
補充小物件樣本 訓練集裡沒有小目標的圖,模型根本沒學過怎麼偵測
切片推論(SAHI) 把大圖切成小塊分別推論再合併,適合航拍、監控場景

❓ Q17:目標會因為遠近變大變小,訓練需要特別處理嗎?YOLOv8 怎麼實現的?

A:不需要,YOLOv8 天生就會同時偵測不同大小的目標。

YOLOv8 在同一次推論中,同時用三個不同的「偵測層」各自負責不同大小的目標:

偵測層 負責偵測 對應場景
細節層 小物件 遠距離目標、畫面中的小物件
中間層 中型物件 一般距離目標
全局層 大物件 近距離目標

三層同時運作,不論目標遠近大小,都有對應的層負責,不需要做任何特別處理

💡 唯一要注意:訓練資料中要有遠中近各種距離的樣本,確保三層都有學習機會。若遠距效果差,通常是遠距樣本太少,補充即可。

❓ Q18:可以用遊戲的 SPR 圖檔先訓練預標籤模型,再拿來自動標記遊戲截圖嗎?

A:可以,這是有效的兩階段標註策略。

階段 做什麼
① 訓練預標籤模型 用 SPR 圖訓練一個粗糙的偵測器
② 自動標記截圖 用預標籤模型對遊戲截圖做自動框選
③ 人工校正 用 LabelImg 檢查並修正框選結果
④ 訓練最終模型 用校正後的截圖訓練正式模型

讓預標籤更準的技巧:SPR 圖通常是透明或純色背景,可以先把 SPR 圖合成到遊戲背景截圖上再訓練,讓模型提前學會在複雜背景中辨識目標。

  • 2D 遊戲:SPR 和遊戲畫面幾乎一致,效果最好
  • 3D 遊戲:有光影和透視差異,準確率較低,但仍比從頭手標省力
  • 無論哪種,校正步驟不能省略

❓ Q19:我已經有一個訓練好的模型,可以直接用它來幫新圖片產生標籤嗎?

A:可以,而且比 Q18 的 SPR 方式更準。

讓模型對新圖片推論,把結果輸出成 YOLO 格式的 .txt 標籤檔,再用 LabelImg 校正即可。

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
# pre_label.py
from ultralytics import YOLO
import os

model = YOLO("runs/detect/custom_detector/weights/best.pt")
img_dir = "assets/new_images/"
label_dir = "assets/new_labels/"
os.makedirs(label_dir, exist_ok=True)

for img_file in os.listdir(img_dir):
if not img_file.lower().endswith((".jpg", ".png")):
continue

results = model(os.path.join(img_dir, img_file), conf=0.3) # conf 低一點,寧可多框也不漏框
result = results[0]

label_path = os.path.join(label_dir, os.path.splitext(img_file)[0] + ".txt")
with open(label_path, "w") as f:
for box in result.boxes:
cls_id = int(box.cls)
cx, cy, bw, bh = box.xywhn[0].tolist() # 歸一化的中心座標 + 寬高
f.write(f"{cls_id} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}\n")

print(f"{img_file}{len(result.boxes)} 個框 → {label_path}")

print("完成!請用 LabelImg 開啟資料夾校正。")
  • conf=0.3:寧可多框(刪框快)也不漏框(補框慢)
  • 校正完加回訓練集重新訓練,下一輪預標籤會更準,工作量越來越少(這就是 Active Learning

❓ Q20:有哪些地方可以下載別人已經訓練好的模型?遊戲的也有嗎?

A:有幾個主要平台,遊戲相關的模型在社群平台上也找得到。

平台 特色 適合找什麼
Roboflow Universe 最大的公開模型與資料集社群,可直接下載權重 遊戲偵測模型、各種自訂類別
Ultralytics Hub YOLOv8 官方平台,品質較有保障 官方範例與社群分享模型
Hugging Face 大型 AI 模型託管平台,搜尋 yolov8 各種領域的 YOLOv8 模型
GitHub 搜尋 yolov8 + 遊戲名稱(如 yolov8 minecraft 針對特定遊戲的個人專案

找遊戲模型的搜尋建議:

  • Roboflow Universe:直接搜尋遊戲名稱,如 league of legendsminecraftgenshin
  • GitHub:搜尋 yolov8 [遊戲名] detection

下載後先確認:

1
2
3
4
# 載入別人的模型,先查看它認識哪些類別
from ultralytics import YOLO
model = YOLO("下載的模型.pt")
print(model.names)

⚠️ 使用前注意:

  • 確認類別名稱:用 model.names 查看這個模型認識哪些類別
  • 確認授權條款:部分模型有使用限制,商業使用前需確認 License
  • 品質不保證:社群模型品質參差不齊,用於預標籤前建議先測幾張圖

🎯 結語

遇到問題時,通常可以先從資料下手——是否夠多、夠多樣、標籤是否正確。大多數時候,資料品質才是影響模型表現的關鍵。

下一篇進入新章節 Python | OpenCV QR Code 與 BarCode 辨識,開始 08.專案實作篇的內容。

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

註:以上參考了
Ultralytics YOLOv8 官方文件 — Train
Ultralytics YOLOv8 官方文件 — Transfer Learning
Ultralytics YOLOv8 官方文件 — Tips for Best Training Results
Catastrophic Forgetting — Wikipedia