从0开始深度学习(35)——YOLO V5原理详解

news2025/1/4 20:03:37

以YOLO V5s为例,介绍YOLO V5的网络结构,以及其中具体的功能模块

1 YOLO V5的整体网络结构

在这里插入图片描述
YOLO V5网络结构分为四个部分:

  1. 输入端: 输入端负责对输入图像进行预处理,包括数据增强、锚框计算等。
  2. 骨干网络(Backbone): Backbone是网络的主干部分,用于提取图像中的特征。
  3. 颈部网络(Neck): 融合Backbone提取的特征,增强网络对目标的位置和大小信息的敏感性。
  4. 头部(Head): 负责对Neck输出的特征进行预测,包括目标的类别和边界框的位置。

2 输入端

输入端会把图片处理成需要的尺寸,并进行归一化操作,然后进行批处理等操作。YOLO V5输入端有三种创新操作:Mosaic数据增强、自适应锚框计算、自适应图片缩放

2.1 Mosaic数据增强

本方法就是把4张图片,通过随机缩放、随机裁减、随机排布的方式进行拼接,具体步骤如下:

  1. 随机读取四张图片
  2. 分别对四张图片进行翻转(对原始图片进行左右的翻转)、缩放(对原始图片进行大小的缩放)、色域变化(对原始图片的明亮度、饱和度、色调进行改变)等操作
  3. 将四张图片组合到一张图片中,并筛除掉一些没用的框。

如下图所示:
在这里插入图片描述
该方法极大的丰富了检测物体的背景,并且在标准化计算的时候,会同时计算了四张图片的数据。

2.2 自适应锚框计算

Yolov5 中并不是只使用默认锚定框,在开始训练之前会对数据集中标注信息进行核查,计算此数据集标注信息针对默认锚定框的最佳召回率。当最佳召回率大于或等于0.98,则不需要更新锚定框;如果最佳召回率小于0.98,则需要重新计算符合此数据集的锚定框。

重新计算符合此数据集标注框的锚定框,是利用 kmean聚类方法实现的。

2.3 自适应图片缩放

传统的缩放方式都是按照原始比例缩放图像并用黑色填充至目标大小,由于实际的使用中很多图片的宽高比不同,因此缩放填充之后,两端的黑边大小不一定相同,而如果填充过多,则会存在大量的信息冗余,从而影响整个算法的推理速度。

Yolov5算法则提出Letterbox方法,能够自适应的添加最少的黑边到缩放之后的图片中,这样推理时计算量减少,目标检测速度也会得到提升,步骤如下:

  1. 计算缩放比例。例如原始缩放尺寸为416x416,都除以原始图像尺寸,可以得到0.52和0.69两个缩放系数,选择较小系数0.52。
    在这里插入图片描述

  2. 计算缩放后的尺寸。原始图片的长宽都乘以最小缩放系数0.52,宽变成了416,高变为312。
    在这里插入图片描述

  3. 计算黑边填充数值。将416-312=104,得到原本需要填充的高度。
    在这里插入图片描述

注意: :缩减黑边方式仅在模型推理时使用,用于提高目标检测及推理速度。训练时仍采用传统填充方式,即缩放到416x416大小

此处参考的Yolov5原理详细解析!一文看懂。

3 骨干网络(Backbone)

该结构负责提取各个尺度的的特征,增强网络对目标的位置和大小信息的敏感性,骨干网络结构如下:
在这里插入图片描述

下面分别介绍这些功能模块。

3.1 Focus模块

在不增加额外计算成本的情况下,增强模型对输入图像的理解能力,处理步骤如下:

  1. 切片(Slicing): Focus模块将输入图像分割成更小的块,每个子区域包含了原始图像的一部分信息。
  2. 重排(Rearrangement): 这些子区域的信息被重新排列组合到一起,会形成一个新的特征图。
  3. 连接(Concatenation): 把经过处理后的特征图连接在一起,形成一个更加丰富的输入表示,供后续的网络层进一步处理。
  4. 自定义卷积(CBL模块): 通过CBL模块操作,最终得到了没有信息丢失情况下的二倍下采样特征图。

在这里插入图片描述

下图展示了切片、重排、组合操作的结果:
在这里插入图片描述
原始的 640 × 640 × 3 640 × 640 × 3 640×640×3的图像输入Focus结构,采用切片操作,先变成 320 × 320 × 12 320 × 320 × 12 320×320×12的特征图,然后进行拼接(Concat),再经过一次步长为2的自定义卷积操作(CBL模块),最终变成 320 × 320 × 32 320 × 320 × 32 320×320×32的特征图。

3.2 CBL模块(自定义卷积操作)

负责特征提取和非线性映射,CBL模块的处理步骤如下:

  1. 卷积操作: 负责从输入数据中提取特征。
  2. 批量归一化操作: 对卷积层的输出计算均值和方差,并用它们来标准化该层的输入,有助于加快训练速度、提高模型收敛性并减少过拟合的风险。
  3. Leaky_relu激活函数: 引入非线性因素,得模型能够学习到复杂的映射关系。

在这里插入图片描述

3.3 CSP1_x模块

CSP1模块是基于CSPNet(Cross Stage Partial Network)设计的一种结构,它旨在通过更高效的计算资源利用来提升模型的性能。CSPNet 的核心思想是在不显著增加计算成本的情况下,增强特征表达能力,从而提高检测精度。
在这里插入图片描述

其中,残差组件结构如下图,主要作用是解决或缓解深度神经网络训练过程中遇到的退化问题(Degradation Problem),即随着网络层数增加,模型准确率反而下降的问题。
在这里插入图片描述

CSP1_1就代表有一个是含有1个残差组件的CSP1组件,CSP1_3就代表有一个是含有3个残差组件的CSP1组件,

3.4 SSP模块

该模块是何恺明提出的Spatial Pyramid Pooling(空间金字塔池化),传统的 CNN 在最后几层通常使用固定尺寸的输入(例如 224x224),这意味着所有输入图像必须被缩放到相同的尺寸。然而,这种做法可能会导致信息丢失或引入不必要的变形。相比之下,SPP 可以接受任意尺寸的输入图像,并通过以下步骤将其转换为固定长度的特征表示:

  1. 多级划分: 将最后一个卷积层生成的特征图划分为多个不同尺度的空间区域。这些区域可以按照金字塔结构组织,比如分成 1x1、2x2、4x4等等不同数量的块。每个级别的划分代表了不同尺度的感受野
  2. 池化操作: 对每个划分后的区域应用最大池化(Max Pooling)或其他类型的池化操作。这样可以从每个区域内提取出最具代表性的特征。由于每个级别都有固定的池化区域数目,所以无论原始输入图像的尺寸如何,最终都会得到相同数量的池化结果。
  3. 特征拼接: 将所有级别池化后的特征向量进行拼接,形成一个单一的长向量作为整个图像的特征表示。这个特征向量随后可以被送入全连接层来进行分类或其他任务。

YOLO V5 模型中的SSP操作步骤如下:

  1. 自定义卷积操作: CBL模块 。
  2. 最大池化: 分别进行 13 × 13 13\times13 13×13 9 × 9 9\times9 9×9 5 × 5 5\times5 5×5最大池化,再和原来的组合成新的特征。
  3. 自定义卷积操作: CBL模块。

在这里插入图片描述

4 颈部网络(Neck)

负责融合Backbone提取的特征,增强网络对目标的位置和大小信息的敏感性。,结构如下如下:
在这里插入图片描述

4.1 CSP2_x模块

CSP2_x也是基于CSPNet(Cross Stage Partial Network)设计的一种结构,作用和CSP1_x类似,结构图如下:
在这里插入图片描述

4.2 上采样

YOLOv5 默认采用的是 最近邻插值(Nearest neighbor interpolation) 作为其上采样方法,尝试其他类型的上采样方法,例如双线性插值(Bi-linear interpolation)、双立方插值(Bi-cubic interpolation)、三线性插值(Trilinear interpolation),甚至是转置卷积(Transposed Convolution, 也称为反卷积)。最近邻插值法效果如下图所示:
在这里插入图片描述

4.3 FPN(Feature Pyramid Networks)、PAN(Path Aggregation Network)

整个Neck网络采用了特征金字塔网络FPN和路径聚合网络PAN结构,实现了多尺度特征融合,效果步骤图如下:
在这里插入图片描述

  1. FPN 结构通过自顶向下进行上采样,使得底层特征图包含更强的图像强语义信息
  2. PAN 结构自底向上进行下采样,使顶层特征包含图像位置信息
  3. 两个特征最后进行融合,使不同尺寸的特征图都包含图像语义信息和图像特征信息,保证了对不同尺寸的图片的准确预测。

5 头部(Head)

负责对Neck输出的特征进行预测,包括目标的类别和边界框的位置,结构如下:
在这里插入图片描述

5.1 损失函数

损失函数由三部分组成:

  • 分类损失(Classes loss): 采用BCE loss,只计算正样本的分类损失。
  • OBJ置信度损失(ObJectness loss): 采用BCE loss,计算的是所有样本的obj损失。注意这里的OBJ指的是网络预测的目标边界框与GT Box的CIoU。
  • 定位损失(Location loss): 采用CIoU loss,只计算正样本的定位损失。

L o s s = λ L c l s + λ L o b j + λ L l o c Loss = \lambda L_{cls} + \lambda L_{obj} + \lambda L_{loc} Loss=λLcls+λLobj+λLloc

可以看到会出三个预测特征层,针对不同的层,OBJ置信度损失采用不同的权重。

  • 针对预测小目标的预测特征层采用的权重是4.0
  • 针对预测中目标的预测特征层采用的权重是1.0
  • 针对预测大目标的预测特征层采用的权重是0.4

5.3 匹配样本方式

  1. 根据GT Box与对应的Anchor Templates模板的高宽比例(0.25~4)进行匹配。
  2. 栅格左上角点距离GT中心点在( − 0.5 , 1.5 ) 范围,它们对应的Anchor都能回归到GT的位置,这样会让正样本的数量得到大量的扩充。

6 完整的模型结构

在这里插入图片描述

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

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

相关文章

云计算vspere 安装过程

1 材料的准备 1 安装虚拟机 vmware workstation 2 安装esxi 主机 3 在esxi 主机上安装windows 2018 dns 服务器 4 在虚拟机上安装windows 2018 服务器 6 安装vcenter 5 登入界面测试 这里讲一下,由于部署vspere 需要在windows 2012 服务器上部…

微信小程序中使用miniprogram-sm-crypto实现SM4加密攻略

在微信小程序开发过程中,数据安全至关重要。本文将为大家介绍如何在微信小程序中使用miniprogram-sm-crypto插件进行SM4加密,确保数据传输的安全性。 一、SM4加密简介 SM4是一种对称加密算法,由国家密码管理局发布,适用于商密领…

算法-字符串-43.字符串相乘

一、题目 二、思路解析 1.思路: 1.双重for循环,倒序依次相乘 2.在倒序处理进位问题 3.最后返回参数的类型是string,用StringBuilder拼接,再转换为字符串 2.常用方法: 1.equals,比较对象内容是否一致 "0".eq…

vscode鼠标右键跳转到定义只能跳转到头文件

在使用Visual Studio Code进行C语言编程开发时,C/C插件出错,鼠标右键只能跳转到头文件,不能跳转到源代码中函数原型定义的地方。 解决办法 打开C/C拓展设置页面,点击卸载右边的小箭头,点击安装特定版本 安装老版本的C…

AI 数字人模型 Hallo2:让图片开口说话,一键修复模糊人脸

Hallo2 是由复旦大学 (Fudan University)、百度公司 (Baidu Inc) 和南京大学 (Nanjing University) 于 2024 年联合开发的一项先进技术,旨在生成长时间、高质量的唇形视频。该技术在原有的 Hallo 模型基础上进行了多项创新和改进,使其能够应对长时间视频…

模型训练数据-MinerU一款Pdf转Markdown软件

模型训练数据-MinerU一款Pdf转Markdown软件-说明 简介: MinerU是什么 MinerU是上海人工智能实验室OpenDataLab团队推出的开源智能数据提取工具,专注于复杂PDF文档的高效解析与提取。MinerU能将包含图片、公式、表格等元素的多模态PDF文档转化为易于分析…

Spring07——AOP通知以及几个相关案例

切入点表达式 注意,不是参数,是参数类型 可以使用通配符描述切入点,快速描述 ■ *:单个独立的任意符号,可以独立出现,也可以作为前缀或者后缀的通配符出现 execution(public∗com.itheima.∗.UserServi…

【ETCD】【源码阅读】configurePeerListeners() 函数解析

configurePeerListeners 是 ETCD 的一个核心函数,用于为集群中节点之间的通信配置监听器(Peer Listener)。这些监听器主要负责 Raft 协议的消息传递、日志复制等功能。函数返回一个包含所有监听器的列表。 函数签名 func configurePeerList…

Kafka怎么发送JAVA对象并在消费者端解析出JAVA对象--示例

1、在pom.xml中加入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-stream-kafka</artifactId><version>3.1.6</version></dependency> 2、配置application.yml 加入Kafk…

为了安全,自己搭建KMS,成功激活Office2010

在本篇文章中&#xff0c;将全过程描述Office Professional Plus 2010 With SP1 VOL从下载到自建KMS服务器再到激活的过程。本文展示的是64位版本&#xff0c;32位版本的方法类似。 特别注意&#xff1a;KMS激活仅限于VOL 版本&#xff0c;其他的零售版无法激活&#xff01;&am…

Unity 基于Collider 组件在3D 物体表面放置3D 物体

实现 从鼠标点击的屏幕位置发送射线&#xff0c;以射线监测点击到的物体&#xff0c;根据点击物体的法线向量调整放置物体的位置及朝向。 Ray ray Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit, 100)) {obj.transform.…

【RDMA】RDMA read和write编程实例(verbs API)

WRITE|READ编程&#xff08;RDMA read and write with IB verbs&#xff09; &#xff08;本文讲解的示例代码在&#xff1a;RDMA read and write with IB verbs | The Geek in the Corner&#xff09; 将 RDMA 与verbs一起使用非常简单&#xff1a;首先注册内存块&#xff0c…

HTML5教程-表格宽度设置,最大宽度,自动宽度

HTML表格宽度 参考&#xff1a;html table width HTML表格是网页设计中常用的元素之一&#xff0c;可以用来展示数据、创建布局等。表格的宽度是一个重要的参数&#xff0c;可以通过不同的方式来设置表格的宽度&#xff0c;本文将详细介绍HTML表格宽度的不同设置方式和示例代…

2024年12月9日Github流行趋势

项目名称&#xff1a;ollama / ollama 项目维护者&#xff1a;mxyng, jmorganca, dhiltgen, BruceMacD, technovangelist等项目介绍&#xff1a;快速上手使用Llama 3.2、Mistral、Gemma 2及其他大型语言模型。项目star数&#xff1a;101,591项目fork数&#xff1a;8,117 项目名…

IntelliJ+SpringBoot项目实战(29)--如何将Beetl的模板文件放在独立的文件目录

在实际的项目开发中&#xff0c;为了方便前端人员调试页面&#xff0c;所以有必要将Beetl的模板文件放在独立的目录下&#xff0c;方便前端人员维护&#xff0c;而不是打包到项目的jar包中&#xff0c;如果打包到项目的jar包中还有另外的问题&#xff0c;就是一改动页面就要重新…

在Ubuntu上使用IntelliJ IDEA:开启你的Java开发之旅!

你好&#xff0c;年轻的学徒&#xff01;&#x1f9d1;‍&#x1f4bb; 是时候踏上进入Java开发世界的史诗之旅了&#xff0c;我们的得力助手将是强大的IntelliJ IDEA。准备好了吗&#xff1f;出发吧&#xff01; 在我们开始之前&#xff0c;我们需要下载这个工具。但是&#…

GWAS分析先做后学

大家好&#xff0c;我是邓飞。 GWAS分析是生物信息和统计学的交叉学科&#xff0c;上可以学习编程&#xff0c;下可以学习统计。对于Linux系统&#xff0c;R语言&#xff0c;作图&#xff0c;统计学&#xff0c;机器学习等方向&#xff0c;都是一个极好的入门项目。生物信息如…

LeetCode—189. 轮转数组(中等)

题目描述&#xff1a; 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例1&#xff1a; 输入: nums [1,2,3,4,5,6,7], k 3输出:[5,6,7,1,2,3,4] 解释: 向右轮转 1 步:[7,1,2,3,4,5,6] 向右轮转 2 步:[6,7,1,2,3,4,5] 向…

ModelScope-Agent(1): 基于开源大语言模型的可定制Agent系统

目录 简介快速入门 简介 github地址 快速入门 看前两篇&#xff0c;调用千问API和天气API # 选用RolePlay 配置agent from modelscope_agent.agents.role_play import RolePlay # NOQArole_template 你扮演一个天气预报助手&#xff0c;你需要查询相应地区的天气&#x…

go语言的成神之路-标准库篇-fmt标准库

目录 一、三种类型的输出 print&#xff1a; println&#xff1a; printf&#xff1a; 总结&#xff1a; 代码展示&#xff1a; 二、格式化占位符 %s&#xff1a;用于格式化字符串。 %d&#xff1a;用于格式化整数。 %f&#xff1a;用于格式化浮点数。 %v&#xff1…