要介绍yolo-v3,首先要知道yolo-v1和yolo-v2
yolov1核心思想
核心思想是:
要预测一张图片中有哪些物体。如果有一个输入,s×s大小的图片。如果有一个图片上的物体的中心点落到了某一个小区域,就预测这个小区域是什么。
所以要预测图片中的每一个小区域分别代表什么。但是对每一个小区域预测之后,并不知道预测到的物体他的长宽比例是什么。此时就有一些先验的长宽比例,虽然这个比例和实际可能有一些不符合。
对每个小区域来进行预测,预测当前的小区域是否有物体,会预测出一些置信度,要把置信度比较小的给过滤掉。
之后就需要对这些先验知识进行微调,这些微调就是回归任务,通过回归任务来看长和宽做什么微调最为合适。
此时就要看选择哪一个先验框来进行微调。此时选择IOU大的来进行回归。选择的这个先验框叫做候选框。
yolov1网络架构
输入图像的大小是固定的,通过对图像进行reset来进行实现。输入图片的大小为448×448×3。因为卷积网络的全连接层的特征图大小是固定的。
最后的7×7×30中的7×7代表要预测的特征图的大小为7×7个格子。
每个格子要预测30个值:B1(x1,y1,w1,h1(指预测出的物体的起始位置和长宽比例),c1)这是一个先验框预测出来的指,网络预测了两个框。目前为止,就要10个值了。之后的20个是一个20分类,每一个格子上的物体属于每一个类别的概率,这些类别有20种类别。最后就是5+5+20=30。
位置损失函数的计算
损失函数就是真实值和预测值之间的误差,分为位置误差,置信度误差,分类误差等。
对于位置误差,为
(
x
−
−
x
)
2
+
(
y
−
−
y
)
2
+
(
w
−
−
w
)
+
(
h
−
−
h
)
(x^--x)^2+(y^--y)^2+(\sqrt{w^-}-\sqrt{w})+(\sqrt{h^-}-\sqrt{h})
(x−−x)2+(y−−y)2+(w−−w)+(h−−h)其中,因为有些物体的面积大,有些物体的面积小,面积小的物体的绝对误差很小时,也会导致对面积小的物体的预测出现较大的错误,所以要对加一个根号来削弱这一特征。
置信度误差的计算
我们希望置信度越接近于IOU越好,所以置信度误差为 ( C i − I O U i ) 2 (C_i-IOU_i)^2 (Ci−IOUi)2。但是预测分为对物体的预测和对背景的预测,那么背景的置信度误差之前就加一个权值,来削弱背景误差的影响。
非极大值抑制(NMS)
选择IOU最大的值。
yolov1的优点
简单,快速
yolov1存在的问题
如果有两个物体重合在一起,最后很难分类。
小物体很难检测得到,因为先验框固定而且没有考虑小物体
如果一个物体有多个标签,很难处理。
yolo-v2概述
yolov2舍弃了Dropout,在每一次卷积后全部加入Batch Normalization,网络的每一次都加入了归一化,使得收敛更加容易。
V1训练时用的是224×224,测试的时候使用448×448。
V2在训练时额外又进行了10次448×448的微调
使用了高分辨率分类器后,提高了4%。
yolov2网络架构的特点
yolo-v2提出了一种新的网络结构,实际输入为416×416,称为DarkNet(19)。为什么不是448,因为他一定可以被
2
32
2^{32}
232整除。416是一个比较合适的值。(见下面几行)
整个网络没有全连接层,可以加快速度,也可以避免过拟合。所有操作都用卷积来实现,最后目标只是提取特征而已。
没有FC层,经过了5次降采样即
2
32
2^{32}
232。最后416×416变成了13×13。最后的输出就是13×13。
用了3×3的卷积,还有一些1×1的卷积(在传递中用1×1的卷积更加节省时间)。
yolov2-聚类提取先验框
在yolov1中先验框是选择了两种,在实际的物体中,先验框远不止两种。在faster-cnn系列中,选择的先验比例都是常规的,但是不一定完全适合数据集。
聚类提取先验框:先把训练集里面所有的先验框全提取出来在进行聚类。聚类的距离度量选择的是IOU。
d
(
b
o
x
,
c
e
n
t
r
o
i
d
s
)
=
1
−
I
O
U
(
b
o
x
,
c
e
n
t
r
o
i
d
)
d(box,centroids)=1-IOU(box,centroid)
d(box,centroids)=1−IOU(box,centroid)。IOU越小,d越大。经过实验选择的聚类类别数量是5时,效果最好。
引入先验框,通过引入Anchor-Box,使得预测的box数量更多(13×13×n)。
yolov2-偏移量计算
如果计算出来的位置中心为
(
x
p
,
y
p
)
(x_p,y_p)
(xp,yp),宽和高为
(
w
p
,
h
p
)
(w_p,h_p)
(wp,hp),则:
x
=
x
p
+
w
p
t
x
x=x_p+w_pt_x
x=xp+wptx,
y
=
y
p
+
w
p
t
y
y=y_p+w_pt_y
y=yp+wpty当
t
x
=
1
t_x=1
tx=1时,那么bbox在x轴上向右移动
w
p
w_p
wp,反之,则向左移动,这样会导致收敛问题,模型不稳定,尤其是刚开始训练的时候。
所有yolov2中并没有直接使用偏移量,而是选择相对grid cell的偏移量,这里的gird cell指的就是一个网格,如下图所示:从图中可以看出,
t
x
t_x
tx和
t
y
t_y
ty在sigmod函数的约束下,使得预测出来的位置中心无法脱离网格,避免了不稳定的收敛。而为了记住预测中心的位置,(用于映射到原图),使用了
C
x
和
C
y
C_x和C_y
Cx和Cy,代表着他们在水平是在第几个格子,竖直是在第几个格子。
上图的
p
w
p_w
pw和
p
h
p_h
ph是已只常数,而
b
w
b_w
bw和
b
h
b_h
bh是预测框的大小。
yolov2-感受野的作用:
感受野指的是一个特征图上的数据可以代表原始图像的多大区域。即特征图上一个点的大小是输入图片多大区域的浓缩,即卷积核的大小。
最终的是一个点相当于原始图像多大区域的浓缩。
如果堆叠3个3×3的卷积层,并且保持滑动窗口步长为1,其感受野就是7×7了,那为什么不用一步7×7的卷积核。
堆叠小的卷积核所需要的参数更少一些,并且卷积过程越多,特征提取就越细致,加入的非线性变换也会随着增多,而且不会增加参数个数。
yolov2-特征融合:
yolo-v2最好一层时感受野太大了,小目标可能丢失,需要融合之前的特征。如将一个26×26×512拆为13×13×2048,在加上一层13×13×1024,最后加起来就是13×13×3072。
都是卷积操作的话,就不像yolov1中一样需要对图片大小进行限制,所以图片大小就可以更加灵活。
yolov3-概述:
yolov3最大的改进就是网络结构,使其更适合小目标检测。特征做的更加细致,融入多持续特征图信息来预测不太规格的物体。先验框更丰富了,3种scale,每种3个规格,一共九种,并且做了softmax改进,预测多标签任务。
多scale改进和特征融合
为了能检测到不同大小的物体,设计了3个scale。3个scale的大小分别为52×52,26×26,13×13。那么,这三种大小的特征图从何而来?
最直接的想法就是用多层卷积,卷到大小为52时提出来,卷到大小为26时提出来,卷到大小为13时在提出来。但是还需要借鉴:即大小为52的需要借鉴大小为26的特征图,大小为26的需要借鉴大小为13的特征图。(特征图越小,感受野越大,感受野小的借鉴感受野大的)。
融合方法
将13×13的做上采样成为26×26的图。然后将其与原来的26×26的融合到了一起。
残差连接方法
resnet的思想:残差连接。在传统神经网络中,并不是卷积层数越多,效果越好,例如:从19层开始卷积卷到56层,整体效果会下降。在19-56层这么多层之中,里面会有卷积效果好的和卷积效果差的。
19层→20层→21层,19层到20层有两种方法,一种是卷积,另一种是啥都不干,直接拿过来当做第20层使用。核心思想就是至少不比原来差。
yolov3卷积架构
没有池化层和全连接层,全部卷积;下采样通过stride为2实现,三种scale,更多先验框,基本上融合了当年全部的经典做法。
yolov3-sotfmax层改进
物体检测任务中可能有多个标签。使用logistic激活函数来完成,这样就可以预测每一个类别是/不是。
∑
y
i
−
l
n
y
i
\sum{y_i^-lny_i}
∑yi−lnyi,他是以对数的形式存在,如果
y
i
y_i
yi越接近于,那么
y
i
−
l
n
y
i
y_{i}^{-}lny_{i}
yi−lnyi越接近于0。这样就避免了属于某一个类别的概率越大而去影响其他类别的概率。