Python | OpenCV YOLOv8 常見問題 Q&A
📚 前言
在上一篇 YOLOv8 推論與匯出 中,我們完成了整個 YOLOv8 自訓練物件偵測的流程。
走完一遍之後,往往會冒出很多實際操作上的問題。本篇整理成 Q&A 格式,針對最常見的問題逐一解答。
📋 目錄
增加類別
- Q1 — 想新增類別,只訓練新類別資料可以嗎?
- Q2 — Fine-tuning 時只放新類別資料就好嗎?
- Q3 — 遷移學習 Fine-tuning 的做法?
- Q4 — 原本的訓練資料遺失了怎麼辦?
- Q5 — 一個類別訓練一個模型,好不好?
資料集
訓練
效果診斷
- Q13 — mAP 高但實際效果差,為什麼?
- Q14 — 某個類別 AP 特別低,怎麼改善?
- Q15 — 同一物件被框了好幾個框,怎麼解決?
- Q16 — 小物件偵測效果很差,怎麼辦?
- Q17 — 目標因遠近變大變小,需要特別處理嗎?
標註與模型資源
❓ 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 的做法?
步驟:
- 準備 fish 的圖片與標籤
- 把 cat/dog 原有資料與 fish 資料合併
- 更新
data.yaml,類別順序不能改(cat=0, dog=1 維持不動) - 從
best.pt繼續訓練
1 | # data_v2.yaml |
1 | # finetune_add_class.py |
❓ Q4:原本的 cat/dog 訓練資料遺失了怎麼辦?
A:改用「獨立模型 + 合併推論」,只需準備新類別的資料。
先單獨訓練一個 fish 模型:
1 | # train_fish.py |
推論時兩個模型各跑一次,手動合併結果:
1 | # inference_merged.py |
❓ 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 | 把物件複製貼到其他圖片上 |
一般不需要自己處理,若想調整強度,可修改訓練參數中的 mosaic、flipud、fliplr 等。
❓ Q10:訓練到一半中斷了(停電、當機),可以繼續接著訓練嗎?
A:可以,用 resume=True 從中斷點繼續。
1 | # resume_training.py |
💡
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(精準度更重要)
💡 建議先用
yolov8n或yolov8s跑通整個流程,再換較大的模型測試精準度是否有明顯提升。
❓ Q13:mAP 很高,但實際場景測試效果很差,為什麼?
A:通常是訓練資料和實際場景「差太多」造成的。
- 驗證集圖片太「標準」,但實際有複雜背景、不同光線、奇怪角度
- 模型過擬合,只記住了訓練資料的特徵
- 實際場景的目標尺寸或角度從未出現在訓練資料中
解法:把實際場景拍攝的圖片加入訓練集。
❓ Q14:某個類別的 AP 特別低,怎麼改善?
A:先看 confusion_matrix 找出根本原因,再對症下藥。
| 可能原因 | 解法 |
|---|---|
| 該類別訓練資料太少 | 補充更多圖片 |
| 和其他類別外觀相似,常被誤認 | 補充更多對比性樣本 |
| 標籤品質差(框標歪、標錯) | 重新檢查並修正標籤 |
| 該類別在畫面中通常很小 | 參考 Q16 |
❓ Q15:同一個物件被框了好幾個框(重複偵測),怎麼解決?
A:調低 iou 閾值,讓過濾更積極。
iou 是兩個框的重疊程度(0 = 完全不重疊,1 = 完全重疊)。預設 iou=0.7 表示「重疊超過 70% 才算重複並過濾」。若重複框明顯,往下調讓過濾條件更寬鬆:
1 | # inference_nms.py |
⚠️ 物件本身密集(如人群、排列貨物)時,不要調太低,否則會漏掉真實物件。
❓ 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 | # pre_label.py |
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 legends、minecraft、genshin - GitHub:搜尋
yolov8 [遊戲名] detection
下載後先確認:
1 | # 載入別人的模型,先查看它認識哪些類別 |
⚠️ 使用前注意:
- 確認類別名稱:用
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
