Python | OpenCV 模型評估與測試
📚 前言
在上一篇 模型使用與推論 的章節導覽中,我們了解了推論流程的整體架構。
這一篇進入第一個細節:模型評估與測試 (Model Evaluation & Testing)。
訓練結束後,你最常看到的應該是程式印出的 Val Accuracy(驗證正確率)和 Val Loss(驗證損失)。
簡單來說:
- Val Loss:用來判斷訓練過程是否過擬合(前面文章已經教過)
- Val Accuracy:代表模型在驗證集上預測正確的比例,例如 90% 表示每 100 張圖片,大約有 90 張猜對
但只看 Val Accuracy 是遠遠不夠的!
因為:
- 當類別數量不平衡時,Accuracy 很容易被大類別拉高,造成誤判
- 它無法告訴你「模型在哪個類別上特別容易出錯」
- 也不能幫助你知道該如何改進模型
這一篇就是要教你更完整、更實用的模型評估方法,讓你清楚知道模型真正的優缺點,以及接下來該怎麼改進。
🔎 常見評估指標是什麼意思?
圖:貓 vs 狗 二分類指標白話版 ─ Accuracy、Precision、Recall、F1-Score 簡單說明
用實際例子幫助理解
假設測試集中有 100 張「狗」的圖片:
- Accuracy = 90%:100 張圖片裡,模型總共猜對了 90 張。
- Precision = 95%:模型預測是狗的 80 張圖片中,有 76 張真的是狗(只有 4 張貓被誤認成狗)。
- Recall = 80%:實際是狗的 100 張圖片中,模型成功找出 80 張(還有 20 張狗被漏掉了)。
- F1-Score:同時考慮 Precision 和 Recall 的平衡分數,當類別數量不平衡時特別有用。
💡 實際應用小提醒
- 醫療診斷(如判斷有沒有病)通常最看重 Recall(寧可多報一點,也不要漏掉真正有病的)。
- 垃圾郵件過濾通常最看重 Precision(寧可讓一些垃圾郵件漏掉,也不要把正常郵件誤判成垃圾)。
🛠️ 評估前必須準備的事
在開始評估之前,請先確認以下事項:
- 建立測試集資料夾
請在你的資料目錄下建立一個獨立的test資料夾(與train、val同層級):1
2
3
4data/cat_dog/
├── train/
├── val/
└── test/ ← 新增這個資料夾把一些從未用來訓練或驗證的圖片放進
test資料夾,也可以先從 val 複製一份當作測試集使用。 - 安裝評估需要的套件
在開始評估之前,請先安裝scikit-learn(用來產生分類報告與混淆矩陣):1
pip install scikit-learn
🗺️ 模型評估的正確流程
圖:模型評估的正確流程 ─ 從測試集推論到找出弱勢類別的完整步驟
💻 PyTorch — 完整評估流程
此處使用的是PyTorch 微調範例 - train.py,所訓練的模型。
以下是推薦的評估程式碼(已包含分類報告、混淆矩陣、錯誤樣本分析):
1 | # evaluate_pytorch.py |

圖:使用 PyTorch 對測試集推論,並以 classification_report 輸出各類別 Precision、Recall、F1 及繪製混淆矩陣
輸出範例:
1 | ── Classification Report ── |
報告說明
- 整體準確率 (Accuracy): 96% —— 非常好的成績!
- 貓的類別:Precision 0.96、Recall 0.96、F1 0.96
- 狗的類別:Precision 0.96、Recall 0.96、F1 0.96
- macro avg 和 weighted avg 都是 0.96,表示兩個類別表現非常均衡。
1
2
3
4
5support 是什麼?
support = 該類別在測試集中的實際樣本數量
cat 的 support = 48 → 表示測試集中實際有 48 張貓的圖片
dog 的 support = 50 → 表示測試集中實際有 50 張狗的圖片
⚠️ 注意事項
- 使用測試集而非驗證集評估:驗證集在訓練過程中用於調整超參數,不能代表真實的模型表現,最終評估應使用從未接觸過的測試集。
- 類別不均衡時看 F1-Score:若各類別的樣本數差異很大,Accuracy 會被大類別主導,此時 F1-Score 或 macro avg 更能反映真實表現。
- 混淆矩陣要標準化:若各類別樣本數不同,建議使用
normalize="true"將混淆矩陣轉為比例,更容易比較。
🎯 結語
完整的模型評估能讓你清楚知道模型的強項與弱項,是改進模型的起點而非終點。
發現哪個類別的 Recall 特別低?回去補充那個類別的訓練資料或調整增強策略。
下一步是 模型保存與載入,學習如何妥善保存訓練成果。
📖 如在學習過程中遇到疑問,或是想了解更多相關主題,建議回顧一下 Python | OpenCV 系列導讀,掌握完整的章節目錄,方便快速找到你需要的內容。
註:以上參考了
scikit-learn — classification_report
scikit-learn — ConfusionMatrixDisplay
