本文从ap计算到map计算,最后到coco[0.5:0.95:0.05] map的计算,一步一步拆解物体检测指标map的计算方式。
一、ap计算方法
一个数据集有多个类别,对于该数据库有5个gt,算法检测出来10个bbox,对于人这个类别来说检测有下面结果,IoU>0.5时为GT与bbox之间是匹配关系。
GT-boxes | BB | confidence | IoU>0.5 | TP | FP | precision | recall |
---|---|---|---|---|---|---|---|
GT1 | BB1 | 0.9 | 1 | 1 | 0 | 1.00 | 0.14 |
GT2 | BB2 | 0.9 | 1 | 1 | 0 | 1.00 | 0.29 |
GT1 | BB3 | 0.8 | 1 | 0 | 1 | 0.67 | 0.29 |
BB4 | 0.7 | 0 | 0 | 1 | 0.50 | 0.29 | |
BB5 | 0.7 | 0 | 0 | 1 | 0.40 | 0.29 | |
GT3 | BB6 | 0.7 | 1 | 1 | 0 | 0.50 | 0.43 |
BB7 | 0.7 | 0 | 0 | 1 | 0.43 | 0.43 | |
BB8 | 0.7 | 0 | 0 | 1 | 0.38 | 0.43 | |
GT4 | BB9 | 0.7 | 1 | 1 | 0 | 0.44 | 0.57 |
GT5 | BB10 | 0.7 | 1 | 1 | 0 | 0.50 | 0.71 |
根据上述结果可以计算出如下结果,要注意的是BB1\BB3都与GT1匹配,所以BB3计算的时候是false positive。
那么就可以得到两个数组(为了符合0-1,在原始的数组两边加入了两个值):
P r e c i s i o n = [ 0 ] + [ 1 , 1 , 0.67 , 0.50 , 0.40 , 0.50 , 0.43 , 0.38 , 0.44 , 0.50 ] + [ 0 ] Precision = [0] + [1, 1, 0.67, 0.50, 0.40, 0.50, 0.43, 0.38, 0.44, 0.50] + [0] Precision=[0]+[1,1,0.67,0.50,0.40,0.50,0.43,0.38,0.44,0.50]+[0]
R e c a l l = [ 0 ] + [ 0.14 , 0.29 , 0.29 , 0.29 , 0.29 , 0.43 , 0.43 , 0.43 , 0.57 , 0.71 ] + [ 1 ] Recall = [0] + [0.14, 0.29, 0.29, 0.29, 0.29, 0.43, 0.43, 0.43, 0.57, 0.71] + [1] Recall=[0]+[0.14,0.29,0.29,0.29,0.29,0.43,0.43,0.43,0.57,0.71]+[1]
对Precision进行平滑后得到:
P r e c i s i o n = [ 1. , 1. , 1. , 0.67 , 0.5 , 0.5 , 0.5 , 0.5 , 0.5 , 0.5 , 0.5 , 0. ] Precision = [1., 1., 1., 0.67, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.] Precision=[1.,1.,1.,0.67,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.]
通过平滑后的数据可以画出下面曲线图:
对于上述PR值,如果我们采用:
- VOC2010之前的方法,我们选取Recall >= 0, 0.1, …, 1的11处Percision的最大值:1, 1, 1, 0.5, 0.5, 0.5, 0.5, 0.5, 0, 0, 0。此时人类别的 AP = 5.5 / 11 = 0.5
- VOC2010及以后的方法,对于Recall >= 0, 0.14, 0.29, 0.43, 0.57, 0.71, 1,我们选取此时Percision的最大值:1, 1, 1, 0.5, 0.5, 0.5, 0。此时人类别的$ AP = (0.14-0)*1 + (0.29-0.14)*1 + (0.43-0.29)*0.5 + (0.57-0.43)*0.5 + (0.71-0.57)*0.5 + (1-0.71)*0 = 0.5$
由于上面例子图不是很一般,下面根据知乎的图来描述关于积分的计算:
在得到P和R后,可以画出PR曲线如下所示:
对PR曲线进行平滑处理,即对PR曲线上的每点Precision值都取右侧最大值,平滑操作如下:
得到平滑后的曲线后,VOC2010年之前的方法是采样11个点,来计算AP
VOC2010之后改用求Area under curve方式,即曲线的积分来得到AP
二、map的计算
得到一类的ap后,多个类别求平均即为map
三、coco[0.5:0.95:0.05] map的计算
每个IoU在多类别上都可以得到map,多个IoU的平均就是coco[0.5:0.95:0.05] map的指标。个人认为应该称为mmap会形象一点。
参考文献:
- https://www.zhihu.com/question/53405779/answer/419532990 (上述例子来源,但是有所修改,因为他的例子有点问题)
- https://zhuanlan.zhihu.com/p/88896868 (上述的图片来源)