0. 前言
引入
在目标检测中,mAP是常用的性能指标,但一直没有完全搞清楚。 好像对于不同的数据集/任务,使用的mAP也有不同,比如Pascal VOC和COCO的就有所不同。 在计算mAP的过程中会用到IOU,而IOU的计算又与TP/FP/TN/FN有关联。 之前一直对 accuracy, recall, precision 没有完全透彻的搞明白。
1. TP/FP/TN/FN 与 accuracy/precision/recall
这些概念应该属于机器学习入门知识,现在才完全搞明白,这就体现出我的基础到底有多烂。 参考资料:
1.1. TP/FP/TN/FN
混淆矩阵中的四个分量,对应下面图片。
True Positive, TP;False Positive, FP;True Negative, TN;False Negative, FN Positive/Negative用来表示预测的结果,预测是1则就是Positive,预测是0则表示Negative。 True/False 用来表示预测结果是否正确,正确则为True,错误则为False。
1.2. accuracy/precision/recall
机器学习常用的几个性能指标。 accuracy,准确率,是预测正确的样本数除以所有样本数,即
a
c
c
u
r
a
c
y
=
T
P
+
T
N
T
P
+
F
P
+
T
N
+
F
N
accuracy = \frac{TP+TN}{TP + FP + TN + FN}
a c c u r a c y = T P + F P + T N + F N T P + T N recall:
召回率,在所有正样本中,预测为正的样本概率,即
r
e
c
a
l
l
=
T
P
T
P
+
F
N
recall = \frac{TP}{TP+FN}
r e c a l l = T P + F N T P 理解:recall越高,所有真实正样本中被预测为正样本的概率
越高,即“宁可错杀一万不可放过一个”。 场景:如果正样本没有被预测出来则会导致很坏结果,如判断病人有没有生病,导弹预测。 召回 两字的理解:在所有正样本中,召回(预测)了多少正样本。 precision:
即精确率,所有预测为为正的杨根本中,真正属于正样本的概率,即
p
r
e
c
i
s
i
o
n
=
T
P
T
P
+
F
P
precision = \frac{TP}{TP + FP}
p r e c i s i o n = T P + F P T P precision越高,则所有预测为正的样本中的确为正样本的概率
越高, 场景:如果预测为正的样本中存在负样本会导致很坏的结果,如嫌犯定罪。 下面图片帮助理解:
recall/precision 属于鱼和熊掌,不可兼得。
2. IOU
参考资料:目标检测番外篇(1)_IoU 基本理解:上面的参考文献中给出了配图
实现思路:
一般输入是两个bbox的信息,即两组 xmin, ymin, xmax, ymax
。 IOU实现的重点就是两个bbox交
的面积
计算IOU就是要计算两个bbox的交
与并
的面积。 bbox并
的面积,其实就是两个bbox的面积减去bbox交
的面积。 所以,难点就是计算两个bbox的交
。 需要考虑的情况有很多:
两个bbox没有相交部分。 一个bbox在另一个bbox中。 其他普通情况 下面代码来自上面的参考文献,很清楚了,就不多说了。
def get_IoU ( pred_bbox, gt_bbox) :
"""
return iou score between pred / gt bboxes
:param pred_bbox: predict bbox coordinate
:param gt_bbox: ground truth bbox coordinate
:return: iou score
"""
assert ( ( abs ( pred_bbox[ 2 ] - pred_bbox[ 0 ] ) > 0 ) and
( abs ( pred_bbox[ 3 ] - pred_bbox[ 1 ] ) > 0 ) )
assert ( ( abs ( gt_bbox[ 2 ] - gt_bbox[ 0 ] ) > 0 ) and
( abs ( gt_bbox[ 3 ] - gt_bbox[ 1 ] ) > 0 ) )
ixmin = max ( pred_bbox[ 0 ] , gt_bbox[ 0 ] )
iymin = max ( pred_bbox[ 1 ] , gt_bbox[ 1 ] )
ixmax = min ( pred_bbox[ 2 ] , gt_bbox[ 2 ] )
iymax = min ( pred_bbox[ 3 ] , gt_bbox[ 3 ] )
iw = np. maximum( ixmax - ixmin + 1 . , 0 . )
ih = np. maximum( iymax - iymin + 1 . , 0 . )
inters = iw * ih
uni = ( ( pred_bbox[ 2 ] - pred_bbox[ 0 ] + 1 . ) * ( pred_bbox[ 3 ] - pred_bbox[ 1 ] + 1 . ) +
( gt_bbox[ 2 ] - gt_bbox[ 0 ] + 1 . ) * ( gt_bbox[ 3 ] - gt_bbox[ 1 ] + 1 . ) -
inters)
overlaps = inters / uni
return overlaps
3. mAP
3.1. 基本思路
mAP的计算会用到precision/recall以及IOU。 计算precision/recall:
检测结束后,每张图获取若干最终结果pred bboxes。 每张图片本身有gt bboxes。 依次计算每张图片、每类物体的 pred bboxes 与 gt bboxes 之间的IOU。 IOU大于一定阈值(如0.5)且对应gt bbox未与其他pred bbox对应的记作TP。 IOU小于阈值,或IOU大于阈值但gt bbox与其他pred bbox关联,对应则记为FP。 没有对应pred bbox 的 gt bbox 被看过只FN。 统计数据集中所有图片的TP/FP/FN,,就可以计算 precision 和 recall。 另外,检测结果(即 pred bboxes)的确认,是通过置信度大小来设置的,即可以通过置信度来控制预测bbox的Positive/Negative。 mAP,其实就是 mean AP,即对每一类物体计算AP,然后再求所有类的平均。
AP,就是 average precision,就是在若干固定recall的情况下计算precision,然后求precision的平均数。 总结一下相关概念:
mAP:mean average precision AP: average precision,PR曲线下的面积 Presicion = TP / (TP + FP) Recall = TP/ (TP + FN) TP: IOU 大于阈值的bbox数量(每个gt bbox只有一个对应的 pred bbox) FP: IOU 小于阈值或同一gt bbox多余的bbox的数量。 FN:没有检测到的gt bbox数量。
3.2. 实例
下面的例子来自 这里 ,不了解原始出处。 对于一次物体检测任务,得到以下结果:
绿色的是gt bboxes,红色的是pred bboxes。 对于所有pred bboxes,根据置信度排序(confidences)得到以下表格
Confidences 表示置信度,TP 表示该 pred bbox 是否与某个gt bbox对应,即IOU是否大于阈值。 Acc TP 表示累计 TP数量,Acc FP表示累计FP数量。 Precision与Recall分别代表当前点的累计准确率与召回率,可以看做是置信度阈值为X(即对应行Confidences的取值)时的recall与precision。 根据上面的表格,可以获得以下PR曲线:
注意,从上面的表格从上到下,置信度(confidences)逐渐减小,recall肯定是增加的(因为肯定会有越来越多的TP被包含其中)。 从表格上看,当新增一个TP时,PR曲线会向右上方移动。当新增一个FP时,PR曲线会向正下方移动。 Pascal VOC 2008:
Interpolated AP,即进行差值计算AP。 具体方法:对每一个Precision值,使用其右边最大的Precision值替代。 如下图,就是利用红色虚线取代蓝色曲线。 实际计算方法如下图,就是对平滑后的Precision曲线进行均匀采样出11个点(每个点间隔0.1),然后计算这11个点的平均Precision。 Pascal VOC 2012
Area under curve AUC。 Pascal VOC 2007 的方法由于插值点数量太少,很容易导致结果不准确。 示意图如下,可以理解为算了无数个点的面积平均,所以结果要准确一些。 COCO
使用101个点的内插mAP(Interpolated AP)。 使用了不同IOU阈值,不同尺度下的AP平均来作为评测结果,比如AP @ [.5 : .95]对应于IoU的平均AP,从0.5到0.95,步长为0.05。
3.2. TODO:源码分析