文章目录
- 前言
- 一、YOLOv5的网络结构和流程
- 二、YOLOv5的创新点
-
- [1. 网络结构](#1. 网络结构)
- [2. 输入数据处理](#2. 输入数据处理)
- [3. 训练策略](#3. 训练策略)
- 总结
前言
前文目标检测-One Stage-YOLOv4提到YOLOv4主要是基于技巧的集成,对于算法落地具有重大意义,YOLOv5则在工程应用方面更近一步,将算法深度集成,使得使用者不用再过多关注算法实现,且提供了多种预训练模型,到目前为止,由ultralytics团队开发的ultralytics
包,已经支持YOLOv3
、YOLOv5
、YOLOv6
、YOLOv8
、YOLO-NAS
、RT-DETR
等等,其中YOLOv5和当前YOLO家族最新的YOLOv8是由ultralytics团队研发的。
提示:以下是本篇文章正文内容,下面内容可供参考
一、YOLOv5的网络结构和流程
YOLOv5的不同版本
YOLOv5给出了五个版本:Yolov5n
、Yolov5s
、Yolov5m
、Yolov5l
、Yolov5x
ps:
- 要注意的是Yolov5n是YOLOv5 系列中的一个变体,专为 Nano 设备(如 NVIDIA Jetson Nano)进行优化。YOLOv5n 在保持较快速度的同时,提供适用于边缘设备的准确度。
- 因此不算Yolov5n的话,YOLOv5s网络是YOLOv5系列中深度最小,特征图的宽度(channels)最小的网络。其他的三种(m、l、x)都是在此基础上不断加深,不断加宽。
YOLOv5的流程
- 利用自适应图片缩放技术对输入图片进行缩放
ps:
- 传统的缩放填充后,两端的黑边大小都不同,如果填充的比较多,则存在信息冗余,影响推理速度。
- yolov5对原始图像自适应的添加最少的黑边。图像高度上两端的黑边变少了,在推理时,计算量也会减少,即目标检测速度会得到提升。注意自适应图片缩放只在检测时使用,在训练时仍使用传统填充方法。
- 举例说明自适应图片缩放计算过程:
- 根据原始图片大小以及输入到网络的图片大小计算缩放比例,并选择小的缩放系数
- 第一步得到缩放系数的计算缩放后的图片大小
- 计算黑边填充数值:将416-312=104,得到原本需要填充的高度,再采用32对104取余,得到8个像素,再除以2,即得到图片高度两端需要填充的数值。之所以利用32取余,是因为YOLOv5的网络经过5次下采样,而2的5次方,等于32。所以至少要去掉32的倍数,再进行取余,以免产生尺度太小走不完stride(filter在原图上扫描时,需要跳跃的格数)的问题。
- 将利用Focus在不丢失信息情况下对输入影像进行下采样
- 将下采样图像输入Backbone+PANet提取多尺度特征
- 利用自适应anchor计算获取预选框
ps:
- YOLO系列中,可以针对数据集设置初始的anchor。在网络训练中,网络在anchor的基础上输出预测框,进而和GT框进行比较,计算loss,再反向更新,迭代网络参数。在YOLOv3、4版本中,设置初始anchor的大小都是通过单独的程序使用K-means算法得到,但是在YOLOv5中,将此功能嵌入到代码中,每次训练数据集之前,都会自动计算该数据集最合适的Anchor尺寸,该功能可以在代码中设置超参数进行关闭。
- 自适应anchor的计算具体过程如下:
①获取数据集中所有目标的宽和高。
②将每张图片中按照等比例缩放的方式到 resize 指定大小,这里保证宽高中的最大值符合指定大小。
③将 bboxes 从相对坐标改成绝对坐标,这里乘以的是缩放后的宽高。
④筛选 bboxes,保留宽高都大于等于两个像素的 bboxes。
⑤使用 k-means 聚类三方得到n个 anchors,与YOLOv3、YOLOv4 操作一样。
⑥使用遗传算法随机对 anchors 的宽高进行变异。倘若变异后的效果好,就将变异后的结果赋值给 anchors;如果变异后效果变差就跳过,默认变异1000次。这里是使用 anchor_fitness 方法计算得到的适应度 fitness,然后再进行评估。
- 将上一步得到的anchor输入不同的分类和边框回归器
- 使用非极大值抑制DIoU-NMS去除冗余窗口(训练时用的CIoU loss)
YOLOv5s的网络结构图
二、YOLOv5的创新点
1. 网络结构
- 卷积块从CBM换回了CBL(激活函数从Mish到Leaky relu)
- 设计了CSP_2X结构应用于Neck中,加强了网络特征融合的能力。
- backbone最前端添加了Focus模块(基本上是Yolov2中的pass through)以减小特征图尺寸,减小了模型复杂度。
2. 输入数据处理
- Mosaic数据增强
- 自适应锚框计算
- 自适应图片缩放
3. 训练策略
- 多尺度训练(Multi-scale training)。 如果网络的输入是416 x 416。那么训练的时候就会从 0.5 x 416 到 1.5 x 416 中任意取值,但所取的值都是32的整数倍。
- 训练开始时先使用 warmup 进行预热。 在模型预训练阶段,先使用较小的学习率训练一些epochs或者steps (如4个 epoch 或10000个 step),再修改为预先设置的学习率进行训练。
- 使用了余弦退火学习率衰减策略(Cosine annealing scheduler)。
- 采用了 EMA (Exponential Moving Average)更新权重。 相当于训练时给参数赋予一个动量,这样更新起来就会更加平滑。
ps:在深度学习中,经常会使用EMA(指数移动平均)这个方法对模型的参数做平均,以求提高测试指标并增加模型鲁棒。
- 使用了AMP(Automatic Mixed-Precision training)进行混合精度训练(Mixed precision)。 能够减少显存的占用并且加快训练速度,但是需要 GPU 支持。
ps:默认情况下,大多数深度学习框架都采用32位浮点算法进行训练。2017年,NVIDIA研究了一种用于混合精度训练的方法,该方法在训练网络时将单精度(FP32)与半精度(FP16)结合在一起,并使用相同的超参数实现了与FP32几乎相同的精度。
总结
YOLOv5的精度和速度如下:
ps:YOLOv5n6等后缀的6代表6.0版本,是在默认版本(5.0)上的更新,区别如下:
- 使用了更大的输入,提高了对小物体的检测精度
- backbone中:5.0中是SPP+CSP2_X的结构,而在6.0版本是CSP1_X+SPPF结构
- CBL修改为CBS