目标检测评价指标

基本概念

mAP: mean Average Precision,即各类别AP的平均值

AP: PR曲线下面积,后文会详细讲解

PR曲线: Precision-Recall曲线

Precision: TP / (TP + FP)

Recall: TP / (TP + FN)

TP: IoU>0.5的检测框数量(同一Ground Truth只计算一次)

FP: IoU<=0.5的检测框,或者是检测到同一个GT的多余检测框的数量

FN: 没有检测到的GT的数量

其实Precision和Recall就是分母不同,一个分母是预测为正的样本数,另一个是原来样本中所有的正样本数。

注意:一般来说mAP针对整个数据集而言的;AP针对数据集中某一个类别而言的;而percision和recall针对单张图片某一类别的。

mAP的具体计算

由前面定义,我们可以知道,要计算mAP必须先绘出各类别PR曲线,计算出AP。而如何采样PR曲线,VOC采用过两种不同方法。参见:The PASCAL Visual Object Classes Challenge 2012 (VOC2012) Development Kit

  1. 在VOC2010以前,只需要选取当Recall >= 0, 0.1, 0.2, …, 1共11个点时的Precision最大值,然后AP就是这11个Precision的平均值。

  2. 在VOC2010及以后,需要针对每一个不同的Recall值(包括0和1),选取其大于等于这些Recall值时的Precision最大值,然后计算PR曲线下面积作为AP值。

  3. COCO数据集,设定多个IOU阈值(0.5-0.95,0.05为步长),在每一个IOU阈值下都有某一类别的AP值,然后求不同IOU阈值下的AP平均,就是所求的最终的某类别的AP值。

下面给出某一个类别AP的计算示例:

对于多类别目标检测,首先选定一个类别,比如说Aeroplane类别,从检测器中筛选出这种类别的检测框(其他类别的先不管,并且这里是所有图片的结果)。假设网络有以下输出(BB表示BoundingBox序号,IoU>0.5时GT=1):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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
----------------------

这里需要注意的有如下几点:

  1. 这里的confidence一般指的是分类得分,也就是预测框中物体属于Aeroplane类别的概率
  2. 上面各行是按照confidence进行排序的,跟后面计算时的rank对应;另外这样排序后也方便将检测到同一个GT的多余检测框去掉
  3. 这里有两个BB1,这两个并不是同一个bbox,指的是同一个GT匹配上了不同的bbox
  4. 因为percision和recall针对单张图片某一类别的。而在实际计算的时候,是将所有图片该类别的检测结果和GT放到一块计算的。

因此,我们有 TP=5 (第一个BB1, BB2, BB5, BB8, BB9), FP=5 (重复检测到的BB1也算FP)。除了表里检测到的5个GT以外,我们还有2个GT没被检测到,因此: FN = 2. 这时我们就可以按照Confidence的顺序给出各处的PR值,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
----------

对于上述PR值,如果我们采用:

  1. VOC2010之前的方法,选取$Recall >= 0, 0.1, …, 1$的11处Percision的最大值:$1, 1, 1, 0.5, 0.5, 0.5, 0.5, 0.5, 0, 0, 0$。此时Aeroplane类别的 $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$。此时Aeroplane类别的 $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$
  3. COCO数据集,设定多个IOU阈值(0.5-0.95,0.05为步长),在每一个IOU阈值下都有某一类别的AP值,然后求不同IOU阈值下的AP平均,就是所求的最终的某类别的AP值。

mAP就是对每一个类别都计算出AP然后再计算AP平均值就好了

建议参考GluonCV库里面的voc_detection.py实现了两种mAP计算方式,思路清晰:https://github.com/dmlc/gluon-cv/blob/master/gluoncv/utils/metrics/voc_detection.py

参考

目标检测中的mAP是什么含义? - Wentao的回答 - 知乎
目标检测的性能评价指标
如何解释召回率与精确率? - Charles Xiao的回答 - 知乎

------ 本文结束------
坚持原创技术分享,您的支持将鼓励我继续创作!

欢迎关注我的其它发布渠道