YOLOv5

YOLO系列(五)——YOLO v5



前言

该系列为博主自主学习YOLO系列的自我总结。本篇是对YOLOv5进行一个总结和分析。YOLOv5系列下有四种不同规模的版本,分别是YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x。本文主要以YOLOv5s为例,将网络分为Input、Backbone、Neck、Head四个部分对YOLOv5中的创新点一一分析。并且会分析YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x的不同之处。


一、Input

(1) 自适应锚框计算

之前的 YOLOv3、YOLOv4,对于不同的数据集,都会计算先验框 anchor。然后在网络训练时,网络会在 anchor 的基础上进行预测,然后输出预测框,再和标签框进行对比,最后就进行梯度地反向传播。在 YOLOv3、YOLOv4 中,训练不同的数据集时,是使用单独的脚本进行初始锚框的计算,在YOLOv5 中,则是将此功能嵌入到整个训练代码里中。所以在每次训练开始之前,它都会根据不同的数据集来自适应计算 anchor。
自适应的计算具体过程:

  1. 获取数据集中所有目标的宽和高。
  2. 将每张图片中按照等比例缩放的方式到 resize 指定大小,这里保证宽高中的最大值符合指定大小。
  3. 将 bboxes 从相对坐标改成绝对坐标,这里乘以的是缩放后的宽高。
  4. 筛选 bboxes,保留宽高都大于等于两个像素的 bboxes。
  5. 使用 k-means 聚类三方得到n个anchors,与v3、v4 操作一样。
  6. 使用遗传算法随机对 anchors 的宽高进行变异。倘若变异后的效果好,就将变异后的结果赋值给 anchors;如果变异后效果变差就跳过,默认变异1000次。这里是使用 anchor_fitness 方法计算得到的适应度 fitness,然后再进行评估。

(2)自适应图片缩放

在常用的目标检测算法中,不同的图片长宽都不相同,因此常用的方式是将原始图片统一缩放到一个标准尺寸,再送入检测网络中。但是在实际使用时,很多图片的长宽比不同。因此缩放填充后,两端的黑边大小都不同,而如果填充的比较多,则存在信息冗余,影响推理速度。因此在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大小。只是在测试,使用模型推理时,才采用缩减黑边的方式,提高目标检测,推理的速度。


二、Backbone

YOLOv5网络结构图引用了博主江大白的图。可以看出,YOLOv5中Backbone的创新点在于有Focus模块和CSP1_x模块。
在这里插入图片描述

(1)Focus

在这里插入图片描述
Focus 模块,输入通道扩充了4倍,作用是可以使信息不丢失的情况下提高计算力。Focus 是在 YOLOv5 中提出来的,它先将特征图进行分块切片操作,然后再将结果 Concat 起来,再送入后面模块。以Yolov5s的结构为例,原始608×608×3的图像输入Focus结构,采用切片操作,先变成304×304×12的特征图,再经过一次32个卷积核的卷积操作,最终变成304×304×32的特征图。需要注意的是:Yolov5s的Focus结构最后使用了32个卷积核,而其他三种结构,使用的数量有所增加,先注意下,后面会讲解到四种结构的不同点。

(2)CSP1_X

在这里插入图片描述

YOLOv5 与 YOLOv4 的不同点在于,YOLOv4 只有主干网络使用了 CSP结构, 而在 YOLOv5 中,设计了两种 CSP 结构。其中,CSP1_X 应用于 Backbone,另一种 CSP2_X 则是应用于 Neck 中。


三、Neck

如下图所示,YOLOv5 对 FPN + PAN 的结构作了一些改动,使用了另外一种 CSP2_X 的结构,加强网络特征融合的能力。
在这里插入图片描述

(1)CSP2_X

在这里插入图片描述
CSP2_X与CSP1_X不同的点就在于CBL和Conv之间的模块。CSP1_X是由X个Res Unit的残差模块组成,而CSP2_X是由2X个CBL组成。


四、Head

在训练阶段,YOLOv5 与 YOLOv4 一样,采用其中的了 CIOU_Loss。在推理阶段,YOLOv4 在 DIOU_Loss 的基础上采用了 DIOU_nms 的方式,而 YOLOv5 是采用加权 nms 的方式。这个估计可以和YOLOv4一模一样,具体结果本人没有去测试,只是单纯猜测。因为在YOLOv4分析中提到DIOU_nms,在重叠的目标检测中,DIOU_NMS效果更好,其他情况差距不大。


五、四种网络的比较

Yolov5代码中的四种网络,内容基本上都是一样的,只有最上方的depth_multiple和width_multiple两个参数不同。就是这两个参数(网络深度和网络宽度)决定着四种版本的不同。
在这里插入图片描述

(1)四种网络的深度

这里我自己理解的网络深度是指网络的总层数。从下图中可以看出在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同理,不多赘述。
在这里插入图片描述

(2)四种网络的宽度

网络宽度指的是卷积层中卷积核的数量,也就是通道数(卷积后特征图的第三维度),可以理解为网络的厚度。
在这里插入图片描述
以YOLOv5s为例,如下图所示,方框标中的数字表示的就是卷积核数量。YOLOv5s的宽度系数gw=0.5,Focus中的卷积核数量是64,那么下采样操作的卷积核数量=gw * 64 = 32。每经过一个Conv层就比上一层翻倍,和上图所示情况一致。YOLOv5m、YOLOv5l、YOLOv5x同理。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Fredzj/article/details/125717022