mAP全称为mean average precision,多类别目标平均精度。与其对应的,还有average precision(AP),即单个分类的平均精度。在目标检测任务中,我们常常会见到各类论文中会使用mAP的概念进行精度的总结,这归功于它良好的表达能力。mAP计算方式看起来简单,但很多人却搞不懂这是怎么计算的,网上相关的资料许多也语焉不详,只是粗粗介绍了概念。这篇文章中,我们会详细的讲它的概念、计算公式以及tensorflow的实现。
Precision、Recall、AP的概念
要了解mAP,一般从AP开始,mAP只是其多类的扩展。AP又由两个概念衍生而来:Precision和Recall。
Precision和Recall的公式如下:
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} \\ Recall= \frac{tp} {tp+fn}
Precision=tp+fptpRecall=tp+fntp
其中,p表示positive,即检出目标;n表示negative,即未检出目标;t表示true,即正确;f表示false,即错误。上式中,tp表示检出的正确目标数量,fp表示误检的目标数量,fn表示漏检的目标数量。所以,tp+fp为算法检出目标数,tp+fn为真实目标数量。
一般来说,Precision和Recall无法单独使用。因为在极端条件下,只要认为所有物体都是检出目标,那么我们就能得到Recall为100%,但是precision为0%。反之亦然。所以,这两种变量会配合使用,这就造成统计和比较上的困难。比如A算法达到precision=80%,Recall=50%;B算法达到precision=85%,Recall=45%,此时很难通过这两个指标来比较2种算法的优劣。
由于上述的困难,我们引进了AP的概念。它即Recall和Precision组成曲线下的面积(Area Under Curve,AUC)。
由AP的定义可知,在多分类时,我们可以在每一种类别都得到一个AP。此时,我们可以通过mAP来得到算法精度:
m
A
P
=
1
n
∑
n
i
A
P
i
mAP=\frac {1} {n} \sum_{n}^{i}AP_{i}
mAP=n1n∑iAPi
目标检测中的AP计算及代码实现
下面就讲讲目标检测中是如何计算AP的。
上图中,红框表示真实的目标物体,蓝框表示算法检出的目标物体,左上角的数字代表检出分数。此时,我们需要设置一个IOU阈值(定义见下文),高于该阈值才被认为是检出物体,那么显然,3个蓝框中只有2个算正确检出。假设我们设置了0.5的iou阈值,此时,我们可以画一个precision和recall的对应表格
precision | recall |
---|---|
0.66 | 1 |
0.5 | 0.5 |
1 | 0.5 |
1 | 0 |
一般来说,我们假定precision从小到大(第一个值改为0.5)。将四个点依次绘出,P-R曲线如下:
我们可以很容易得到此时AP=0.5。
上面就是tensorflow/models中,mAP的实现过程。关键点有二,一个是tp_fp_labels的计算方法,戳我看代码;另一个是precision和recall的计算,戳我看代码。
IOU的计算方式
iou的计算很简单,即目标的最小重叠面积与最大轮廓矩形面积的比值
图片来源:https://medium.com/@jonathan_hui/map-mean-average-precision-for-object-detection-45c121a31173
Recall超过1怎么办?
recall有可能超过1吗?在目标检出任务中,这是有可能发生的。假设图像仅有一个目标,但这个物体检出了2个预测框,此时根据定义,recall可以达到2/1=200%。tensorflow/models中使用单个真实物体检出标量(代码在此)is_gt_box_detected来控制重复的检出动作,使recall在1以内。
总结
本文详细讲述了何为mAP,为何用它来定义目标检测算法的精度,以及mAP的计算方法。希望能给研究目标检测的读者带来一点帮助。
最后,祝您身体健康,再见!