1.1 背景
yolov1由作者joseph发表在CVPR2016上,是经典的one-stage检测算法。是把bounding box的坐标和宽高像分类网络那样预测出来。是end to end 的一种网络结构,检测速度快。
论文标题: 《You Only Look Once: Unified, Real-Time Object Detection》
论文地址:https://arxiv.org/pdf/1506.02640.pdf
1.2 原理介绍
1.2.1 同时预测多个box位置和类别
1.2.2 端到端的目标检测算法识别
1.2,3 速度快
实现回归功能的CNN并不需要复杂的设计过程
直接选用整图训练模型,能更好的区分背景和目标
1.2.4 图像被分成SxS个格子
1.2.5 包含GT物体中心的格子负责检测相应的物体
1.2.6 每个格子预测B个检测框及其置信度,以及c个类别概率
1.2.7 bbox信息(x,y,w,h)为物体的中心位相对格子位置的偏移及宽度和高度,均被归一化
1.2.8 置信度反映是否包含物体,以及包含物体情况下位置的准确性
置信度的计算公式:
C
=
P
r
(
O
b
j
e
c
t
)
I
O
U
p
r
e
d
t
r
u
t
h
C = P_r(Object) IOU_{pred}^{truth}
C=Pr(Object)IOUpredtruth
其中
P
r
(
O
b
j
e
c
t
)
∈
P_r(Object)\in_ {}
Pr(Object)∈ { 0, 1 }
1.2.9 网络使用小卷积,及:1 X 1, 3 X 3 (GoogLeNet),减少参数及计算量
1.2.10 v1采用GoogleNet 为backbone
1.3 网络结构
整个网络执行流程简单:只需要三个步骤:
(1)resizes the input image to 448 × 448
(2) runs a single convolutional network on the image
(3) thresholds the resulting detections by the model’s confidence.
如上图所示,输入图片被划分为sxs个单元格,每个单元格独立作检测。If the center of an object falls into a grid cell, that grid cellis responsible for detecting that object.
可以通过yolo_v1的structure来进一步理解,相比faster r-cnn那种two-stage复杂的网络结构而言,yolo_v1的网络结构简单多。其基本思想是这样:预测框的位置、大小和物体分类都通过CNN暴力predict出来。
上面是结构图yolo_v1结构图,由24个卷积层,和2个fullly conneced layer 组成,其输出是一个sxsx30的张量,sxs表示把输入图片划分位sxs的网格,每一个小单元的另一个维度等于30。30=(2*5+20)。代表能预测2个框的5个参数(x,y,w,h,score)和20个种类。
输出tensor计算公式:
SxSx(B∗5+C)= 7x7x(2*5 + 20) = 1470
SxS表示网格数量,B表示每个网格生成框的个数,C表示能检测识别的种类。
可以看出输出张量的深度影响yolo_v1能检测目标的种类。v1的输出深度只有30,意味着每个单元格只能预测两个框(而且只认识20类物体),这对于密集型目标检测和小物体检测都不能很好适用。
1.4 损失函数
yolo是端到端训练,对于预测框的位置、size、种类、置信度(score)等信息的预测都通过一个损失函数来训练。yolo_v1就是选用最简单的SSE作为损失函数,其计算公式如下:
l
o
s
s
=
∑
i
=
0
s
2
c
o
o
r
d
E
r
r
+
i
o
u
E
r
r
+
c
l
s
E
r
r
=
loss=\sum_{i=0}^{s^2}coordErr + iouErr + clsErr=
loss=∑i=0s2coordErr+iouErr+clsErr=
λ
c
o
o
r
d
∑
i
=
0
s
2
∑
j
=
0
B
l
i
j
o
b
j
[
(
x
i
−
x
^
i
)
2
+
(
y
i
−
y
^
i
)
2
]
+
λ_{coord}\sum_{i=0}^{s^2}\sum_{j=0}^Bl_{ij}^{obj}[(x_i−\hat{x}_i)^2+(y_i−\hat{y}_i)^2]+
λcoord∑i=0s2∑j=0Blijobj[(xi−x^i)2+(yi−y^i)2]+
λ
c
o
o
r
d
∑
i
=
0
s
2
∑
j
=
0
B
l
i
j
o
b
j
[
(
w
i
−
w
^
i
)
2
+
(
h
i
−
h
i
)
2
]
+
λ_{coord}\sum_{i=0}^{s^2}\sum_{j=0}^Bl_{ij}^{obj}[(\sqrt{w}_i−\sqrt{\hat{w}_i})^2+(\sqrt{h_i}−\sqrt{h_i})^2]+
λcoord∑i=0s2∑j=0Blijobj[(wi−w^i)2+(hi−hi)2]+
∑
i
=
0
s
2
∑
j
=
0
B
l
i
j
o
b
j
[
(
c
i
−
c
^
i
)
2
]
+
\sum_{i=0}^{s^2}\sum_{j=0}^Bl_{ij}^{obj}[(c_i - \hat{c}_i)^2] +
∑i=0s2∑j=0Blijobj[(ci−c^i)2]+
λ
n
o
o
b
j
∑
i
=
0
s
2
∑
j
=
0
B
l
i
j
n
o
o
b
j
[
(
c
i
−
c
^
i
)
2
]
+
λ_{noobj}\sum_{i=0}^{s^2}\sum_{j=0}^Bl_{ij}^{noobj}[(c_i -\hat{c}_i)^2]+
λnoobj∑i=0s2∑j=0Blijnoobj[(ci−c^i)2]+
∑
i
=
0
s
2
∑
c
∈
c
l
a
s
s
e
s
[
(
p
i
(
c
)
−
p
^
i
(
c
)
)
2
]
\sum_{i=0}^{s^2}\sum_{c\in{classes}}[(p_i(c) -\hat{p}_i(c))^2]
∑i=0s2∑c∈classes[(pi(c)−p^i(c))2]
S
2
S^2
S2表示网格数,在这里是7x7。B表示每个单元格预测框的个数,这里是2。
第一行就方差和( sum-squared error)来当作位置预测的损失函数,第二行用根号总方误差来当作宽度和高度的损失函数。第三行和第四行对置信度confidence也用SSE作为损失函数。第五行用SSE作类别概率的损失函数。最后将几个损失函数加到一起,当作yolo v1的损失函数。
l
i
j
o
b
j
l_{ij}^{obj}
lijobj 取值为0和1,即单元格内是否有目标。
λ
c
o
o
r
d
=
5
λ_{coord} = 5
λcoord=5
λ
n
o
o
b
j
=
0.5
λ_{noobj} = 0.5
λnoobj=0.5
1.5 网络训练
1.5.1 ImageNet 1000 类数据预训练
1.5.2 使用预训练参数 (20 个conv)来初始化YOLO ,去掉FC层, 并训练VOC20
1.5.3 将输入图像分辨率从224 x 224 Resize到448 x448。
1.5.4 训练时B个bbox的GT设置相同
1.6 优缺点
缺点:
输入尺寸固定,进入YOLO 检测层,进行最后检测的时候,输入图像尺寸是固定的,没有采用多尺度特征检测
小目标检测效果差
每个格子包含多个目标时只预测一个类别(IOU最高)
损失函数中没有区分大物体和小物体IOU的err,对网络LOSS贡献值的影响。一般来说小物体对LOSS值 影响大
同一物体出现不常见的不同长宽比时,表现出较差的泛化能力、
优点:
速度快,在没有使用BN时能达到45FPS
网络结构简单,是一种end to end 的网络结构
背景区分度高,能够reasion more contexture infomation
1.7 网络性能
1.8总结
v1对于整个yolo系列的价值,即v2/v3还保留的特性,可以总结为3点:
1.8.1 leaky ReLU,相比普通ReLU,leaky并不会让负数直接为0,而是乘以一个很小的系数(恒 定),保留负数输出,但衰减负数输出;公式如下:
y
=
{
x
,
x
>
0
0.1
x
,
o
t
h
e
r
w
i
s
e
y =\begin{cases} x, x>0\\0.1x,otherwise\end{cases}
y={x,x>00.1x,otherwise
1.8.2. 分而治之,用网格来划分图片区域,每块区域独立检测目标;
1.8.3. 端到端训练。损失函数的反向传播可以贯穿整个网络,这也是one-stage检测算法的优势。