看了几篇相关资料,知乎上一篇文章(https://zhuanlan.zhihu.com/p/43068926)写的容易理解,转载以学习。为了方便理解,我在文中自己画了一个P-R曲线,读完本文以后足够理解AP和mAP了,其具体计算过程可以参考我另一篇博客中第五部分:https://blog.csdn.net/zhou4411781/article/details/105112058
图像分类任务通常用accuracy来衡量模型的准确率,对于目标检测任务,比如测试集上的所有图片一共有1000个object(这里的object不是图片的数量,因为一张图片中可能包含若干个object),两个模型都正确检测出了900个object(IOU>规定的阈值)。与图像分类任务不同的是,目标检测因为可能出现重复检测的情况,所以不是一个n to n的问题。也就不能简单用分类任务的accuracy来衡量模型性能,因为模型A有可能是预测了2000个结果才中了900个,而模型B可能只预测了1200个结果。模型B的性能显然要好于A,因为模型A更像是广撒网,误检测的概率比较高。想象一下如果将模型A用在自动驾驶的汽车上,出现很多误检测的情况对汽车的安全性和舒适性都有很大影响。
那在目标检测任务中,应该怎样衡量模型的性能?其中一个标准就是信息检索那样,不仅要衡量检测出正确目标的数量,还应该评价模型是否能以较高的precision检测出目标。也就是在某个类别下的检测,在检测出正确目标之前,是不是出现了很多判断失误。AP越高,说明检测失误越少。对于所有类别的AP求平均就得到mAP了。
(1)voc2007的计算方法:
在计算AP时,首先要把结果按照置信度排序,公式如下:
(2)voc2010的计算方法:
比起07年,10年以后的新方法是取所有真实的recall值,按照07年的方法得到所有recall/precision数据点以后,计算recall/precision曲线下的面积:
Compute a version of the measured precision/recall curve with > precision monotonically decreasing, by setting the precision for > recall r to the maximum precision obtained for any recall r′ ≥ r.
Compute the AP as the area under this curve by numerical integration. No approximation is involved since the curve is piecewise constant.
举一个例子具体说明:
对于Aeroplane类别,我们有以下输出(BB表示Bounding Box序号,IOU>0.5时GT=1):
BB | confidence | GT
----------------------
BB1 | 0.9 | 1
----------------------
BB2 | 0.9 | 1
----------------------
BB1 | 0.8 | 1
----------------------
BB3 | 0.7 | 0
----------------------
BB4 | 0.7 | 0
----------------------
BB5 | 0.7 | 1
----------------------
BB6 | 0.7 | 0
----------------------
BB7 | 0.7 | 0
----------------------
BB8 | 0.7 | 1
----------------------
BB9 | 0.7 | 1
----------------------
因此,我们有 TP=5 (BB1, BB2, BB5, BB8, BB9), FP=5 (重复检测到的BB1也算FP)。除了表里检测到的5个GT以外,我们还有2个GT没被检测到,因此: FN = 2. 这时我们就可以按照Confidence的顺序给出各处的PR值,如下:
rank=1 precision=1.00 and recall=0.14
------------------------------
rank=2 precision=1.00 and recall=0.29
------------------------------
rank=3 precision=0.66 and recall=0.29
------------------------------
rank=4 precision=0.50 and recall=0.29
------------------------------
rank=5 precision=0.40 and recall=0.29
------------------------------
rank=6 precision=0.50 and recall=0.43
------------------------------
rank=7 precision=0.43 and recall=0.43
------------------------------
rank=8 precision=0.38 and recall=0.43
------------------------------
rank=9 precision=0.44 and recall=0.57
------------------------------
rank=10 precision=0.50 and recall=0.71
------------------------------
(1)07年的方法:我们选取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
(2)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。计算recall/precision下的面积:AP = (0.14-0)x1 + (0.29-0.14)x1 + (0.43-0.29)x0.5 + (0.57-0.43)x0.5 + (0.71-0.57)x0.5 + (1-0.71)x0 = 0.5
计算出每个类别的AP以后,对于所有类别的AP取均值就得到mAP了。