前言
前面几篇讲目标检测的是R-CNN系列,基本都是基于候选区来进行分类和回归,可以说是分了两步。本篇开始介绍YOLO系列的yolo-v1,引入了一种新的思路,就是把分类和回归问题都归结为回归问题,一步到位。
主要思想
YOLO的主要思想在于全局的去看整个图像,从左到右,从上到下的去看每一个地方,然后给每个地方两个框,以便于回归物体的位置和边界框,然后去判断每个地方是否是有物体,如果存在物体,又属于哪一类,然后进行边界框的回归。
具体做法
将图像分割成SxS的格子(你会发现没有真正的分割,只是最后是7x7x30的特征图,也就是对应原图分割成了7x7格子,有30个通道),如果某个对象的中心落在某个格子的话,那这个格子就负责检测这个对象。每个格子里会有物体的置信度,也就是物体在这个格子的可能性大小,可信度c包括两部分:是否存在物体
P
r
(
O
b
j
e
c
t
)
Pr(Object)
Pr(Object)的概率,预测框和真实框之间的交并比
I
O
U
p
r
e
d
t
r
u
t
h
IOU_{pred} ^{truth}
IOUpredtruth。定义为:
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
刚才说了每个格子有30个通道,也就是30个特征,其实分为前10个和后20个。
先说前10个特征,前10个特征代表2个框的特征,每个框5个特征,分别对应x,y,w,h,置信度C。x,y对应于框的中心,是相对于某个格子来说的,也就是归一化了0-1,比如格子大小是10x10,框坐标是5,5,那x=0.5,y=0.5。w,h是框的宽和高对应于整个图像的宽和高,也是归一化了0-1,比如图像是100x100,框的宽高分别是20,30,那w=0.2,h=0.3。
后20个就是每个格子的类别的条件概率 P r ( C l a s s i ∣ O b j e c t ) Pr(Class_i|Object) Pr(Classi∣Object),实验中是20个类别,所以是20个,为什么是条件概率呢,因为格子里面可能不存在物体呀,所以得是有物体的存在下是某个类别的概率,即条件概率。
我们要知道某个格子是哪个类别的概率,只要将格子的置信度和类别的条件概率相乘,即该类存在的概率和框的重叠程度:
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_{pred} ^{truth}=Pr(Class_i)*IOU_{pred} ^{truth}
Pr(Classi∣Object)∗Pr(Object)∗IOUpredtruth=Pr(Classi)∗IOUpredtruth
模型
这个没啥好说的,作者说是借鉴一些比较好的网络结构修改而来的,至于为什么有些参数是这样,因为实验结果比较好呀,理论上用了1x1卷积的降维,增加非线性,使得网络更深不至于特征更加抽象等特性。
训练
重要的还是这部分,先来看看损失函数吧,有点长,所以截图了:
其实是分为3部分,红框是边界框之间的损失,绿框是置信度的损失,蓝筐是预测类概率的损失,即坐标,置信度,类别。
先看红框,主要是每个边界框都要算损失:
λ
c
o
o
r
d
\lambda_{coord}
λcoord表示边界框损失的权重系数,也就是这部分损失多重要,也可以理解成惩罚系数,系数大说明对这项比较看重。
∑
i
=
0
S
2
\sum_{i=0}^{S^2}
∑i=0S2表示格子的总数,总共SxS个格子。
∑
i
=
0
B
\sum_{i=0}^{B}
∑i=0B表示每个格子内边界框的总数,总共B个,每个边界框都要这么去算损失。
1
i
j
o
b
j
1_{ij} ^{obj}
1ijobj表示第i个格子,第j个框是否对物体预测负责,就是要不要算这个损失。
后面x,y之间的损失就是方差,但是w,h的不是,因为可能出现大框和小框,大框偏差一点可能还没关系,但是小框和大框同样偏差,那就偏差大了,比如1000米预测,你说偏差个10米也就算了,但是100米偏差10米,那就差大了,所以为了把这种偏差放大,又因为取值是0-1,所以选择开根号,放大这种差距。
再看绿框,主要是每个边界框的置信度损失:
置信度也是两项,包含物体的和不包含物体的。
λ
n
o
o
b
j
\lambda_{noobj}
λnoobj表示边界框中不含有物体的权重系数。
再看蓝色的框,主要是计算每个格子中的预测类别损失:
1
i
o
b
j
1_{i} ^{obj}
1iobj表示第i个格子是否有对象。
总结
细节的东西就不多讲了,具体看代码比较好理解,比如预测里涉及到IOU,NMS等技术,总的来说yolo v1
还是可以的,虽然精确度可能不是最高的,但是速度是确实很快,而且那种思想也相对简单,但是也有不少缺点,比如一个格子只能预测一个类别的物体,导致如果物体很小,或者扎堆,那这样一堆里面只能检测一个物体,就漏了。还有貌似对输入图片尺寸也是有要求的,不能任意的。还有作者也说了边界框宽高比不寻常的物体效果不好,定位错误比较大,大框中的小误差影响不大,但是小框中的小误差影响就大了,同时也给出了和Fast R-CNN的错误比较,可见yolo的背景错误比较少,因为yolo是全局的,一格格过去的当然比较仔细,而Fast R-CNN是用了选择性区域,这个就不好说了,然后定位问题还是上面说的,应该是对于大框小框的误差敏感问题:
好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵,图片来自网络,侵删。