一文讲清楚YOLO模型训练的各种指标
一文讲清楚YOLO模型训练的各种指标
训练 YOLO 时,终端会不断跳出 box_loss、cls_loss、dfl_loss、Precision、Recall、mAP50、mAP50-95 等数字。最容易犯的错误,是只盯着最后的 mAP,或者看到 loss 降了就觉得模型已经变好。
更实用的理解方式是:loss 用来判断模型有没有学稳,Precision 和 Recall 用来判断它错在哪里,mAP 用来比较模型整体效果,速度指标决定它能不能部署。 这些指标放在一起看,才能知道下一步该调数据、调训练,还是改模型。
一、先分清:训练 loss 和验证指标回答的不是同一个问题
YOLO 的训练日志大致可分成两组。
第一组是 loss,例如 box_loss、cls_loss 和较新 YOLO 版本中常见的 dfl_loss。它们来自训练过程,反映模型正在怎样拟合当前训练数据;数值通常越低越好,但不适合单独当作最终成绩。
第二组是验证指标,例如 Precision、Recall、mAP50、mAP50-95。它们在验证集上计算,更接近模型面对未参与训练的图片时的表现。选择 best.pt、比较不同实验,主要看这一组。
一个常见现象是:训练 loss 还在下降,验证集 mAP 却不再提高,甚至开始回落。这往往意味着模型正在记住训练集中的细节,泛化能力没有同步提升。此时继续训练未必有收益,应检查数据量、数据增强、正则化和早停设置。
反过来,loss 在不同实验之间也不能直接横向比较。换了损失函数、输入尺寸或数据增强后,loss 的量纲和难度都可能改变。实验 A 的 loss 更低,不等于它一定比实验 B 检测更好;验证集指标才是更可靠的裁判。
二、先看懂 IoU,再区分 TP、FP 和 FN
看懂所有检测指标,先抓住两个判断。
IoU(交并比) 衡量预测框和真实框重叠得有多好:
IoU = 预测框与真实框的交集面积 / 两个框的并集面积
IoU 越接近 1,说明框的位置和大小越准确。评估时通常先设一个阈值,例如 IoU ≥ 0.5;只有类别也对、框也满足阈值的预测,才算一次正确检测。
接着会得到三类结果:
- TP(真正例):该检出的目标检出来了,类别和框都对。
- FP(假正例):模型报出了一个目标,但它其实不存在、类别错了,或框偏得太远。
- FN(假负例):图片里本来有目标,模型却漏掉了。
这里有个特别容易忽略的细节:同一个真实目标如果被预测出多个框,经过置信度排序和匹配后,通常只有一个能成为 TP,其余重复框会计为 FP。所以“框画得很多”不会自动提高效果,反而可能拉低 Precision。
三、Precision、Recall、F1:先判断模型是在乱报,还是在漏报
Precision 和 Recall 都由 TP、FP、FN 得来,但关注点不同:
Precision = TP / (TP + FP)
它回答的是:模型报出来的框里,有多少是真的。Precision 低,说明误检较多,例如把背景、阴影或相似物体当成目标。
Recall = TP / (TP + FN)
它回答的是:图片中真实存在的目标,有多少被找到了。Recall 低,说明漏检较多,常见于小目标、遮挡目标、少数类样本或置信度阈值过高的情况。
F1 是 Precision 和 Recall 的调和平均:
F1 = 2 × Precision × Recall / (Precision + Recall)
它适合用来找一个相对均衡的置信度阈值。YOLO 输出的 BoxF1_curve.png,就是在不同置信度阈值下观察这种平衡。部署时不要机械沿用默认 conf=0.25:安防告警更怕误报,可适当提高阈值;缺陷检测或危险目标识别更怕漏报,则应优先保证 Recall,再结合业务允许的误报量确定阈值。
可以用下面的组合快速定位方向:
- Precision 低、Recall 高:目标大多找到了,但误检多。先看错误标签、相似背景、重复预测和置信度阈值。
- Precision 高、Recall 低:模型很谨慎,但漏掉很多目标。先看小目标比例、少数类样本、输入尺寸和阈值设置。
- 两者都低:优先检查数据与训练流程,例如标注质量、类别定义、学习率、训练轮数。
- 两者都高但 mAP50-95 不高:模型能大致发现目标,框的位置不够准,应重点看定位与标注边界。
注意,终端中显示的 Precision 和 Recall 通常对应验证过程选出的某个置信度点;它们会随着阈值变化。因此比较实验时,不能只截取一个阈值下的 P、R,而要结合 PR 曲线和 mAP 一起看。
四、AP、mAP50、mAP50-95:为什么两个 mAP 会差很多
对某一个类别,把置信度阈值从高到低逐渐放开,会得到一条 Precision-Recall 曲线。曲线下面积就是该类别的 AP(Average Precision)。AP 不只看某一个阈值,因此比单个 Precision 或 Recall 更稳定。
多类别任务中,把各类别 AP 再取平均,就是 mAP(mean Average Precision)。
YOLO 训练结果里最常见的两个数是:
- mAP50:只在 IoU = 0.50 的标准下计算。框只要大致套住目标就可能算对,数值通常较高。
- mAP50-95:分别在 IoU 为 0.50、0.55、0.60,一直到 0.95 的十个阈值下计算,再取平均。这是更严格、更能反映定位质量的指标,数值通常明显低于 mAP50。
因此,mAP50 很高,mAP50-95 低很多 并不一定是 bug。它说明模型基本能找到目标,但在更严格的框重叠要求下不够稳定。小目标、边界模糊、遮挡,或者标注框本身不一致,都可能放大这个差距。
做论文或算法对比时,建议把 mAP50-95 作为整体检测质量的主指标,同时报告 mAP50 便于与部分旧工作对照。只报 mAP50 容易掩盖定位不够精确的问题;只报一个总 mAP,也会掩盖某些类别已经失效的情况。
五、别忽略分类别结果、混淆矩阵和速度
整体 mAP 是平均数,平均数有时会“掩盖问题”。例如数据集中 A 类有 5000 个样本、B 类只有 100 个样本,模型把 A 类做得很好,整体指标依然可能漂亮,但 B 类根本无法使用。
所以至少再看三样输出:
分类别 AP。 在验证日志的每类别表格中,关注 Instances 很少且 AP 很低的类别。先区分它是样本不足、视觉特征相近,还是标签质量问题,再决定是否补数据或调整训练策略。
混淆矩阵。 对角线越集中越好;某两个类别之间的非对角元素很高,说明模型经常把它们混淆。若大量目标被归到 background,通常说明漏检;若 background 被频繁预测成某一类,通常说明该类误检较多。
速度与资源。 preprocess、inference、postprocess 的耗时、FPS、参数量、FLOPs、显存占用,决定模型是否能在目标设备上运行。一个 mAP 高 0.3 个点、速度却下降一半的改进,在实时场景里未必值得保留。比较速度时要固定硬件、输入尺寸、batch 和推理精度,否则数字没有可比性。
最后还要回到预测图和错误样本。指标告诉你“差在哪里”,图片才能帮助判断“为什么会差”。例如,混淆矩阵显示某类 Recall 低,再筛出该类的漏检图,通常就能看出问题集中在远距离、夜间、遮挡,还是标注本身。
结语
YOLO 指标不需要逐个死记。训练时用 loss 看优化是否稳定;验证时用 Precision 和 Recall 判断误检、漏检;用 mAP50-95 衡量更严格的整体检测质量;再用分类别 AP、混淆矩阵和错误样本定位具体问题;需要部署时,把速度和资源一起纳入结论。
下次看到一组训练结果,先别急着问“mAP 涨了没有”。更值得问的是:模型到底在什么图片、什么类别、什么目标尺寸上失败?这个答案,才是下一轮改进真正该从哪里开始的依据。