最近在学习Faster R-CNN进行目标检测,在评估检测结果阶段遇到了目标检测中常用的评价指标mAP。之前不太了解这方面知识,为此搜集了一些博客,做了下总结。
关于mAP的背景知识可以参考目标检测评测指标mAP及计算[译],翻译自国外的一篇博客,很详细。下面的内容主要是关注如何计算mAP(VOC2010以后的计算方法)。
这两个是基本的分类判别指标,是从如下混淆矩阵中得来的:
通常将我们所关注的问题、对象或目标表示为正例,其他的为反例。由该表可以得出:
p r e c i s i o n = T P T P + F P r e c a l l = T P T P + F N precision=\frac{TP}{TP+FP} \\[3mm]recall=\frac{TP}{TP+FN} precision=TP+FPTPrecall=TP+FNTP
precision表示在预测结果中有多少正例被预测到。recall表示所有正例中有多少被预测出来。所谓召回嘛就是原来的目标有多少被召集回来。
在目标检测中即计算预测边界框与GT边界框的重叠程度。
首先要计算每一类的AP(Average Precision)。
比如我们计算person这一类的AP。这里有一组测试集图片,每张图片都事先标记或未标记出person,这样我们就有了person的GT(Ground Truth)边界框。在每张测试图片输入模型后会得到一系列person类的预测边界框,每个边界框都附带有一个置信度。(注意当我们计算person的AP时就只关注这一类的边界框,不考虑其他类的,即使该图片中存在如dog类的GT边界框。)
将每张测试集中的图片进行检测后会得到一系列预测边界框集合,之后将该预测边界框集合按照置信度降序排序。然后对于某一张测试集图片,我们计算在该图片上person类的预测边界框与GT边界框重叠程度(即IoU),如果IoU大于设定阈值(IoU阈值的典型值为0.5)则将该边界框标记为TP,否则标记为FP。对测试集中每张图片的预测边界框均进行如上操作(注意:在计算某一张图片的预测框时会从预测框集合中选取该图片的预测框)。由此会判定预测边界框集合中每个预测边界框属于TP或者FP。
如下面3张图,我们要检测人脸,蓝色框表示GT,绿色框表示预测边界框,旁边的红色数字为置信度。
可以得出有3个GT(GT1,GT2,GT3),3个预测框(BBox1,BBox2, BBox3)。
按照如上方法计算其他所有类的AP,最后取平均值即为mAP(mean Average Precision)。
m A P = ∑ i = 1 C A P i C mAP=\frac{\sum_{i=1}^{C}AP_i}{C} mAP=C∑i=1CAPi
其中 C C C表示总类别数目, A P i AP_i APi表示第 i i i类的AP值。
比如说我们的测试集中类A的GT有7个,经过目标检测模型预测到了10个边界框,经过上次排序及判断操作,有如下结果:
预测边界框 | Confidence | TP | FP |
---|---|---|---|
Bbox1 | 0.9 | 1 | 0 |
Bbox2 | 0.9 | 1 | 0 |
Bbox3 | 0.8 | 0 | 1 |
Bbox4 | 0.7 | 0 | 1 |
Bbox5 | 0.7 | 0 | 1 |
Bbox6 | 0.7 | 1 | 0 |
Bbox7 | 0.7 | 0 | 1 |
Bbox8 | 0.7 | 0 | 1 |
Bbox9 | 0.7 | 1 | 0 |
Bbox10 | 0.7 | 1 | 0 |
按照confidence降序排序。从上表TP可以看出我们预测正确5个(TP=5),从FP看出预测错误5个(FP=5)。除了表中已预测到的5个GT,还有2个GT并未被预测出来(FN=2)。
接下来计算AP,计算前*个BBox得到的precision和recall:
预测边界框 | Rank | TP | FP | Precision | Recall |
---|---|---|---|---|---|
Bbox1 | 1 | 1 | 0 | 1/(1+0)=1 | 1/7=0.14 |
Bbox2 | 2 | 1 | 0 | 2/(2+0)=1 | 2/7=0.29 |
Bbox3 | 3 | 0 | 1 | 2/(2+1)=0.66 | 2/7=0.29 |
Bbox4 | 4 | 0 | 1 | 2/(2+2)=0.5 | 2/7=0.29 |
Bbox5 | 5 | 0 | 1 | 2/(2+3)=0.4 | 2/7=0.29 |
Bbox6 | 6 | 1 | 0 | 3/(3+3)=0.5 | 3/7=0.43 |
Bbox7 | 7 | 0 | 1 | 3/(3+4)=0.43 | 3/7=0.43 |
Bbox8 | 8 | 0 | 1 | 3/(3+5)=0.375 | 3/7=0.43 |
Bbox9 | 9 | 1 | 0 | 4/(4+5)=0.44 | 4/7=0.57 |
Bbox10 | 10 | 1 | 0 | 5/(5+5)=0.5 | 5/7=0.71 |
在计算precision和Recall时Rank*指的是前*个预测边界框的TP和FP之和。
于是我们得到了一个recall阈值列表 [ 0 , 0.14 , 0.29 , 0.43 , 0.57 , 0.71 , 1 ] [0, 0.14, 0.29, 0.43, 0.57, 0.71, 1] [0,0.14,0.29,0.43,0.57,0.71,1],为recall阈值列表中的各值生成对应的precision列表,选择 r e c a l l > = 阈 值 元 素 recall>=阈值元素 recall>=阈值元素所对应的precision的最大值。为此可得precision列表为 [ 1 , 1 , 1 , 0.5 , 0.5 , 0.5 , 0 ] [1, 1, 1, 0.5, 0.5, 0.5, 0] [1,1,1,0.5,0.5,0.5,0]。在这里举个计算的例子吧,比如找recall阈值列表中0.57所对应的precision,当 r e c a l l > = 0.57 recall>=0.57 recall>=0.57时,由上表可得precision为 m a x { 0.44 , 0.5 } = 0.5 max\{0.44, 0.5\}=0.5 max{0.44,0.5}=0.5,其他recall对应precision的选取同理。
有了这两个列表就可以计算类A的AP了, A P = ( 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 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 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。
同样可以通过绘制PR曲线计算线下面积,如下图所示:
AP值即浅蓝色图形的面积,蓝色折线为recall、precision点。
[1] 目标检测评测指标mAP及计算[译] (图1引自该博客)
[2] 理解目标检测当中的mAP (图2-5引自该博客)
[3] 目标检测中的mAP是什么含义?——Wentao的回答 (例子整理自该回答)
[4] 理解IOU、precision、recall、AP、mAP的含义