赞
踩
Yolov5是一种单阶段目标检测算法,主要算法思路如下:
输入端主要有三个数据处理:Mosaic数据增强、自适应锚框计算、自适应图片缩放
方法:Mosaic数据增强是在Cutmix数据增强的基础上改进而来。CutMix仅仅利用了两张图片拼接,Mosaic数据增强采用了4张图片,并且按照随机缩放、随机裁剪和随机排布的方式进行拼接。
优势:丰富数据集的同时极大的提升网络的训练速度,并且可以降低模型的内存需求。
针对不同的数据集,都需要设定特定长宽的锚点框。在网络训练阶段,模型在初始锚点框的基础上输出对应地预测框,计算与GT框之间的差距,并执行反向更新操作,从而更新网络的参数,因此初始点锚框的设置也非常关键。
在v3,v4中,训练不同的数据集,都是通过单独的运行程度来获得初始锚点锚框。Yolov5将此功能嵌入到代码,每次训练时,根据数据集的名称自适应的计算出最优的锚点框。网络中对应的命令行为:parser.add_argument(‘–noautoanchor’, action=‘store_ true’, help=‘disable autoanchor check’),如果需要打开,只需要在训练代码时增加–noautoanch or选项即可。
YOLO系列算法中常用的图片尺寸包括416*416, 608*608大小。由于实际使用的图片很多图片的长宽比例不同,因此在缩放填充后,两端都会有黑边,如果填充过多,则会存在大量信息冗余,从而影响整个算法的推理速度。
在yolov5中采用了一个新的方法,在图片中填充最少的黑边。
步骤1-根据原始图片与输入端网络图大小计算缩放比例
步骤2-使用最小的缩放比例对原始图片进行缩放
步骤3-计算黑边填充数值
原理:Focus结构是图片进入Backbone前,对图片进行切片操作。具体操作是在一张图片中每隔一个像素拿到一个值,将图像缩小四倍(长宽各缩小两倍),这样一张图像就可以得到四张图像。例如,images大学为6086083,对图像进行slice操作后得到4*(3304304).
作用:降低参数量(后续理解透了还会再更新)
原理:通过分割梯度流,使梯度流经过不同的网络路径传播。然后对使用Concat再将不同的梯度流进行汇合。从下图中看到X0被分成两部分,一部分通过一个卷积操作,另一个部分直接被复制,然后通过concat操作对这两部分内容进行组合。
目的:为了保证模型识别精度不会下降的情况下,减少计算量,提高推理速度。
在新版的YOLOv5中,使用C3代替CSP结构。C3模块是Yolov5Backbone结构中一个重要的组成部分,其主要作用是增加网络的深度和感受野,提高特征提取的能力。C3模块的组成如下所示:
可以看到,在C3模块主干中包括3个Conv块,一个Bottleneck模块。
Conv模块中封装了三个模块包括:卷积Conv2d(stride=2),BN层和SiLU层。
可以看到BottleNeck模块是一个残差连接结构。先通过一个11卷积对通道数减半,然后,使用一个33结构将通道数量加倍,并获取特征,然后将特征直接输出。
C3模块利用了CSP结构的思想,即将特征图分为两部分处理。一部分直接通过卷积层进行前向传播,另一部分则通过一个更为复杂的结构后再与前者相加。
但是采用了与CSP不同的修正单元,可以看到,相较于BottleneckCSP模块,经过残差输出后的Conv模块被去掉了,Concat后的标准卷积模块中的激活函数也由LeakyRelu变成了SiLU。
原理:SPPF(空间金字塔),首先通过一个标准卷积将输入通道减半,然后分别做kernel-size为5,9,13的maxpooling(对于不同的核大小,padding是自适应的)。然后,对三次池化的结果与未进行池化的结果进行concat,最终channel数是原来的2倍。
作用:SPPF层通过在不同的空间尺度上应用池化操作来提取特征,这些池化操作被并行地应用,并且它们的输出被拼接起来,以保持空间信息的多样性。
YOLOv5Neck中采用了FPN+PAN结构。
FPN:是自顶向下结构,将高层特征通过上采样和低层特征做融合得到进行预测的特征图。
PAN:是自底向上结构。这样结合操作,FPN层自顶向下传达强语义特征,而特征金字塔则自底向上传达强定位特征,两两联手,从不同的主干层对不同的检测层进行参数聚合。
下面截图中插入的文本有错:网络输出的三种尺度分别是:76*76,38*38,19*19
在训练过程中,采用中心点+宽高,即(x,y w,h)的表示形式。
YOLOv4在目标边界框回归过程中,当预测中心点位于左上红点时,
t
x
,
t
y
t_x, t_y
tx,ty趋于∞才能靠近目标框中心点(蓝色点)。并且宽高的预测不稳定(指数函数的表示),很容易导致梯度失控。
YOLOv5对此进行了改进,对于中心点预测,作者放宽了值域的上下限,使
t
x
,
t
y
t_x, t_y
tx,ty预测变得更加稳定、快速。
同时也修改了预测宽高的函数,将预测框与目标匹配的倍数限制在4倍以内。
YOLOv5的每个检测层上的每个网格都预设9个大小、宽高比都不同预设框。但不是每个网格中都存在目标,也并不是每个Anchor都适合用来回归当前目标,因此**需要对这些anchor先验框进行过滤筛选。**筛选过程中包括根据宽高比筛选和跨网格扩充。
宽高比筛选Anchors的大致过程如下:
筛选出来的框,大多数都是负样本,为了扩充正样本,YOLOv5会考虑上下左右四个格子Anchors, 靠近GT中心点的两个格子也会参与边界框的回归和预测,即:
yolov5的损失函数包括:分类损失+定位损失+置信度损失。
先看总损失:
L
=
A
∗
L
c
l
a
s
s
+
B
∗
L
r
e
c
t
+
C
∗
L
o
b
j
L=A*L_{class}+B*L_{rect}+C*L_{obj}
L=A∗Lclass+B∗Lrect+C∗Lobj。
由于YOLOv5是在三个尺度的特征图上进行检测,所以需要对每个尺度的特征图都要求损失,最后的总损失是每个特征图的分类损失+定位损失+置信度损失。
分类损失: 通常对于分类任务,输出的标签往往是互斥的。此时会用到softmax函数将N个类别的预测值总和转换为总和为1的概率值,并分类为概率最高的一类。
y
i
=
S
o
f
t
m
a
x
(
x
i
)
=
e
x
i
∑
n
=
1
N
e
x
n
y_i = Softmax(x_i)=\frac{e^{x_i}}{\sum_{n=1}^Ne^{x_n}}
yi=Softmax(xi)=∑n=1Nexnexi
L
c
l
a
s
s
=
−
∑
n
=
1
N
y
n
∗
l
o
g
(
y
n
)
L_{class}=-\sum_{n=1}^Ny^*_nlog(y_n)
Lclass=−n=1∑Nyn∗log(yn)
在v3之后,考虑到一个目标可能同时属于多个类别(输出“概率”总和>1),在v3之后,则对每个类别做二元交叉熵损失,并对预测概率
y
i
y_i
yi进行sigmoid映射。
y
i
=
S
i
g
m
o
i
d
(
x
i
)
=
1
1
+
e
−
x
i
y_i = Sigmoid(x_i)=\frac{1}{1+e^{-x_i}}
yi=Sigmoid(xi)=1+e−xi1
L
c
l
a
s
s
=
−
∑
n
=
1
N
y
i
∗
l
o
g
(
y
i
)
+
(
1
−
y
i
)
l
o
g
(
1
−
y
i
)
L_{class} = -\sum_{n=1}^Ny^*_ilog(y_i)+(1-y_i)log(1-y_i)
Lclass=−n=1∑Nyi∗log(yi)+(1−yi)log(1−yi)
定位损失(预测框与GT框之间的误差):用于衡量预测框与真实框之间的匹配程度。在YOLOv5中定位损失采用了CIOU损失,即:
C
I
O
U
=
I
O
U
−
α
.
D
C
I
−
β
.
V
A
CIOU=IOU-\alpha . D_{CI}-\beta . V_A
CIOU=IOU−α.DCI−β.VA
V
A
=
4
π
(
a
r
c
t
a
n
w
g
t
h
g
t
−
a
r
c
t
a
n
w
h
)
2
V_A=\frac{4}{\pi}(arctan\frac{w^{gt}}{h^{gt}}-arctan\frac{w}{h})^2
VA=π4(arctanhgtwgt−arctanhw)2
其中,IOU表示预测框与真实框的交并比;
D
C
I
D_{CI}
DCI表示预测框与真实框之间的中心点之间的距离,用于衡量预测框与真实框中心点的偏移;
V
A
V_A
VA表示预测框与真实框比例的插值归一化。
置信度损失:关注的是“对象的存在性”和“定位准确性”。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。