文章目录
1. one-stage与two-stage检测算法
two-stage:
one-stage目标检测算法:一步到位,速度较快。
yolo_v1的基本思想:预测框的位置、大小和物体分类都通过CNN暴力predict出来。
1. 模型过程
yolo v1进行目标检测的过程如下图所示
就拿yolo如何检测出这只小狗的过程来说,引出yolo是如何进行目标检测和在这个过程中的相关概念。
1.1 grid cell
首先,将图片分为7*7的网格,每个网格叫做grid
或则和grid cell
。所以一张图片有49个grid。如果一个目标的中心位置落在某个格子,那么这个格子就负责检测出这个目标(If the center of an object falls into a grid cell, that grid cell is responsible for detecting that object.
)。比如下面狗的中心落在(5,2)grid,所以该grid负责预测狗。
1.2 bounding box与confidence score
上文中含有小狗中心的那个grid cell
会预测2个bounding boxes
(边界框)和这些框框的confidence scores
(置信度分数)。
这些confidence scores
反映了模型对框中包含对象的置信度,以及它认为框预测的准确性。也就是一个bounding box
对应一个confidences score
。
在这里,需要明确一点,一个grid cell
会有多个bounding box
,而每个bounding box
会有一个confidence score
。比如,下面的一个grid cell
就有三个bounding box
。每个bounding box
会对应一个confidences score
。
其中,confidences score
的定义公式为:
置
信
度
=
P
r
(
O
b
j
e
c
t
)
∗
I
O
U
p
r
e
d
t
r
u
t
h
置信度=Pr(Object)*IOU^{truth}_{pred}
置信度=Pr(Object)∗IOUpredtruth
其中,Pr(Object)代表bounding box
对应的grid cell
中是否有含有物体中心。若有,为1,若没有,则为0(没有的话,计算IOU没有任何意义)。
关于IOU,它表示的是真实框与预测框的交并比。其意义如下图所示。
所以confidences score
代表其所对应的bounding box
预测能力的强弱。
每个bounding box有5个属性,x、y、w、h和confidence core。(x,y)表示的是某个grid cell下的bounding box的中心(The (x, y) coordinates represent the center of the box relative to the bounds of the grid cell.
)。w和h表示预测的图片的宽和高(个人理解,w和h就是bounding box的宽和高)。最后,confidence反应的是预测图像和真实图像的IOU。
1.3 类别预测
每个grid cell有预测C个条件概率:Pr(Classi|Object),即在一个grid cell包含一个Object的前提下,它属于某个类的概率。 每个网格单元预测一组类概率,不管框的数量是多少。也就是说,类别预测只是跟grid cell是相关的,与这个grid cell有多少个bounding box无关。
最终每个网格会得到一个30维度向量。
所以,最后一张图片会生成一个7730的张量。
其中,置信度confidence score计算为
所以上面说的类别预测的条件概率乘以单个盒子的置信度即:
=
P
r
(
C
l
a
s
s
i
)
∗
I
O
U
p
r
e
d
t
r
u
t
h
=Pr(Class_{i})*IOU^{truth}_{pred}
=Pr(Classi)∗IOUpredtruth
这个给了我们每个box一个分数特殊类别预测。这些分数编码了类出现在框中的概率以及预测框与对象的匹配程度。
1.4 预测目标
在测试阶段,将每个网格的类别预测与每个 bounding box的 confidence相乘:
在有目标中心的情况下,即Pr(Object)不等于0
P
r
(
C
l
a
s
s
i
∣
O
b
j
e
c
t
)
∗
置
信
度
=
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(Class_{i}|Object)*Pr(Object)*IOU^{truth}_{pred} =Pr(Class_{i})*IOU^{truth}_{pred}
Pr(Classi∣Object)∗置信度=Pr(Classi∣Object)∗Pr(Object)∗IOUpredtruth=Pr(Classi)∗IOUpredtruth
这是我看到的一篇博客的图。
在训练过程中,关于拿如何把狗这个对象预测出来。整个过程有三点:
首先,将整个图片分成S*S个grid cell(网格)。每个grid cell会预测B个(多个)
2. 网络的学习
对于上面的过程,可能会有如下疑问:
- 模型是如何知道“狗”的中心点在哪个网格,或者说模型是如何知道网格中是否包含物体中心点
- 模型是如何选择bbox的,即预测框是如何框的
- 模型是如何预测方框中的对象是“狗”,而不是猫或者其他的东西
2.1 网络输出的数据与预测集数据
由1中可知,神经网络每次回输出7730(即SS(B*5+C))的张量。
对于每个网格会输出一个30维张量。
同时,我们的数据集经过处理过后,会有一个25维的张量(一个真实框+类别)。
拿预测的值和真实值进行对比。以此达到训练的目的。
所以:
- 模型开始并不知道“狗”的中心点在哪个网格,它会随机预测一个,拿它与真实值对比。以此达到学目的。
- 模型开始也是随机选择bbox的,然后拿它跟真实框对比,以此来学习。
- 至于预测网格中对象是“狗”而不是“猫”,则是类似于手写识别字
2.2 损失函数
损失函数的设计目标就是让坐标(x,y,w,h),confidence,classification 这个三个方面达到很好的平衡。
2.3 网络的设计
YOLO的检测网络分为24个卷积层和2个全连接层,如下图所示:
其中,卷积层用来提取图像特征,全连接层用来预测图像位置和类别概率。