【YOLO系列】--YOLOv5网络结构超详细解读/总结

news2025/1/12 18:20:03

前言

官方源码仓库:GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite

       YOLOv5至今没有论文发表出来,YOLOv5项目的作者是Glenn Jocher并不是原作者Joseph Redmon作者当时也有说准备在2021年的12月1号之前发表,并承诺如果到时候没有发表就吃掉自己的帽子(不知道有没有吃哈哈哈哈)。

一、YOLOv5 网络结构

       Yolov5官方代码中,给出的目标检测网络中一共有4个版本,分别是Yolov5s、Yolov5m、Yolov5l、Yolov5x四个模型。如下图所示:这几个模型的结构基本是一样的,不同的是(depth_multiple)模型深度和width_multiple(模型宽度)这两个参数。YOLOv5s网络是YOLOv5系列中深度最小,特征图的宽度最小的网络。其他的三种都是在此基础上不断加深,不断加宽。

YOLOv5各版本算法性能测试图:

      作者是在COCO数据集上进行测试的,在YOLOv4解读中提到过,COCO数据集的小目标占比,因此四种网络结构性能上来说各有千秋。 

YOLOv5 网络结构主要由以下几部分组成:

  • 骨干网络(Backbone): New CSP-Darknet53
  • 颈部网络(Neck): SPPF, New CSP-PAN
  • 头部网络(Head): YOLOv3 Head

基于深度学习的现在目标检测算法中主要有三个组件:Backbone、Neck和Head。

Backbone:骨干网络,主要指用于特征提取的,已在大型数据集(例如ImageNet|COCO等)上完成预训练,拥有预训练参数的卷积神经网络,例如:ResNet-50、Darknet53等
Head:检测头/头部网络,主要用于预测目标的种类和位置(bounding boxes)
Neck:颈部网络,在Backone和Head之间,会添加一些用于收集不同阶段中特征图的网络层。
基于深度学习的目标检测模型的结构是这样的:输入->主干->脖子->头->输出。主干网络提取特征,脖子提取一些更复杂的特征,然后头部计算预测输出。

YOLOv5与Yolov3及Yolov4进行比较。主要的不同点:

(1)输入端 : Mosaic数据增强(v4中使用到了)、自适应锚框计算、自适应图片缩放
(2)骨干网络(Backbone) : Focus结构,CSP结构
(3)颈部网络(Neck) : FPN+PAN结构
(4)头部网络(Head) : GIOU_Loss

YOLOv5基本组件:

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

二、YOLOv5输入端

2.1 Mosaic数据增强

      Yolov5的输入端采用了和Yolov4一样的Mosaic数据增强的方式。Mosaic是参考2019年底提出的CutMix数据增强的方式,但CutMix只使用了两张图片进行拼接,而Mosaic数据增强则采用了4张图片,随机缩放、随机裁剪、随机排布的方式进行拼接,使模型在更小的范围内识别目标。。

 Mosaic数据增强的主要步骤为:

  1. 随机选取图片拼接基准点坐标(xc,yc),另随机选取四张图片。
  2. 四张图片根据基准点,分别经过尺寸调整和比例缩放后,放置在指定尺寸的大图的左上,右上,左下,右下位置。
  3. 根据每张图片的尺寸变换方式,将映射关系对应到图片标签上。
  4. 依据指定的横纵坐标,对大图进行拼接。处理超过边界的检测框坐标。

采用Mosaic数据增强的优点:

  1. 丰富数据集: 随机使用4张图像,随机缩放后随机拼接,增加很多小目标,大大增加了数据多样性。
  2. 增强模型鲁棒性: 混合四张具有不同语义信息的图片,可以让模型检测超出常规语境的目标。
  3. 加强批归一化(Batch Normalization)的效果: 当模型设置 BN 操作后,训练时会尽可能增大批样本总量(BatchSize),因为 BN 原理为计算每一个特征层的均值和方差,如果批样本总量越大,那么 BN 计算的均值和方差就越接近于整个数据集的均值和方差,效果越好。
  4. 有利于提升小目标检测性能: Mosaic 数据增强图像由四张原始图像拼接而成,这样每张图像会有更大概率包含小目标,从而提升了模型的检测能力。

Mosaic数据增强的内容在YOLOv4解读中提到过可以查看之前的内容。

2.2 自适应锚框计算

     在之前学习的YOLO系列算法中,对于不同的数据集,初始设定长宽的锚框。

     在YOLOv3和YOLOv4中,训练不同的数据集,都是通过单独的程序运行来获得初始锚点框。在 YOLOv5 中,则是将此功能嵌入到整个训练代码里中。所以在每次训练开始之前,它都会根据不同的数据集来自适应计算不同训练集中的最佳锚框值。

如果觉得计算的锚框效果并不好,也可以在代码中将此功能关闭。指令代码:

控制的代码即train.py中上面一行代码,设置成False,每次训练时,不会自动计算。

自适应的计算具体过程:

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

2.3 自适应图片缩放

        在目标检测算法中,不同的图片的长宽都不相同,因此常用的方式是将原始图片统一缩放到一个标准尺寸,再送入检测网络中。

        原始的缩放方法存在着一些问题,在实际的使用中的很多图片的长宽比不同,缩放填充之后,两端的黑边大小都不相同,然而如果填充的过多,会存在大量的信息冗余,从而影响整个算法的推理速度。为了进一步提升YOLO v5的推理速度,该算法提出一种方法能够自适应的添加最少的黑边到缩放之后的图片中。

具体步骤如下:

YOLO算法中常用416*416等尺寸,对下面800*600的图像进行缩放。

(1) 根据原始图片大小以及输入到网络的图片大小计算缩放比例

 原始缩放尺寸是416*416,都除以原始图像的尺寸后,可以得到0.52,和0.69两个缩放系数,选择小的缩放系数。

(2)计算缩放后的尺寸

 原始图片的长宽都乘以最小的缩放系数0.52,宽变成了416,而高变成了312。

(3) 计算黑边填充数值

       图中416表示YOLO v5网络所要求的图片宽度,312为缩放后图片的宽度。

       通过加减操作获得需要填充的黑边长度104,然后对该数值执行np.mod 取余操作,获得8个像素点,使用32是因为YOLOv5网络执行了5次下采样操作。最后因将填充的区域分散到图片两边,因此再÷2。

注意:
(1)Yolov5中填充的是灰色,即(114,114,114)。
(2)训练时没有采用缩减黑边的方式,还是采用传统填充的方式,即缩放到416*416大小。只是在测试,使用模型推理时,才采用缩减黑边的方式,提高目标检测,推理的速度。
(3)为什么np.mod函数的后面用32?
因为YOLOv5的网络经过5次下采样,而2的5次方,等于32。所以至少要去掉32的倍数,再进行取余。以免产生尺度太小走不完stride(filter在原图上扫描时,需要跳跃的格数)的问题,再进行取余。

三、骨干网络(Backbone)

3.1 Focus结构

       Focus模块在YOLOv5中是图片进入Backbone前,对图片进行切片操作,具体操作是在一张图片中每隔一个像素拿到一个值,类似于邻近下采样,这样就拿到了四张图片,四张图片互补,长得差不多,但是没有信息丢失,这样一来,将W、H信息就集中到了通道空间,输入通道扩充了4倍,即拼接起来的图片相对于原先的RGB三通道模式变成了12个通道,最后将得到的新图片再经过卷积操作,最终得到了没有信息丢失情况下的二倍下采样特征图。
       以YOLOv5s为例,原始的640 × 640 × 3的图像输入Focus结构,采用切片操作,先变成320 × 320 × 12的特征图,再经过一次卷积操作,最终变成320 × 320 × 32的特征图。
切片操作如下:

作用: 可以使信息不丢失的情况下提高计算力

不足:Focus 对某些设备不支持且不友好,开销很大,另外切片对不齐的话模型就崩了。

后期改进: 在新版中,YOLOv5 将Focus 模块替换成了一个 6 x 6 的卷积层。两者的计算量是等价的,但是对于一些 GPU 设备,使用 6 x 6 的卷积会更加高效。

3.2 CSP结构

     CSPNet主要是将feature map拆成两个部分,一部分进行卷积操作,另一部分和上一部分卷积操作的结果进行concate。

      在之前的YOLOv4网络结构中,借鉴了CSPNet的设计思路,在主干网络中设计了CSP结构。下图是YOLOv4的网络结构图:

      在目标检测问题中,使用CSPNet作为Backbone带来的提升比较大,可以有效增强CNN的学习能力,同时也降低了计算量。 

      虽然YOLOv4与YOLOv5都是用了CSP结构,但YOLOv5与其不同点在于:YOLOv4中只有主干网络使用了CSP结构。 而YOLOv5中设计了两种CSP结构,以YOLOv5s网络为例,CSP1_ X结构应用于Backbone主干网络,而CSP2_X结构则应用于Neck中。下图清楚的表示出来了:

 四、颈部网络(Neck)

       YOLOv5与YOLOv4的颈部网络(Neck)都采用FPN+PAN的结构。但是在它的基础上做了一些改进操作:YOLOV4的Neck结构中,采用的都是普通的卷积操作,而YOLOV5的Neck中,采用CSPNet设计的CSP2结构,从而加强了网络特征融合能力。
      FPN-PAN结构如下图所示,FPN层自顶向下传达强语义特征,而PAN塔自底向上传达定位特征:     

五、头部网络(Head)

5.1 Bounding box损失函数   

    YOLO v5采用CIOU_LOSS 作为bounding box 的损失函数。下面依次对IOU_Loss、GIOU_Loss、DIOU_Loss以及CIOU_Loss进行介绍。

(1) IOU_Loss : 预测框与GT框之间的交集/预测框与GT框之间的并集。

       这种损失存在一些问题:如下图所示,当预测框和GT框不相交时,即IoU=0,此时无法反映两个框之间的距离,此时该损失函数不可导,即IoU Loss无法优化两个框不相交的情况;当两个预测框大小相同时,那么这两个IOU也相同。

 (2) GIOU_Loss:

        为了解决以上的问题,GIOU_Loss增加了相交尺度的衡量方式。其引入最小外接矩形及外接矩形与并集的差集。

       但是这种方法并不能完全解决这种问题,仍然存在着其他的问题。如上图所示,状态1、2、3都是预测框在GT框内部且预测框大小一致的情况,这时预测框和GT框的差集都是相同的,因此这三种状态的GIoU值也都是相同的,这时GIoU退化成了IoU,无法区分相对位置关系。

(3) DIOU_Loss:

        针对IOU和GIOU损失所存在的问题,DIOU为了解决如何最小化预测框和GT框之间的归一化距离这个问题,DIOU_Loss考虑了预测框与GT框的重叠面积和中心点距离,当GT框包裹预测框的时候,直接度量2个框的距离,因此DIOU_Loss的收敛速度更快一些。

      如下图所示,当GT框包裹预测框时,此时预测框的中心点的位置都是一样的,因此按DIOU_Loss的计算公式,三者的值都是相同的。

(4)CIOU_Loss:

       在DIOU_Loss的基础上增加了一个影响因子,将预测框和GT框的长宽比也考虑了进来。具体的计算方法如下式所示,即CIOU_Loss将GT框的重叠面积、中心点距离和长宽比全都考虑进来了。

      综上:

  • IOU_Loss主要考虑了检测框和GT框之间的重叠面积。
  • GIOU_Loss在IOU的基础上,解决边界框不重合时出现的问题。
  • DIOU_Loss在IOU和GIOU的基础上,同时考虑了边界框中心点距离信息。
  • CIOU_Loss在DIOU的基础上,又考虑了边界框宽高比的尺度信息。

5.2 NMS非极大值抑制

NMS 的本质是搜索局部极大值,抑制非极大值元素。

       非极大值抑制,主要就是用来抑制检测时冗余的框。因为在目标检测中,在同一目标的位置上会产生大量的候选框,这些候选框相互之间可能会有重叠,所以我们需要利用非极大值抑制找到最佳的目标边界框,消除冗余的边界框。

算法流程:


  1.对所有预测框的置信度降序排序
  2.选出置信度最高的预测框,确认其为正确预测,并计算他与其他预测框的 IOU。
  3.根据步骤2中计算的 IOU 去除重叠度高的,IOU > threshold 阈值就直接删除。
  4.剩下的预测框返回第1步,直到没有剩下的为止.
 

SoftNMS:
      当两个目标靠的非常近时,置信度低的会被置信度高的框所抑制,那么当两个目标靠的十分近的时候就只会识别出一个 BBox。为了解决这个问题,可以使用 softNMS。
      它的基本思想是用稍低一点的分数来代替原有的分数,而不是像 NMS 一样直接置零。

六、训练策略

  • (1)多尺度训练(Multi-scale training)。 如果网络的输入是416 x 416。那么训练的时候就会从 0.5 x 416 到 1.5 x 416 中任意取值,但所取的值都是32的整数倍。
  • (2)训练开始前使用 warmup 进行训练。 在模型预训练阶段,先使用较小的学习率训练一些epochs或者steps (如4个 epoch 或10000个 step),再修改为预先设置的学习率进行训练。
  • (3)使用了 cosine 学习率下降策略(Cosine LR scheduler)。
  • (4)采用了 EMA 更新权重(Exponential Moving Average)。 相当于训练时给参数赋予一个动量,这样更新起来就会更加平滑。
  • (5)使用了 amp 进行混合精度训练(Mixed precision)。 能够减少显存的占用并且加快训练速度,但是需要 GPU 支持。

这篇YOLOv5的学习和总结到这里就结束啦,如果有什么问题可以在评论区留言呀~

如果帮助到大家,可以一键三连支持下~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/525147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux pl320 mbox控制器驱动分析 - (1) pl320手册分析

linux pl320 mbox控制器驱动分析 1 pl320简介1.1 pl320用途1.2 pl320 IPCM 由以下部分组成:1.3 pl320 IPCM可配置的参数1.4 功能操作1.5 IPCM 操作流程1.6 Channel ID 2 Using mailboxes(使用邮箱中断)2.1 Defining source core2.2 Defining …

JNI中GetObjectArrayElement, GetStringUTFChars,ReleaseStringUTFChars函数讲解

文章目录 GetObjectArrayElement函数使用场景代码演示GetStringUTFChars 函数使用场景ReleaseStringUTFChars函数 GetObjectArrayElement函数 函数原型: jobject GetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index); Returns an element of a J…

STL容器之deque

文章目录 deque容器简介deque的操作 deque容器简介 deque是“double-ended queue”的缩写,和vector一样都是STL的容器 deque是双端数组,而vector是单端的deque在接口上和vector非常相似,在许多操作的地方都可以直接替换deque可以随机存取元…

C语言-【操作符二】

Hello,大家好,前面的文章里边介绍了算术、赋值以及移位操作符,这篇文章呢,就介绍一下C语言中的其他操作符吧~ 目录 位操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用,函…

C++11多线程:windows临界区和Linux互斥锁、递归锁的区别与使用。

文章目录 前言一、windows临界区1.1 基本概念1.2 函数使用 二、使用步骤1.代码示例1 总结 前言 多线程windows临界区和Linux互斥锁 提示:以下是本篇文章正文内容,下面案例可供参考 一、windows临界区 1.1 基本概念 Linux下有递归锁,递归锁…

着重讲解一下自动化测试框架的思想与构建策略,让你重新了解自动化测试框架

目录 序言: 一、简述自动化测试框架 二、自动化测试框架思想 三、构建自动化测试框架的策略 四、自动化测试框架的发展趋势 序言: 也许到现在大家对所谓的“自动化测试框架”仍然觉得是一种神秘的东西,仍然觉得其与各位很远;…

【JavaScript】ES6新特性(1)

1. let 声明变量 let 声明的变量只在 let 命令所在的代码块内有效 块级作用域 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge">&l…

08-04 中间件和平台运行期监控

缓存中间件的三大坑 缓存击穿 用户访问热点数据&#xff0c;并且缓存中没有热点数据&#xff0c;大量访问直接到DB&#xff0c;热点击穿采用Canal做数据异构方案&#xff0c;把数据库中的值全部放到缓存热点缓存策略&#xff1a;通过分析调用日志获取热点数据&#xff0c;放到…

PMP项目管理-[第十一章]风险管理

风险管理知识体系&#xff1a; 规划风险管理&#xff1a; 识别风险&#xff1a; 实施定性风险分析&#xff1a; 实施定量风险分析&#xff1a; 监督风险&#xff1a; 11.1 风险 定义&#xff1a;是一种不确定的事件或条件&#xff0c;一旦发生&#xff0c;就会对一个或多个项目…

Elasticsearch(二)

Clasticsearch&#xff08;二&#xff09; DSL查询语法 文档 文档&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html 常见查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有数据&#xff0c;一般测试用。如&#xff1a…

eNSP模拟器下VRRP+MSTP实验配置

①&#xff1a;底层配置&#xff1a; vlan trunk 略 ②&#xff1a;MSTP配置&#xff1a; 所有交换机&#xff1a; stp region-configuration region-name aa revision-level 1 instance 1 vlan 2 to 3 instance 2 vlan 4 to 5 active region-configuration 核心1&…

Java笔记_21(网络编程)

Java笔记_21 一、网路编程1.1、初始网络编程1.2、网络编程三要素1.3、IP1.4、端口号1.5、协议1.6、UDP协议 一、网路编程 1.1、初始网络编程 什么是网络编程 在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;进行的数据传输。 应用场景:即时通信、网游对战…

(一)SAS初识

1、SAS常用工作窗口 “结果”&#xff08;Result&#xff09;窗口——管理SAS程序的输出结果&#xff1b; “日志”&#xff08;Log&#xff09;窗口——记录程序的运行情况&#xff1b; “SAS资源管理器”&#xff08;Explore&#xff09;窗口&#xff1b; “输出”&#xff0…

洛谷P1217-回文质数 Prime Palindromes

洛谷P1217-回文质数 Prime Palindromes 这个题目我做出来了但是超时了&#xff0c;时间复杂度有点高&#xff0c;主要是因为我用了大量的循环&#xff0c; 所以我这个是比较暴力的解法&#xff0c;下面我分析我的暴力代码 首先是判断回文数的函数 第一步将标识传入参数是不是…

[数据集][目标检测]篮球数据集VOC格式7398张

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;7398 标注数量(xml文件个数)&#xff1a;7398 标注类别数&#xff1a;1 标注类别名称:["basketball"]…

详解MNIST数据集下载、解析及显示的Python实现

Content MNIST数据集基本介绍下载MNIST数据集到本地解析MNIST数据集显示MNIST数据集中训练集的前9张图片和标签 随着图像处理、计算机视觉、机器学习&#xff0c;甚至深度学习的蓬勃发展&#xff0c;一个良好的数据集作为学习和测试相关算法非常重要。MNIST数据集对于想要学习和…

PMP 高项 07-项目质量管理

项目质量管理 概念 质量的基本概念 克劳斯比&#xff1a;符合要求 戴明&#xff1a;低成本条件下可预测的一致性和可靠度&#xff0c;适应市场需要 朱兰&#xff1a;适用性&#xff0c;满足客户需要 国际标准化组织&#xff1a;质量是反映实体&#xff08;产品、过程或活动等…

中间件容器化部署实现方案的前期调研

中间件容器化部署是为了实现GitOps模式的持续交付,实现部署即代码。痛点在于大多数中间件都是有状态的,本篇介绍如何实现有状态中间件的容器化部署。 常见中间件要实现容器化部署,需要解决以下问题: 对于网关类中间件,作为流量入口,虽然是无状态类型的中间件,但由于需要…

flask实现S3 Web客户端下载文件

import io from minio import Minio from minio.error import S3Error from flask import Flask, jsonify, render_template, request, send_file# 实例化 Flask 应用 app Flask(__name__)# 配置 MinIO 客户端 minio_client Minio("192.168.2.110:58894",access_ke…

Vue CLI 初始化脚手架

3.1. 初始化脚手架 3.1.1. 说明 Vue脚手架是Vue官方提供的标准化开发工具&#xff08;开发平台&#xff09;最新的版本是 4.x文档 Vue CLI 3.1.2. 具体步骤 如果下载缓慢请配置npm淘宝镜像npm config set registry http://registry.npm.taobao.org全局安装 vue/cli npm ins…