目标检测之相关指标介绍
前言: 该篇为【目标检测】系列博文的开篇,也作为自己目标检测入门学习的总结和督促。内容主要是定性地介绍一些目标检测中常见术语和相关指标。
其中,术语和指标包括但不限于:标准框(Ground-truth bounding box),混淆矩阵(Confusion Matrix),交并比(Intersection over Union, IoU),非极大值抑制(Non-Maximum Compression, NMS), 置信度,真阳性(True Positive, TP),假阳性(False Positive, FP),真阴性(True Negative, TN),假阴性(False Negative, FN),TPR,FPR,敏感度(Sensitivity),特异度(Specificity),
F
β
_
S
c
o
r
e
F_{\beta}\_Score
Fβ?_Score,准确率(Precision),召回率(Recall),P-R曲线,ROC曲线,AUC,AP,mAP等等。
本文主要为从新手入门角度,了解相关术语和指标的来源和含义,不牵扯到具体的目标检测网络结构。
内容仅为自己学习中的个人理解,如有错误,会及时改之。
0 引入
0.1 一个检测问题
输入下面一张图,要求检测图中是否包含狗狗(目标),若包含,标注出其位置(如红框所示)。
0.2 定性分析
上述即是个标准的目标检测问题。且为简单的单目标检测问题。
从上述问题描述中,也可以看出,其包含了两部分内容:
(1)检测是否存在狗狗(分类)
(2)标注出所在位置(定位)
本节暂且不考虑如何具体详尽地解决该问题,而只定性分析,从而了解目标检测中一些常用术语和指标的来源及含义。
针对该问题可以想到一个简单的解决思路:
在图上生成无数个覆盖所有大小范围的(预定位)方框,用方框剪切图像,然后挨个检测每个方框剪切后的图像是否包含着狗狗,且方框完美包含。
这确切说是得到一个能够解决上述问题的一个神经网络的训练思路。而非上述问题的直接解决方案。
该思路可类比参考RCNN(不知尚可),但不完全相同,RCNN是确定分类类型后,对方框进行位置精修。
按照分析和该解决思路,举例详细说明下。
如下图,标注出了上述无数覆盖所有大小范围方框的其中三个方框作为示意。
按照上述思路,也即,将覆盖所有大小范围的方框所框选的内容(上图右侧所示)逐一送入到某一网络,只需检测其是否包含着狗狗且完美包含即可。
如上图中,1号框明显不包含狗狗,PASS掉;2号框虽然包含狗狗,但似乎包含得不那么完美,PASS掉;3 号框包含着狗狗,且完美包含,那么就可以作为最终检测输出结果,目标达成。
此时 3 号框内容和方框位置即为我们得到的最终分类和定位结果。
0.3 术语与指标
其实,上述问题的分析过程中就已经隐藏着诸多目标检测需要注意的术语和指标。
以下通过问题来引入,更深入了解其含义:
-
如何表征方框内是否包含着目标对象? 上图 1 号框,我们通过肉眼观察可知,不包含狗狗,分类结果可以描述其为”背景“;上图 2 号框和 3 号框,肉眼观察可知,包含着狗狗。而对于计算机而言,如何表达这种差异呢?毕竟计算机也不像人眼那么可以非黑即白的百分百地判断出图中包含内容,更毕竟,有时人眼观察到模糊图像也不能保证百分百区分出来。 答案是我们可以使用一个 0~1 的数值来表征,该数值越接近 1,表示越确信其方框框选内容中包含着目标对象,即大小表征着对判断内容为目标类别的自信程度。 在目标检测中,用于此目的的数值被称为分类置信度。该值代表当前方框中是否存在对象的概率。记为
P
r
(
o
b
j
e
c
t
)
P_r(object)
Pr?(object) 。
了解分类网络的应该熟悉,通常模型输出后常接softmax,从而得到每个类别的置信度分数。此处的分类置信度即为针对狗狗类别的置信度分数。
-
如何表征方框完美包含了目标对象? 为何要强调完美包含这词呢?如上图 2 号框和 3 号框所示,可以完全确定都包含着狗狗,即分类置信度可能都为 1。但从肉眼观察我们得知,3 号框可能更是我们想要的,而 2 号框位置有点点偏颇。那么如何来表征这种差异呢? 这里我们就需要引入一个“标准答案”,即一个标准框,也就是监督学习中的“标签”。因为如果没有“标准答案”,我们无从定义“完美”一词。在目标检测中,这一“标准答案”,或者说是“标签”被称作标准框(Ground-truth bounding box,GT)。而上述中,我们生成的无数的一个个方框被称为预测框(Predicted bounding box)。 在有了“标准答案”,完美也就很好定义了。也就是无数预测框中的其中一个预测框恰好与标准框完全重合,此时预测框即为我们想要的完美结果。同样,对于计算机而言需要数字来表征该点。在目标检测中用于该目的的数值叫做交并比(Intersection over Union, IoU) 。 交并比简单理解就是预测框与标准框的重叠程度。上述完美包含的情况即对应着 IoU = 1。交并比是从集合角度来计算,“交”即集合中的交集,“并”即集合中的并集。本小节不具体展开说明,本节只做引入,后节有详述。 从上图中可以看出,(假设标签设定的标准框位置就是3号框所在位置),对于 1 号框,IoU = 0;对于 2 号框,与标准框重叠了一大部分,IoU 可能是 0.8(具体没计算,只是示意值);对于 3 号框,与标准框完全重叠,即 IoU = 1。 -
如何处理无法穷尽生成覆盖所有大小范围的方框这一事实。 事实上,上述解决思路中有一个极大的BUG,即以生成无数个覆盖所有大小范围的(预定位)方框作为前提,但实际上,对计算机而言无法实现,且不可能去实现。 那么上述分析中,对于有限的、无法覆盖所有大小范围的方框就会出现一些问题。可也要相信一个事实是,很多理论都是从理想条件向实际条件迈步的,该问题同样也可,只是需要添加一些描述。 首先,有限方框下,面临第一个问题就是可能无法达到“完美包含“这一目标。即生成的有限预测框可能没有恰巧与标准框重合(即IoU=1)情况。 似乎该问题也很好解决,常规思路是,“只需取 IoU 最大情况”即可,也即取预测框与标准框重叠最多的情况。但这也只是针对单目标检测而言,而且,“取最大值情况”这一动态操作在网络中如何去具体实现是值得怀疑的。此外,对于多目标检测,如一个图中包含着两个目标,即两个 GT 框(Ground-truth bounding box) ,我们可能最终需要两个预测框,两个框的 IoU 很难一样,而我们两者都需要,就不存在着只取最大值。 在目标检测中,解决该问题的方法是,对于 IoU 设定一个阈值。大于该阈值的,即可将此时预测框标注为可输出结果,更术语一点叫“正样本”。通常 IoU 可设定为 0.5。 但此时又会出现一个问题,即 2 号框 和 3 号框的问题(当然实际中很大概率是并不止这两个),两者都是正样本,都可作为输出结果,但我们只需要一个输出结果,这就需要去除冗余预测框。从肉眼看,我们可能更想要 3 号框。
插一句,在这里,1 号框定位完全错误,3 号框定位看起来比2 号框更准可以直观地通过预测框与真实框的 IoU 值大小来体现,此时含义下的 IoU 值大小在目标检测中有另外一个名词,叫定位置信度,也即定位准确的可信程度。记为
I
O
U
p
r
e
d
t
r
u
t
h
IOU_{pred}^{truth}
IOUpredtruth? 。 这里会有个奇怪的问题,会给人一个错觉。即按照上述理论,似乎我们只需参考定位置信度便可了,因为似乎定位置信度的 IoU 就是表征着 预测框与标准框,即预测值与真实值差距。标准框就已经是目标对象的标准框,已经包含了目标对象,我们只需要 IoU 足够大,即预测框与标准框重合度足够高即可,因为标准框中一定包含着目标对象。产生此错觉的原因在于,我们是基于单类别单目标检测。如果存在多个类别目标多个GT框,那么我们就需要分类置信度和定位置信度来确定损失函数。此外,上述所有内容只是做了定性分析,未深入具体的实现原理,仅为了引入相关术语和指标用。
先忽略以上错觉,继续接着上面想法,我们可以通过某种手段来删去重复结果,留下最佳结果。这种手段参考的数值可以有每个结果框的置信度、结果框间的IoU(这里是预测框间的IoU,不同于上述预测框与标签框的IoU)。这里的置信度是最终结果框的置信度,可能不仅仅单一参考分类或定位。只使用定位置信度的话,可能会出现定位准但分类差的不好情况,只使用分类置信度,可能会出现分类准但定位差的不好情况。因此,我们可以考虑使用同时包含分类和定位置信信息的值,即上述的置信度,记为
C
C
C。计算如下
C
=
P
r
(
p
r
o
j
e
c
t
)
?
I
O
U
p
r
e
d
t
r
u
t
h
C = P_r(project) * IOU_{pred}^{truth}
C=Pr?(project)?IOUpredtruth? 基于置信度和IoU来保留图中某一个目标的唯一预测结果。过程大致为通过IoU 删去置信度偏小所对应的方框,保留置信度尽量大的框框作为最终结果。 该上述删去重复结果、冗余预测框的过程,在目标检测中被称为非极大值抑制(Non-Maximum Suppression, NMS)。
0.3 小结
上述定性分析,引入了诸多目标检测可能牵扯到的术语和指标,包括了
Ground-truth bounding box, Predicted bounding box, Intersection over Union(IoU), Non-Maximum Suppression(NMS), 置信度等。
这些都是一些通过定性分析得到的一些基础内容。还有一大块重要内容——目标检测性能指标——未展示。
下面将从更理论角度出发来,从头再次对相关术语和指标进行梳理。
其中会包含一些指标计算的编程实现。
1 实现
1.1 方框坐标表示
目标检测需要实现对目标的定位,因此离不开定位结果表示,通常是使用方框表征。
方框表示有多个方法,包括
(1)左上角点坐标
(
x
1
,
y
1
)
(x_1,y_1)
(x1?,y1?) 和 右下点坐标
(
x
2
,
y
2
)
(x_2,y_2)
(x2?,y2?)
(2)左上角点坐标
(
x
1
,
y
1
)
(x_1,y_1)
(x1?,y1?) 和 长宽
(
w
,
h
)
(w, h)
(w,h)
(3)中心点坐标
(
x
0
,
y
0
)
(x_0,y_0)
(x0?,y0?) 和 长宽
(
w
,
h
)
(w,h)
(w,h)
三种方法都是等价的互通的,可以互相转化。
通常使用第(3)种方法,也即
(
x
0
,
y
0
,
w
,
h
)
(x_0,y_0,w,h)
(x0?,y0?,w,h) 来表示一方框。
1.2 交并比 IoU(Intersection over Union)
基本概念
通常预测框 (predicted bounding box) 和真实框 (ground-truth bounding box) 可表示如下
交并比表征了预测框(用
B
p
r
e
d
B_{pred}
Bpred?表示)和真实框(用
B
G
T
B_{GT}
BGT?)的重叠程度。是从集合角度进行的描述。
“交”即两者交集,“并”即两者并集,“比”即比值。本质上是面积的比值。
用式子描述如下:
I
o
U
=
I
n
t
e
r
s
e
c
t
i
o
n
U
n
i
o
n
=
B
p
r
e
d
∩
B
G
T
B
p
r
e
d
∪
B
G
T
IoU = \frac{Intersection}{Union} = \frac{B_{pred}\cap B_{GT}}{B_{pred}\cup B_{GT}}
IoU=UnionIntersection?=Bpred?∪BGT?Bpred?∩BGT?? 用图像示意如下:
理论计算
根据 1.1,预测框和真实框都可以使用坐标进行表示。三种坐标可以相互转化,为了方便说明,假设采用第一种表示方式。即 预测框
(
x
1
p
r
e
d
,
y
1
p
r
e
d
,
x
2
p
r
e
d
,
y
2
p
r
e
d
)
(x1_{pred},y1_{pred},x2_{pred},y2_{pred})
(x1pred?,y1pred?,x2pred?,y2pred?) ,真实框
(
x
1
G
T
,
y
1
G
T
,
x
2
G
T
,
y
2
G
T
)
(x1_{GT},y1_{GT},x2_{GT},y2_{GT})
(x1GT?,y1GT?,x2GT?,y2GT?)。
预测框与真实框交集同样为方框。若交集方框左上角坐标记为
(
x
1
i
n
t
e
r
,
y
1
i
n
t
e
r
)
(x1_{inter}, y1_{inter})
(x1inter?,y1inter?) ,右下角坐标记为
(
x
2
i
n
t
e
r
,
y
2
i
n
t
e
r
)
(x2_{inter},y2_{inter})
(x2inter?,y2inter?),则有
x
1
i
n
t
e
r
=
m
a
x
(
x
1
p
r
e
d
,
x
1
G
T
)
,
???
y
1
i
n
t
e
r
=
m
a
x
(
y
1
p
r
e
d
,
y
1
G
T
)
;
x
2
i
n
t
e
r
=
m
i
n
(
x
2
p
r
e
d
,
x
2
G
T
)
,
???
y
2
i
n
t
e
r
=
m
i
n
(
y
2
p
r
e
d
,
y
2
G
T
)
;
x1_{inter} = max(x1_{pred}, x1_{GT}),\ \ \ y1_{inter}= max(y1_{pred}, y1_{GT}); \\ x2_{inter} = min(x2_{pred}, x2_{GT}),\ \ \ y2_{inter} = min(y2_{pred}, y2_{GT});
x1inter?=max(x1pred?,x1GT?),???y1inter?=max(y1pred?,y1GT?);x2inter?=min(x2pred?,x2GT?),???y2inter?=min(y2pred?,y2GT?); 那么,对于交集(这里需要注意交集是否为空,即是否有交集,具体代码实现时考虑,此处不细究),则有
I
n
t
e
r
s
e
c
t
i
o
n
=
B
p
r
e
d
∩
B
G
T
=
(
x
2
i
n
t
e
r
?
x
1
i
n
t
e
r
)
(
y
2
i
n
t
e
r
?
y
1
i
n
t
e
r
)
=
[
m
i
n
(
x
2
p
r
e
d
,
x
2
G
T
)
?
m
a
x
(
x
1
p
r
e
d
,
x
1
G
T
)
]
?
[
m
i
n
(
y
2
p
r
e
d
,
y
2
G
T
)
?
m
a
x
(
y
1
p
r
e
d
,
y
1
G
T
)
]
\begin{aligned} Intersection &= B_{pred}\cap B_{GT} = (x2_{inter}-x1_{inter})(y2_{inter}-y1_{inter}) \\ &=[min(x2_{pred}, x2_{GT})-max(x1_{pred}, x1_{GT})]*[min(y2_{pred}, y2_{GT}) - max(y1_{pred}, y1_{GT})] \end{aligned}
Intersection?=Bpred?∩BGT?=(x2inter??x1inter?)(y2inter??y1inter?)=[min(x2pred?,x2GT?)?max(x1pred?,x1GT?)]?[min(y2pred?,y2GT?)?max(y1pred?,y1GT?)]? 对于并集,则有
U
n
i
o
n
=
B
p
r
e
d
∪
B
G
T
=
S
p
r
e
d
+
S
G
T
?
I
n
t
e
r
s
e
c
t
i
o
n
\begin{aligned} Union = B_{pred}\cup B_{GT} = S_{pred} + S_{GT} - Intersection \end{aligned}
Union=Bpred?∪BGT?=Spred?+SGT??Intersection? 其中,
S
p
r
e
d
,
S
G
T
S_{pred}, S_{GT}
Spred?,SGT? 分别表示预测框和真实框的面积,计算如下
S
p
r
e
d
=
(
x
2
p
r
e
d
?
x
1
p
r
e
d
)
(
y
2
p
r
e
d
?
y
1
p
r
e
d
)
S
G
T
=
(
x
2
G
T
?
x
1
G
T
)
(
y
2
G
T
?
y
1
G
T
)
S_{pred} = (x2_{pred} - x1_{pred})(y2_{pred} - y1_{pred})\\ S_{GT} = (x2_{GT} - x1_{GT})(y2_{GT} - y1_{GT})
Spred?=(x2pred??x1pred?)(y2pred??y1pred?)SGT?=(x2GT??x1GT?)(y2GT??y1GT?) 根据
I
o
U
IoU
IoU 公式 ,
I
o
U
=
I
n
t
e
r
s
e
c
t
i
o
n
U
n
i
o
n
=
I
n
t
e
r
s
e
c
t
i
o
n
S
p
r
e
d
+
S
G
T
?
I
n
t
e
r
s
e
c
t
i
o
n
IoU = \frac{Intersection}{Union} = \frac{Intersection}{S_{pred} + S_{GT} - Intersection}
IoU=UnionIntersection?=Spred?+SGT??IntersectionIntersection? 将上述各计算结果带入,即可得到
I
o
U
IoU
IoU 数值。值得说明的是,方框是基于像素来表示的,因此这里的坐标不是单纯的一个没大小没宽度的点,在计算面积时,方框所在像素是否被划分其内(也即长宽是否考虑边界的两排像素问题),根据自己想法来定,对结果影响不是很大。
下面用代码实现。
代码实现
上述分析过程方框坐标使用了第(1)种表示方式,假设使用第(3)种描述方式,即
预测框表示为:
(
x
p
r
e
d
,
y
p
r
e
d
,
w
p
r
e
d
,
h
p
r
e
d
)
(x_{pred}, y_{pred}, w_{pred}, h_{pred})
(xpred?,ypred?,wpred?,hpred?);真实框表示为:
(
x
G
T
,
y
G
T
,
w
G
T
,
h
G
T
)
(x_{GT}, y_{GT}, w_{GT}, h_{GT})
(xGT?,yGT?,wGT?,hGT?)
可以将(3)表示转化为(1)表示,即
(
x
0
,
y
0
,
w
,
h
)
→
(
x
1
,
y
1
,
x
2
,
y
2
)
(x_0, y_0, w, h) \to (x_1, y_1, x_2, y_2)
(x0?,y0?,w,h)→(x1?,y1?,x2?,y2?),其中
x
1
=
x
0
?
1
2
w
;
??????
y
1
=
y
0
?
1
2
h
x
2
=
x
0
+
1
2
w
;
??????
y
2
=
y
0
+
1
2
h
x1 = x_{0}-\frac{1}{2}w;\ \ \ \ \ \ y1 = y_{0}-\frac{1}{2}h \\ x2 = x_{0}+\frac{1}{2}w;\ \ \ \ \ \ y2 = y_{0}+\frac{1}{2}h
x1=x0??21?w;??????y1=y0??21?hx2=x0?+21?w;??????y2=y0?+21?h 下面用代码实现 IoU 计算,方框表示方式包括上述(1)(2)(3)类。
'''
功能:IOU 计算
输入:
预测框box1 = [x1_pred, y1_pred, x2_pred, y2_pred]
真实框box2 = [x1_GT, y1_GT, x2_GT, y2_GT]
输出:
IOU 数值
'''
def IoU(box_pred, box_GT, boxType=1):
if boxType == 1:
box1 = box_pred
box2 = box_GT
elif boxType == 2:
box1 = [box_pred[0], box_pred[1], box_pred[0]+box_pred[2], box_pred[1]+box_pred[3]]
box2 = [box_GT[0], box_GT[1], box_GT[0]+box_GT[2], box_GT[1]+box_GT[3]]
elif boxType == 3:
box1 = [box_pred[0]-box_pred[2]/2, box_pred[1]-box_pred[3]/2, box_pred[0]+box_pred[2]/2, box_pred[1]+box_pred[3]/2]
box2 = [box_GT[0]-box_GT[2]/2, box_GT[1]-box_GT[3]/2, box_GT[0]+box_GT[2]/2, box_GT[1]+box_GT[3]/2]
else:
return -1
[x1_pred, y1_pred, x2_pred, y2_pred] = box1
[x1_GT, y1_GT, x2_GT, y2_GT] = box2
S_pred = (x2_pred - x1_pred) * (y2_pred - y1_pred)
S_GT = (x2_GT - x1_GT) * (y2_GT - y1_GT)
x1_inter = max(x1_pred, x1_GT)
y1_inter = max(y1_pred, y1_GT)
x2_inter = min(x2_pred, x2_GT)
y2_inter = min(y2_pred, y2_GT)
w_inter = x2_inter - x1_inter
h_inter = y2_inter - y1_inter
if w_inter <= 0 or h_inter <=0:
return 0
Intersection = w_inter * h_inter
Union = S_pred + S_GT - Intersection
IoU = Intersection/Union
return IoU
1.3 非极大值抑制 NMS (Non-Maximum Suppression)
基本概念
预测结果中,会出现诸多冗杂、重复的框,这里举一个多目标检测的例子,如下图所示,包含了两个狗狗,经过检测网络后,可能输出了最终满足要求的结果有 a,b,c,d,e 五个框框。而每个目标我们只需要一个结果即可,多余框应当删去。
每个框框会有对应一个置信度数值,如图中红色数字所示。
非极大值抑制的任务就是保留每个对象最大置信度所对应的预测框作为最终结果,删去冗余预测框。如左侧狗狗保留 b,右侧狗狗 保留 e。也即经过 NMS 后,输出最终结果只保留 b 和 e,删去其它重复的 a, c, d。
算法流程
下面就是用上图作为例子,说明 NMS 思路。
对于一个上述图中紫色结果框,通常使用方框坐标信息和其检测得到的置信度来表征,也即 [x, y, w, h, c]。
这里使用了第(3)类坐标表示,x,y,w,h 分别代表方框中心点横坐标、中心点纵坐标、方框宽、方框高,c 用来代表置信度。
五个结果框,分别可表示如下
A
:
[
x
a
,
y
a
,
w
a
,
h
a
,
0.79
]
A :[x_a, y_a, w_a, h_a, 0.79]
A:[xa?,ya?,wa?,ha?,0.79]
B
:
[
x
b
,
y
b
,
w
b
,
h
b
,
0.92
]
B :[x_b, y_b, w_b, h_b, 0.92]
B:[xb?,yb?,wb?,hb?,0.92]
C
:
[
x
c
,
y
c
,
w
c
,
h
c
,
0.78
]
C :[x_c, y_c, w_c, h_c, 0.78]
C:[xc?,yc?,wc?,hc?,0.78]
D
:
[
x
d
,
y
d
,
w
d
,
h
d
,
0.66
]
D :[x_d, y_d, w_d, h_d, 0.66]
D:[xd?,yd?,wd?,hd?,0.66]
E
:
[
x
e
,
y
e
,
w
e
,
h
e
,
0.98
]
E :[x_e, y_e, w_e, h_e, 0.98]
E:[xe?,ye?,we?,he?,0.98]
(1)根据置信度数值大小,对框进行排序。排序后如下
| x | y | w | h | c |
---|
d 框 |
x
d
x_d
xd? |
y
d
y_d
yd? |
w
d
w_d
wd? |
h
d
h_d
hd? | 0.66 | c 框 |
x
c
x_c
xc? |
y
c
y_c
yc? |
w
c
w_c
wc? |
h
c
h_c
hc? | 0.78 | a 框 |
x
a
x_a
xa? |
y
a
y_a
ya? |
w
a
w_a
wa? |
h
a
h_a
ha? | 0.79 | b 框 |
x
b
x_b
xb? |
y
b
y_b
yb? |
w
b
w_b
wb? |
h
b
h_b
hb? | 0.92 | e 框 |
x
e
x_e
xe? |
y
e
y_e
ye? |
w
e
w_e
we? |
h
e
h_e
he? | 0.98 |
(2)选出此时置信度最大所对应的框,即 e 框,计算该框与剩余框的重叠程度,剔除掉重叠程度过高的方框。也即,将其与剩余框逐次进行 IoU 计算,删去 IoU 值大于 指定阈值的方框(即冗杂框)。
也即逐次计算上图红色e框,与紫色框 d,c,a,b 的IoU 值。假设计算结果分别为
I
o
U
e
d
,
I
o
U
e
c
,
I
o
U
e
a
,
I
o
U
e
b
IoU_{ed}, IoU_{ec}, IoU_{ea}, IoU_{eb}
IoUed?,IoUec?,IoUea?,IoUeb? 。
假设设定阈值 iou_thresh = 0.5,可能通过计算我们得知
c,d框与e框重叠程度大于设定值,也即
I
o
U
e
c
>
0.5
,
I
o
U
e
d
>
0.5
IoU_{ec}>0.5, IoU_{ed}>0.5
IoUec?>0.5,IoUed?>0.5,我们删去 c,d框
而对于 a,b框明显与e重叠程度较小(确切说,无重叠),也即
I
o
U
e
a
=
0
,
I
o
U
e
b
=
0
IoU_{ea} = 0, IoU_{eb}=0
IoUea?=0,IoUeb?=0 保留 a,b 框。
该步处理结果如下
已处理框为 e,即可当做最终结果;删去框为 c,d;保留框(或称为未处理框)为 a,b;
(3)在保留框中继续选取分数最大的,重复上述操作。直至所有框都被处理,即可得到最终结果。
代码实现
'''
功能:非极大值抑制,删去重复框
输入:
待处理的多个预测框 boxes = [
[x1, y1, w1, h1, c2], # 第一个框:x, y, w, h 为方框第(3)类坐标表示; c 为该方框的置信度;
[x2, y2, w2, h2, c2], # 第二个框, 同上
...]
'''
import numpy as np
def NMS(boxes, iou_thresh = 0.5):
boxes = np.array(boxes)
if len(boxes) == 0:
return []
pick = []
boxes = boxes[boxes[:, -1].argsort()]
while len(boxes):
box1 = boxes[-1]
pick.append(box1)
boxes = np.delete(boxes, -1, axis = 0)
if len(boxes) == 0:
break
rem = []
for b in boxes:
box2 = b[:-1]
iou = IoU(box1, box2, 3)
if iou < iou_thresh:
rem.append(b)
boxes = np.array(rem)
res = np.array(pick)
return res
说明:需要注意的是 NMS 是针对一个图像中的一类目标对象,如果存在多类目标对象,分多次进行 NMS 操作
2 性能
进行该节时首先忽略掉上面所有的一些细节问题,尤其是开篇指标引入时推导思路。前述中可能存在理论漏洞,仅为引入指标用。且大多是基于训练过程分析得到,即基于训练集。
而此节中,是属于网络实际应用即预测过程,是在测试集样本上进行。下述皆为在测试集样本上的一些模型评价指标。
2.1 混淆矩阵(Confusion Matrix)
混淆矩阵是一个二维的误差矩阵,用于描述预测值与真实值之间的差异,其两维也即分别代表着“真实值”和“预测值”,且两维都具有着相同的类。
机器学习中,混淆矩阵常用于可视化评估一些分类算法的性能。
如分类猫、狗、鼠三类(可以有很多很多类,但真实值和预测值的类都相同),共60个样本。通过一个网络预测后,得到混淆矩阵如下,如何分析矩阵呢?
首先,从真实值横向来看,60个样本中,猫有 7+1+2 = 10个,狗有 3+16+1 = 20个,鼠有 4+3+23 = 30个。
纵向来看,预测结果中,有7只是预测正确的,有3只是误把狗预测为了猫,有4只误把鼠预测为了猫。对于狗、鼠的预测,同理。
事实上!目标检测中常常采用2x2的混淆矩阵,即二分类的混淆矩阵。如上表3x3混淆矩阵,可以被表示为如下三个二分类矩阵。
混淆矩阵可以一定程度评价预测结果的好坏。
如对于猫的预测来看,共有14只被预测为了猫,但其中有7只是正确的,7只是非猫预测为猫,因此可以说,针对猫分类的预测精确度为
7
7
+
7
=
0.5
\frac{7}{7+7} = 0.5
7+77?=0.5 。此外我们还可以得出,原始10只真实的猫,被成功预测揪出了 7 只,该比例
7
10
=
0.7
\frac{7}{10} = 0.7
107?=0.7 在目标检测中被称为召回率,即原始真实的猫中,被预测对而成功揪出或召回的比例为 0.7。
混淆矩阵对于目标检测性能的评价十分重要,如上两个重要指标就是基于该二分类混淆矩阵来得到的。
这里只是举例进行了定性地描述,下面着重介绍二分类混淆矩阵。
2.2 TP,FP,TN,FN
用一种更加通俗化的方式,表示二分类的混淆矩阵如下
其中,“正例”也通常被称为“正样本”或“阳性”等;“负例”通常也被称为“负样本”或“阴性”等。
TP(True Positive) : 真实值为正样本,预测值为正样本。真阳性。
FP(False Positive) : 真实值为负样本,预测值为正样本。假阳性。
TN(True Negative):真实值为负样本,预测值为负样本。真阴性。
FN(False Negative):真实值为正样本,预测值为负样本。假阳性。
目标检测诸多性能指标便是从此表中得出的。
基于二分类混淆矩阵可以评价目标检测网络性能。
在目标检测中,
通过上图再详细说明一下混淆矩阵中TP, FP, TN, FN。图中 2 个 GT 框,3 个预测框。
TP(True Positive) : 真实值为正样本,预测值为正样本。真阳性。 IoU > th的检测框数量。如上图 b 框。也即 TP = 1。
FP(False Positive) : 真实值为负样本,预测值为正样本。假阳性。IoU
≤
\le
≤th (注意:这里表示该检测框与所有 GT框 IoU都不大于 th)的检测框数量(或者检测到同一GT的多余检测框数量)。如上图 a,c框。也即 FP=2。
TN(True Negative):真实值为负样本,预测值为负样本。真阴性。也即本身是背景,结果也没有检测出来目标对象。该指标一般在目标检测中用不到。
FN(False Negative):真实值为正样本,预测值为负样本。假阳性。没有检测到的GT的数量。如上图 GT1 框。也即 FN=1。
注:上面的th为设定的阈值,即判定预测框是否正确或是否满足要求(IoU>th的要求)而可以作为正确结果。该值一般取0.50,0.70等。该阈值设定会影响到混淆矩阵的计算,进而影响到后面Precision, Recall计算,进而影响到后面PR曲线,进而影响到AP或mAP。因此对于一些网络性能表示是有
A
P
50
AP^{50}
AP50 或
A
P
70
AP^{70}
AP70等,这里的50和75即此处的 th 设定值50%和70%。
因此上图示可得到的混淆矩阵如下:
2.3 精确度(Accuracy)
精确度计算公式如下:
A
c
c
u
r
a
c
y
=
(
T
P
+
T
N
)
T
P
+
T
N
+
F
P
+
F
N
Accuracy = \frac{(TP+TN)}{TP+TN+FP+FN}
Accuracy=TP+TN+FP+FN(TP+TN)?
因为一般目标检测中不太使用 TN,所以一般也不用此指标,但该指标可用在常见的分类评价上。
2.4 准确率(Precision), 召回率(Recall)
准确率又称为查准率,计算公式如下:
P
r
e
c
i
s
i
o
n
=
T
P
T
P
+
F
P
Precision = \frac{TP}{TP+FP}
Precision=TP+FPTP? 准确率表示所有预测为正例的结果中,实际也为正例的比例。
在目标检测中,也即表示,所有被检测的结果中(也即所有输出的预测框中),可以代表实际情况(用IoU衡量)的数量比例。
如上图中,共3个预测框,即黑框。其中可以代表实际情况的(与GT框IoU大于设定阈值) TP=1,不能代表实际情况或不符合要求的 FP=2,则上例中,准确率即为
1
1
+
2
=
0.33
\frac{1}{1+2} = 0.33
1+21?=0.33
召回率又称为查全率,计算公式如下:
R
e
c
a
l
l
=
T
P
T
P
+
F
N
Recall = \frac{TP}{TP + FN}
Recall=TP+FNTP? 召回率表示,实际为正例的样本被检测出来或被召回的概率。
在目标检测中,也即所有 GT 框,被检测出来所占的比例。
如上图,共 2 个GT框,即红框。其中 只有GT2框被检测出来(也即与之对应的b预测框),而GT1无对应框,也即没有被检测出来,因此上例的召回率为
1
2
=
0.50
\frac{1}{2} = 0.50
21?=0.50
”准确率“ 和 ”召回率“ 没有必然的数值联系,但在巨量数据集下,会存在着互相制约的倾向。
定性来看,我们如果要求召回率较高,也即把所有实际为正例的样本全部召回或全部检测出来,以上述为例,如果预测框足够多,如预测框为覆盖各位置各大小范围的框,那么一定可以把GT1和GT2全部召回,TP=2, FN=2,此时召回率也即
2
2
=
1
\frac{2}{2} = 1
22?=1 ,但此时准确率肯定特别低,因为很多预测框都是无用的,也即 FP 会非常大,则准确率数值便很小。
反过来,如果我们追求准确率,即要求比较大的准确率数值,分母就不能太大,也即预测框就不能太多,预测框较少,定性来说,把所有正例都召回的概率便可能会偏小。
思考下,什么情况下”精确率“和”召回率“双高呢?
很明显,需要检测极其精准,如上图中,两个GT框,而输出预测框也为两个,且一个可以与GT1对应,一个与GT2对应。此时“精确率”和“召回率”都是 1。
但该种情况,在巨量数据下是很难的。除非检测网络性能非常好,检测如手术刀般精准。
从上面的例子中也可以感受到,仅仅参考单一指标可能会出现较多偏颇。因此可以来综合参考两个数值去评定综合性能,考虑到对于一些任务其侧重点也会不一样,故可以对 Precision 和 Recall 施加权重综合计算,从而产生一个新的描述子。该描述子就是
F
β
_
S
c
o
r
e
F_{\beta}\_Score
Fβ?_Score。
2.5
F
β
_
S
c
o
r
e
F_{\beta}\_Score
Fβ?_Score,
F
1
_
S
c
o
r
e
F_1\_{Score}
F1?_Score
该数值综合了 Precision 和 Recall 两者数值,通过施加
β
\beta
β 权重,来对 Precision 和 Recall 有所侧重,综合计算所得。
计算公式如下:
F
β
_
S
c
o
r
e
=
1
+
β
2
1
P
r
e
c
i
s
i
o
n
+
β
2
R
e
c
a
l
l
F_\beta\_{Score} = \frac{1+\beta^2}{\frac{1}{Precision}+\frac{\beta^2}{Recall}}
Fβ?_Score=Precision1?+Recallβ2?1+β2? 其中,
β
\beta
β 表示对于 Recall 的看重程度。
当
β
\beta
β 为 1 时,也即考虑 Precision 和 Recall 同等重要,也即
F
1
_
S
c
o
r
e
F_1\_ Score
F1?_Score ,也即两者的调和平均。
计算公式如下:
F
β
_
S
c
o
r
e
=
2
1
P
r
e
c
i
s
i
o
n
+
1
R
e
c
a
l
l
F_\beta\_{Score} = \frac{2}{\frac{1}{Precision}+\frac{1}{Recall}}
Fβ?_Score=Precision1?+Recall1?2?
上述的精确度(Accuracy), 准确率(Precision), 召回率(Recall),
F
β
_
S
c
o
r
e
F_\beta\_Score
Fβ?_Score 都是单一数值指标。如果我们需要全面评估模型,就需要观察模型在不同参数下的表现,就需要曲线来“动态”表示。
在目标检测或分类算法中,这种性能曲线包括了 PR 曲线, ROC曲线 和 AUC。
2.6 PR曲线
我们上面得知了可以通过准确率(Precision)和召回率(Recall)来评价模型的性能。
P-R曲线即以 Precision 为纵坐标, Recall 为横坐标绘制而成。
依旧以狗狗检测作为例子,详述PR曲线绘制过程。
如下两图是测试图,测试结果如下所示,红色框为 GT 框,黄色框为模型输出的 预测结果框。
预测结果框输出包括了 框的位置和置信度得分 ,也即
(
x
,
y
,
w
,
h
,
c
o
n
f
i
d
e
n
c
e
s
c
o
r
e
)
(x, y, w, h, confidence_score)
(x,y,w,h,confidences?core),这里直接用标号id(下图中的a,b,c…)代表位置,后面数字为置信度得分数值。
初步观察可以得知,图中共有3个GT 框,7个预测结果框。
总体来说, TP = 2,即 b 框和 e 框;FP = 5,即 a 框,c 框,d 框,e 框和 g 框;FN = 1,即 GT1。
注意:这里是总体来看的结果,即没有掐 confidence_score (也即没有后处理,没有设定阈值去除掉 confidence_score 较小的预测框),而 PR 曲线实际上就是通过掐不同的confidence_score阈值,计算不同阈值下对应 P 和 R 而得到的曲线。 下面展示这一曲线求解和绘制过程,
针对上例,PR 曲线求解和绘制过程如下:
(1)按照 confidence_score 数值大小对预测框进行逆序排序
ID | confidence_score |
---|
f | 0.95 | b | 0.92 | d | 0.62 | e | 0.56 | g | 0.44 | c | 0.43 | a | 0.15 |
(2)掐 confidence_score 阈值 th_s,即当 confidence_score
≥
\ge
≥ th_s 时,保留预测框,也即预测框为正样本,否则删去预测框,即认定其为负样本,不予加入计算。(理论上, th_s 从1到0连续取值,从而得到连续的点,但上例中有限样本下confidence_score并非连续值,因此离散取值)
-
th_s = 0.95,只有 f 框纳入考虑,计算此时 P, R值 此时,GT框:GT1, GT2, GT3;预测框:f 框 TP :作为输出结果的预测框数量(根据IoU来判断,不详述),则 TP = 1,也即 f 框; FP :不可作为输出结果的预测框数量,则 FP = 0; FN:未被检测出 GT 框,则 FN = 2,也即 GT1, GT2; 那么,就有
P
=
T
P
T
P
+
F
P
=
1
1
+
0
=
1.00
R
=
T
P
T
P
+
F
N
=
1
1
+
2
=
0.33
P = \frac{TP}{TP+FP} = \frac{1}{1+0} = 1.00 \\ R = \frac{TP}{TP+FN} = \frac{1}{1+2} = 0.33
P=TP+FPTP?=1+01?=1.00R=TP+FNTP?=1+21?=0.33 -
th_s = 0.92 GT框:GT1, GT2, GT3;预测框:f 框,b 框; TP :作为输出结果的预测框数量(根据IoU来判断,不详述),则 TP = 2,也即 f 框和 b 框; FP :不可作为输出结果的预测框数量,则 FP = 0; FN:未被检测出 GT 框,则 FN = 1,也即 GT1; 那么,就有
P
=
T
P
T
P
+
F
P
=
2
2
+
0
=
1.00
R
=
T
P
T
P
+
F
N
=
2
2
+
1
=
0.66
P = \frac{TP}{TP+FP} = \frac{2}{2+0} = 1.00 \\ R = \frac{TP}{TP+FN} = \frac{2}{2+1} = 0.66
P=TP+FPTP?=2+02?=1.00R=TP+FNTP?=2+12?=0.66 -
th_s = 0.62 GT框:GT1, GT2, GT3;预测框:f 框,b 框,d 框; TP :作为输出结果的预测框数量(根据IoU来判断,不详述),则 TP = 2,也即 f 框和 b 框; FP :不可作为输出结果的预测框数量,则 FP = 1,也即 d 框; FN:未被检测出 GT 框,则 FN = 1,也即 GT1; 那么,就有
P
=
T
P
T
P
+
F
P
=
2
2
+
1
=
0.66
R
=
T
P
T
P
+
F
N
=
2
2
+
1
=
0.66
P = \frac{TP}{TP+FP} = \frac{2}{2+1} = 0.66 \\ R = \frac{TP}{TP+FN} = \frac{2}{2+1} = 0.66
P=TP+FPTP?=2+12?=0.66R=TP+FNTP?=2+12?=0.66 -
th_s = 0.56 GT框:GT1, GT2, GT3;预测框:f 框,b 框,d 框,e 框; TP :作为输出结果的预测框数量(根据IoU来判断,不详述),则 TP = 2,也即 f 框和 b 框; FP :不可作为输出结果的预测框数量,则 FP = 1,也即 d 框和 e 框; FN:未被检测出 GT 框,则 FN = 1,也即 GT1; 那么,就有
P
=
T
P
T
P
+
F
P
=
2
2
+
2
=
0.50
R
=
T
P
T
P
+
F
N
=
2
2
+
1
=
0.66
P = \frac{TP}{TP+FP} = \frac{2}{2+2} = 0.50 \\ R = \frac{TP}{TP+FN} = \frac{2}{2+1} = 0.66
P=TP+FPTP?=2+22?=0.50R=TP+FNTP?=2+12?=0.66 -
th_s = 0.44 GT框:GT1, GT2, GT3;预测框:f 框,b 框,d 框, e 框,g 框; TP :作为输出结果的预测框数量(根据IoU来判断,不详述),则 TP = 2,也即 f 框和 b 框; FP :不可作为输出结果的预测框数量,则 FP = 3,也即 d 框, e 框,g 框; FN:未被检测出 GT 框,则 FN = 1,也即 GT1; 那么,就有
P
=
T
P
T
P
+
F
P
=
2
2
+
3
=
0.40
R
=
T
P
T
P
+
F
N
=
2
2
+
1
=
0.66
P = \frac{TP}{TP+FP} = \frac{2}{2+3} = 0.40\\ R = \frac{TP}{TP+FN} = \frac{2}{2+1} = 0.66
P=TP+FPTP?=2+32?=0.40R=TP+FNTP?=2+12?=0.66 -
th_s = 0.43 GT框:GT1, GT2, GT3;预测框:f 框,b 框,d 框, e 框,g 框, c 框; TP :作为输出结果的预测框数量(根据IoU来判断,不详述),则 TP = 2,也即 f 框和 b 框; FP :不可作为输出结果的预测框数量,则 FP = 4,也即 d 框, e 框,g 框,c 框; FN:未被检测出 GT 框,则 FN = 1,也即 GT1; 那么,就有
P
=
T
P
T
P
+
F
P
=
2
2
+
4
=
0.33
R
=
T
P
T
P
+
F
N
=
2
2
+
1
=
0.66
P = \frac{TP}{TP+FP} = \frac{2}{2+4} = 0.33 \\ R = \frac{TP}{TP+FN} = \frac{2}{2+1} = 0.66
P=TP+FPTP?=2+42?=0.33R=TP+FNTP?=2+12?=0.66 -
th_s = 0.15 GT框:GT1, GT2, GT3;预测框:f 框,b 框,d 框, e 框,g 框, c 框, a 框; TP :作为输出结果的预测框数量(根据IoU来判断,不详述),则 TP = 2,也即 f 框和 b 框; FP :不可作为输出结果的预测框数量,则 FP = 5,也即 d 框, e 框,g 框,c 框,a 框; FN:未被检测出 GT 框,则 FN = 1,也即 GT1; 那么,就有
P
=
T
P
T
P
+
F
P
=
2
2
+
5
=
0.29
R
=
T
P
T
P
+
F
N
=
2
2
+
1
=
0.66
P = \frac{TP}{TP+FP} = \frac{2}{2+5} = 0.29 \\ R = \frac{TP}{TP+FN} = \frac{2}{2+1} = 0.66
P=TP+FPTP?=2+52?=0.29R=TP+FNTP?=2+12?=0.66
(3)根据得到的(R,P)点,绘制 PR 曲线
? 通过上述计算得到 (R,P) 点坐标:
?
(
0.33
,
1.0
)
;
?
(
0.66
,
1.0
)
;
?
(
0.66
,
0.66
)
;
?
(
0.66
,
0.50
)
;
?
(
0.66
,
0.40
)
;
?
(
0.66
,
0.33
)
;
?
(
0.66
,
0.29
)
(0.33, 1.0) ;\ (0.66,1.0);\ (0.66,0.66);\ (0.66,0.50);\ (0.66,0.40);\ (0.66,0.33);\ (0.66,0.29)
(0.33,1.0);?(0.66,1.0);?(0.66,0.66);?(0.66,0.50);?(0.66,0.40);?(0.66,0.33);?(0.66,0.29)
? 根据坐标绘制 PR 曲线如下
?
由于上面的测试样本量极少(才两个),因此得到了上面一个看着有点突兀的PR曲线,但上述例子也仅为展示PR曲线如何计算和绘制的。
实际中,测试样本有一定数量后,就会得到更加平滑的曲线。更一般PR曲线如下图所示
曲线上的任一点都对应着某一个 Confidence_Score,对应着一组准确率和召回率。
事实上,我们综合评价一个模型,无法仅仅从曲线上一点来评估。如前述,可能选取的点,准确率高的时候召回率低,准确率低的时候,召回率高。我们需要综合评判曲线变化整个过程。也即 平均准确率 AP(Average Precision) 指标。
2.7 AP(Average Precison), mAP(mean Average Precision)
基于PR曲线定性分析来看,好的模型应该是保持着较高的准确度,也即随着召回率的增加,准确度也尽量维持在较高的高度,此时模型的性能也就越好。反应到PR曲线上也即曲线越接近右上角越好。
在数值上来体现也即曲线与坐标所围成的面积越大越好。这一面积在目标检测中被称为 Average Precision(AP),即
A
P
=
∫
0
1
P
d
R
AP = \int_0^1 PdR
AP=∫01?PdR AP综合考量了不同召唤率下的准确率,不会对P与R有任何偏好。
需要注意的是,这里的 AP 是单类别下的计算结果。许多目标检测中为多类别检测,需要分别计算对应 AP 值。
而对各类别的 AP 值进行取平均,即可得到 mAP (mean Average Precision),也即
m
A
P
=
1
N
∑
i
=
1
N
A
P
i
mAP = \frac{1}{N} \sum_{i=1}^{N} AP_{i}
mAP=N1?i=1∑N?APi? 而在具体实现中,由于求解积分比较麻烦,可以通过离散方式进行 AP 求解。如通过等间隔取一定数量的 R 值及其对应的 P 值来求解 AP,进而求解出 mAP。
3 其它
3.1 真阳率(True Positive Rate, TPR), 假阳率(False Positive Rate, FPR)
真阳率表示在所有实际结果为阳性的样本中,被正确判断为阳性的比例。计算如下
T
P
R
=
R
e
c
a
l
l
=
T
P
T
P
+
F
N
TPR = Recall = \frac{TP}{TP+FN}
TPR=Recall=TP+FNTP?
假阳率表示在所有实际结果为阴性的样本中,被错误判断为阳性的比例。计算如下
F
P
R
=
F
P
F
P
+
T
N
FPR =\frac{FP}{FP+TN}
FPR=FP+TNFP?
3.2 ROC (Receiver Operating Characteristic)曲线, AUC(Area Under Curve)
ROC曲线全称为受试者工作特征曲线。该曲线就是以假阳率FPR为横坐标,真阳率TPR为纵坐标,绘制得到的曲线。
其与 PR 曲线思路相似。因为目标检测中不考虑 TN 值,也即不计算 FPR,因此在次不再探究(挖坑,如之后用到再补充)。
整个思路可类比 PR 曲线。同样地,对于ROC曲线有一个对应指标,即 AUC(Area Under Curve),即ROC曲线下的面积。可类比于 AP。
AUC越大,模型性能越好。
3.3 敏感度(Sensitivity), 特异度(Specificity)
敏感度相当于对 Positive 样本的一个 Recall 的定义。(就是我们常说的 Recall, 之所以这么描述是为了同下作对比)
S
e
n
s
i
t
i
v
i
t
y
=
T
P
R
=
R
e
c
a
l
l
=
T
P
T
P
+
F
N
Sensitivity = TPR = Recall = \frac{TP}{TP+FN}
Sensitivity=TPR=Recall=TP+FNTP?
特异度相当于对 Negative 样本的一个 Recall 的定义。数值上有
S
p
e
c
i
f
i
c
i
t
y
=
1
?
F
P
R
=
T
N
T
N
+
F
P
Specificity = 1-FPR=\frac{TN}{TN+FP}
Specificity=1?FPR=TN+FPTN?
写在最后
本篇为目标检测的一些基础知识,后续将会对具体网络进行探究,主要包括三个经典系列网络即: FRCNN,SSD,YOLO
|