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,但目标检测不是只判断图片类别。检测模型至少要同时回答三个问题:

  1. 图中有没有目标;
  2. 目标属于哪个类别;
  3. 框的位置是否足够准。

所以目标检测更常用 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 相对宽松,能够反映模型是否大体找到了目标。

它适合回答这样的问题:

  1. 模型有没有基本学会这个数据集;
  2. 某些类别是否完全检测不出来;
  3. 改进后大致召回和分类能力有没有变化。

但 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:

import pandas as pd

csv_path = r"runs\yolo11_baseline\yolo11n_s0_e100_i640\results.csv"

df = pd.read_csv(csv_path)
df.columns = [c.strip() for c in df.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)

这段代码做了三件事:

  1. 读取训练结果 CSV;
  2. 去掉列名前后可能存在的空格;
  3. metrics/mAP50-95(B) 找到最佳 epoch。

如果你更关注 mAP50,也可以把排序列换成:

best_index = df["metrics/mAP50(B)"].idxmax()

但做 YOLO11 改进对比时,我更建议优先记录 mAP50-95,因为它对定位质量更敏感。


八、如何查看最后一轮和最佳轮是否一致

有时最后一个 epoch 的指标并不是最高的,这很正常。训练过程中模型会保存 best.ptlast.pt

权重 含义
best.pt 验证指标最优时保存的权重
last.pt 最后一个 epoch 的权重

可以用下面代码对比最后一轮和最佳轮:

import pandas as pd

csv_path = r"runs\yolo11_baseline\yolo11n_s0_e100_i640\results.csv"
df = pd.read_csv(csv_path)
df.columns = [c.strip() for c in df.columns]

best_row = df.loc[df["metrics/mAP50-95(B)"].idxmax()]
last_row = df.iloc[-1]

for name, row in [("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 同参数

表格后面的分析可以这样写:

  1. 如果 Precision 上升但 Recall 下降,说明模型可能更保守;
  2. 如果 Recall 上升但 Precision 下降,说明模型找得更多,但误检增加;
  3. 如果 mAP50 上升而 mAP50-95 不变,说明大致检测能力变好,但定位质量未必提升;
  4. 如果 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 一起看,并且只使用真实训练日志中的数值。这样写出来的文章不仅更严谨,也更容易让读者判断改进是否真的有效。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐