yolov1模型
论文地址: http://arxiv.org/abs/1506.02640
tensorflow代码地址: https://github.com/TowardsNorth/yolo_v1_tensorflow_guiyu
一. 模型简介
1. 背景
在yolov1提出之前,目标检测常用的方法有DPM和R-CNN方法,DPM是通过一个滑动窗口来定位和识别物体,R-CNN是先提取候选框再识别物体,这些检测方法流程复杂,性能较差。并且每个模块都必须单独训练调优,很难优化。
2. yolov1流程
作者提出了yolov1模型,用一个CNN模型就能对图像中的物体进行定位和分类。yolov1系统执行流程如下:
- (1) 将输入图像缩放到 448 × 448 448\times448 448×448
- (2) 在图像上运行一个单一的卷积网络
- (3) 根据模型置信度对检测结果设定阈值
3. yolov1优势
- (1) yolov1模型非常快
yolov1将目标检测中独立的模块整合到了一个CNN模型中,不需要复杂的流程,因而具有非常好的性能。 - (2) yolov1模型能对图像全局推理
yolov1在训练和测试期间看到整个图像,它能隐式地对物体及其外观的上下文信息编码。不像DPM的滑动窗口和R-CNN的区域候选框,它们没有更大的视野。 - (3) yolov1模型能学习到目标物体更通用化的特征
在自然图像上训练的模型应用到艺术品图像,yolov1仍然保持很好的效果。
4. yolov1缺点
- 模型对物体定位不够精确
yolov1在图像中能快速识别物体,但不能精确地定位物体。模型设计图像每个网格只能产生B个预测框, 论文中B=2,数量很少,这会使得很难产生更完美的预测框。
作者在论文中分析模型误差时,与Fast R-CNN相比,yolov1模型更多在定位误差,占比19%,这几乎是其他误差的总和;而Fast R-CNN模型误差更多在于将背景识别为物体,这主要是提取的候选框没有更大的视野。
- 模型对紧邻物体检测效果不好
模型结构中设计每个网格只能预测一个物体,这使得图像中紧邻的物体容易漏检,尤其是小物体。
二. 模型结构
1. 设计思想
- (1) yolov1将目标检测的各个模块集成到单个CNN网络中
yolov1网络能从整个图像中提取特征来预测物体的位置和类别,可以进行端到端的训练,在实时检测的同时又较高的准确度。 - (2) yolov1将输入图像拆分为S * S个网格
如果物体的中心点落到一个网格中,该网格负责检测这个物体 - (3) 每个网格能预测B个物体框及对应置信度
置信度分数反映了物体框中包含物体的置信度,也反映了模型认为物体框预测的准确性
作者定义了物体框的置信度表示为 P r ( O b j e c t ) ∗ I O U p r e d t r u t h Pr(Object) * IOU_{pred}^{truth} Pr(Object)∗IOUpredtruth ,若网格中没有物体,置信度为0
置信度分数应该等于predicted box(预测物体框)和 ground truth(真实物体框)的IOU - (4) 每个物体框包含5个预测值:x, y, w, h and confidence
(x, y)代表了物体框的中心点相对于所在网格的偏移(不是相对于整个图像)
w, h 代表了相对于整个图像的宽高
confidence代表了预测物体的置信度。 - (5) 每个网格预测出了C个物体类别的条件概率,
P
r
(
C
l
a
s
s
i
∣
O
b
j
e
c
t
)
Pr(Class_i|Object)
Pr(Classi∣Object)
P r ( C l a s s i ∣ O b j e c t ) Pr(Class_i|Object) Pr(Classi∣Object)表示在网格中存在物体的条件下,将物体预测为 C l a s s i Class_i Classi类的概率。
尽管每个网格能预测B个物体框,但是每个网格只允许预测出一个物体类(该设计也导致yolov1对小物体和密集物体检测效果较差)。
作者评估yolov1在PASCAL VOC数据集上效果时,使用S=7, B=2,该数据集有20个标签类,所以C = 20。
在上图中,输入图像被划分为7 * 7个网格;Bounding boxes + cofidence图中每个网格可预测出2个物体框,框的粗细代表置信度,明显看出有三个比较粗的预测框。在Class probability map图像不同颜色代表网格预测的物体类;将二图结合生成最后的Final detections预测结果。
2. 网络结构
yolov1的网络结构有24个卷积层,卷积层后接2个全连接层。在卷积层中,
3
∗
3
3*3
3∗3的卷积层用来提取特征,
1
∗
1
1*1
1∗1的卷积层用来降维。全连接层负责预测物体类别概率和坐标。
模型最终输出为一个维度(1,1470)的张量,这个张量包含了对图像中物体坐标和分类概率的预测。
三. 损失函数
1. 维度变换
计算损失时,通过reshape操作将维度为(1,1470)的张量转化为一个维度为(7, 7, 30)的张量,如下图所示。
原图每个网格都对应一个维度为(1, 1, 30)的预测结果,前10个数代表两个预测框的坐标和置信度,后20个数代表20个类别的预测概率。
2. 损失函数公式说明
在模型训练过程中,对于损失函数计算有以下说明:
- 作者将bounding box的坐标x、y、w、h归一化到(0, 1), 中心点x、 y为所在网格的偏移
(1) 在训练过程中,将bounding box的w, h除以图像宽高,作了归一化
(2) 中心点x,y是相对于所在网格宽高的偏移,而非图像宽高的偏移 - 作者选择均方误差为模型训练的损失函数
(1) 选择均方误差的主要原因是易于优化 - 作者使用参数
λ
c
o
o
r
d
\lambda_{coord}
λcoord和
λ
n
o
o
b
j
\lambda_{noobj}
λnoobj来平衡各方损失
(1) 均方误差将坐标损失和分类损失赋予相同权重,这并不合适
(2) 图像很多网格中并不包含物体,该种网格预测出物体的置信度应该为0。在训练过程将该种网格预测的置信度逼向0的计算,远远超过了包含物体网格的梯度下降的计算,这将导致训练出的模型效果非常不稳定。
(3) 作者设置 λ c o o r d \lambda_{coord} λcoord=5来增加坐标预测的损失比重, λ n o o b j \lambda_{noobj} λnoobj=0.5来减小不包含物体的单元格损失比重 - 作者选择用
w
\sqrt{w}
w、
h
\sqrt{h}
h来代替w、h
(1) 均方误差同样将大物体和小物体的定位损失赋予相同权重,这并不合适
(2) 误差度量在定位损失应该反映大物体的小偏差比小物体里的小偏差的误差更小,取根号能缓解一下 - 网格中可预测出的多个bounding box,与真实标注框IOU最大的负责预测物体
论文中,作者设置每个网格能预测2个bounding box,如上图,与真实标注框IOU最大的bounding box会负责预测物体
损失函数是理解yolov1模型的第二个关键点,下文将进行详细说明,作者在论文中的损失函数如下,:
λ
c
o
o
r
d
∑
i
=
0
s
2
∑
j
=
0
B
ı
i
j
o
b
j
[
(
x
i
−
x
^
i
)
2
+
(
y
i
−
y
^
i
)
2
]
\lambda_{coord}\displaystyle\sum_{i=0}^{s^2}\displaystyle\sum_{j=0}^{B}\text{\i}_{ij}^{obj}[(x_i - \hat{x}_i )^2 + (y_i - \hat{y}_i)^2]
λcoordi=0∑s2j=0∑Bıijobj[(xi−x^i)2+(yi−y^i)2] — 定位损失 – 中心点预测误差
+
λ
c
o
o
r
d
∑
i
=
0
s
2
∑
j
=
0
B
ı
i
j
o
b
j
[
(
w
i
−
w
^
i
)
2
+
(
h
i
−
h
^
i
)
2
]
+\lambda_{coord}\displaystyle\sum_{i=0}^{s^2}\displaystyle\sum_{j=0}^{B}\text{\i}_{ij}^{obj}[(\sqrt{w _i} - \sqrt{\hat{w}_i} )^2 + (\sqrt{h_i} - \sqrt{\hat{h}_i})^2]
+λcoordi=0∑s2j=0∑Bıijobj[(wi−w^i)2+(hi−h^i)2] — 定位损失 – 宽高预测误差
+
∑
i
=
0
s
2
∑
j
=
0
B
ı
i
j
o
b
j
(
C
i
−
C
^
i
)
2
+\displaystyle\sum_{i=0}^{s^2}\displaystyle\sum_{j=0}^{B}\text{\i}_{ij}^{obj}(C_i - \hat{C}_i )^2
+i=0∑s2j=0∑Bıijobj(Ci−C^i)2 — 置信度损失 – 网格含物体
+
λ
n
o
o
b
j
∑
i
=
0
s
2
∑
j
=
0
B
ı
i
j
n
o
o
b
j
(
C
i
−
C
^
i
)
2
+\lambda_{noobj}\displaystyle\sum_{i=0}^{s^2}\displaystyle\sum_{j=0}^{B}\text{\i}_{ij}^{noobj}(C_i - \hat{C}_i )^2
+λnoobji=0∑s2j=0∑Bıijnoobj(Ci−C^i)2 — 置信度损失 – 网格不含物体
+
∑
i
=
0
s
2
ı
i
o
b
j
∑
c
ϵ
c
l
a
s
s
e
s
(
p
i
(
c
)
−
p
^
i
(
c
)
)
2
+\displaystyle\sum_{i=0}^{s^2}\text{\i}_i^{obj}\displaystyle\sum_{c\epsilon{classes}}(p_i(c) - \hat{p}_i(c))^2
+i=0∑s2ıiobjcϵclasses∑(pi(c)−p^i(c))2 — 类别损失
其中,
ı
i
o
b
j
\text{\i}_i^{obj}
ıiobj表示在第i个网格中存在物体,
ı
i
j
o
b
j
\text{\i}_{ij}^{obj}
ıijobj 表示在第i个网格中的第j个bounding box负责预测该物体。
通过公式中能注意到,对于类别损失,只计算存在物体的网格的分类误差;对于定位损失,只计算负责预测物体的bounding box的定位误差。
3. 损失函数计算示例
下面以实际图像案例来进一步说明损失函数的计算过程。
图像(448, 448, 3)中存在一个物体,类别为狗,真实坐标为红框(221, 51, 371, 319)。物体中心点落到第3行第5列的网格中,该网格预测出物体的置信度为0.8,预测出两个框: 绿框(213, 60, 357, 313)、黄框(190, 96, 420, 254)。其他参数为:
λ
c
o
o
r
d
\lambda_{coord}
λcoord=5、
λ
n
o
o
b
j
\lambda_{noobj}
λnoobj=0.5、S=7、B=2
(1) 置信度损失
假设图像网格中预测置信度如下所示:
计算两个bounding box与真实物体框的IOU值,数值高的bounding box负责预测物体,并且用IOU代表真实置信度。
项目 | Value |
---|---|
S r e d S_{red} Sred | (371-221) ∗ * ∗(319-51) = 40200 |
S g r e e n S_{green} Sgreen | (357-213) ∗ * ∗(313-60) = 36432 |
S y e l l o w S_{yellow} Syellow | (420-190) ∗ * ∗(254-96) = 36340 |
S g r e e n ⋂ S r e d S_{green}\bigcap S_{red} Sgreen⋂Sred | (357-221) ∗ * ∗(313-61) = 34272, (注: 相交区域为(221, 60, 357, 313)) |
S g r e e n ⋃ S r e d S_{green}\bigcup S_{red} Sgreen⋃Sred | S r e d + S g r e e n S_{red} + S_{green} Sred+Sgreen - S g r e e n ⋂ S r e d S_{green}\bigcap S_{red} Sgreen⋂Sred = 42360 |
S y e l l o w ⋂ S r e d S_{yellow}\bigcap S_{red} Syellow⋂Sred | (371-221) ∗ * ∗(254-96) = 23700, (注: 相交区域为(221, 96, 371, 254)) |
S y e l l o w ⋃ S r e d S_{yellow}\bigcup S_{red} Syellow⋃Sred | S r e d + S y e l l o w S_{red} + S_{yellow} Sred+Syellow - S y e l l o w ⋂ S r e d S_{yellow}\bigcap S_{red} Syellow⋂Sred = 52840 |
I O U g r e e n IOU_{green} IOUgreen | S g r e e n ⋂ S r e d S g r e e n ⋃ S r e d = 34272 42360 \dfrac{S_{green}\bigcap S_{red}}{S_{green}\bigcup S_{red}} = \dfrac{34272}{42360} Sgreen⋃SredSgreen⋂Sred=4236034272 = 0.81 |
I O U y e l l o w IOU_{yellow} IOUyellow | S y e l l o w ⋂ S r e d S y e l l o w ⋃ S r e d = 23700 52840 \dfrac{S_{yellow}\bigcap S_{red}}{S_{yellow}\bigcup S_{red}} = \dfrac{23700}{52840} Syellow⋃SredSyellow⋂Sred=5284023700 = 0.45 |
由于
I
O
U
g
r
e
e
n
IOU_{green}
IOUgreen >
I
O
U
y
e
l
l
o
w
IOU_{yellow}
IOUyellow, 故而绿框代表当前网格对物体的预测框,进而计算置信度损失如下:
网格含物体:
∑
i
=
0
s
2
∑
j
=
0
B
ı
i
j
o
b
j
(
C
i
−
C
^
i
)
2
\displaystyle\sum_{i=0}^{s^2}\displaystyle\sum_{j=0}^{B}\text{\i}_{ij}^{obj}(C_i - \hat{C}_i )^2
i=0∑s2j=0∑Bıijobj(Ci−C^i)2 = 0 + 0 + … +
1
∗
(
0.81
−
0.8
)
2
1*(0.81 - 0.8)^2
1∗(0.81−0.8)2 + 0 +…+0 = 0.0001
网格不含物体:
λ
n
o
o
b
j
∑
i
=
0
s
2
∑
j
=
0
B
ı
i
j
n
o
o
b
j
(
C
i
−
C
^
i
)
2
=
0.5
∗
[
0
+
.
.
.
+
1
∗
(
0
−
0.1
)
2
+
1
∗
(
0
−
0.2
)
2
+
1
∗
(
0
−
0.1
)
2
+
.
.
.
+
0
]
\lambda_{noobj}\displaystyle\sum_{i=0}^{s^2}\displaystyle\sum_{j=0}^{B}\text{\i}_{ij}^{noobj}(C_i - \hat{C}_i )^2=0.5*[0+...+1*(0-0.1)^2+1*(0-0.2)^2+1*(0-0.1)^2+...+0]
λnoobji=0∑s2j=0∑Bıijnoobj(Ci−C^i)2=0.5∗[0+...+1∗(0−0.1)2+1∗(0−0.2)2+1∗(0−0.1)2+...+0]=0.0008
(2) 定位损失
在计算定位损失时,(x, y)为物体框中心点在网格中的偏移量。图示如下,各项计算见如下表格。
项目 | 位置 | 中心点 (x, y, w, h) | 归一化x值 | 归一化y值 |
---|---|---|---|---|
真实框(红) | (221,51,371,319) | (296, 185, 150, 268) | x w ∗ S − c o l = 296 448 ∗ 7 − 4 = 0.62 \dfrac{x}{w}*S-col=\dfrac{296}{448}*7-4=0.62 wx∗S−col=448296∗7−4=0.62 | y w ∗ S − r o w = 185 448 ∗ 7 − 2 = 0.89 \dfrac{y}{w}*S-row = \dfrac{185}{448}*7-2=0.89 wy∗S−row=448185∗7−2=0.89 |
预测框(绿) | (213,60,357,313) | (285, 186.5, 144, 253) | x ^ w ∗ S − c o l = 285 448 ∗ 7 − 4 = 0.45 \dfrac{\hat{x}}{w}*S-col=\dfrac{285}{448}*7-4 = 0.45 wx^∗S−col=448285∗7−4=0.45 | y ^ w ∗ S − r o w = 186.5 448 ∗ 7 − 4 = 0.91 \dfrac{\hat{y}}{w}*S-row=\dfrac{186.5}{448}*7-4=0.91 wy^∗S−row=448186.5∗7−4=0.91 |
定位损失只需要计算含有物体的网格即可,图中仅有一个网格中含有物体,损失计算如下:
中心点损失:
λ
c
o
o
r
d
∑
i
=
0
s
2
∑
j
=
0
B
ı
i
j
o
b
j
[
(
x
i
−
x
^
i
)
2
+
(
y
i
−
y
^
i
)
2
]
\lambda_{coord}\displaystyle\sum_{i=0}^{s^2}\displaystyle\sum_{j=0}^{B}\text{\i}_{ij}^{obj}[(x_i - \hat{x}_i )^2 + (y_i - \hat{y}_i)^2]
λcoordi=0∑s2j=0∑Bıijobj[(xi−x^i)2+(yi−y^i)2] =
5
∗
1
∗
[
(
0.62
−
0.45
)
2
+
(
0.89
−
0.91
)
2
]
5*1*[(0.62-0.45)^2 + (0.89-0.91)^2]
5∗1∗[(0.62−0.45)2+(0.89−0.91)2] = 0.1465
宽高:
λ
c
o
o
r
d
∑
i
=
0
s
2
∑
j
=
0
B
ı
i
j
o
b
j
[
(
w
i
−
w
^
i
)
2
+
(
h
i
−
h
^
i
)
2
]
\lambda_{coord}\displaystyle\sum_{i=0}^{s^2}\displaystyle\sum_{j=0}^{B}\text{\i}_{ij}^{obj}[(\sqrt{w _i} - \sqrt{\hat{w}_i} )^2 + (\sqrt{h_i} - \sqrt{\hat{h}_i})^2]
λcoordi=0∑s2j=0∑Bıijobj[(wi−w^i)2+(hi−h^i)2] =
5
∗
1
∗
[
(
150
448
−
144
448
)
2
+
(
268
448
−
253
448
)
2
]
5*1*[(\sqrt{\smash[b]{\dfrac{150}{448}}} - \sqrt{\smash[b]{\dfrac{144}{448}}})^2 + (\sqrt{\smash[b]{\dfrac{268}{448}}} - \sqrt{\smash[b]{\dfrac{253}{448}}})^2]
5∗1∗[(448150−448144)2+(448268−448253)2] = 0.0098
(3) 类别损失
假设模型对20个类别预测概率如下表
类别 | aeroplane | bicycle | bird | boat | bottle | bus | car | cat | chair | cow | diningtable | dog | horse | motorbike | person | pottedplant | sheep | sofa | train | tvmonitor |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
概率 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.15 | 0.0 | 0.0 | 0.0 | 0.85 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
类别损失只计算含物体的网格,实际只有一个网格含有物体,损失计算如下:
类别损失:
∑
i
=
0
s
2
ı
i
o
b
j
∑
c
ϵ
c
l
a
s
s
e
s
(
p
i
(
c
)
−
p
^
i
(
c
)
)
2
=
[
(
0
−
0.15
)
2
+
(
1
−
0.85
)
2
]
=
0.45
\displaystyle\sum_{i=0}^{s^2}\text{\i}_i^{obj}\displaystyle\sum_{c\epsilon{classes}}(p_i(c) - \hat{p}_i(c))^2 = [(0-0.15)^2 + (1-0.85)^2] = 0.45
i=0∑s2ıiobjcϵclasses∑(pi(c)−p^i(c))2=[(0−0.15)2+(1−0.85)2]=0.45
综上,总损失 = 置信度损失 + 定位损失+ 类别损失 = 0.0001 + 0.0008 + 0.1465 + 0.0019 + 0.45 = 0.5993