【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)。这意味…

你是否真的弄懂了 OAuth 2.0?

目录 OAuth 2.0 中的基本概念 OAuth 2.0 参与方 OAuth 2.0 典型的授权流程 使用 OAuth 2.0 需要注意的安全问题 OAuth 2.0 的使用场景 小结 OAuth 2.0(Open Authorization 2.0,开放授权 2.0)是被广泛使用的一种开放的标准授权协议&…

php常用设计模式之工厂模式

引言 在日常开发中,我们一些业务场景需要用到发送短信通知。然而实际情况考虑到不同厂商之间的价格、实效性、可能会出现的情况等 我们的业务场景往往会接入多个短信厂商来保证我们业务的正常运行,而不同的短信厂商(如阿里云短信、腾讯云短信…

[Java基础] Lambda 表达式

往期回顾 [Java基础] 流程控制 [Java基础] 运算符 [Java基础] 基本数据类型 [Java基础] Java HashMap 的数据结构和底层原理 [Java基础] 面向对象编程 [Java基础] 异常处理机制 [Java基础] 集合框架 [Java基础] 输入输出流 目录 概述 Lambda 表达式的基本语法 应用…

使用Uniapp开发微信小程序实现一个自定义的首页顶部轮播图效果?

在Uniapp中开发微信小程序,并实现自定义首页顶部轮播图的效果,可以通过使用Uniapp的组件如swiper和swiper-item来完成。这是一个常见的需求,下面是一个完整的示例代码,展示如何实现一个简单的自定义轮播图效果。 创建页面结构 首…

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

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

MySQL数据库和表的基本操作

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

“智改数转”转了什么?

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

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

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

Windows安装RabbitMQ 4.0.2(图文教程)

本章教程,主要记录在Windows 10上RabbitMQ 4.0.2的安装过程。 一、下载安装包 1、官方下载(速度不稳定) Erlang:https://github.com/erlang/otp/releases/download/OTP-26.0/otp_win64_26.0.exe RabbitMQ 4.0.2:https://github.com/rabbitmq/rabbitmq-server/releases/do…

设计模式之设计模式分类

java设计模式总体上分为3大类,即: 1)创建型模式 2)结构型模式 3)行为型模式 1、创建型模式 创建型模式提供创建对象的机制,主要解决对象的创建问题,封装复杂的创建过程,解耦 对象的创…

【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虚拟试穿提供了更为真…

HashMap优点总结及源码分析

HashMap优点总结: 可存储不同类型的数据:使用泛型来定义键和值的类型,兼容所有数据类型高效的查找和插入操作:通过key的hash映射,实现快速的查找和插入操作。时间复杂度基本为O(1)灵活的容量调整:可根据数据量增长自行…

WebSocked基础

一. WebSocket 基本概念 WebSocket是什么? WebSocket 是基于 TCP 的一种新的应用层网络协议。它提供了一个全双工的通道,允许服务器和客户端之间实时双向通信。因此,在 WebSocket 中,浏览器和服务器只需要完成一次握手&#xff…

文章解读与仿真程序复现思路——电网技术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 论文和模型的相关介绍大家可以参考其他博客的介绍,这里只介绍模型部署的过程和中间可能遇到的问题解决办法,以及代码解析和使用记录。 模型部署…

解决ubuntu20 启动卡死在 installing open-vm-tools 问题

------------------------------------------------------------------------------- 1. 解决ubuntu20 启动卡死在 installing open-vm-tools 问题 ------------------------------------------------------------------------------- 最近VMware 安装ubuntu-20.04.6-desktop…