理解 mAP,最关键的是先理解 PR 曲线(Precision-Recall Curve,精确率-召回率曲线)。PR 曲线描述:当我们不断调整目标检测模型的置信度阈值时,模型的精确率和召回率如何变化;AP 则是对这条曲线进行综合计算得到的指标,mAP 再对多个类别的 AP 求平均。
一、先从一个船舶检测例子理解
1. 先理解 Precision、Recall 和 IoU
IoU:预测框与真实框有多重合?
IoU(Intersection over Union,交并比)衡量预测框和真实标注框的重叠程度。
IoU=预测框与真实框的交集面积预测框与真实框的并集面积 IoU=\frac{\text{预测框与真实框的交集面积}} {\text{预测框与真实框的并集面积}}IoU=预测框与真实框的并集面积预测框与真实框的交集面积
高 IoU: 预测框和真实框高度重合,位置较准确。
低 IoU: 预测框偏移较大,与真实目标的重叠程度较低。
例如,某个预测框与真实框的交集面积为 80,两个框的并集面积为 100,则:
IoU=80100=0.8 IoU=\frac{80}{100}=0.8IoU=10080=0.8
在常见的 mAP@0.5 评估中,如果预测类别正确,且 IoU 达到 0.5 或以上,这个预测才可能被判为正确检测(TP)。具体还要考虑同一个目标是否已经被其他预测匹配。
Precision:预测出来的目标有多少是真的?
Precision=TPTP+FP Precision=\frac{TP}{TP+FP}Precision=TP+FPTP
- TP:正确检测到的目标。
- FP:误检,即模型预测有目标,但没有正确匹配到真实目标。
例如,模型预测了 10 艘船,其中 8 个预测符合评估规则,则 Precision 为 80%。
Recall:真实存在的目标有多少被找到了?
Recall=TPTP+FN Recall=\frac{TP}{TP+FN}Recall=TP+FNTP
- FN:漏检,即真实存在的目标没有被正确检测出来。
例如,图像中有 20 艘真实船舶,模型只检测出 15 艘,则 Recall 为 75%。
Precision 和 Recall 存在权衡:降低检测置信度阈值,通常能找出更多目标,但也可能引入更多误检。
假设一组评测图片中一共有 10 艘真实船舶
模型预测了很多候选框,每个框都有一个置信度,表示模型认为它是船舶的程度。
例如:
- 置信度为 0.95:模型认为这个框有 95% 的把握是船舶。
- 置信度为 0.60:模型认为这个框有 60% 的把握是船舶。
这里的置信度不是经过校准后必然准确的概率,而是模型输出的检测分数。
我们可以设置不同的置信度阈值,只保留分数达到阈值的预测框,然后计算 Precision 和 Recall。
Precision=TPTP+FP Precision=\frac{TP}{TP+FP}Precision=TP+FPTP
Recall=TPTP+FN Recall=\frac{TP}{TP+FN}Recall=TP+FNTP
其中:
- TP:正确检测到的船舶数量(True Positive)。
- FP:误检出来的目标数量 (False Positive)。
- FN:没有检测到的真实船舶数量 (False Negative)。
举个例子,阈值设为 0.7 时,模型保留5 个预测框,其中 4 个正确匹配真实船舶,那么:
Precision=45=0.8 Precision=\frac{4}{5}=0.8Precision=54=0.8
如果这 4 个正确检测覆盖了10 艘真实船舶中的 4 艘,那么:
Recall=410=0.4 Recall=\frac{4}{10}=0.4Recall=104=0.4
因此,这个阈值对应 PR 曲线上的一个点:(Recall,Precision)=(0.4,0.8)(Recall, Precision)=(0.4,0.8)(Recall,Precision)=(0.4,0.8)。
二、PR 曲线示例图
下面这张图是一个示意性的船舶检测 PR 曲线。横轴是 Recall,纵轴是 Precision。
示意图用于辅助理解曲线形状;下面的数值例子和计算以明确给出的数据为准。
也可以查看这张由示例数据绘制的曲线:
PR 曲线示例图
怎么理解这条曲线?
- 左上角越好:Precision 和 Recall 都高,误检少,同时漏检也少。
- 向右移动:Recall 增大,通常意味着降低置信度阈值,找出更多真实目标。
- 向下移动:Precision 降低,说明加入的低置信度预测中,可能有更多误检。
- 曲线越靠近右上角,通常检测性能越好。
注意:PR 曲线并不一定严格单调下降,因为真实检测结果中的预测分数、误检和漏检的排列会影响曲线形状。
三、AP 怎么计算?为什么说它是曲线下面积?
AP 是 Average Precision。直观上,它衡量整个 PR 曲线的综合表现,而不是只看一个阈值下的 Precision。
AP≈∫01P(R),dR AP \approx \int_0^1 P(R)\\,dRAP≈∫01P(R),dR
其中:
- RRR是 Recall。
- P(R)P(R)P(R)是对应 Recall 下的 Precision。
可以把 AP 理解成:沿着横轴 Recall 从 0 走到 1,把曲线下方的面积累积起来。
为了简单说明,我们用一组离散数据计算。假设某船舶类别得到如下 PR 点:
| Recall | Precision |
|---|---|
| 0.0 | 1.00 |
| 0.2 | 0.95 |
| 0.4 | 0.90 |
| 0.6 | 0.80 |
| 0.8 | 0.60 |
| 1.0 | 0.30 |
如果用梯形法近似计算曲线面积:
AP≈∑iPi+P_i+12(R_i+1−Ri) AP\approx\sum_i \frac{P_i+P\_{i+1}}{2}(R\_{i+1}-R_i)AP≈i∑2Pi+P_i+1(R_i+1−Ri)
逐段计算:
AP≈0.195+0.185+0.170 +0.140+0.090 =0.780 \begin{aligned} AP \approx {}& 0.195+0.185+0.170\\\ &+0.140+0.090\\\ ={}&0.780 \end{aligned}AP≈=0.195+0.185+0.170+0.140+0.0900.780
因此,这个示例的梯形面积约为 0.78,即 78%。
需要强调:这只是为了教学而使用的梯形积分示例。实际目标检测评估中,AP 的具体计算方式取决于评测协议。例如,VOC 的不同版本和 COCO 都可能使用不同的插值与积分规则,所以不能仅凭几个采样点就认定真实模型的 AP。
四、mAP 怎么计算?
如果只检测一个类别,例如只有ship,那么在相同评测协议下,mAP 就等于这个类别的 AP。
如果检测多个类别,则先分别计算每个类别的 AP,再取平均:
mAP=1C∑_c=1CAPc mAP=\frac{1}{C}\sum\_{c=1}^{C} AP_cmAP=C1∑_c=1CAPc
假设某模型的结果如下:
| 类别 | AP |
|---|---|
| 货船 | 0.90 |
| 快艇 | 0.80 |
| 油轮 | 0.70 |
则:
mAP=0.90+0.80+0.703=0.80 mAP=\frac{0.90+0.80+0.70}{3}=0.80mAP=30.90+0.80+0.70=0.80
也就是 mAP 为 80%。
另外,目标检测中的 AP 和 mAP 通常还要指定 IoU 阈值。比如:
- mAP@0.5:IoU 阈值为 0.5 时,各类别 AP 的平均值。
- mAP@0.5:0.95:分别在 0.50、0.55、……、0.95 的 IoU 阈值下计算 mAP,再对这些结果求平均。
所以,在面试中听到“mAP 提升了 8 个百分点”,一定要追问:究竟是哪种 mAP?从多少提升到多少?评测集是否固定? 只有把这些条件说清楚,才能判断这个提升是否可信。