论文精读——YOLOv5


专栏链接:深度学习和论文精读
本文并非对论文直接进行翻译,增加了自己对于论文的理解,如有问题请及时指出~
本文大部分图片均参考江大白,侵权可删。


前言

论文题目:YOLOv5(无论文)
论文原文:https://github.com/ultralytics/yolov5
论文来源:无
发表时间:无
YOLOv5项目链接


1 模型结构

YOLOv5官方代码中,给出的目标检测网络中一共有5个版本,分别是YOLOv5n、YOLOv5s、YOLO5m、YOLO5l、YOLOv5x四个模型,见下图,图源路人贾’ω’
模型结构
在YOLOv5中,已经配置了各个版本的参数,大家可以根据自己需求调用(路径:yolov5/models)。其实只是改变了文件中depth_multiple模型深度和width_multiple模型宽度这两个参数,网络结构并没有改变。模型结构文件
本文以下内容根据YOLOv5s版本进行讲解。


2 网络结构

YOLOv5s的整体结构见下图,图源江大白。这里可以用netron工具查看更为详细的网路结构,链接Yolov5s可视化网络结构图
YOLOv5s网络结构
可以看出,YOLOv5还是分为输入端、Backbone、Neck、Prediction四个部分。

  • 输入端:Mosaic数据增强、自适应锚框计算、自适应图片缩放
  • Backbone主干网络:Focus结构,CSP结构
  • Neck:FPN+PAN结构
  • Prediction:GIoU Loss

基本组件:

  • Focus:基本上就是YOLO v2的passthrough。
  • CBL:由Conv+Bn+Leaky_relu激活函数三者组成。
  • CSP1_X:借鉴CSPNet网络结构,由三个卷积层和X个Res unint模块Concate组成。
  • CSP2_X:不再用Res unint模块,而是改为CBL。
  • SPP:采用1×1,5x5,9x9,13×13的最大池化的方式,进行多尺度融合。

个人认为YOLOv5和v4的变化不是特别大。

2.1 输入端

2.1.1 Mosaic数据增强

YOLOv5的输入端采用了和YOLOv4一样的Mosaic数据增强的方式。详细内容可以查看YOLOv4当中的介绍。
Mosaic数据增强

2.1.2 自适应锚框计算

此部分简单来说就是根据数据集计算初始锚框的大小。YOLO5中将此功能嵌入到代码中,每次训练时,自适应的计算不同训练集中的最佳锚框值。

2.1.3 自适应图片缩放

在常用的目标检测算法中,不同的图片长宽都不相同,因此常用的方式是将原始图片统一缩放到一个标准尺寸,再送入检测网络中。
YOLO算法中常用 416 ∗ 416 416*416 416416 608 ∗ 608 608*608 608608等尺寸(原因是网络有32倍的下采样,因此必须是32的倍数),比如对下面 800 ∗ 600 800*600 800600的图像进行缩放。
一般的填充方式均为直接缩放填充,但YOLOv5中对此进行了改进,使得推理速度加快。
作者认为,在项目实际使用时,很多图片的长宽比不同,因此缩放填充后,两端的黑边大小都不同,而如果填充的比较多,则存在信息冗余,影响推理速度。YOLO通过对原始图像自适应缩放,以添加最少的黑边。
第一步:计算缩放比例
原始缩放尺寸是 416 ∗ 416 416*416 416416,都除以原始图像的尺寸后,可以得到0.52,和0.69两个缩放系数,选择小的缩放系数。
计算缩放比例
第二步:计算缩放后的尺寸
原始图片的长宽都乘以最小的缩放系数0.52,宽变成了416,而高变成了312。
计算缩放后的尺寸
第三步:计算黑边填充数值
将416-312=104,得到原本需要填充的高度。再采用numpy中np.mod取余数的方式,得到8个像素,再除以2,即得到图片高度两端需要填充的数值。YOLOv5中填充的是灰色,即(114,114,114)。实际训练时没有采用缩减黑边的方式,还是采用传统填充的方式,即缩放到 416 ∗ 416 416*416 416416大小。只是在测试,使用模型推理时,才采用缩减黑边的方式,提高目标检测,推理的速度。
计算黑边填充数值

2.2 Backbone

2.2.1 Focus结构

YOLOv5在输入图片后,首先通过一个Focus结构,这个结构在YOLOv2时就出现过。
以YOLOv5s的结构为例,原始 608 ∗ 608 ∗ 3 608*608*3 6086083的图像输入Focus结构,采用切片操作,先变成 304 ∗ 304 ∗ 12 304*304*12 30430412的特征图,再经过一次32个卷积核的卷积操作,最终变成 304 ∗ 304 ∗ 32 304*304*32 30430432的特征图。
需要注意的是:YOLOv5s的Focus结构最后使用了32个卷积核。
Focus结构

2.2.2 CSP结构

CSP在YOLOv4中就被引入。YOLOv5与YOLOv4不同点在于,YOLOv4中只有主干网络使用了CSP结构。而YOLOv5中设计了两种CSP结构,以YOLOv5s网络为例,CSP1_X结构应用于Backbone主干网络,另一种CSP2_X结构则应用于Neck中。
CSP结构

2.3 Neck

YOLOv5现在的Neck和YOLOv4中一样,都采用FPN+PAN的结构。
YOLOv4的Neck结构中,采用的都是普通的卷积操作。而YOLOv5的Neck结构中,采用借鉴CSPnet设计的CSP2结构,加强网络特征融合的能力。
Neck


3 总结

整体来说YOLOv5与YOLOv4的相差不大,目前最为常用的YOLO模型就是v5,大家可以集合代码分析整体架构。YOLOv5可以做很多的目标检测任务,只需要整理好数据集便可训练,十分方便。这里给出代码连接https://github.com/ultralytics/yolov5
在这里插入图片描述


相关面试问题

对于单个YOLO版本的相关面试题并不是特别多,大部分都是介绍v1-v5的演变,后续有专门的汇总部分。


参考

深入浅出Yolo系列之Yolov5核心基础知识完整讲解
【YOLO系列】YOLOv5超详细解读(源码详解+入门实践+改进)

  • 18
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Yolov5是一种目标检测算法,其代码主要分为模型定义、数据处理、训练和推理四个部分。以下是对yolov5代码的精读: 1. 模型定义部分:yolov5的模型定义主要在models/yolo.py文件中,其中包括了网络结构的定义、损失函数的定义以及前向传播函数的实现。在网络结构的定义中,yolov5采用了CSPDarknet53作为骨干网络,并在其基础上添加了多个特征层和预测层,用于检测不同大小的目标。在损失函数的定义中,yolov5采用了Focal Loss和GIoU Loss两种损失函数,用于优化目标检测的精度和召回率。 2. 数据处理部分:yolov5的数据处理主要在datasets文件夹中实现,包括了数据集的读取、预处理、增强等操作。其中,yolov5支持多种数据格式,包括COCO、VOC、YOLO等格式,并提供了多种数据增强方式,如随机裁剪、随机旋转、随机缩放等,用于增加数据集的多样性和数量。 3. 训练部分:yolov5的训练主要在train.py文件中实现,其中包括了模型的初始化、数据集的加载、优化器的定义、训练过程的实现等。在训练过程中,yolov5采用了分布式训练的方式,使用torch.nn.parallel.DistributedDataParallel进行多GPU训练,并支持多种训练策略,如学习率衰减、梯度累积等。 4. 推理部分:yolov5的推理主要在detect.py文件中实现,其中包括了模型的加载、图像的读取、预处理、目标检测等操作。在目标检测过程中,yolov5采用了非极大值抑制(NMS)算法,用于去除重复的检测框,并支持多种后处理方式,如可视化、保存结果等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值