目标检测中的mAP理解

1 引语

对于做目标检测的同学来讲,mAP这个评价指标一定是耳熟能详。很多时候,我们在进行实验的过程中,是直接调用别人写好的源码,其原理究竟是什么,会有些模棱两可,至少我是这样。最近刚巧在调试一个模型,发现直接使用COCO API下的评价方法接口,结果不是很好,需要自己处理下才能得到结果,幸运的是,最后明白了mAP的原理,就现学现卖,总结下。

2 混淆矩阵

简单来说,混淆矩阵就是分别统计分类模型归错类,归对类的观测值个数,然后把结果放在一个表里展示出来。这个表就是混淆矩阵。具体如下图:

目标检测中的mAP理解
上图中,具体的含义为:
TP(True Positive):真实值是positive,模型认为是positive的数量
**FN(False Negative)????*真实值是positive,模型认为是negative的数量:这就是统计学上的第一类错误(Type I Error)
**FP(False Positive)????*真实值是negative,模型认为是positive的数量:这就是统计学上的第二类错误(Type II Error)
**TN(True Negative)????*真实值是negative,模型认为是negative的数量

下面引入两个与mAP计算相关的量Percision(精度)和Recall(召回率):

Percision=TP / (TP+FP):分类器认为是正类并且确实是正类的部分占所有分类器认为是正类的比例”,衡量的是一个分类器分出来的正类的确是正类的概率。
Recall=TP / (TP+FN):分类器认为是正类并且确实是正类的部分占所有确实是正类的比例”,衡量的是一个分类能把所有的正类都找出来的能力。
【注意】以上 PercisionRecall各有 两个极端.
1 】如果 Percision是100%,就代表所有分类器分出来的正类确实都是正类。如果 Percision是0%,就代表分类器分出来的正类没一个是正类。光是精度还不能衡量分类器的好坏程度,比如50个正样本和50个负样本,我的分类器把49个正样本和50个负样本都分为负样本,剩下一个正样本分为正样本,这样我的 Percision也是100%,但是*也知道这个分类器很垃圾。
2 】如果Recall是100%,就代表所有的正类都被分类器分为正类。如果Recall是0%,就代表没一个正类被分为正类。

3 IOU(Intersection-over-Union)

其定义为模型产生的目标窗口和原来标记窗口的交叠率(交并率)。具体我们理解为:检测结果(最终生成的框)与真实值Ground Truth的交集比上它们的并集。具体如图:

目标检测中的mAP理解
IOU的计算公式就是上图中,绿色和红色矩形的面积之和减去相交的斜线部分得到的。具体可以看以下计算
IOU=[(|X2-X1||Y2-Y1|)+(|X4-X3||Y4-Y3|)] - (|X2-X3|*|Y2-Y3|)

mAP计算

目标检测中,由于我们既要对图片的物体进行分类,又要进行定位,所以在计算mAP的时候,需要从两方面入手,1)物体的分类效果 2)定位效果,即 Ground-Truth 和 预测框的 IOU。
首先假设我们的模型输出的结果格式为 [cat_id,x1,y1,w,h,score] 即 [种类id,左上横坐标,左上纵坐标,目标宽,目标长,分类得分],而 Ground-Truth 格式为 [cat_id,x1,y1,w,h]
具体步骤如下:

1 针对某一图片中识别结果的 score 得分进行降序排序。
2 依次遍历每个排序好的预测结果,并分别与Ground-Truth中的真实类别进行比较,如果是相同的类别,再进行分别比较该预测结果和真实框的 IOU 值是否大于某一阈值,一般该阈值为 0.5 ,如果满足类别预测对,IOU 检验也通过,就记为预测对的对象。如果不满足,就跳过该真实框,继续下一个真实框与预测框的检测,如果真实框遍历结束,仍没找到合适的,就统计完 Percision 和 Recall 的值 ,继续进行遍历下一个预测框
3 在进行以上步骤时,需要同时统计 Percision 和 Recall 的值
4 当某个图像的预测结果遍历结束后,可以进行计算该图像物体所对应类的 精度值了,主要是根据记录的 Percision 和 Recall 的值进行推演,主要有两种方式:

目标检测中的mAP理解
如上图,前两列是预测的种类Id 和 预测得分,后两列对应精度和召回率。
【注意】:在计算mAP的时候,其实与 score 没有关系,这一点经常容易搞混,score仅仅是帮助我们进行排序,减少mAP计算的遍历次数,因为得分越高的越有可能是正确的值。此外,IOU值也只是一个在判断预测结果是否正确时候的辅助,对于mAP的计算没有关系的,mAP只通过 Percision 和 Recall 的结果进行得出。
在这个例子里,我们可以明显的看出来,因为表格里的前7个结果,其 score 和 IOU 均较大,一般情况下是大于我们实验设置的 预测得分 和 交并比阈值的,所以可以认为以上 7 个数据均为预测的正类,即是 (TP+FP) 的集合,因为可以明显看到,种类那里有明显的不对,因为 有 0 和 1,一般 1 我们认为是和 真实类别一样的类。那下面就进行表格分析:

1 首先看 Percision 那一列,我们在计算 Percision 的时候,结合上面的公式,其实就是 TP/(TP+FP) , 即在前7个我们都假定是正确类别的前提下,当预测类标是 1 的时候,Percision 分子,分母均+1,如果预测类标是 0 的时候,Percision 分子不变,分母+1 .
2 看Recall 那一列,我们可以看到,他的分母始终是 4 因为我们的 Ground-Truth 中的真实数据的量是 4 个 【这里如果你的图像上的目标数量是N ,那 Recall 的分母就是 N】,那么当我们找到一个 预测类标为 1 的即为找到了一个正确的 TP,当预测类标为 0 时,即Recall 分子分母都不变。
以上是表格 分析应该是比较详细的了,要注意仔细看。
下面讲 mAP 计算的两种方法。

我们从表格中的
Percision 值为 : [ 1.0,0.5, 0.67,0.5,0.4,0.6,0.43 ],
Recall 值为 : [ 1/4.1/4. 2/4, 2/4, 2/4, 3/4, 3/4 ],
注意 Recall 和 Percision 是一一对应的。
计算方法一:

取 11 个点,点为 [0:0.1:1],也就是从0开始,每隔0.1一个点,直到 1.0 总共是 11个点。然后依次取11个点中的一个与 Recall 列表中数据进行对比,查找 Recall >= 11点中某一点 时候,Percision 对应的最大值。
比如:Recall 0.25>=0.0 时,Percision 最大为 1.0,则记下,Recall 0.5>=0.5 时, Percision 最大为 0.67 … 最后,我们可以得到
11 个点 [ 0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0] 对应的
PercisionMax 序列为 [1.0,1.0,1.0,0.67,0.67,0.67,0.6,0.6,0.,0.,0.]
所以

Average Percision=(1.0+1.0+1.0+0.67+0.67+0.67+0.6+0.6+0.+0.+0.)/11=0.56

计算方法二:
是针对每一个不同Recall值(M个正例就有M个recall值)即最后的 Recall 是在原来基础上去过重的,选取大于Recall时的最大精度值,并基于这些值计算AP,上面例子中有 7 个正例 , 取 recall>=对应recall(包括0,1)的精度最大值,记为 PercisionMax ,如下:
[0., 1/4.2/4, 3/4 ,1.] 对应的 PercisionMax [ 1., 0.67, 0.6,0] 注意 这里PercisionMax 是从 1/4 开始比较的 ,这样才对。这个细节扣一下,代码里需要斟酌怎么操作的。具体运算如下:

Average Percision =(1/4-0.)*1.+( 2/4-1/4)*0.67+( 3/4-2/4)0.6+(1-3/4)0=0.5675

可以看出,第二种方法是比第一种方法的结果要好一些,但是第一种方法是个改进版,但是很多代码里用的是第二种方法,哈哈哈 不说也知道什么意思咯。
注意 如果一幅图像里有多个类别,是需要多个类别计算多个 AP 的 ,分别加在对应类的 AP和 上去。
然后把以上每个类别的 AP 的和 再除以 包含每个类别的图片总数 ,因为你最终得AP和是每张图片中对应类对象的AP之和,所以需要除以总的包含该类对象图片的数目, 然后得到的是每个类的 真正AP值 , 最后的总类数就是 mAP 了。

【如有问题,欢迎指正!!】