一、引言
YOLOv5与YOLOv4实质上都是在YOLOv3算法的基础上,进行了网络结构及训练技巧等方面的改进,使得检测性能得到进一步的提升。
YOLO系列目标检测的框架,通常可以分为如下几个部分:输入端、骨干网络、Neck网络和输出端。本文将具体阐述YOLOv5算法的改进之处,主要内容如下:(1)输入端的改进,主要增加了Mosaic数据增强方法和自适应图片缩放方法。(2)骨干网络的改进,考虑了Focus结构和CSPNet结构。(3)输出端的改进,主要对损失函数的构建进行了研究。
二、数据增强
YOLOv5算法实验部分采用的数据增强方式是马赛克(Mosaic)方法,Mosaic方法原理上与CutMix方法类似。CutMix运用的是两张图片,而Mosaic方法运用了四张图片。我们首先说明CutMix数据增强的原理。
如图1(左)所示,CutMix方法是将图片的一部分区域裁剪掉,但不是以0像素填充,而是随机填充训练集中的其他数据图像部分区域的像素值,分类结果按一定比例分配。原理如下:
x
A
x_A
xA和
x
B
x_B
xB是训练集中的两张不同的图片,
y
A
y_A
yA和
y
B
y_B
yB是与之相对应的标签值。经过CutMix之后的新训练样本
x
~
\tilde{x}
x~和对应的标签
y
~
\tilde{y}
y~的生成方法如公式(1)所示:
x
~
=
M
⊙
x
A
+
(
1
−
M
)
⊙
x
B
y
~
=
λ
y
A
+
(
1
−
λ
)
y
B
(1)
\tilde{x}=M\odot x_A+(\pmb{1}-M)\odot x_B\\ \tilde{y}=\lambda y_A+(\pmb{1}-\lambda)y_B\tag{1}
x~=M⊙xA+(1−M)⊙xBy~=λyA+(1−λ)yB(1)
其中,1指所有元素都为1的二进制掩码,
λ
\lambda
λ服从Beta分布,
M
∈
{
0
,
1
}
W
×
H
M\in\{0,1\}^{W\times H}
M∈{0,1}W×H,
W
×
H
W\times H
W×H指的是图像的大小。
M
M
M是一个与原图尺寸一致的由0和1标记的掩码矩阵,它标记了需要裁剪的区域和保留的区域,裁剪的区域值均为0,其余位置为1。为了对掩码矩阵
M
M
M进行采样,需要先对裁剪区域的边界框
B
B
B进行采样。我们将边界框
B
B
B记作
B
=
(
r
x
,
r
y
,
r
w
,
r
h
)
B=(r_x,r_y,r_w,r_h)
B=(rx,ry,rw,rh),其中
(
r
x
,
r
y
)
(r_x,r_y)
(rx,ry)指裁剪区域的中心点坐标,
r
w
r_w
rw和
r
h
r_h
rh指裁剪区域的宽和高,采样公式如(2)所示:
r
x
∼
U
n
i
f
(
o
,
W
)
,
r
w
∼
W
1
−
λ
,
r
y
∼
U
n
i
f
(
0
,
H
)
,
r
h
∼
H
1
−
λ
(2)
r_x\sim Unif(o,W),\quad r_w\sim W\sqrt{1-\lambda},\\ r_y\sim Unif(0,H),\quad r_h\sim H\sqrt{1-\lambda}\tag{2}
rx∼Unif(o,W),rw∼W1−λ,ry∼Unif(0,H),rh∼H1−λ(2)
裁剪区域
B
B
B确定后,将区域内的掩码值置为0,其余区域置为1.按照公式将图片
A
A
A中相对于区域
B
B
B的部分擦除,并将图片
B
B
B中相对于区域
B
B
B的部分填充到图片
A
A
A中,完成CutMix操作。
Mosaic数据增强参考了CutMix方法,理论上相似,但Mosaic利用了四张图片,采用随机裁剪、缩放、排布的方式进行拼接,如图1(右)所示。Mosaic数据增强的优点是更加丰富了检测物体的背景,且在批量标准化计算的时候会一次性计算四张图片的数据,使得Mini-batch的设置不需要太大,那么使用较少的GPU即可达到较好的效果。同时,Mosaic方法也能提高小目标的检测效果。MS COCO数据集的大、中、小目标分布不均,而Mosaic方法利用了随机缩放进行拼接,增加了小目标的数据,丰富了数据集,从而使网络更加鲁棒。
三、网络结构
3.1、YOLOv5网络结构
目前YOLOv5算法共有4个版本,分别是:YOLOv5s、YOLOv5m、YOLOv51和YOLOv5x。本节以YOLOv5s为例进行说明,其他版本的结构原理与之类似,是在YOLOv5s的基础上对网络加宽。YOLOv5s目标检测算法的整体网络结构如图2所示。YOLOv5s的输入图像大小为 608 × 608 608\times 608 608×608,下面分别介绍网络结构的每一个组件:
(1)CBL模块:该模块由卷积操作(Conv)、批量标准化操作(BN)和激活函数(Leaky-Relu)三部分组成,如图3所示。
(3)SPP模块:如图5所示,该结构分别采用
1
×
1
1\times 1
1×1、
5
×
5
5\times 5
5×5、
9
×
9
9\times 9
9×9和
13
×
13
13\times 13
13×13的最大池化,再将所得结果拼接,得到融合后的特征。
(4)CSP1_X和CSP2_X模块:借鉴CSPNet的思想(后面具体说明),该模块由卷积层、CBL模块和Res Unit模块三部分组成。其中,Res Unit模块借鉴ResNet残差结构,由CBL模块组成,如图6所示。CSP_X和CSP_X模块结构如图10和11所示。
3.2、Focus结构
与YOLOv4相比,Focus结构是YOLOv5中特有的结构,其中的关键是切片操作。Focus结构是指,再图片进入骨干网络之前,将图片每隔一个像素取一个值,与临近下采样操作相似,即可得到四组图片。Focus操作将图像的宽和高信息集中到了通道空间,通道的维数扩大为原来的4倍,即拼接后的结果相当于将原先的RGB三通道模式变成了12个通道,最后将得到的结果再经过卷积操作,得到最终的二倍下采样的特征图。切片操作的过程如下图7所示。
我们发现,图片在经过Focus结构后,最直观的是它起到了采样的作用,但是Focus操作和常用的卷积下采样又略有不同。我们可以对Focus的计算量和普通卷积下采样计算量进行对比,计算量以浮点运算数(FLOPs)为评估标准。以YOLOv5s为例,输入图像大小为608×608×3,计算量的对比结果如下:
(1)如果采用普通卷积下采样,卷积核大小是3×3,步长为2,输出通道数为32,则经过采样后的特征图维数是304×304×32,那么普通卷积下采样无偏差时的计算量理论上的结果如公式(3)所示。
F
l
o
P
s
(
C
o
n
v
)
=
3
×
3
×
3
×
32
×
304
×
304
(3)
FloPs(Conv)=3\times 3\times 3\times 32\times 304\times 304\tag{3}
FloPs(Conv)=3×3×3×32×304×304(3)
(2)如果采用Focus结构,先采用切片操作,特征图大小变为304×304×12,再经过一次卷积核大小为3×3的卷积操作,最终输出的特征图大小为304×304×32,过程如图8所示。Focus结构无偏差时的计算量理论上的结构如公式(4)所示。
F
L
O
P
s
(
F
o
c
u
s
)
=
3
×
3
×
3
×
4
×
32
×
304
×
304
(4)
FLOPs(Focus)=3\times 3\times 3\times 4\times 32\times 304\times 304\tag{4}
FLOPs(Focus)=3×3×3×4×32×304×304(4)
可以看到,采用Focus结构的计算量要比普通卷积下采样的计算量多一些,大约是普通卷积下采样的4倍,但Focus结构的好处是下采样的过程中减少了信息的丢失。综上所述,YOLOv5算法采用Focus结构的主要作用在于,图片进行下采样的过程中,将宽和高的信息集中到了通道维数上,再利用卷积层进行特征提取,使得特征提取更加充分。虽然带来了一些计算量的增加,但减轻了信息的丢失现象。
3.3、CSP结构
CSPNet(Cross Stage Partial Network)主要从网络结构的设计方面减少推理时的计算量。CSPNet的提出主要做了以下改进:增强CNN的学习能力,能够再轻量化的同时维持准确性;降低计算瓶颈以及降低内存成本。CSPNet将底层的特征图按通道拆分为两部分,一部分经过密集块(由多个全连接层组成)和过渡层(通常是卷积核大小为1×1的卷积层),另一部分与传输的特征图结合,在减少计算量的同时也提高了推理的速度和准确性。CSPNet不仅是一种网络结构,也是一种处理思想,它可以与ResNet、ResNeXt以及DenseNet等网络进行结合。以DenseNet为例,DenseNet与CSPDenseNet的对比示意图如图9所示。
如图9(a),以DenseNet为例,前向传播过程如公式(5),反向传播权重的更新过程如公式(6)。其中,“ ∗ \ast ∗”代表卷积算子, [ x 0 , x 1 , ⋯ , x k ] [x_0,x_1,\cdots,x_k] [x0,x1,⋯,xk]表示将 x 0 , x 1 , ⋯ , x k x_0,x_1,\cdots,x_k x0,x1,⋯,xk进行拼接, f f f是更新权重的函数, g i g_i gi表示传递到第 i i i个全连接层的梯度, w i w_i wi和 x i x_i xi分别是第 i i i个全连接层的权重和输出。
x
1
=
w
1
∗
x
0
x
2
=
w
2
∗
[
x
0
,
x
1
]
⋯
x
k
=
w
k
∗
[
x
0
,
x
1
,
⋯
,
x
k
−
1
]
(5)
x_1=w_1\ast x_0\\ x_2=w_2\ast [x_0,x_1]\\ \cdots\\ x_k=w_k\ast [x_0,x_1,\cdots,x_{k-1}]\tag{5}
x1=w1∗x0x2=w2∗[x0,x1]⋯xk=wk∗[x0,x1,⋯,xk−1](5)
w
1
′
=
f
(
w
1
,
g
0
)
w
2
′
=
f
(
w
2
,
g
0
,
g
1
)
w
3
′
=
f
(
w
3
,
g
0
,
g
1
,
g
2
)
⋯
w
k
′
=
f
(
w
k
,
g
0
,
g
1
,
g
2
,
⋯
,
g
k
−
1
)
(6)
w_1^\prime=f(w_1,g_0)\\ w_2^\prime=f(w_2,g_0,g_1)\\ w_3^\prime=f(w_3,g_0,g_1,g_2)\\ \cdots\\ w_k^\prime=f(w_k,g_0,g_1,g_2,\cdots,g_{k-1})\tag{6}
w1′=f(w1,g0)w2′=f(w2,g0,g1)w3′=f(w3,g0,g1,g2)⋯wk′=f(wk,g0,g1,g2,⋯,gk−1)(6)
我们发现,在利用反向传播更新全连接层之间的权重的计算过程中,大量的梯度信息是重复利用的,导致不同全连接层重复学习相同的梯度信息。为了解决这一问题,CSPDenseNet将底层特征通道分为两部分,记作
x
0
=
[
x
0
′
,
x
0
′
′
]
x_0=[x_0^\prime,x_0^{\prime\prime}]
x0=[x0′,x0′′]。
x
0
′
x_0^\prime
x0′直接连接到该阶段的末尾,而
x
0
′
′
x_0^{\prime\prime}
x0′′需要经过密集块和过渡层。如图9(b),密集块的输出
[
x
0
′
′
,
x
1
,
⋯
,
x
k
]
[x_0^{\prime\prime},x_1,\cdots,x_k]
[x0′′,x1,⋯,xk]经过过渡层,得到输出
x
T
x_T
xT。
x
T
x_T
xT与
x
0
′
x_0^\prime
x0′拼接后经过过渡层,得到输出结果
x
U
x_U
xU。CSPDenseNet前向传播过程如公式(7),反向传播权重的更新过程如公式(8)。
x k = w k ∗ [ x 0 ′ ′ , x 1 , ⋯ , x k − 1 ] x T = w T ∗ [ x 0 ′ ′ , x 1 , ⋯ , x k ] x U = w U ∗ [ x 0 ′ , x T ] (7) x_k=w_k\ast [x_0^{\prime\prime},x_1,\cdots,x_{k-1}]\\ x_T=w_T\ast [x_0^{\prime\prime},x_1,\cdots,x_{k}]\\ x_U=w_U\ast [x_0^\prime,x_T]\tag{7} xk=wk∗[x0′′,x1,⋯,xk−1]xT=wT∗[x0′′,x1,⋯,xk]xU=wU∗[x0′,xT](7)
w
k
′
=
f
(
w
k
,
g
0
′
′
,
g
1
,
g
2
,
⋯
,
g
k
−
1
)
w
T
′
=
f
(
w
k
,
g
0
′
′
,
g
1
,
g
2
,
⋯
,
g
k
)
w
U
′
=
f
(
w
U
,
g
0
′
,
g
T
)
(8)
w_k^\prime=f(w_k,g_0^{\prime\prime},g_1,g_2,\cdots,g_{k-1})\\ w_T^\prime=f(w_k,g_0^{\prime\prime},g_1,g_2,\cdots,g_{k})\\ w_U^\prime=f(w_U,g_0^\prime,g_T)\tag{8}
wk′=f(wk,g0′′,g1,g2,⋯,gk−1)wT′=f(wk,g0′′,g1,g2,⋯,gk)wU′=f(wU,g0′,gT)(8)
可以看到,两边路径的梯度是单独集成的。更新权重的梯度信息时,两边都不包含属于另一半的重复梯度信息。CSPNet通过截断梯度流,防止梯度信息过多地重复计算。
CSPNet的思想在YOLOv4和YOLOv5目标检测算法中继续被延用。YOLOv4将CSPNet与YHOLOv3的骨干网络DarkNet53结合,增强了卷积神经网络的学习能力,也降低了计算瓶颈和内存成本。YOLOv5与YOLOv4结构的不同点在于,YOLOv4只是在骨干网络部分运用了CSPNet结构,而YOLOv5设计了两种CSPNet结构,分别为CSP1_X和CSP2_X。如图10和11所示,CSP1_X结构应用于骨干网络,另一种CSP2_X结构则应用于Neck部分。总结来说,在目标检测任务中,利用CSPNet改进骨干网络能提升检测的性能,增强了CNN的学习能力,同时减少计算量,提升推理的速度。
四、损失函数
目标检测任务的损失函数一般由边界框回归损失和分类损失两部分构成,本部分将说明实验训练阶段运用的边界框回归损失和分类损失。
边界框回归损失最常用的计算指标是交并比(
I
o
U
IoU
IoU),计算方法如公式(9)。
I
o
U
=
∣
A
∩
B
∣
A
∪
B
(9)
IoU=\frac{|A\cap B|}{A\cup B}\tag{9}
IoU=A∪B∣A∩B∣(9)
交并比可以获得预测框和真是框之间的距离,从而反映检测的效果,但是它作为损失函数会有以下的缺点:如果两个框没有相交,根据定义,
I
o
U
=
0
IoU=0
IoU=0,不能充分反映两者的重合程度;同时因为
I
o
U
=
0
IoU=0
IoU=0,
l
o
s
s
=
1
−
I
o
U
=
1
loss=1-IoU=1
loss=1−IoU=1,没有梯度回传,所以无法进行学习和训练。
YOLOv5算法采用的是
G
I
o
U
GIoU
GIoU作为边界框回归的损失函数,
G
I
o
U
GIoU
GIoU方法在克服了
I
o
U
IoU
IoU缺点的同时又充分利用了
I
o
U
IoU
IoU的优点。假设
A
A
A为预测框,
B
B
B为真实框,令
C
C
C表示包含
A
A
A与
B
B
B的最小凸闭合框。
G
I
o
U
GIoU
GIoU的计算公式如(10),损失函数
G
I
o
U
l
o
s
s
GIoUloss
GIoUloss的计算如公式(11)。
G
I
o
U
=
I
o
U
−
∣
C
∖
(
A
∪
B
)
∣
∣
C
∣
(10)
GIoU=IoU-\frac{|C\setminus(A\cup B)|}{|C|}\tag{10}
GIoU=IoU−∣C∣∣C∖(A∪B)∣(10)
G
I
o
U
l
o
s
s
=
1
−
G
I
o
U
(11)
GIoUloss=1-GIoU\tag{11}
GIoUloss=1−GIoU(11)
训练阶段的分类损失采用的是二元交叉熵损失(BCE loss)。因此,如公式(12)所示,完整的损失函数有边界框回归损失(第一项)、置信度预测损失(第二三项)和类别预测损失(第四项)三部分构成。
L
o
s
s
(
o
b
j
)
=
G
I
o
U
l
o
s
s
+
∑
i
=
0
S
×
S
∑
j
=
0
B
1
i
j
o
b
j
[
C
i
l
o
g
(
C
i
)
+
(
1
−
C
i
)
l
o
g
(
1
−
C
i
)
]
−
∑
i
=
0
S
×
S
∑
j
=
0
B
1
i
j
n
o
o
b
j
[
C
i
l
o
g
(
C
i
)
+
(
1
−
C
i
)
l
o
g
(
1
−
C
i
)
]
+
∑
i
=
0
S
×
S
∑
j
=
0
B
1
i
j
o
b
j
∑
c
∈
c
l
a
s
s
e
s
[
p
i
(
c
)
l
o
g
(
p
i
(
c
)
)
+
(
1
−
p
i
(
c
)
)
l
o
g
(
1
−
p
i
(
c
)
)
]
(12)
\begin{aligned} Loss(obj)=&GIoUloss\\ &+\sum_{i=0}^{S\times S}\sum_{j=0}^{B}\pmb{1}_{ij}^{obj}\big[C_ilog(C_i)\\ &+(1-C_i)log(1-C_i)\big]\\ &-\sum_{i=0}^{S\times S}\sum_{j=0}^{B}\pmb{1}_{ij}^{noobj}\big[C_ilog(C_i)\\ &+(1-C_i)log(1-C_i)\big]\\ &+\sum_{i=0}^{S\times S}\sum_{j=0}^{B}\pmb{1}_{ij}^{obj}\quad\sum_{c\in classes}\big[p_i(c)log\big(p_i(c)\big)\\ &+\big(1-p_i(c)\big)log\big(1-p_i(c)\big)\big]\tag{12} \end{aligned}
Loss(obj)=GIoUloss+i=0∑S×Sj=0∑B1ijobj[Cilog(Ci)+(1−Ci)log(1−Ci)]−i=0∑S×Sj=0∑B1ijnoobj[Cilog(Ci)+(1−Ci)log(1−Ci)]+i=0∑S×Sj=0∑B1ijobjc∈classes∑[pi(c)log(pi(c))+(1−pi(c))log(1−pi(c))](12)