【YOLO学习】YOLOv5详解

文章目录

  • 1. 网络结构
  • 2. 结构整体描述
    • 2.1 输入端
    • 2.2 Backbone
    • 2.3 Neck
    • 2.4 Head
  • 3. 模块细节
    • 3.1 Focus模块
    • 3.2 SPPF
    • 3.3 Bounding Box损失函数
  • 4. 训练策略


1. 网络结构

 1. 目标检测的模型框架大体都是以下图示这样的结构:

在这里插入图片描述

 2. 关于 YOLOv5 的网络结构其实网上相关的讲解已经有很多了。网络结构主要由以下几部分组成:Backbone,Neck,Head。

 3. 下面是根据 yolov5l.yaml 绘制的网络整体结构,YOLOv5 针对不同大小(n, s, m, l, x)的网络整体架构都是一样的,只不过会在每个子模块中采用不同的深度和宽度,分别应对 yaml 文件中的 depth_multiplewidth_multiple 参数。

在这里插入图片描述

2. 结构整体描述

2.1 输入端

 1. 输入端主要由 Mosaic 图像增强、自适应锚框计算、自适应图片缩放组成。

 2. Mosaic 图像增强是一种目标检测中常用的数据增强方法,它可以通过组合多个不同的图像来生成新的训练图像。

 3. 在目标检测算法中,锚框是指在输入图像上定义的一些预先设定好的矩形框,用于检测不同尺度和宽高比的目标。
 传统的目标检测算法中,通常需要手动设置锚框的大小和宽高比等参数。然而,这些参数的选择往往需要经验和调试,容易出现不稳定和不准确的情况。
 为了解决这个问题,自适应锚框的方法应运而生。自适应锚框的思想是通过学习的方式自动计算出最适合输入图像的锚框参数,而不需要手动设置。这种方法可以提高目标检测的精度和鲁棒性。

 4. 在 YOLOv5 中,自适应图片缩放(Adaptive Image Scaling)是一种基于目标尺度的图像缩放方式,它可以自适应地缩放输入图像的尺寸,以适应不同尺度目标的检测。

2.2 Backbone

 1. Backbone 负责提取输入图像的特征。在 YOLOv5 中,常见的 Backbone 网络包括 CSPDarknet53 或 ResNet。这些网络都是相对轻量级的,能够在保证较高检测精度的同时,尽可能地减少计算量和内存占用。

 2. 其结构主要有 Conv 模块、C3 模块、SPPF 模块。

  • Conv 模块主要由卷积层、BN 层和激活函数组成。
  • C3 模块则将前面的特征图进行自适应聚合。
  • SPPF 模块通过全局特征与局部特征的加权融合,获取更全面的空间信息。

2.3 Neck

 Neck 部分负责对 Backbone 提取的特征进行多尺度特征融合,并把这些特征传递给预测层。主要用于增强模型的特征表达能力和感受野,进一步提升模型的检测性能。

2.4 Head

 Head 主要负责进行最终的回归预测,即利用 Backbone 骨干网络提取的特征图来检测目标的位置和类别。最后,输出端是模型预测的结果,包括每个目标的类别和其对应的边界框坐标等信息。

3. 模块细节

3.1 Focus模块

 1. Focus 结构类似于 YOLOv2中的 passthrough,是一种用于特征提取的卷积神经网络层,用于将输入特征图中的信息进行压缩和组合,从而提取出更高层次的特征表示。

在这里插入图片描述

 2. YOLOv5 的代码中有时会将 Focus 结构替换为卷积层。这是因为 Focus 结构在实现上比较复杂,需要进行通道分离、卷积、通道拼接等操作,导致计算量较大,不利于模型的训练和推理。但由于卷积层只能进行简单的特征压缩和下采样操作,可能会损失一些输入特征图中的细节信息。因此,在某些需要较高特征提取能力的任务中,采用 Focus 结构可能会更加合适。

在这里插入图片描述

3.2 SPPF

 1. SPP 结构如下图所示,是将输入并行通过多个不同大小的 MaxPool,然后做进一步融合,能在一定程度上解决目标多尺度问题。

在这里插入图片描述

 2. SPPF 结构是将输入串行通过多个 5x5 大小的 MaxPool 层,这里需要注意的是串行两个 5x5 大小的 MaxPool 层是和一个 9x9 大小的 MaxPool 层计算结果是一样的,串行三个 5x5 大小的 MaxPool 层是和一个 13x13 大小的 MaxPool 层计算结果是一样的。

在这里插入图片描述

 3. 做个简单的小实验,对比下 SPP 和 SPPF 的计算结果以及速度,代码如下(注意这里将 SPPF 中最开始和结尾处的 1x1 卷积层给去掉了,只对比含有MaxPool的部分)。运行后实验结果可以看出 SPPF 的速度更快。

import time
import torch
import torch.nn as nnclass SPP(nn.Module):def __init__(self):super().__init__()self.maxpool1 = nn.MaxPool2d(5, 1, padding=2)self.maxpool2 = nn.MaxPool2d(9, 1, padding=4)self.maxpool3 = nn.MaxPool2d(13, 1, padding=6)def forward(self, x):o1 = self.maxpool1(x)o2 = self.maxpool2(x)o3 = self.maxpool3(x)return torch.cat([x, o1, o2, o3], dim=1)class SPPF(nn.Module):def __init__(self):super().__init__()self.maxpool = nn.MaxPool2d(5, 1, padding=2)def forward(self, x):o1 = self.maxpool(x)o2 = self.maxpool(o1)o3 = self.maxpool(o2)return torch.cat([x, o1, o2, o3], dim=1)def main():input_tensor = torch.rand(8, 32, 16, 16)spp = SPP()sppf = SPPF()output1 = spp(input_tensor)output2 = sppf(input_tensor)print(torch.equal(output1, output2))t_start = time.time()for _ in range(100):spp(input_tensor)print(f"spp time: {time.time() - t_start}")t_start = time.time()for _ in range(100):sppf(input_tensor)print(f"sppf time: {time.time() - t_start}")if __name__ == '__main__':main()

3.3 Bounding Box损失函数

 YOLOv5 采用的是 CIOU_Loss 作为 bounding box 的损失函数。

关于损失函数的详解可以参考博主前面写的 YOLOv4 部分:https://blog.csdn.net/m0_62881487/article/details/142748923

4. 训练策略

 在 YOLOv5 源码中使用到了很多训练的策略,这里简单总结几个我注意到的点:

  • Multi-scale training(0.5~1.5x):多尺度训练,假设设置输入图片的大小为 640 × 640,训练时采用尺寸是在 0.5 × 640 ∼ 1.5 × 640 之间随机取值,注意取值时取得都是 32 的整数倍(因为网络会最大下采样 32 倍)。
  • AutoAnchor(For training custom data):训练自己数据集时可以根据自己数据集里的目标进行重新聚类生成 Anchors 模板。
  • Warmup and Cosine LR scheduler:训练前先进行 Warmup 热身,然后在采用 Cosine 学习率下降策略。
  • EMA(Exponential Moving Average):可以理解为给训练的参数加了一个动量,让它更新过程更加平滑。
  • Mixed precision:混合精度训练,能够减少显存的占用并且加快训练速度,前提是 GPU 硬件支持。
  • Evolve hyper-parameters:超参数优化,建议保持默认。

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

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

相关文章

数据结构 - 队列

队列也是一种操作受限的线性数据结构,与栈很相似。 01定义 栈的操作受限表现为只允许在队列的一端进行元素插入操作,在队列的另一端只允许删除操作。这一特性可以总结为先进先出(First In First Out,简称FIFO)。这意味…

R语言机器学习算法实战系列(八)逻辑回归算法 (logistic regression)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍教程下载数据加载R包导入数据数据预处理数据描述数据切割构建模型预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC CurvePRC Curve特征的重要性保存模型总结系统信息介绍 …

MySQL数据库和表的基本操作

文章目录 一、数据库的基础知识 背景知识数据库的基本操作二、数据类型 字符串类型数值类型日期类型三、表的基本操作 创建表查看表结构查看所有表删除表 一、数据库的基础知识 背景知识 MySQL是一个客户端服务器结构的程序 主动发送数据的这一方,客户端(client…

“智改数转”转了什么?

万界星空科技专门针对数字化改造申报的MES系统具有显著的技术优势和实施效果,能够为制造型企业提供全方位、高效、可靠的数字化转型支持。项目合作可以私信或者百度上海万界星空科技官网。 “智改数转”是一个综合性的过程,涉及企业多个方面的转型和升…

【python实战】利用代理ip爬取Alibaba海外版数据

引言 在跨境电商的业务场景中,数据采集是分析市场、了解竞争对手以及优化经营策略的重要环节。然而,随着越来越多企业依赖数据驱动决策,许多跨境电商平台为了保护自身数据,采取了更严格的防护措施。这些平台通过屏蔽大陆IP地址或部…

【Spring声明式事务失效的12种场景测试】

文章目录 一.Spring声明式事务是什么?二.Spring事务失效的12种场景1.访问权限问题 小结 一.Spring声明式事务是什么? Spring声明式事务是一种通过配置的方式管理事务的方法,它通过注解或XML配置来声明哪些方法需要事务管理,从而将…

JRT怎么从IRIS切换到PostGreSql库

1.执行M导出得到建库脚本文件 2.下载生成的脚本到本地D盘 3.修改驱动为PostGreSql 4.修改连接串 5.到PostGreSql里面创建一个jrtlis的数据库,模式为jrt 6.启动网站点击导入脚本按钮 导入完成了就可以正常使用PostGreSql库了

OpenCV高级图形用户界面(14)交互式地选择一个或多个感兴趣区域函数selectROIs()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 允许用户在给定的图像上选择多个 ROI。 该函数创建一个窗口,并允许用户使用鼠标来选择多个 ROI。控制方式:使用空格键或…

Google FabricDiffusion:开启3D虚拟试穿新篇章

随着数字化转型的步伐不断加快,时尚界也在探索如何利用最新技术为消费者带来更加沉浸式的购物体验。在这一背景下,Google 推出了一项名为 FabricDiffusion 的新技术,这项技术能够将2D服装图像中的高质量织物纹理转移到任意形状的3D服装模型上,从而为3D虚拟试穿提供了更为真…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于AGCN-LSTM模型的海上风电场功率概率预测 》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

端到端自动驾驶模型SparseDrive部署过程

SparseDrive 论文链接 https://arxiv.org/pdf/2405.19620 仓库链接 https://github.com/swc-17/SparseDrive 论文和模型的相关介绍大家可以参考其他博客的介绍,这里只介绍模型部署的过程和中间可能遇到的问题解决办法,以及代码解析和使用记录。 模型部署…

CyberRT通信介绍与基于Reader、Writer的通信实践(apollo9.0)

目录 数据通信场景 CyberRT中的通信方式 ​编辑 通信模式 话题通信 服务通信 参数通信 protobuf protobuf简介 protobuf文件编写 topic通信实验 实验环境 实验准备 代码编写 定义消息格式 发送消息 接收消息 定义编译规则 程序编译 运行程序 数据通信场景 …

fabric-sdk-go

Fabric-SDK-go 区块链网络搭建fabric-sdk代码代码结构:代码eg: 区块链网络搭建 使用fabric-sample的网络结构用容器搭建起测试网络即可。 fabric-sdk代码 代码很简易,主要为了了解怎么使用fabric为编程人员提供的sdk从而提供HTTP接口的情况…

浅谈华为 HarmonyOS Next

1. 万物互联时代的新机遇 随着万物互联时代的到来,智能应用从几十亿部手机扩展到数百亿个IoT设备,深刻改变了人们的生活方式。这为我们应用开发者带来了新的机遇和挑战。 机遇 : 目前正处于万物互联时代的前夕,正在经历手机单设备到全场景多…

技术分享:A-23OH型树脂在汽车涂装废溶剂回收中的应用

在当今汽车制造业竞争激烈的环境下,提高生产效率、降低成本的同时,满足环保要求已成为各制造商追求的核心目标。水性涂料因其环保、节能等多重优势,在汽车涂装领域的应用日益广泛。然而,随之而来的喷涂废溶剂处理问题也日益凸显。…

从 Hadoop 迁移到数据 Lakehouse 的架构师指南

从 Hadoop 到数据湖仓一体架构的演变代表了数据基础架构的重大飞跃。虽然 Hadoop 曾经以其强大的批处理能力统治着大数据领域,但如今的组织正在寻求更敏捷、更具成本效益和现代化的解决方案。尤其是当他们越来越多地开始实施 AI 计划时。根本没有办法让 Hadoop 为 A…

三周精通FastAPI:1 第一步入门

FastAPI是一个非常棒的python web和api框架,准备用三周的时间“精通它” 学习流程参考FastAPI官网的用户教程:教程 - 用户指南 - FastAPI 学前提示 运行代码 所有代码片段都可以复制后直接使用(它们实际上是经过测试的 Python 文件&#x…

UG NX12.0建模入门笔记:1.0 UG NX12.0安装教程

一、如何关闭防火墙? 提示:安装软件之前,建议先 关闭防火墙和杀毒软件!!! 文章目录 一、如何关闭防火墙?二、UG NX12.0安装包三、UG NX12.0安装教程1.新建文件夹2.安装JAVA环境3.安装许可证管理…

LeetCode_2235. 两整数相加_java

1、问题 2235. 两整数相加https://leetcode.cn/problems/add-two-integers/ 给你两个整数 num1 和 num2,返回这两个整数的和。 示例 1: 输入:num1 12, num2 5 输出:17 解释:num1 是 12,num2 是 5 &am…

智慧监管:EasyCVR视频汇聚智能分析平台助力有限空间作业实现全天候可视化监控

随着工业化和城市化进程的加快,有限空间作业(如地下管道、储罐、隧道等)在各类企事业单位中日益频繁。然而,这类作业环境复杂、危险系数高,对作业人员的安全管理和实时监控提出了严峻挑战。为了保障有限空间作业的安全…