文章目录
mAP定义及相关概念
- mAP: mean Average Precision, 即各类别AP的平均值;
- AP: PR曲线下面积,后文会详细讲解;
- PR曲线: Precision-Recall曲线;
- Precision: TP / (TP + FP);
- Recall: TP / (TP + FN);
- TP: IoU>0.5的检测框数量(同一Ground Truth只计算一次);
- FP: IoU<=0.5的检测框,或者是检测到同一个GT的多余检测框的数量;
- FN: 没有检测到的GT的数量;
举例计算mAP
假设有3张图如下,要求算法找出face。蓝色框代表标签label,绿色框代表算法给出的结果pre,旁边的红色小字代表置信度。设定第一张图的检出框叫pre1,第一张的标签框叫label1。第二张、第三张同理。
|
|
|
根据IOU(阈值)计算TP、FP
首先我们计算每张图的pre和label的IOU,根据IOU是否大于0.5来判断该pre是属于TP还是属于FP。显而易见,pre1是TP,pre2是FP,pre3是TP。
排序
根据每个pre的置信度进行从高到低排序,这里pre1、pre2、pre3置信度刚好就是从高到低。
在不同置信度阈值下获得Precision和Recall
首先,设置阈值为0.9,无视所有小于0.9的pre。那么检测器检出的所有框pre即TP+FP=1,并且pre1是TP,那么Precision=1/1。因为所有的label=3,所以Recall=1/3。这样就得到一组P、R值。
然后,设置阈值为0.8,无视所有小于0.8的pre。那么检测器检出的所有框pre即TP+FP=2,因为pre1是TP,pre2是FP,那么Precision=1/2=0.5。因为所有的label=3,所以Recall=1/3=0.33。这样就又得到一组P、R值。
再然后,设置阈值为0.7,无视所有小于0.7的pre。那么检测器检出的所有框pre即TP+FP=3,因为pre1是TP,pre2是FP,pre3是TP,那么Precision=2/3=0.67。因为所有的label=3,所以Recall=2/3=0.67。这样就又得到一组P、R值。
绘制PR曲线并计算AP值
根据上面3组PR值绘制PR曲线如下。然后每个“峰值点”往左画一条线段直到与上一个峰值点的垂直线相交。这样画出来的红色线段与坐标轴围起来的面积就是AP值。
在这里
A
P
=
1
∗
0.33
+
0.67
∗
0.33
≈
0.55
AP = 1 * 0.33 + 0.67 * 0.33 \approx 0.55
AP=1∗0.33+0.67∗0.33≈0.55
计算mAP
AP衡量的是对一个类检测好坏,mAP就是对多个类的检测好坏(分别对每一类计算AP)。就是简单粗暴的把所有类的AP值取平均就好了。比如有两类,类A的AP值是0.5,类B的AP值是0.2,那么 m A P = ( 0.5 + 0.2 ) / 2 = 0.35 \ mAP=(0.5+0.2)/2=0.35 mAP=(0.5+0.2)/2=0.35。
计算mAP的工具:https://github.com/Cartucho/mAP
mAP的计算的两种方式
在VOC2010以前,只需要选取当Recall >= 0, 0.1, 0.2, …, 1共11个点时的Precision最大值,然后AP就是这11个Precision的平均值。
在VOC2010及以后,需要针对每一个不同的Recall值(包括0和1),选取其大于等于这些Recall值时的Precision最大值,然后计算PR曲线下面积作为AP值。
代码实现
References
- https://datascience.stackexchange.com/questions/25119/how-to-calculate-map-for-detection-task-for-the-pascal-voc-challenge
- https://www.zhihu.com/question/53405779 推荐
- https://blog.csdn.net/hsqyc/article/details/81702437