Mean Average Precision (mAP)
平均精度均值 (mAP) 通过对召回率、类别和 IoU 阈值上的精度取平均来评估检测器。了解 mAP50 和 mAP50-95 的计算方法。
平均精度均值(mAP)是目标检测的标准评估指标,同样的方法也可评估实例分割、姿势估计和旋转目标检测。它会综合衡量模型是否找到了所有目标、是否避免了误检,以及每个边界框是否贴合目标,并将这三方面压缩为 0 到 1 之间的一个数值,通常以百分比表示。平均精度(AP)是某一类别的精确率-召回率曲线下的面积;mAP 是各类别 AP 的均值,而最常报告的形式 mAP50-95 还会对十个交并比(IoU)阈值上的结果取平均。
基本组成#
- IoU:预测框与标注框之间的重叠程度,范围为 0 到 1。只有当预测框与同类别且尚未匹配的标注框之间的 IoU 达到阈值(例如 0.5)时,该预测才算真正例。
- 精确率:预测正确的比例,TP / (TP + FP)。
- 召回率:模型找到的已标注目标所占比例,TP / (TP + FN)。
- 置信度:用于给检测结果排序的分数。每个置信度阈值对应一组精确率和召回率,而所有阈值共同描绘出精确率-召回率曲线。
mAP 的计算方法#
评估时会汇总整个数据集中某一类别的所有检测结果,并按置信度排序。从列表顶部开始逐项检查:每个检测结果要么与该类别中重叠最多且尚未匹配的标注框配对,成为真正例;要么成为假正例。每个标注框只能匹配一次,因此已经找到的目标如果再次出现一个框,就会拉低精确率。每处理一项都会重新计算精确率和召回率,由此从置信度最高的检测结果到最低的检测结果绘制出精确率-召回率曲线。
AP 是该曲线下的面积。积分前,曲线会替换为其包络线,即每个召回率水平及其之后能达到的最高精确率,这样细小的曲线波动就不会影响分数。COCO 评估会在召回率从 0 到 1 的范围内取 101 个点,而原始的 PASCAL VOC 基准使用 11 个点。模型无法达到的召回率水平会以零精确率计入,因此每个漏检目标都会降低 AP。
import numpy as np
# One class: 8 detections sorted by confidence (1 = matched a label, 0 = false positive)
tp = np.array([1, 1, 0, 1, 0, 1, 0, 0])
num_labels = 5 # ground-truth objects of this class in the dataset
# Precision and recall after each detection in the ranked list
tp_cum = np.cumsum(tp)
precision = tp_cum / np.arange(1, len(tp) + 1)
recall = tp_cum / num_labels
# Precision envelope: best precision at this recall or any higher recall
envelope = np.maximum.accumulate(precision[::-1])[::-1]
# COCO-style AP: average the envelope at 101 recall points (0 beyond the highest recall reached)
points = np.linspace(0, 1, 101)
idx = np.searchsorted(recall, points, side="left")
ap = np.mean([envelope[i] if i < len(envelope) else 0.0 for i in idx])
print(f"Max recall: {recall[-1]:.1f}, AP: {ap:.3f}")脚本会打印 Max recall: 0.8, AP: 0.686。五个标注目标中有一个始终未被检测到,因此召回率轴上最后五分之一的区间不会增加面积;尽管置信度最高的两个检测结果都正确,AP 仍为 0.686。
mAP 与相关指标的比较#
- 准确率用正确预测数除以所有预测数,因此需要统计真负例。对于检测器,真负例会是每个没有目标的背景图块,所以准确率对目标检测没有实际意义。
- F1 分数在一个置信度阈值下综合精确率和召回率,描述单个工作点,例如部署模型所使用的阈值。
- 混淆矩阵统计检测器在一个阈值下会混淆哪些类别,呈现单个 mAP 数值无法体现的细节。
mAP50、mAP75 和 mAP50-95#
由于 mAP 是对各类别求简单平均,因此稀有类别和常见类别的权重相同。IoU 阈值决定边界框必须贴合到什么程度才算正确:
- mAP50:IoU 为 0.5 时检测结果即为正确,这是 PASCAL VOC 的规则。
- mAP75:阈值提高到 0.75,用于严格检验定位效果。
- mAP50-95:在 10 个阈值上取 mAP 平均值,阈值范围为 0.50 到 0.95,步长为 0.05。COCO 将这个数值简称为“AP”,不区分 AP 和 mAP,并将其作为主要挑战指标。
Ultralytics YOLO26 训练会保留验证 mAP50-95 最高的轮次对应的 best.pt,并在每次运行时通过验证报告这三个变体的结果。
from ultralytics import YOLO
# Load a pretrained YOLO26 nano detector
model = YOLO("yolo26n.pt")
# Validate on the small COCO8 dataset to compute mAP
metrics = model.val(data="coco8.yaml")
# The same detections scored at three IoU thresholds
print(f"mAP50: {metrics.box.map50:.3f}")
print(f"mAP75: {metrics.box.map75:.3f}")
print(f"mAP50-95: {metrics.box.map:.3f}")IoU 阈值越宽松,算作正确的检测结果就越多,因此 mAP50 最高,mAP50-95 则低于它。COCO还会按对象大小划分 AP:小型对象的面积小于 32 × 32 像素,中型对象的面积不超过 96 × 96 像素,大型对象的面积则更大。










