赞
踩
该系列为博主自主学习YOLO系列的自我总结。本篇是对YOLOv5进行一个总结和分析。YOLOv5系列下有四种不同规模的版本,分别是YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x。本文主要以YOLOv5s为例,将网络分为Input、Backbone、Neck、Head四个部分对YOLOv5中的创新点一一分析。并且会分析YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x的不同之处。
之前的 YOLOv3、YOLOv4,对于不同的数据集,都会计算先验框 anchor。然后在网络训练时,网络会在 anchor 的基础上进行预测,然后输出预测框,再和标签框进行对比,最后就进行梯度地反向传播。在 YOLOv3、YOLOv4 中,训练不同的数据集时,是使用单独的脚本进行初始锚框的计算,在YOLOv5 中,则是将此功能嵌入到整个训练代码里中。所以在每次训练开始之前,它都会根据不同的数据集来自适应计算 anchor。
自适应的计算具体过程:
在常用的目标检测算法中,不同的图片长宽都不相同,因此常用的方式是将原始图片统一缩放到一个标准尺寸,再送入检测网络中。但是在实际使用时,很多图片的长宽比不同。因此缩放填充后,两端的黑边大小都不同,而如果填充的比较多,则存在信息冗余,影响推理速度。因此在Yolov5代码中datasets.py的letterbox函数中进行了修改,对原始图像自适应的添加最少的黑边。黑边计算的具体步骤如下:
1. 根据原始图片大小与输入到网络图片大小计算缩放比例
假设输入图像尺寸是800×600,初始缩放尺寸为416×416,那么初始缩放系数为416/800=0.52,416/600=0.69。选择较小的缩放系数为最终的缩放比例。
2. 根据原始图片大小与缩放比例计算缩放后的图片大小
将原始图像尺寸 * 缩放比例。800 * 0.52 = 416,600 * 0.52 = 312。
3.计算黑边填充值
将416-312=104,得到原本需要填充的高度。再采用numpy中np.mod取余数的方式,得到8个像素,再除以2,即得到图片高度两端需要填充的数值。为什么np.mod函数的后面用32?因为Yolov5的网络经过5次下采样,而2的5次方,等于32。所以至少要去掉32的倍数,再进行取余。
注意
训练时没有采用缩减黑边的方式,还是采用传统填充的方式,即缩放到416×416大小。只是在测试,使用模型推理时,才采用缩减黑边的方式,提高目标检测,推理的速度。
YOLOv5网络结构图引用了博主江大白的图。可以看出,YOLOv5中Backbone的创新点在于有Focus模块和CSP1_x模块。
Focus 模块,输入通道扩充了4倍,作用是可以使信息不丢失的情况下提高计算力。Focus 是在 YOLOv5 中提出来的,它先将特征图进行分块切片操作,然后再将结果 Concat 起来,再送入后面模块。以Yolov5s的结构为例,原始608×608×3的图像输入Focus结构,采用切片操作,先变成304×304×12的特征图,再经过一次32个卷积核的卷积操作,最终变成304×304×32的特征图。需要注意的是:Yolov5s的Focus结构最后使用了32个卷积核,而其他三种结构,使用的数量有所增加,先注意下,后面会讲解到四种结构的不同点。
YOLOv5 与 YOLOv4 的不同点在于,YOLOv4 只有主干网络使用了 CSP结构, 而在 YOLOv5 中,设计了两种 CSP 结构。其中,CSP1_X 应用于 Backbone,另一种 CSP2_X 则是应用于 Neck 中。
如下图所示,YOLOv5 对 FPN + PAN 的结构作了一些改动,使用了另外一种 CSP2_X 的结构,加强网络特征融合的能力。
CSP2_X与CSP1_X不同的点就在于CBL和Conv之间的模块。CSP1_X是由X个Res Unit的残差模块组成,而CSP2_X是由2X个CBL组成。
在训练阶段,YOLOv5 与 YOLOv4 一样,采用其中的了 CIOU_Loss。在推理阶段,YOLOv4 在 DIOU_Loss 的基础上采用了 DIOU_nms 的方式,而 YOLOv5 是采用加权 nms 的方式。这个估计可以和YOLOv4一模一样,具体结果本人没有去测试,只是单纯猜测。因为在YOLOv4分析中提到DIOU_nms,在重叠的目标检测中,DIOU_NMS效果更好,其他情况差距不大。
Yolov5代码中的四种网络,内容基本上都是一样的,只有最上方的depth_multiple和width_multiple两个参数不同。就是这两个参数(网络深度和网络宽度)决定着四种版本的不同。
这里我自己理解的网络深度是指网络的总层数。从下图中可以看出在s, m, l ,x四种版本中的CSP1_X中的X不同,而X表示Res Units的个数, Res Units越多,层数就越深。
【这一part的图片也都是引用博主江大白博文里的图。】
以YOLOv5s为例,如下图所示,第一个BottleneckCSP层中的参数3记为n,YOLOv5s的深度参数为0.33记为gd,CSP1_X中的X表示残差组件数量,X = n * gd = 3 * 0.33 = 1。同理,第二个BottleneckCSP层中的n为9,CSP1_X中的X=3,就和上图的第二个CSP1对应起来了。YOLOv5m、YOLOv5l、YOLOv5x同理,不多赘述。
网络宽度指的是卷积层中卷积核的数量,也就是通道数(卷积后特征图的第三维度),可以理解为网络的厚度。
以YOLOv5s为例,如下图所示,方框标中的数字表示的就是卷积核数量。YOLOv5s的宽度系数gw=0.5,Focus中的卷积核数量是64,那么下采样操作的卷积核数量=gw * 64 = 32。每经过一个Conv层就比上一层翻倍,和上图所示情况一致。YOLOv5m、YOLOv5l、YOLOv5x同理。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。