赞
踩
继续学习目标检测!
详情参看原论文:You Only Look Once: Unified, Real-Time Object Detection (https://arxiv.org/pdf/1506.02640.pdf)
YOLO创新性地将目标检测看作Bbox坐标和类别概率的回归问题,并用单独一个端到端的网络,直接将整张图片作为输入,预测目标在整张图像上的相对位置和类别,在检测速度和泛化能力上显著优于当时的state-of-the-art方法,让实时(Real-time)目标检测成为可能。
YOLO区别于当时普遍的两阶段目标检测,用一个统一的网络作为检测器。
首先,YOLO最基础的思想就是网格化,它将整张图片分为一个S × S的网格,并假设:“如果一个目标的中心落在某个网格(Cell)内,那么这个Cell就负责这个目标的检测”。说实话,这个表达很抽象,很难立刻理解,但是没有关系,我们先放在这,等我们了解了YOLO的整个流程,这句话也就不难理解了,目前只需要知道YOLO把图片分成一个S × S的网格。
对每个网格中的Cell,它们都需要预测B个目标,同时假设中心落在同一个Cell中的目标都具有相同的类别。每个目标应该包含它的位置信息和类别信息;位置信息在YOLO中包含5个参数 (x, y, w, h, c),x和y代表预测框中心在Cell中的相对位置,w和h代表预测框在原输入图像中的宽度和高度,c代表置信度,定义为预测框与任意Ground Truth的IoU;类别信息则包含C个参数,分别表示对应数据集中各个类别的概率。
即对于一个有C个类别标签的数据集,每张图像输入进YOLO后的输出应该是一个S × S × (B * 5 + C) 的张量。
现在,我们再来理解那句话:
“如果一个目标的中心落在某个网格(Cell)内,那么这个Cell就负责这个目标的检测”
通过YOLO对于预测框的定义我们也能看出来,每个Cell生成的预测框的中心必须包含在这个Cell中,并且每个Cell最终实际上都只有一个类别标签:对于中心落在这个Cell中的所有预测框,它们的类别都被这个Cell的类别预测标签决定!
按照YOLO将目标检测视为回归问题的思路,YOLO的网络结构包含用于特征提取的卷积层部分和用于回归预测的全连接层。
受到GoogLeNet的启发,YOLO也采用24层卷积层 + 2层全连接层的结构,但不同的是,YOLO将GoogLeNet中的inception模块换成了1 × 1的reduction layer跟着3 × 3的卷积层这样的结构。
具体网络结构如下图:
YOLO将置信度定义为:
c
o
n
f
i
d
e
n
c
e
=
P
r
(
O
b
j
e
c
t
)
∗
I
O
U
p
r
e
d
t
r
u
t
h
confidence = Pr(Object) * IOU^{truth}_{pred}
confidence=Pr(Object)∗IOUpredtruth
意为:在Cell内如果不存在目标,那么置信度应该为0;否则,置信度定义为Ground Truth和预选框(Predicted Box)的交并比。
但是在测试,即计算评估指标时,使用的置信度有所不同,为类别特化的置信度 (Class-specific confidence score):
P
r
(
C
l
a
s
s
i
∣
O
b
j
e
c
t
)
∗
P
r
(
O
b
j
e
c
t
)
∗
I
O
U
p
r
e
d
t
r
u
t
h
=
P
r
(
C
l
a
s
s
i
)
∗
I
O
U
p
r
e
d
t
r
u
t
h
Pr(Class_i | Object)* Pr(Object) * IOU^{truth}_{pred} = Pr(Class_i) * IOU^{truth}_{pred}
Pr(Classi∣Object)∗Pr(Object)∗IOUpredtruth=Pr(Classi)∗IOUpredtruth
参考2.2中的YOLO网络结构,并不是全部的卷积层都经过了预训练,论文中仅将前20层卷积层 + Average Pool Layer + 一层全连接层然后再ImageNet上预训练。
预训练时的输入图像尺寸为224 × 224,但考虑到目标检测需要更加细粒度的图像信息,在正式训练时输入图像的尺寸为448 × 448。
论文团队首先从易于优化的角度,考虑平方误差(Sum-squared error)。
L
s
u
m
−
s
q
u
a
r
e
d
=
1
2
∑
(
y
′
−
y
)
2
L_{sum-squared} = {1 \over 2} \sum (y' - y)^2
Lsum−squared=21∑(y′−y)2
但平方和误差实际上并适合目标检测任务:因为它将定位产生的损失(Localization error)与分类产生的损失(Classification error)看做的平等的;同时由于每张图像中许多的Cell中并没有目标,平方误差会趋向把它们的置信度推向0,这种效果往往压过了那些有目标Cell所产生的梯度,最终导致模型不稳定。
为了补救以上问题,他们首先为设置了两个权重参数λcoord=5和λnoobj=0.5,增加了预选框坐标带来的损失,减少了没有目标Cell由于分类产生的损失。
平方误差还将大预测框和小预测框中的同样误差同等看待,导致较大预测框中的小误差反而比小预测框的中小误差更加重要,这是违反直觉的。
为了减轻这种影响,YOLO选择预测w和h的平方根,而非直接预测w和h。
经过以上的调整,损失函数最终如下:
L
o
s
s
y
o
l
o
=
λ
c
o
o
r
d
∑
i
=
0
S
2
∑
j
=
0
B
1
i
,
j
o
b
j
[
(
x
i
−
x
i
′
)
2
+
(
y
i
−
y
i
′
)
2
]
+
λ
c
o
o
r
d
∑
i
=
0
S
2
∑
j
=
0
B
1
i
,
j
o
b
j
[
(
w
i
−
w
i
′
)
2
+
(
h
i
−
h
i
′
)
2
]
+
∑
i
=
0
S
2
∑
j
=
0
B
1
i
,
j
o
b
j
(
C
i
−
C
i
′
)
2
+
λ
n
o
o
b
j
∑
i
=
0
S
2
∑
j
=
0
B
1
i
,
j
n
o
o
b
j
(
C
i
−
C
i
′
)
2
+
∑
i
=
0
S
2
1
i
,
j
o
b
j
∑
c
∈
c
l
a
s
s
e
s
(
p
i
(
c
)
−
p
i
′
(
c
)
)
2
Loss_{yolo} = λ_{coord} \sum^{S^2}_{i=0}\sum^{B}_{j=0}1^{obj}_{i,j}[(x_i - x_i')^2 + (y_i - y_i')^2] + λ_{coord} \sum^{S^2}_{i=0}\sum^{B}_{j=0}1^{obj}_{i,j}[(\sqrt{w_i} - \sqrt{w_i'})^2 + (\sqrt{h_i} - \sqrt{h_i'})^2] + \sum^{S^2}_{i=0}\sum^{B}_{j=0}1^{obj}_{i,j}(C_i - C_i')^2 + λ_{noobj}\sum^{S^2}_{i=0}\sum^{B}_{j=0}1^{noobj}_{i,j}(C_i - C_i')^2 + \sum^{S^2}_{i=0}1^{obj}_{i,j}\sum_{c\in{classes}}(p_i(c) - p_i'(c))^2
Lossyolo=λcoordi=0∑S2j=0∑B1i,jobj[(xi−xi′)2+(yi−yi′)2]+λcoordi=0∑S2j=0∑B1i,jobj[(wi
−wi′
)2+(hi
−hi′
)2]+i=0∑S2j=0∑B1i,jobj(Ci−Ci′)2+λnoobji=0∑S2j=0∑B1i,jnoobj(Ci−Ci′)2+i=0∑S21i,jobjc∈classes∑(pi(c)−pi′(c))2
YOLO的每个Cell会预测多个预测框,但在训练的时候,我们更希望每个目标只有一个预测框对其负责。训练时,他们假设与Ground Truth交并比最高的预测框对其“负责”(即提供损失)。这样会使得各个预测框之间都具备一定特化性,从整体上提高模型对不同尺寸、不同比例、不同类别目标的检测能力。
YOLO在每个Cell中仅检测有限个目标,且这些目标都必须有同样的类别,这相当于在预测框的选择上加上了很强的空间约束,一定程度上导致YOLO在检测小目标群的问题上很困难。
YOLO完全是从数据中学习如何预测目标,导致YOLO在应对数据集外的目标尺寸或者比例时没有很好的泛化能力。
YOLO出于平方损失函数应用在目标检测任务上的种种问题,主要误差集中在定位精度上。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。