YOLOv5基础知识入门(2)— YOLOv5核心基础知识讲解

前言:Hello大家好,我是小哥谈。YOLOV4出现之后不久,YOLOv5横空出世。YOLOv5在YOLOv4算法的基础上做了进一步的改进,使检测性能得到更进一步的提升。YOLOv5算法作为目前工业界使用的最普遍的检测算法,存在着很多可以学习的地方。本文将对YOLOv5检测算法的核心基础知识进行详细的解说,希望大家可以透彻的理解。🌈

前期回顾:

YOLOv5基础知识入门(1)— YOLO算法的发展历程

        目录

🚀1.YOLOv5简介

🚀2.YOLOv5网络结构

🚀3.输入端

3.1 Mosaic数据增强

3.2 自适应锚框计算 

3.3 自适应图像缩放

🚀4.主干网络(Backbone)

4.1 Focus结构

4.2 CSP结构

 🚀5.Neck网络

 🚀6.输出端

 🚀7.训练策略

🚀1.YOLOv5简介

YOLOv5是一种单阶段目标检测算法,该算法在YOLOv4的基础上添加了一些新的改进思路,使其速度精度都得到了极大的性能提升。主要的改进思路如下所示:

输入端:在模型训练阶段,提出了一些改进思路,主要包括Mosaic数据增强、自适应锚框计算、自适应图片缩放
主干网络(Backbone):融合其它检测算法中的一些新思路,主要包括:Focus结构与CSP结构
Neck网络:目标检测网络在BackBone与最后的输出端之间往往会插入一些层,Yolov5中添加了FPN+PAN结构
输出端:输出层的锚框机制与YOLOv4相同,主要改进的是训练时的损失函数CIOU_Loss,以及预测框筛选的DIOU_nms

总结:

输入端:Mosaic数据增强、自适应锚框计算、自适应图片缩放

主干网络(Backbone):Focus结构、CSP结构

Neck网络:FPN+PAN结构

输出端:CIOU_Loss、DIOU_nms

YOLOv5目标检测算法是Ultralytics公司于2020年发布的,根据模型的大小,YOLOv5有5个版本,分别为YOLOv5n、YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x,这5个版本的权重、模型的宽度和深度是依次增加的。这些不同的变体使得YOLOv5能很好的在精度和速度中权衡,方便用户选择。YOLOv5五个版本的算法性能图和相应的指标如下所示:

​ 说明:

YOLOv5官方代码:🌷

GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite


🚀2.YOLOv5网络结构

YOLOv5的网络模型分为4个部分,包括输入端主干网络(Backbone)Neck网络输出端,本文将使用常用的YOLOv5s检测模型来进行介绍,下面即是YOLOv5s的网络结构图。👇👇👇

基本组件: 

  • CBL模块由Conv+BN+Leaky_relu激活函数组成,如上图中的模块1所示。
  • Res unit借鉴ResNet网络中的残差结构,用来构建深层网络,CBM是残差模块中的子模块,如上图中的模块2所示。
  • CSP1_X借鉴CSPNet网络结构,该模块由CBL模块、Res unint模块以及卷积层、Concat组成而成,如上图中的模块3所示。
  • CSP2_X借鉴CSPNet网络结构,该模块由卷积层和X个Res unint模块Concat组成而成,如上图中的模块4所示。
  • Focus如上图中的模块5所示,Focus结构首先将多个slice结果Concat起来,然后将其送入CBL模块中。
  • SPP采用1×1、5×5、9×9和13×13的最大池化方式,进行多尺度特征融合,如上图中的模块6所示。

其他基础操作:

  • Concat:张量拼接,会扩充两个张量的维度,例如26*26*256和26*26*512两个张量拼接,结果是26*26*768。
  • add:张量相加,张量直接相加,不会扩充维度,例如104*104*128和104*104*128相加,结果还是104*104*128。

说明:

YOLOv5n网络最小,速度最快,AP精度也最低。若检测的以大目标为主,追求速度,是个不错的选择。其他的四种网络,在YOLOv5基础上,不断加深加宽网络,AP精度也不断提升,但速度的消耗也在不断增加。🌱🌱🌱

福利:

Yolov3&Yolov4&Yolov5资源相关(包括模型权重、网络结构图等)💥💥💥

链接:https://pan.baidu.com/s/1NdVEtGxntCaAa_wWU0yG-g?pwd=zm4q 
提取码:zm4q 


🚀3.输入端

YOLOv5的输入端主要包括Mosaic数据增强、自适应锚框计算和自适应图像缩放三个部分。输入端表示需要输入图片,该阶段通常包含一个图像预处理阶段,即将输入图像缩放到网络的输入大小,并进行归一化等操作。在网络训练阶段,YOLOv5使用Mosaic数据增强操作提升模型的训练速度和网络的精度;并提出了一种自适应锚框计算与自适应图片缩放方法。🌻🌻🌻

3.1 Mosaic数据增强

Mosaic数据增强是在模型训练阶段使用的,将四张图片按照随机缩放、随机裁剪和随机排布的方式进行拼接,可以增加数据集中小目标的数量,从而提升模型对小目标物体的检测能力。YOLOv5会根据参数启动自适应锚框计算功能,自适应的计算不同类别训练集中的最佳锚框值。Mosaic数据增强方法,使用随机增减亮度、对比度、饱和度、色调以及随机缩放、裁减、翻转、擦除等基本方法进行数据增强。Mosaic数据增强选取四张经过上述基本方法操作后的图片进行随机编排和拼接,一方面变相增大BatchSize,降低显存占用率,另一方面扩充了原始数据集,防止过拟合的发生,提高了模型的整体鲁棒性。🚵

说明:

使用Mosaic数据增强方法的优点:🏆

丰富数据集:随机使用4张图片,随机缩放,再随机分布进行拼接,丰富了检测数据集,尤其是随机缩放增加了小目标,让网络的鲁棒性更好。

减少GPU:可能会有人说,随机缩放,普通的数据增强也可以做,但作者考虑到很多人可能只有一个GPU,因此Mosaic增强训练时,可以直接计算4张图片的数据,使得Mini-batch大小并不需要很大,一个GPU就可以达到比较好的效果。

3.2 自适应锚框计算 

在YOLO算法中,针对不同的数据集,都会有初始设定长宽的锚框。在网络训练中,网络在初始锚框的基础上输出预测框,进而和真实框groundtruth进行比对,计算两者差距,再反向更新,迭代网络参数,因此初始锚框是比较重要的一部分。在YOLOv3、YOLOv4中,训练不同的数据集时,计算初始锚框的值是通过单独的程序运行的。但YOLOv5中将此功能嵌入到代码中,每次训练将会自适应的计算不同训练集中的最佳锚框值。如果觉得计算的锚框效果不好,可以将自动计算锚框功能关闭。🚃

 
3.3 自适应图像缩放

在常用的目标检测算法中,不同的图片长宽都不相同,因此常用的方式是将原始图片统一缩放到一个标准尺寸,再送入检测网络中。YOLO算法中常用416*416608*608等尺寸,比如对下面800*600的图像进行缩放。🐳

步骤1:根据原始图片大小以及输入到网络的图片大小来计算缩放比例

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

步骤2:根据原始图片大小与缩放比例计算缩放后的图片大小

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

步骤3:计算黑边填充数值

 将416-312=104,得到原本需要填充的高度。再采用numpy中np.mod取余数的方式,得到8个像素,再除以2,即得到图片高度两端需要填充的数值。🌺

注意:

1.Yolov5中填充的是灰色,即(114,114,114)。

2.训练时没有采用缩减黑边的方式,还是采用传统填充的方式,即缩放到416*416大小。只是在测试,使用模型推理时,才采用缩减黑边的方式,提高目标检测,推理的速度。

3.为什么np.mod函数的后面用32?因为Yolov5的网络经过5次下采样,而2的5次方,等于32。所以至少要去掉32的倍数,再进行取余。


🚀4.主干网络(Backbone)

模型的Backbone主要由FocusC3(改进后的BottleneckCSP)等模块组成。

4.1 Focus结构

Focus 模块,输入通道扩充了4倍,作用是可以使信息不丢失的情况下提高计算力。Focus结构,在Yolov3&Yolov4中并没有这个结构,其中比较关键是切片操作📒

比如右图的切片示意图,4*4*3的图像切片后变成2*2*12的特征图。以Yolov5s的结构为例,原始608*608*3的图像输入Focus结构,采用切片操作,先变成304*304*12的特征图,再经过一次32个卷积核的卷积操作,最终变成304*304*32的特征图。💊

4.2 CSP结构

Yolov5中设计了两种CSP结构,以Yolov5s网络为例,CSP1_X结构应用于Backbone主干网络,另一种CSP2_X结构则应用于Neck网络中。 💯


 🚀5.Neck网络

该模块采用特征金字塔结构(FPN)+路径聚合网络结构(PAN)的结构,可以加强网络对不同缩放尺度对象特征融合的能力。Neck网络通常位于基准网络和头网络的中间位置,利用它可以进一步提升特征的多样性及鲁棒性。🌹

Yolov5现在的Neck和Yolov4中一样,都采用FPN+PAN的结构,但在Yolov5刚出来时,只使用了FPN结构,后面才增加了PAN结构,此外网络中其他部分也进行了调整。

结构如下图所示:

FPN层自顶向下传达强语义特征,而PAN则自底向上传达定位特征。


🚀6.输出端

输出端采用CIOU函数作为边界框的损失函数(关于损失函数,小哥谈后面会单独进行介绍,包括IOU_Loss、GIOU_Loss、DIOU_Loss和CIOU_Loss),在目标检测后处理过程中,使用NMS(非极大值抑制)来对多目标框进行筛选,增强了多目标和遮挡目标的检测能力。🌴

说明:

综合的看下各个Loss函数的不同点:

IOU_Loss:主要考虑检测框和目标框重叠面积。

GIOU_Loss:在IOU的基础上,解决边界框不重合时的问题。

DIOU_Loss:在IOU和GIOU的基础上,考虑边界框中心点距离的信息。

CIOU_Loss:在DIOU的基础上,考虑边界框宽高比的尺度信息。Yolov5中采用了CIOU_Loss的回归方式,使得预测框回归的速度和精度更高一些。

NMS算法实现:

为了从多个候选边界框中选择一个最佳边界框,通常会使用非极大值抑制(NMS)算法,这种算法用于“抑制”置信度低的边界框并只保留置信度最高的边界框。🍃

算法的实现过程为:🍃

输入: 候选边界框集合B(每个候选框都有一个置信度)、IoU阈值N

输出: 最终的边界框集合D(初始为空集合)

1. 对集合B根据置信度进行降序排序;

2. 从集合B中选择第一个候选框(置信度最高),把它放入集合D中并从集合B中删除;

3. 遍历集合B中的每个候选框,计算它们与D集合中这个候选框的IoU值。如果IoU值大于阈值N, 则把它从集合B中删除;

4. 重复步骤2~3直到集合B为空。

说明:

关于NMS(非极大值抑制),请参考我的另一篇文章。🌼🌼🌼

目标检测中NMS(非极大值抑制)原理解析


 🚀7.训练策略

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

西瓜书读书笔记整理(五)—— 第四章 决策树

第四章 决策树 4.1 基本流程4.1.1 什么是决策树算法4.1.2 决策树学习的目的4.1.3 决策树学习基本过程4.1.4 决策树学习基本算法4.1.5 递归结束的三种情况 4.2 划分选择4.2.1 信息增益(information gain)—— ID3 决策树学习算法属性划分准则4.2.2 信息增…

JUC之线程中断与LockSupport

什么是中断 首先一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。其次在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的机制——中…

力扣 -- 467. 环绕字符串中唯一的子字符串

一、题目 二、解题步骤 下面是用动态规划的思想解决这道题的过程&#xff0c;相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。 三、参考代码 class Solution { public:int findSubstringInWraproundString(string s) {int ns.size();vector<int> dp(n,1);int re…

Godot 4 源码分析 - 增加格式化字符串功能

Godot 4的主要字符串类型为String&#xff0c;已经设计得比较完善了&#xff0c;但有一个问题&#xff0c;格式化这块没怎么考虑。 String中有一个format函数&#xff0c;但这个函数只有两个参数&#xff0c;这咋用&#xff1f; String String::format(const Variant &va…

vue 新学习 06 js的prototype ,export暴露,vue组件,一个重要的内置关系

部分内容参考的这篇文章 原文链接&#xff1a;https://blog.csdn.net/harry5508/article/details/84025146 写的很好。 01 在js中&#xff1a; 原型链 注意&#xff1a;构造函数.prototype实例化对象.__proto__&#xff0c;都是指向函数的原型。 export&#xff1a; -export用…

Popover气泡卡片(antd-design组件库)简单使用

1.Popover气泡卡片 点击/鼠标移入元素&#xff0c;弹出气泡式的卡片浮层。 2.何时使用 当目标元素有进一步的描述和相关操作时&#xff0c;可以收纳到卡片中&#xff0c;根据用户的操作行为进行展现。 和 Tooltip 的区别是&#xff0c;用户可以对浮层上的元素进行操作&#xff…

项目实战 — 消息队列(5){统一硬盘操作}

前面已经使用数据库管理了交换机、绑定、队列&#xff0c;然后又使用了数据文件管理了消息。 那么&#xff0c;这里就创建一个类&#xff0c;讲之前的两个部分整合起来&#xff0c;对上层提供统一的一套接口&#xff0c;表示硬盘上存储的所有的类的信息。 /* * 用这个类来管理…

【Linux】Linux下git的使用

文章目录 一、什么是git二、git发展史三、Gitee仓库的创建1.新建仓库2.复制仓库链接3.在命令行克隆仓库3.1仓库里的.gitignore是什么3.2仓库里的git是什么 三、git的基本使用1.将克隆仓库的新增文件添加到暂存区(本地仓库)2.将暂存区的文件添加到.git仓库中3.将.git仓库中的变化…

Flink正常消费一段时间后,大量反压,看着像卡住了,但又没有报错。

文章目录 前言一、原因分析二、解决方案 前言 前面我也有提到&#xff0c;发现flink运行一段时间后&#xff0c;不再继续消费的问题。这个问题困扰了我非常久&#xff0c;一开始也很迷茫。又因为比较忙&#xff0c;所以一直没有时间能够去寻找答案&#xff0c;只是通过每天重启…

如何设计一个自动化测试框架

在进行自动化框架设计之前我们先来看两个问题&#xff0c;什么是自动化框架&#xff0c;设计的时候应该注意什么原则&#xff0c;然后该怎么做&#xff1f;本文会以一个web端的UI自动化测试框架设计为例 Python自动化测试&#xff1a;2023最新合集Python自动化测试开发框架【全…

部署Tomcat和jpress应用

静态页面&#xff1a;静态页面是指在服务器上提前生成好的HTML文件&#xff0c;每次用户请求时直接返回给用户。静态页面的内容是固定的&#xff0c;不会根据用户的请求或其他条件进行变化。静态页面的优点是加载速度快&#xff0c;对服务器资源要求较低&#xff0c;但缺点是无…

fishing之踩坑篇捕获数据不齐全

文章目录 一、问题记录二、解决方法三、更新钓鱼模板四、进行点击邮件五、查看仪表盘免责声明 一、问题记录 通过点击邮件内的链接&#xff0c;提交数据&#xff0c;但是只记录密码&#xff0c;无法记录username 二、解决方法 对于需要被捕获的表单数据&#xff0c;除了inp…

faac内存开销较大,为方便嵌入式设备使用进行优化(valgrind使用)

faac内存开销较大&#xff0c;为方便嵌入式设备使用进行优化&#xff0c;在github上提了issues但是没人理我&#xff0c;所以就搞一份代码自己玩吧。 基于faac_1_30版本&#xff0c;原工程https://github.com/knik0/faac faac内存优化: faac内存开销较大&#xff0c;为方便嵌入…

自然语言处理学习笔记(三)————HanLP安装与使用

目录 1.HanLP安装 2.HanLP使用 &#xff08;1&#xff09;预下载 &#xff08;2&#xff09;测试 &#xff08;3&#xff09;命令行 &#xff08;4&#xff09;测试样例 3.pyhanlp可视化 4. HanLP词性表 1.HanLP安装 HanLP的 Python接口由 pyhanlp包提供&#xff0c;其安装…

Hyper实现git bash在windows环境下多tab窗口显示

1.电脑上安装有git bash 下载链接&#xff1a;https://gitforwindows.org/ 安装Hyper 下载链接:官网 https://hyper.is/ 或者在百度云盘下载&#xff1a; https://pan.baidu.com/s/1BVjzlK0s4SgAbQgsiK1Eow 提取码&#xff1a;0r1f 设置 打开Hyper&#xff0c;依次点左上角-&g…

从特斯拉FSD v11.4.6,看FSD入华

从特斯拉FSD v11.4.6&#xff0c;看FSD入华 1. 芝加哥城区a. 亮点b. 问题 2. 小镇中心a. 亮点b. 问题 3. FSD入华a. 技术路线b. 场景 4. 参考视频 FSD最近更新了v11.4.6&#xff0c;本文根据2个FSD城区测试视频&#xff0c;一起看一下有哪些亮点和问题。 FSD入华的消息也甚嚣尘…

图像快速傅里叶变换的工业应用案例简介:图像自相关,背景纹理去除,旋转矫正,划痕检测

快速傅里叶变换是非常重要的数学分析工具&#xff0c;同时也是一种非常重要的信号处理方法。 下面借助Halcon商业图像处理库&#xff0c;介绍些工业应用案例&#xff0c;我们可以通过案例理解图像快速傅里叶变换的一些应用场景。 案例1&#xff1a;图像自相关性确定芯片间距 …

springCache-缓存

SpringCache 简介&#xff1a;是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;底层可以切换不同的cache的实现&#xff0c;具体是通过CacheManager接口实现 使用springcache,根据实现的缓存技术&#xff0c;如使用的redis,需要导入redis的依赖包 基于map缓存 …

AI编程工具Copilot与Codeium的实测对比

csdn原创谢绝转载 简介 现在没有AI编程工具&#xff0c;效率会打一个折扣&#xff0c;如果还没有&#xff0c;赶紧装起来&#xff0e; GitHub Copilot是OpenAi与github等共同开发的的AI辅助编程工具&#xff0c;基于ChatGPT驱动&#xff0c;功能强大&#xff0c;这个没人怀疑…

【100天精通python】Day27:文件与IO操作_CSV文件处理

目录 专栏导读 1. CSV文件格式简介 2 csv模块的使用方法 3 读写CSV文件的示例 3.1 读取CSV文件示例 3.2 写入CSV文件示例 4 CSV文件的常用数据处理 4.1 读取CSV文件的特定列 4.2 读取CSV文件的特定行 5 csv 文件的特殊处理 5.1 处理包含逗号、换行符、引号的字段 5.…