006-目标检测指标解读-Precision-Recall-mAP50与mAP50-95
006-目标检测指标怎么读:Precision、Recall、mAP50 与 mAP50-95
本文基于 Ultralytics
8.3.253的检测任务输出进行整理,重点讲清楚 YOLO11 训练结果中的 Precision、Recall、mAP50、mAP50-95 分别代表什么,以及如何从results.csv中读取它们。本文不讨论虚构精度,所有数值都以自己的训练日志为准。
摘要
YOLO11 训练完成后,很多同学第一眼会去看results.png或终端里的 mAP,但如果分不清 Precision、Recall、mAP50 和 mAP50-95,就很容易把“检得多”“检得准”“框得准”混成一个概念。
本文结合 Ultralytics 8.3.253 的结果文件,按工程复现实验的思路解释四个核心检测指标。文章会说明它们在results.csv中的列名、各自适合回答什么问题、mAP50 与 mAP50-95 为什么不能混写,以及后续做 YOLO11 改进实验时应该怎样组织对比表。
关键词:YOLO11、目标检测指标、Precision、Recall、mAP50、mAP50-95、Ultralytics、results.csv
一、先确认指标来自哪里
在 Ultralytics 8.3.253 的检测验证逻辑中,目标检测结果主要围绕下面四个指标展开:
metrics/precision(B) metrics/recall(B) metrics/mAP50(B) metrics/mAP50-95(B)其中(B)表示 bounding box,也就是检测框指标。如果是分割、姿态或旋转框任务,还会出现对应任务的其他指标。本文只讨论普通目标检测。
训练完成后,主要看这几个文件:
runs/ yolo11_baseline/ yolo11n_s0_e100_i640/ results.csv results.png PR_curve.png F1_curve.png P_curve.png R_curve.png confusion_matrix.png weights/ best.pt last.pt最核心的是results.csv。它记录了每个 epoch 的 loss、指标和学习率变化。results.png只是根据 CSV 画出来的图,适合观察趋势,但正式做实验表时还是建议回到 CSV 读取数值。
二、不要把检测指标写成“准确率”
分类任务里经常说 accuracy,但目标检测不是只判断图片类别。检测模型至少要同时回答三个问题:
- 图中有没有目标;
- 目标属于哪个类别;
- 框的位置是否足够准。
所以目标检测更常用 Precision、Recall 和 mAP。它们不是同一个东西。
| 指标 | 主要回答的问题 |
|---|---|
| Precision | 模型报出来的目标里,有多少是真的 |
| Recall | 真实存在的目标里,有多少被模型找到了 |
| mAP50 | IoU 阈值为 0.5 时的平均检测表现 |
| mAP50-95 | IoU 从 0.5 到 0.95 多个阈值下的平均表现 |
后续写 YOLO11 改进文章时,建议直接写这几个指标名称,不要笼统写“准确率提升”。尤其是目标检测任务中,“准确率”这个说法很容易让读者误解。
三、Precision:模型报出来的框有多可靠
Precision 可以理解为“模型预测出来的目标里,有多少是对的”。
简单公式可以写成:
Precision = TP / (TP + FP)其中:
| 名称 | 含义 |
|---|---|
| TP | 预测正确的目标 |
| FP | 模型误检出来的目标 |
如果 Precision 很高,通常说明模型比较谨慎,报出来的框大多是可信的。如果 Precision 很低,说明误检比较多,例如把背景纹理、阴影、相似物体也当成目标。
举个常见现象:
| 现象 | 可能原因 |
|---|---|
| Precision 高,Recall 低 | 模型只敢检明显目标,漏检较多 |
| Precision 低,Recall 高 | 模型检得很积极,但误检也多 |
| Precision 和 Recall 都低 | 数据、标注、类别定义或训练本身可能有问题 |
写实验分析时,不要只说 Precision 变高。还要同时看 Recall 有没有明显下降。一个模型如果只是变得更保守,Precision 可能会上去,但实际可用性不一定更好。
四、Recall:真实目标有没有被找全
Recall 可以理解为“真实存在的目标里,有多少被模型找到了”。
公式可以写成:
Recall = TP / (TP + FN)其中:
| 名称 | 含义 |
|---|---|
| TP | 被正确检测出来的目标 |
| FN | 真实存在但模型漏掉的目标 |
Recall 更关注漏检问题。比如工业缺陷、道路障碍物、安全帽检测等任务中,漏检通常比误检更严重,这时 Recall 就需要重点关注。
如果 Recall 长期偏低,可以从下面几个方向排查:
| 排查方向 | 说明 |
|---|---|
| 目标太小 | 小目标在640输入尺寸下可能只剩很少像素 |
| 遮挡严重 | 部分目标标注框不完整,模型难以学习 |
| 类别混淆 | 类别边界不清楚,标注规则不统一 |
| 数据量不足 | 某些类别样本太少 |
| 置信度阈值 | 推理展示时conf设置过高会减少显示框 |
注意,验证阶段的指标计算和普通预测展示不完全一样。不要只根据predict结果截图判断 Recall,正式对比要看val或训练过程中的验证指标。
五、mAP50:较宽松定位标准下的综合表现
mAP50 中的50指 IoU 阈值为 0.5。也就是说,预测框和真实框的重叠程度达到一定标准后,才会被当成正确检测。
IoU 可以简单理解为:
IoU = 预测框和真实框的交集面积 / 预测框和真实框的并集面积当使用 mAP50 时,只要 IoU 达到 0.5,就进入这个阈值下的 AP 计算。因此 mAP50 相对宽松,能够反映模型是否大体找到了目标。
它适合回答这样的问题:
- 模型有没有基本学会这个数据集;
- 某些类别是否完全检测不出来;
- 改进后大致召回和分类能力有没有变化。
但 mAP50 也有局限。一个框只要大概覆盖目标,就可能在这个阈值下通过。如果任务对定位精度要求高,只看 mAP50 会过于乐观。
六、mAP50-95:更严格的综合指标
mAP50-95 是把 IoU 阈值从 0.5 到 0.95 取多个点进行平均。Ultralytics 检测验证中使用的 IoU 阈值序列可以理解为:
0.50, 0.55, 0.60, 0.65, 0.70, 0.75, 0.80, 0.85, 0.90, 0.95这个指标比 mAP50 更严格。因为 IoU 越高,对预测框位置越挑剔。模型如果只是大概框住目标,mAP50 可能还不错,但 mAP50-95 不一定高。
在 Ultralytics 的检测指标对象中,mean_results()返回的顺序是:
Precision, Recall, mAP50, mAP50-95检测任务的fitness也更偏向 mAP50-95。也就是说,如果要选一个更适合做主指标的数,通常优先看 mAP50-95,再结合 mAP50、Precision、Recall 一起解释。
后续写改进文章时,建议表格中至少保留:
| 模型 | Precision | Recall | mAP50 | mAP50-95 |
|---|---|---|---|---|
| YOLO11n baseline | 按真实结果填写 | 按真实结果填写 | 按真实结果填写 | 按真实结果填写 |
| 改进模型 | 按真实结果填写 | 按真实结果填写 | 按真实结果填写 | 按真实结果填写 |
不要把 mAP50 和 mAP50-95 合并成一个“mAP”。这两个数的含义不同,读者也会默认它们应该分开展示。
七、从 results.csv 中读取最佳 epoch
训练完成后,可以用下面脚本读取results.csv,找出 mAP50-95 最高的 epoch:
importpandasaspd csv_path=r"runs\yolo11_baseline\yolo11n_s0_e100_i640\results.csv"df=pd.read_csv(csv_path)df.columns=[c.strip()forcindf.columns]metric_cols=["metrics/precision(B)","metrics/recall(B)","metrics/mAP50(B)","metrics/mAP50-95(B)",]best_index=df["metrics/mAP50-95(B)"].idxmax()best_row=df.loc[best_index,["epoch",*metric_cols]]print(best_row)这段代码做了三件事:
- 读取训练结果 CSV;
- 去掉列名前后可能存在的空格;
- 按
metrics/mAP50-95(B)找到最佳 epoch。
如果你更关注 mAP50,也可以把排序列换成:
best_index=df["metrics/mAP50(B)"].idxmax()但做 YOLO11 改进对比时,我更建议优先记录 mAP50-95,因为它对定位质量更敏感。
八、如何查看最后一轮和最佳轮是否一致
有时最后一个 epoch 的指标并不是最高的,这很正常。训练过程中模型会保存best.pt和last.pt:
| 权重 | 含义 |
|---|---|
best.pt | 验证指标最优时保存的权重 |
last.pt | 最后一个 epoch 的权重 |
可以用下面代码对比最后一轮和最佳轮:
importpandasaspd csv_path=r"runs\yolo11_baseline\yolo11n_s0_e100_i640\results.csv"df=pd.read_csv(csv_path)df.columns=[c.strip()forcindf.columns]best_row=df.loc[df["metrics/mAP50-95(B)"].idxmax()]last_row=df.iloc[-1]forname,rowin[("best",best_row),("last",last_row)]:print(name)print("epoch:",int(row["epoch"]))print("precision:",row["metrics/precision(B)"])print("recall:",row["metrics/recall(B)"])print("mAP50:",row["metrics/mAP50(B)"])print("mAP50-95:",row["metrics/mAP50-95(B)"])如果最佳轮比最后一轮明显更好,正式部署或对比时一般使用best.pt。如果你要断点续训,则使用last.pt。
九、曲线图应该怎么看
results.png适合看趋势,不适合只盯某一个点。建议重点观察:
| 曲线 | 观察重点 |
|---|---|
train/box_loss | 训练集框回归损失是否下降 |
val/box_loss | 验证集框回归损失是否同步变好 |
metrics/precision(B) | 误检是否减少 |
metrics/recall(B) | 漏检是否减少 |
metrics/mAP50(B) | 较宽松定位下综合表现 |
metrics/mAP50-95(B) | 更严格定位下综合表现 |
如果训练 loss 一直下降,但验证 mAP 不涨,可能是过拟合、标注质量、数据分布或增强策略存在问题。
如果 mAP50 比较高,但 mAP50-95 明显偏低,说明模型大概能找到目标,但框的位置还不够精准。这类情况后续可以考虑框回归损失、检测头、小目标尺度或标注边界质量。
十、PR 曲线和混淆矩阵有什么用
除了results.csv,验证阶段还可能生成:
PR_curve.png F1_curve.png P_curve.png R_curve.png confusion_matrix.png confusion_matrix_normalized.png这些图适合进一步分析问题。
| 文件 | 作用 |
|---|---|
PR_curve.png | 看 Precision 和 Recall 的权衡关系 |
F1_curve.png | 看不同置信度下综合表现 |
P_curve.png | 看置信度变化对 Precision 的影响 |
R_curve.png | 看置信度变化对 Recall 的影响 |
confusion_matrix.png | 看类别之间是否互相误判 |
如果某两个类别在混淆矩阵中经常互相错分,优先检查标注规则和样本差异,不要一上来就换复杂模块。很多时候,类别定义不清楚比网络结构影响更大。
十一、做改进实验时怎么写指标表
后续写注意力、Neck 或 Backbone 改进文章时,可以使用下面这种表格结构:
| 实验 | 模型 | 改动 | Precision | Recall | mAP50 | mAP50-95 | 备注 |
|---|---|---|---|---|---|---|---|
| B001 | YOLO11n | 原始模型 | 按真实结果填写 | 按真实结果填写 | 按真实结果填写 | 按真实结果填写 | baseline |
| A001 | YOLO11n + 模块A | 指定位置加入模块A | 按真实结果填写 | 按真实结果填写 | 按真实结果填写 | 按真实结果填写 | 与 B001 同参数 |
表格后面的分析可以这样写:
- 如果 Precision 上升但 Recall 下降,说明模型可能更保守;
- 如果 Recall 上升但 Precision 下降,说明模型找得更多,但误检增加;
- 如果 mAP50 上升而 mAP50-95 不变,说明大致检测能力变好,但定位质量未必提升;
- 如果 mAP50-95 上升,同时 Precision 和 Recall 没有明显恶化,才更适合写成有效改进。
不要只挑一个最好看的数写。读者真正关心的是改进是否稳定、是否公平、是否能复现。
十二、常见问题
1. 为什么 mAP50 比 mAP50-95 高很多
这是常见现象。mAP50 的 IoU 阈值较宽松,mAP50-95 包含更严格的 IoU 阈值,对框的位置要求更高。
如果差距很大,可以检查标注框是否松散、目标是否过小、输入尺寸是否不合适,以及模型是否容易框偏。
2. Precision 很高但图片上漏检很多
Precision 高只能说明报出来的框比较可靠,不代表目标都被找到了。漏检多时要看 Recall。
3. Recall 很高但误检很多
Recall 高说明真实目标多数被找到了,但如果 Precision 低,说明误检也多。实际应用中需要根据场景决定更重视误检还是漏检。
4.predict截图效果不错,为什么 mAP 不高
预测截图通常只展示少量图片,而且conf阈值会影响显示结果。正式指标是在验证集上统计得到的,不能用几张截图代替。
5. 改进模型只有 mAP50 提高,可以写提升吗
可以描述 mAP50 的变化,但不能说整体检测性能一定提升。建议同时报告 mAP50-95、Precision 和 Recall,并说明变化可能对应的原因。
十三、总结
本文把 YOLO11 目标检测中最常用的四个指标拆开讲了一遍:Precision 关注误检,Recall 关注漏检,mAP50 反映较宽松阈值下的综合表现,mAP50-95 更关注多阈值下的定位质量。
在 Ultralytics 8.3.253 中,检测任务的核心指标列名可以从results.csv中读取,分别是metrics/precision(B)、metrics/recall(B)、metrics/mAP50(B)和metrics/mAP50-95(B)。
后续做 YOLO11 改进实验时,建议把 mAP50 和 mAP50-95 分开写,把 Precision 和 Recall 一起看,并且只使用真实训练日志中的数值。这样写出来的文章不仅更严谨,也更容易让读者判断改进是否真的有效。
