目标检测即识别图片中有哪些物体及物体的坐标。然而,在目标检测中能检测出来的物体又受人为设定,它取决于当前任务(数据集)需要检测的物体有哪些。比如一个目标检测模型的当前任务是检测猫、狗、牛和羊这四种结果,那么模型对任何一张图片的输出结果绝对不会有猪等其他类型的结果。
以图片的左上角为原点(0,0),目标检测的位置信息一般有两种格式:
IOU(intersection over union,交并比),即两个矩形框相交的面积/两个矩形框相并的面积。是目标检测算法中用来评价两个矩形框之间相似度的指标。公式如下:
I O U = A r e a o f i n t e r s e c t i o n A r e a o f u n i o n IOU\;=\;\frac{Area \;of \;intersection}{Area \; of \;union} IOU=AreaofunionAreaofintersection
当IOU大于一定的阈值(一般取0.5),则说明检测到目标物体。但是,数据集中的每一张图片可能包含着不同类别的其他物体,因此,用于图像分类问题的标准指标precision不能直接应用于此。
mAP(Mean Average Precision)是多个分类任务的平均值,而AP是图片中具体某一类Precision-Recall曲线下的面积。mAP则是计算所有类别Precision-Recall 曲线下面积的平均值。
m
A
P
=
∑
i
=
1
C
A
P
i
C
mAP \;=\frac{\sum_{i=1}^CAP_{i}}{C}
mAP=C∑i=1CAPi
其中,C为目标检测任务中的类别数量。
先回顾下在分类评估指标中有以下这么一些定义:
在mAP评价指标中查准率和查全率计算公式如下:
P
r
e
c
i
s
i
o
n
=
T
P
T
P
+
F
P
=
T
P
a
l
l
d
e
t
e
c
t
i
o
n
s
Precision\;=\frac{TP}{TP+FP}\;=\frac{TP}{all \;detections}
Precision=TP+FPTP=alldetectionsTP
R
e
c
a
l
l
=
T
P
T
P
+
F
N
=
T
P
a
l
l
g
r
o
u
n
d
t
r
u
t
h
s
Recall\;=\frac{TP}{TP+FN}\;=\frac{TP}{all \;ground \;truths}
Recall=TP+FNTP=allgroundtruthsTP
得到查准率和查全率之后,绘制P-R曲线就可以计算mAP。举个例子,假设我们有 7 张图片(Images1-Image7),这些图片有 15 个目标,也就是GT的数量;以及 24 个预测边框(红色的框,A-Y 编号表示,并且有一个置信度值):
然后将每张图片的检测框标记成TP还是FP:
并根据检测框的置信度进行降序排序,见下表:
然后依次计算每个标号的Precision和Recall为PR曲线(横轴为Recall,纵轴为Precision)的坐标点,例如标号1的Precision=1/(1+0)=1;Recall=1/15=0.066;那么就得到了PR曲线的第一个坐标(0.066,1).
标号20的Precision=6/(6+20)=0.3;Recall=6/15=0.4。坐标为(0.4,0.3)。其他标号同理,最后得出PR曲线如图下所示:
对于同一个Recall值,取Precision的最大值,如下图所示:
最后AP为曲线下的面积,即A1+A2+A3+A4的面积。
在目标检测任务中,滑动窗口提取特征,经过分类器分类识别后,每个预测窗口都会得到一个置信度值。但是滑动窗口会导致很多窗口与其他窗口存在或者大部分交叉的情况。这时就需要用到NMS来选取那些邻域里分数最高(某一类物体的概率最大),并且抑制那些分数低的窗口,从而达到去除冗余的检测框,保留最好的一个的目的。
首先算法检测出所有预测框,其次将检测框按类别进行分类,将各个类别的检测框及其对应的置信度放入列表predict_list,假设当前predict_list为:[{‘bbox1’: ‘0.83’},{‘bbox2’: ‘0.93’},{‘bbox3’: ‘0.73’},{‘bbox4’: ‘0.63’},{‘bbox5’: ‘0.73’}],然后将置信度最大的预测框从列表B中抽出来放入列表result_list,此时predict_list和result_list变成:predict_list=[,{‘bbox2’: ‘0.53’},{‘bbox3’: ‘0.63’},{‘bbox4’: ‘0.43’}];result_list=[{‘bbox1’: ‘0.83’}],最后将result_list中的bbox1与变化后的predict_list中的其他检测框做IOU计算,IOU大于阈值的框从predict_list中移除,重复上述过程,直到predict_list为空,得到最终的检测结果。