YOU ONLY LOOK ONCE 从原理至实现的细致分析
背景
最近在读目标检测领域的文章,一下就看到YOLO系列和R-CNN系列,打算每篇论文都精读一下,发个博客将来需要用的时候回顾一下。
YOLO之前最流行的方法是RCNN系列,当时已经出了Faster-RCNN了,可是这种方法的训练时间和实际应用耗费时间有些长了,不能满足实时场景的需求。在渴望简单高效方法的环境下,YOLO应运而生。
作为目标检测领域的必读论文之一,You only look once 这篇论文中所采用的神经网络结构平平无奇。
忽略最后一层全连接层,就是一种可以分类4096种图片的图像分类CNN模型。
很神奇的是加上最后一层全连接层,它就可以用来做目标检测。
YOLO总体思想
先了解一下YOLO的大体思路
- 将图片分成S*S个grid
- 在每个grid中找到B个bounding box(x, y, w, h, c)
- 每个grid预测C类object的概率
- non-max suppression 找到几个confidence高的bounding box作为最终选择
训练的图片是需要人工标注的,也就是框出每个要识别的物体和相应的类别,这里x, y表示bounding box的中心点坐标,w, h表示物体的宽度和高度,c表示confidence,
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_{pred}^{truth}
confidence=Pr(Object)∗IOUpredtruth
为了在PASCAL VOC上评估YOLO,论文中取
S
=
7
,
B
=
2
,
C
=
20
S=7, B=2, C=20
S=7,B=2,C=20
最终得到的预测结果是
7
×
7
×
(
2
×
5
+
20
)
7 \times 7 \times (2 \times 5 + 20)
7×7×(2×5+20) tensor
注意:这里每个grid只预测一个物体
损失函数
众所周知,神经网络的流行很大程度归功于损失函数,根据损失函数,模型权重不断的优化,最终得出满意的结果。YOLO模型的损失函数与图像分类的损失函数就有很大的区别
YOLO损失函数共包括5项,其中第4项是grid中没有物体时对应的损失。
1
i
j
o
b
j
=
1
\mathbb{1_{ij}^{obj}=1}
1ijobj=1,如果grid中有object,否则
1
i
j
o
b
j
=
0
\mathbb{1_{ij}^{obj}=0}
1ijobj=0
1
i
j
n
o
o
b
j
\mathbb{1_{ij}^{noobj}}
1ijnoobj与之相反