YOLO 深入验证:IOU/mAP/ 混淆矩阵,看懂训练时的数字
YOLO 深入验证前言0. 验证就是给模型打分1. IOU判断预测框对不对的标准2. TP / FP / FN 三个统计量3. P / R / F1 核心指标4. 后处理三连conf / iou / max_det更深入一点推理过程  后处理三连 5. conf 对 P / R / F1 的影响6. P 曲线 / R 曲线 / F1 曲线7. PR 曲线与 AP平均精度8. mAP50 与 mAP50-959. fitness 与 best.pt vs last.pt10. 手动验证 myval.py11. 三个集的指标规律12. 坑点速查表13. 代码速查14. 学完深入验证能干什么前言基于 B 站 UP 主「林亿饼」《YOLO深入验证》整理。前置你已经训练好了自己的模型想知道怎么评价它到底有多准。视频任意门【YOLO深入验证】 https://www.bilibili.com/video/BV1D74JzdEjd/?share_sourcecopy_webvd_sourcefebc13c39cb98e4d1541c783e3161cab读完你会知道训练时那一堆数字和曲线都是什么意思怎么手动验证怎么用 IOU/TP/FP/FN/P/R/F1/mAP 给模型打分。0. 验证就是给模型打分玩 YOLO 的终极目标就是训练出一个又快又准的模型。本期重点关注什么是准验证就是在给模型的准度打分。回忆当初训练的时候每一轮是不是都会打印出一堆数字训练结束是不是也会看到一堆曲线这些大部分都是自动验证产生的。模型预测图片得到一堆框对比预测框和真实框IOU 算重叠度TP/FP/FN 统计对错P/R/F1 单类指标不同 conf 画曲线PR 曲线下面积 AP所有类平均 mAP不同 IOU 阈值算 mAP50/95主播原话“打分就是验证验证就是打分。”1. IOU判断预测框对不对的标准第一个问题如何判断一个预测结果是不是对的目标检测领域通常使用 IOU 算法评价两个框的接近程度。IOU 全称Intersection over Union意思就是交集在并集上面。预测框交集面积真实框IOU 交集/并集框完全重叠 → IOU 1框完全不重叠 → IOU 0最常用的阈值是 0.5IOU 0.5 才算预测对了。主播原话“预测结果和真实结果偏差过大就会变成错误的预测。”2. TP / FP / FN 三个统计量知道怎么判断一个预测结果是不是正确了接下来做统计。指标全称通俗理解怎么算TPTrue Positive预测对的框IOU0.5 的预测FPFalse Positive预测错的框IOU0.5 的预测FNFalse Negative没找到的真实框真实框 - TP两个恒等式TP FP 预测总数所有预测分为对的和错的TP FN 真实总数所有真实框分为找到的和没找到的。主播原话“再优秀的 COOK 第一次看到 False Negative 这个翻译也得思考半天。通俗一点就是没找到的真实结果。”注意一个真实框只能匹配一个预测框反之亦然一个目标被多个预测框命中不是好事。3. P / R / F1 核心指标TP、FP、FN 知道了接下来算三个核心指标。指标全称公式通俗理解PPrecision 精确率TP / (TPFP)预测里有多少是对的RRecall 召回率TP / (TPFN)真实里有多少被找到F1F1-score2PR/(PR)P 和 R 的综合分理想状态P1R1代表一个也没错一个也没漏。主播原话“P 和 R 是评价模型预测能力最基础的两个指标后续各种复杂的指标都来源于此。”4. 后处理三连conf / iou / max_det推理后你会得到一大堆预测结果每个都带着类型和概率。后处理就是去掉大部分多余的框。选项默认值作用关掉怎么写conf0.25去弱去掉概率低于阈值的框conf0.0iou0.7去重NMS 合并同一目标的多个框iou1.0max_det300限量最多保留多少个框max_det9999记忆口诀去弱、去重、限量。主播原话“这三个操作总结一下就是去弱、去重、限量。”更深入一点推理过程后处理三连5. conf 对 P / R / F1 的影响conf 低框多P 低、R 高conf 高框少P 高、R 低conf0 → 跳过去弱框巨多P 很低R 很高conf 调高 → 去掉垃圾预测P 上升R 下降F1 曲线先升后降最高点对应的 conf 就是最优阈值。主播原话“随着你使用的 conf 越来越高所有类型的精确率 P 都会有上升的趋势召回率 R 都会有下降的趋势。”6. P 曲线 / R 曲线 / F1 曲线随着 conf 从 0 到 1 变化每个类型的 P、R、F1 都会变把它们画出来就是三条曲线。conf 很低时R 高、P 低conf 很高时P 高、R 低F1 曲线先升后降好模型的曲线整体靠外随便选个 conf 效果都不错差模型的曲线整体靠内怎么调都不行。平均之后对应训练结果里的报告使用最优秀的conf7. PR 曲线与 AP平均精度把 P 作为纵坐标R 作为横坐标conf 一动就出一个点连起来就是PR 曲线。PR 曲线下面的面积就是 AP。P 曲线 R 曲线PR 曲线曲线下面积 AP所有类 AP 平均 mAP理解 AP 的关键PR 曲线是否靠外主要取决于 P 和 R 交点的高度。主播原话“能找到一个 conf 使得 P 和 R 都很高AP 就大。”8. mAP50 与 mAP50-95指标是什么难度mAP50IOU0.5 时的 mAP最常用mAP50-95IOU 从 0.5 到 0.95 步长 0.05 的 mAP 平均最严格最常用IOU 阈值越高指标越差考试变难了。主播原话“如果你第一次看到这里就全懂了那我得问问你伯哥们咋这么强”9. fitness 与 best.pt vs last.pt每一轮验证完得到四个指标P、R、mAP50、mAP50-95再做一次加权平均得到fitness适应度。fitness 0.0*P 0.0*R 0.1*mAP50 0.9*mAP50-95默认权重极度看重 mAP50-95。文件什么时候更新last.pt每一轮都覆盖更新best.pt只有当本轮 fitness 历史最优时才更新主播比喻“last.pt 是现任对象best.pt 是历任最佳。”10. 手动验证 myval.py除了训练时的自动验证你也可以手动验证。fromultralyticsimportYOLO modelYOLO(results/你的模型/weights/best.pt)model.val(splitval)# 验证集# splittest 测试集# splittrain 训练集注意不用写 databest.pt 自己记得数据集验证其他数据集才加dataxxx.yaml输出包含指标表、4 条曲线、混淆矩阵、pred/labels 对比图。混淆矩阵看模型把哪两类搞混了比如可口 vs 百事。11. 三个集的指标规律数据集指标通常训练集最好模型背过答案验证集稍差测试集最差或和验证集接近坑把测试集图片混进训练集 自欺欺人指标虚高实际部署翻车。主播原话“如果你是搞应用的 COOK发现测试效果还不错直接把模型拿来用就行。如果你是追求极致的 COOK不得不给模型打个分。”12. 坑点速查表#坑解决办法1IOU 必须 ≥0.5 才算预测对低于 0.5 就是 FP2一个真实框只能匹配一个预测框反之亦然3TPFP 预测总数TPFN 真实总数记住这两个恒等式4conf0 不是没预测是跳过了去弱框巨多5max_det 默认 300 大部分是摆设前两关就过滤完了6conf 越低 P 越低 R 越高conf 越高 P 越高 R 越低7F1 最高点对应的 conf 就是推荐阈值实际部署时用这个值8PR 曲线下面积 AP所有类 AP 平均 mAP9mAP50 是 IOU0.5 时的 mAPmAP50-95 是 IOU 从 0.5 到 0.95 的平均10IOU 阈值越高指标越差考试变难了11默认 fitness 权重 0.0/0.0/0.1/0.9极度偏向 mAP50-9512best.pt 不是最后一轮是 fitness 最高的那一轮13last.pt 每轮都覆盖别拿它当最终模型14手动验证不用写 databest.pt 自带数据集路径15测试集指标才是用来攀比的验证集只是训练时参考16别把测试集图片混进训练集会导致指标虚高17混淆矩阵看模型把哪两类搞混了比如可口 vs 百事18labels.jpg 是真实框pred.jpg 是预测框对比着看19指标可靠的前提人工标注可靠 验证图片符合实际场景20加数据比调任何超参数都有效效果差就补数据13. 代码速查# 手动验证fromultralyticsimportYOLO modelYOLO(runs/detect/train/weights/best.pt)model.val(splittest)# val / test / train# 预测时调 confmodel.predict(sourcexxx.jpg,conf0.45,iou0.7,max_det300)14. 学完深入验证能干什么你能看懂训练日志里的每一个数字和每一条曲线你知道 IOU、TP、FP、FN、P、R、F1、AP、mAP 都是什么意思你会用手动验证脚本分别看训练集/验证集/测试集的指标你能根据混淆矩阵发现模型把哪两类搞混了你知道怎么选最优 conf怎么评价一个模型到底有多准。