文章目录

  • 前言
  • 一、YOLOv5的网络结构和流程
    • YOLOv5的不同版本
    • YOLOv5的流程
    • YOLOv5s的网络结构图
  • 二、YOLOv5的创新点
    • 1. 网络结构
    • 2. 输入数据处理
    • 3. 训练策略
  • 总结

前言

前文目标检测-One Stage-YOLOv4提到YOLOv4主要是基于技巧的集成,对于算法落地具有重大意义,YOLOv5则在工程应用方面更近一步,将算法深度集成,使得使用者不用再过多关注算法实现,且提供了多种预训练模型,到目前为止,由ultralytics团队开发的ultralytics包,已经支持YOLOv3YOLOv5YOLOv6YOLOv8YOLO-NASRT-DETR等等,其中YOLOv5和当前YOLO家族最新的YOLOv8是由ultralytics团队研发的。


提示:以下是本篇文章正文内容,下面内容可供参考

一、YOLOv5的网络结构和流程

YOLOv5的不同版本

YOLOv5给出了五个版本:Yolov5nYolov5sYolov5mYolov5lYolov5x

ps:

  • 要注意的是Yolov5n是YOLOv5 系列中的一个变体,专为 Nano 设备(如 NVIDIA Jetson Nano)进行优化。YOLOv5n 在保持较快速度的同时,提供适用于边缘设备的准确度。
  • 因此不算Yolov5n的话,YOLOv5s网络是YOLOv5系列中深度最小,特征图的宽度(channels)最小的网络。其他的三种(m、l、x)都是在此基础上不断加深,不断加宽。

YOLOv5的流程

  1. 利用自适应图片缩放技术对输入图片进行缩放

ps:

  • 传统的缩放填充后,两端的黑边大小都不同,如果填充的比较多,则存在信息冗余,影响推理速度。
  • yolov5对原始图像自适应的添加最少的黑边。图像高度上两端的黑边变少了,在推理时,计算量也会减少,即目标检测速度会得到提升。注意自适应图片缩放只在检测时使用,在训练时仍使用传统填充方法
  • 举例说明自适应图片缩放计算过程:
  1. 根据原始图片大小以及输入到网络的图片大小计算缩放比例,并选择小的缩放系数
  2. 第一步得到缩放系数的计算缩放后的图片大小
  3. 计算黑边填充数值:将416-312=104,得到原本需要填充的高度,再采用32对104取余,得到8个像素,再除以2,即得到图片高度两端需要填充的数值。之所以利用32取余,是因为YOLOv5的网络经过5次下采样,而2的5次方,等于32。所以至少要去掉32的倍数,再进行取余,以免产生尺度太小走不完stride(filter在原图上扫描时,需要跳跃的格数)的问题。
  1. 将利用Focus在不丢失信息情况下对输入影像进行下采样
  2. 将下采样图像输入Backbone+PANet提取多尺度特征
  3. 利用自适应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,然后再进行评估。
  1. 将上一步得到的anchor输入不同的分类和边框回归器
  2. 使用非极大值抑制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)上的更新,区别如下:

  1. 使用了更大的输入,提高了对小物体的检测精度
  2. backbone中:5.0中是SPP+CSP2_X的结构,而在6.0版本是CSP1_X+SPPF结构
  3. CBL修改为CBS