本文从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,在原始的数组两边加入了两个值):
对Precision进行平滑后得到:
通过平滑后的数据可以画出下面曲线图:
对于上述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。此时人类别的
由于上面例子图不是很一般,下面根据知乎的图来描述关于积分的计算:
在得到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 (上述的图片来源)