YOLOv5目标检测算法

YOLOv5在YOLOv3基础上进行了改进,包括Mosaic数据增强和自适应图片缩放。网络结构中引入了Focus模块和CSPNet结构,以提高检测性能。损失函数采用了GIoU损失和BCE损失,以更有效地训练模型。CSPNet通过减少计算瓶颈和内存成本,提升了网络的学习能力和效率。
摘要由CSDN通过智能技术生成

一、引言

YOLOv5与YOLOv4实质上都是在YOLOv3算法的基础上,进行了网络结构及训练技巧等方面的改进,使得检测性能得到进一步的提升。
YOLO系列目标检测的框架,通常可以分为如下几个部分:输入端、骨干网络、Neck网络和输出端。本文将具体阐述YOLOv5算法的改进之处,主要内容如下:(1)输入端的改进,主要增加了Mosaic数据增强方法和自适应图片缩放方法。(2)骨干网络的改进,考虑了Focus结构和CSPNet结构。(3)输出端的改进,主要对损失函数的构建进行了研究。

二、数据增强

YOLOv5算法实验部分采用的数据增强方式是马赛克(Mosaic)方法,Mosaic方法原理上与CutMix方法类似。CutMix运用的是两张图片,而Mosaic方法运用了四张图片。我们首先说明CutMix数据增强的原理。
CutMix方法

图1. CutMix 方法(左图),第一行两张图片为训练集中的两个样本;第二行为CutMix 的过程;Mosaic 方法(右图)

如图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~=MxA+(1M)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} rxUnif(o,W),rwW1λ ,ryUnif(0,H),rhH1λ (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网络结构

在这里插入图片描述

图2. 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. CBL模块结构
(2)Focus模块:如图4所示,该结构将输入图像进行切片操作,再将切片后的结果拼接。Focus结构的内容将在后面具体说明。

在这里插入图片描述

图4. Focus模块结构

(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的最大池化,再将所得结果拼接,得到融合后的特征。
在这里插入图片描述

图5. SPP模块结构

(4)CSP1_X和CSP2_X模块:借鉴CSPNet的思想(后面具体说明),该模块由卷积层、CBL模块和Res Unit模块三部分组成。其中,Res Unit模块借鉴ResNet残差结构,由CBL模块组成,如图6所示。CSP_X和CSP_X模块结构如图10和11所示。

在这里插入图片描述

图6. Res Unit模块结构

3.2、Focus结构

与YOLOv4相比,Focus结构是YOLOv5中特有的结构,其中的关键是切片操作。Focus结构是指,再图片进入骨干网络之前,将图片每隔一个像素取一个值,与临近下采样操作相似,即可得到四组图片。Focus操作将图像的宽和高信息集中到了通道空间,通道的维数扩大为原来的4倍,即拼接后的结果相当于将原先的RGB三通道模式变成了12个通道,最后将得到的结果再经过卷积操作,得到最终的二倍下采样的特征图。切片操作的过程如下图7所示。
在这里插入图片描述

图7. Focus结构中的切片操作过程

我们发现,图片在经过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结构的主要作用在于,图片进行下采样的过程中,将宽和高的信息集中到了通道维数上,再利用卷积层进行特征提取,使得特征提取更加充分。虽然带来了一些计算量的增加,但减轻了信息的丢失现象。

在这里插入图片描述

图8. Focus结构示意图

3.3、CSP结构

CSPNet(Cross Stage Partial Network)主要从网络结构的设计方面减少推理时的计算量。CSPNet的提出主要做了以下改进:增强CNN的学习能力,能够再轻量化的同时维持准确性;降低计算瓶颈以及降低内存成本。CSPNet将底层的特征图按通道拆分为两部分,一部分经过密集块(由多个全连接层组成)和过渡层(通常是卷积核大小为1×1的卷积层),另一部分与传输的特征图结合,在减少计算量的同时也提高了推理的速度和准确性。CSPNet不仅是一种网络结构,也是一种处理思想,它可以与ResNet、ResNeXt以及DenseNet等网络进行结合。以DenseNet为例,DenseNet与CSPDenseNet的对比示意图如图9所示。

在这里插入图片描述

图9. CSPNet结构示意图:(a)原始DenseNet结构,(b)改进后的CSPDenseNet结构

如图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=w1x0x2=w2[x0,x1]xk=wk[x0,x1,,xk1](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,,gk1)(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,,xk1]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,,gk1)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的学习能力,同时减少计算量,提升推理的速度。

在这里插入图片描述

图10. CSP1_X结构

在这里插入图片描述

图11. CSP2_X结构

四、损失函数

目标检测任务的损失函数一般由边界框回归损失和分类损失两部分构成,本部分将说明实验训练阶段运用的边界框回归损失和分类损失。
边界框回归损失最常用的计算指标是交并比( 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=ABAB(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=1IoU=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=IoUCC(AB)(10)
G I o U l o s s = 1 − G I o U (11) GIoUloss=1-GIoU\tag{11} GIoUloss=1GIoU(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=0S×Sj=0B1ijobj[Cilog(Ci)+(1Ci)log(1Ci)]i=0S×Sj=0B1ijnoobj[Cilog(Ci)+(1Ci)log(1Ci)]+i=0S×Sj=0B1ijobjcclasses[pi(c)log(pi(c))+(1pi(c))log(1pi(c))](12)

参考文献

-基于YOLO系列的目标检测改进算法

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值