【目标检测新SOTA!v7 v4作者新作!】YOLO v9 思路设计 + 全流程优化 + 手把手训练自己数据

YOLO v9 思路复现 + 全流程优化 + 手把手训练自己数据

    • 提出背景:深层网络的 信息丢失、梯度流偏差
    • YOLO v9 设计逻辑
      • 可编程梯度信息(PGI):使用PGI改善训练过程
      • 广义高效层聚合网络(GELAN):使用GELAN改进架构
    • 对比其他解法
      • 1. 残差网络(ResNet)
      • 2. 密集连接网络(DenseNet)
      • 3. 注意力机制
      • 4. 可逆网络架构
      • 5. 特征金字塔网络(FPN)
    • 效果
    • 训练自己数据

 


提出背景:深层网络的 信息丢失、梯度流偏差

论文:https://arxiv.org/pdf/2402.13616.pdf

代码:https://github.com/WongKinYiu/yolov9

  • 问题: 深度网络在前馈过程中数据丢失信息,导致偏差的梯度流和错误的目标与输入关联。
  • 解法: YOLO v9

在实际应用中,例如交通监控系统中的车辆和行人检测,深度网络可能会因为网络层过深而导致在前馈过程中丢失对车辆和行人的关键特征信息。

这种信息丢失会导致梯度流在反向传播过程中带有偏差,使得网络无法准确地学习到车辆和行人的特征,进而影响检测准确性。

针对这个问题,YOLOv9被提出作为一种解决方案。

它结合了PGI(可编程梯度信息)和GELAN(广义高效层聚合网络)技术来克服信息瓶颈和深度监督在轻量级网络中的不适用性问题。

YOLOv9的PGI技术包括辅助可逆分支和多级辅助信息,这些设计有助于在网络的深层中保留更多的信息,生成更可靠的梯度,从而在训练过程中确保了更准确的目标与输入之间的关联。

例如,如果在交通监控系统中部署了YOLOv9,当监控画面中有车辆通过时,即使在网络较深的层次上,YOLOv9也能有效地保留车辆的关键特征信息,如车辆的轮廓、颜色和标志等。

这使得在整个训练过程中,网络能够学习到更为精确的特征,提高车辆检测的准确率。

与传统的深度网络相比,YOLOv9能够减少因信息丢失导致的错误预测,从而在实时对象检测任务中表现出更高的准确性和效率。

在这里插入图片描述
图展示了在相同输入图像下,不同神经网络架构的特征图对比。

特征图代表了模型初始权重处理后各个网络架构所关注的内容。

这些可视化包括PlainNet、ResNet、CSPNet以及所提出的GELAN(v9采用),以及原始输入图像。

这些地图用来分析在前馈过程中每个网络保留了多少信息。

图中表明,所提出的GELAN架构保留了最完整的信息,并为计算目标函数提供了最可靠的梯度信息,这对模型的准确性至关重要。

在这里插入图片描述
GELAN在添加了PGI的可逆分支后,对目标对象的专注能力得到了提升。

  • GELAN在没有PGI时显示出一些分散的特征激活
  • 而在结合了PGI后,YOLOv9能够更集中地捕捉到目标对象的位置
  • 表明PGI的引入有助于网络在早期训练阶段就能够更准确地学习到目标的关键信息。

 

在MS COCO数据集上实现顶尖性能。

在这里插入图片描述

YOLO v9 设计逻辑

深度网络在处理复杂任务时面临的主要问题——信息丢失和梯度流偏差。

YOLO v9 结合 可编程梯度信息(PGI)和 通用ELAN(GELAN) 设计。

GELAN架构改进是基于ELAN,能够有效降低参数数量,提高计算效率。PGI作为训练改善手段,可以更好地维护传播过程中的关键信息。

PGI 通过一个辅助的可逆分支来维持关键信息,并确保梯度流的准确性。

接着,为了使模型能够在不同的硬件上高效运行,设计了GELAN,它允许模型根据硬件能力选择最合适的计算块。

最后,通过结合这两种技术,开发了YOLOv9,它在保持模型轻量级的同时,大幅提升了对象检测的准确率和速度。

可编程梯度信息(PGI)和广义高效层聚合网络(GELAN)是在深度学习领域为提高神经网络性能而提出的先进概念。以下是对这两个概念的详细解释:

可编程梯度信息(PGI):使用PGI改善训练过程

PGI是一种旨在解决深度网络中的信息瓶颈问题的策略。

在深度网络的训练过程中,由于层与层之间的复杂映射,有用的信息可能会逐渐丢失,这会导致梯度信号变弱,最终影响网络的学习效率和预测准确性。

  • 特征1:辅助可逆分支 - PGI在网络中引入了一个辅助分支,它与主分支并行运行。

    这个辅助分支被设计为可逆的,意味着它可以在不丢失信息的情况下执行数据的正向和反向传播。

    这有助于在训练过程中产生更可靠的梯度信号,因为它保证了即使是深层次的特征也能够保留对目标任务有用的信息。

  • 特征2:避免语义损失 - 在深度监督方法中,通常将额外的监督信号(如分类标签)插入到网络的中间层,以促进更深层的特征学习。

    然而,这种方法可能会引入语义损失,因为中间层的特征可能无法完全代表数据的全部复杂性。

    PGI通过其辅助可逆分支的设计来避免这种情况,使得整个网络能够在各个层次上保持语义信息的完整性。

PGI框架包括三个组件:主分支、辅助可逆分支和多级辅助信息

  • 特征1: 主分支用于推断,保证无额外推断成本。
  • 特征2: 辅助可逆分支产生可靠梯度,防止信息丢失。
  • 特征3: 多级辅助信息整合不同预测头的梯度信息。

PGI通过辅助可逆分支和多级辅助信息两条路径来提供可靠的梯度,并指导主分支学习,形成一个互补和增强的网络结构。

  • 辅助可逆分支作为一个独立模块在训练阶段生成可靠梯度,然后在推断阶段被移除,确保了信息的完整性而不增加推断成本。
  • 多级辅助信息作为一个整合网络,联合不同预测头的梯度,提供全面的信息给主分支。

 


广义高效层聚合网络(GELAN):使用GELAN改进架构

GELAN是一个新型的神经网络架构,它结合了多种网络设计的优点,旨在提供一个既轻量又高效的网络架构。

  • 特征1:综合设计 - GELAN融合了CSPNet和ELAN的设计理念,创建了一个灵活的网络架构,能够根据不同的应用需求和计算资源进行调整。

    CSPNet通过分割和合并特征图来减少冗余计算,而ELAN则使用层聚合来增强特征的表示能力。

  • 特征2:计算块的自由选择 - 与传统的深度网络架构依赖特定类型的计算单元不同,GELAN允许在其框架内使用各种类型的计算块,比如传统的卷积层、深度可分卷积或者其他类型的新颖计算单元。

    这种设计不仅提高了网络的适应性,也使得GELAN能够轻松地部署在不同性能的设备上,从高性能服务器到边缘设备。

在这里插入图片描述
这图是 GELAN(广义高效层聚合网络)的架构,并将其与CSPNet和ELAN两种网络架构进行了对比。

GELAN是将CSPNet和ELAN的特点结合在一起,并扩展以支持任何计算块的新型网络架构。

(a) CSPNet: 这种架构包括一个分裂-合并的过程,它通过在网络的不同层之间分裂和合并特征来提高性能和效率。

(b) ELAN: 这是一种更进一步的架构,它在CSPNet的基础上增加了多个卷积层(conv)的堆叠,每个卷积层都会进行特征转换,之后再进行合并。

© GELAN: 提出的GELAN架构不仅模仿了CSPNet的分裂-合并机制,还扩展了ELAN的设计,使其可以使用任何类型的计算块,而不仅限于卷积层。

这种设计增加了网络的灵活性,使其能够根据不同的应用需求选择最合适的计算块。

图中的“transition”表示特征转换层,“split”表示特征分裂操作,“concatenation”表示特征合并操作。

“xn”表示特征的复制或扩展,“module”表示网络中的可选模块,“partition”表示特征的分区。

通过这种方式,GELAN旨在克服以往架构中存在的局限性,如过度依赖卷积层堆叠或者处理复杂任务时的效率问题。

  • 融合 CSPNet 的计算效率 和 ELAN 的层聚合策略。

这种设计不仅减少了模型的参数数量和计算复杂度,还保持了高水平的准确率和推理速度,使其适用于各种推理设备,从高性能服务器到资源受限的边缘设备。

此外,GELAN的灵活性允许开发者根据特定应用场景的需要,自由选择和替换不同的计算块,进一步优化模型性能和效率。
 


对比其他解法

除了YOLOv9采用的PGI(可编程梯度信息)和GELAN(广义高效层聚合网络)外,还有其他几种解法。

在这里插入图片描述
这图是关于不同神经网络架构及方法的可视化对比,特别是在处理信息瓶颈和提供辅助信息方面的不同策略。

(a) PAN (Path Aggregation Network): 这种结构通过聚合不同路径的信息来缓解信息瓶颈问题,但仍然存在信息丢失的问题。

(b) RevCol (Reversible Columns): 这种结构旨在保持信息流的完整性,通过可逆列来避免信息的损失,但代价是计算成本较高。

© 深度监督 (Deep Supervision): 这个方法通过在网络的不同深度层添加预测头来实现辅助监督,这可以帮助网络学习到多层次的辅助信息,但可能导致信息损坏。

(d) 可编程梯度信息 (PGI): 这是论文提出的新方法,它通过辅助可逆分支产生可靠的梯度,以供主分支使用,从而控制主分支在多个语义层次上的学习,这有助于更好地保留语义信息并优化梯度流。

图中的蓝色块代表神经网络中的层,灰色块代表预测头或辅助分支,虚线框高亮了每种方法的关键特征。

1. 残差网络(ResNet)

  • 解决方案: 通过引入残差连接(Skip Connections)允许信息直接从一层传递到后面的多个层,从而减轻了梯度消失问题并保留了更多的信息。

  • 对比: 残差连接是一种简单有效的方法来维持信息流,但它可能不足以处理所有类型的信息损失,尤其是在非常深的网络或需要高度复杂特征提取的任务中。

    PGI通过辅助可逆分支提供了一种更为动态和可控的方式来保持关键信息,而GELAN则通过灵活的网络结构设计提供了进一步的优化空间。

2. 密集连接网络(DenseNet)

  • 解决方案: 在DenseNet中,每一层都与前面所有层直接相连,这保证了信息在网络中的自由流动,并减少了信息丢失。

  • 对比: DenseNet通过增强特征重用来提高效率和减少参数数量,但这种架构的参数效率和计算效率与GELAN相比可能不那么优秀。

    GELAN允许更灵活的计算块使用,可能在特定任务上提供更好的性能和效率。

3. 注意力机制

  • 解决方案: 注意力机制可以动态地聚焦于输入数据的关键部分,从而提高网络对重要信息的敏感性和保留能力。

  • 对比: 注意力机制为网络提供了一种有效的信息筛选和增强方式,可以与PGI和GELAN结合使用,以进一步优化信息流和提高模型性能。

    它们各自解决信息保留问题的方式不同,可以相互补充。

    在PGI的辅助可逆分支中集成注意力机制,在PGI的辅助可逆分支中引入注意力模块,如自注意力(Self-Attention)或卷积注意力机制。

    帮助模型更加精确地聚焦于输入特征中对目标任务最重要的部分,从而在生成可靠梯度时保留更多关键信息。

    在GELAN网络中应用注意力增强的计算块,将注意力机制融入GELAN网络的计算块中,例如,使用带有注意力机制的卷积层(如注意力增强的ResNet块)作为GELAN的构建模块。

    这样的设计可以使网络在处理特征时自动强调更有用的信息,同时抑制不相关的信息。

    结合PGI和GELAN的特性使用注意力机制进行特征融合,在PGI和GELAN的结合框架中,可以在特征融合阶段引入注意力机制,特别是在合并来自主分支和辅助可逆分支的特征时。

    通过对这些特征进行加权融合,模型可以更好地利用各自的优势,提取出最有价值的信息。

4. 可逆网络架构

  • 解决方案: 一些网络设计允许前馈和反向传播过程可逆,确保了信息的完全保留。

  • 对比: 可逆网络架构直接针对信息丢失问题提供了解决方案,而PGI中的辅助可逆分支也采用了类似的思想,但在一个辅助的分支上实现,以提高梯度的可靠性和信息的保存。

    因为传统的可逆架构虽然能够保留完整的输入信息,但增加了额外的复合层,会导致推断速度变慢。

    GELAN则通过结构上的创新进一步提升了网络的性能。

5. 特征金字塔网络(FPN)

  • 解决方案: FPN通过构建一个多尺度的特征金字塔来维持在不同尺度上的信息,特别适用于需要捕捉多尺度信息的任务,如对象检测。

  • 对比: FPN专注于通过多尺度表示来保留信息,而PGI和GELAN则通过改进梯度流和网络架构的方式来综合解决信息丢失问题,三者可以结合使用,以在不同层面上优化信息保留。

    如选择GELAN作为模型的基础架构,引入FPN进行多尺度特征融合,利用PGI优化梯度流和信息保留。

 


效果

在这里插入图片描述
表格按照不同的性能指标对模型进行了排名,包括模型参数数量、浮点运算次数(FLOPs)、以及不同IoU阈值下的平均精度(AP)。

这些性能指标是衡量对象检测器性能的关键指标。

  • IoU,即交并比,是一个衡量预测边界框与真实边界框重叠度的指标。
  • AP通常用来评估模型在不同IoU阈值下检测准确性的平均表现。
  • 此外,AP的不同变体(如AP50、AP75等)代表了在不同的IoU阈值(0.50、0.75等)下的性能。

以下是表格的详细拆解:

  • #Param. (M): 模型参数的数量,以百万为单位。这反映了模型的复杂度。
  • FLOPs (G): 浮点运算次数,以十亿为单位。这是衡量模型计算复杂度的指标。
  • AP50% - AP75%: 这些列显示在IoU阈值为50%和75%时的平均精度(AP),这是评估模型准确度的常用指标。
  • AP: 这一列通常表示在所有IoU阈值上平均的AP值。
  • APS, APM, APL: 分别代表小尺寸(S)、中尺寸(M)、大尺寸(L)对象的AP值。这说明了模型在不同尺寸对象检测方面的性能。

表格中展示了多个版本的YOLO(包括YOLOv5、v6、v7、v8和v9),以及其他模型如PPYOLOE、DAMO YOLO、Gold YOLO等。

YOLOv9 在多个性能指标上显示出了优越性,特别是在参数较少和计算复杂度较低的情况下,仍然保持了高AP值,显示了其高效率和准确性。

比如其中一列:

  • YOLOv9的AP为55.6%
  • YOLOv8的AP为52.9%
  • YOLOv5的AP为50.0%

结论:

  • YOLOv9 在保持较低参数数量和计算复杂度的同时,实现了与其他高性能模型相当或更好的AP值,尤其是在大尺寸对象检测上(APL)表现出色。
  • YOLOv9的性能优于其他从头训练的模型,在大多数性能指标上都有明显提升。
  • 这表明YOLOv9是在参数效率和检测准确性之间取得了良好平衡的高效检测模型。

 


训练自己数据

英文原文:https://blog.roboflow.com/train-yolov9-model/

  • 中文解读:https://mp.weixin.qq.com/s/_wsJbLaoZqFNiEri5yiW4Q

代码:https://colab.research.google.com/github/roboflow-ai/notebooks/blob/main/notebooks/train-yolov9-object-detection-on-custom-dataset.ipynb?ref=blog.roboflow.com

训练YOLOv9,分为以下部分:

  1. 安装YOLOv9:首先需要从GitHub克隆YOLOv9的代码库,并安装必要的依赖。

  2. 数据准备:下载并准备自定义数据集,例如足球运动员的数据集。数据集需要被格式化为YOLOv9兼容的格式。

  3. 模型训练:使用训练脚本和自定义数据集来训练模型。可以根据需要调整训练参数,如批量大小、训练周期数、图像大小等。

  4. 模型评估:训练完成后,使用生成的图表和混淆矩阵来评估模型的性能。

  5. 推理运行:最后,使用训练好的模型对新的图像或数据进行预测,以检验模型的实际效果。

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

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

相关文章

J.绝妙的平衡

解题思路 对于一个以染成红色的点为根的子树,要使其权值之和为3的倍数则与其子树中的红色点无关,至于白色点数有关若除去子树中的红色点后,剩余包括其自身共有k个若,则无解,即只有一个红色叶子点若,则除自…

linux查看socket信息

netstat netstat 是一个用于显示网络相关信息的命令行工具。它可以显示当前系统的网络连接状态、路由表、接口统计信息等。 下面是一些常见的 netstat 命令选项和用法: 显示所有活动的网络连接: netstat -a 显示所有正在监听的端口: ne…

局域网技术

目录 一、网络的定义 1、网络的基本概念: 2、不同类型的网络: 二、局域网发展 1、对局域网的研究是从20世纪60年代开始的: 2、英国剑桥大学计算机研究室:剑桥环局域网: 3、DatePoint公司推出用于办公系统的&…

MATLAB环境下一种改进的瞬时频率(IF)估计方法

相对于频率成分单一、周期性强的平稳信号来说,具有非平稳、非周期、非可积特性的非平稳信号更普遍地存在于自然界中。调频信号作为非平稳信号的一种,由于其频率时变、距离分辨率高、截获率低等特性,被广泛应用于雷达、地震勘测等领域。调频信…

远程连接Redis

以连接阿里云上的Redis为例 1. 在阿里云安全组中开放端口 2.修改Redis启动时所用的配置文件(redis.conf) 2.1 修改ip地址 如图:将默认的本地ip bind 127.0.0.1地址改为bind 0.0.0.0 2.2 将保护模式关闭 将默认的 supervised yes 改为 n…

JAVA IDEA 项目打包为 jar 包详解

前言 如下简单 maven 项目,现在 maven 项目比较流行,你还没用过就OUT了。需要打包jar 先设置:点击 File > Project Structure > Artifacts > 点击加号 > 选择JAR > 选择From modules with dependencies 一、将所有依赖和模…

如何将本地项目上传到github上

将本地项目上传到github上有很多种方法,这里只讲述我认为最简单快捷的一种,先在github中创建一个仓库,接着在本地建文件夹,用命令行将项目推送到本地仓库,然后连接远程仓库,将本地项目推送到远程仓库上。要…

vue3 + TS + vite 搭建中后台管理系统(开箱即用)

[TOC](vue3 TS vite 搭建中后台管理系统) 开箱即用 前言 要成功,先发疯,头脑简单往前冲! 三金四银,金九银十,多学知识,也不能埋头苦干,要成功,先发疯,头脑简单往前冲…

苍穹外卖Day02——解决总结2中存在的问题

解决Day02中存在的问题 1. BeanUtils类2. DigestUtils类3. LocalDateTime类4. ThreadLocal类5.扩展Spring MVC框架的消息转化器 1. BeanUtils类 项目应用:属性拷贝 目的:在新增分类中为了减少类category中的setXXX()次数,使用了BeanUtils类中…

TC3xx SMU与TLF35584如何协同工作(2)

目录 1.概述 2.TLF35584的安全控制 3.实例 1.概述 上一篇,我们讲了SMU的基本概念,这一节讲TLE35584,并且我们可以通过这颗芯片的设计思路、引脚命名和功能,可以看到,要设计一块好用的车规MCU,光只有MCU还…

BUUCTF crypto做题记录(9)新手向

一、rsa2 得到题目代码如下: N 101991809777553253470276751399264740131157682329252673501792154507006158434432009141995367241962525705950046253400188884658262496534706438791515071885860897552736656899566915731297225817250639873643376310103992170…

Jupyterlab 和 JupyternoteBook 修改默认路径

Jupyterlab 和 JupyternoteBook 修改默认路径 在使用 JupyterLab 或 Jupyter Notebook 进行数据分析、机器学习项目时,经常会遇到需要修改默认工作目录的需求。默认情况下,JupyterLab 和 Jupyter Notebook 会在启动时打开你的用户目录(例如&…

idea生成WebServices接口

文章目录 idea生成WebServices接口1.创建接口2.生成wsdl文件3.在soapUI中,生成6个文件4.将生成的文件拷贝到工程中5.在service-config中注册服务 idea生成WebServices接口 1.创建接口 新建一个webServices工程,按照接口规范生成接口、请求类、响应类。…

Qt的QThread、QRunnable和QThreadPool的使用

1.相关描述 随机生产1000个数字,然后进行冒泡排序与快速排序。随机生成类继承QThread类、冒泡排序使用moveToThread方法添加到一个线程中、快速排序类继承QRunnable类,添加到线程池中进行排序。 2.相关界面 3.相关代码 widget.cpp #include "widget…

Ubuntu20.04安装Carla0.9.15

文章目录 环境要求下载Carla解压Carla运行Carla测试官方用例创建python环境安装依赖包案例:生成车辆案例:测试自动驾驶 参考链接 环境要求 系统配置要求: 至少3G显存的GPU,推荐3060及以上的显卡进行Carla拟真。预留足够的硬盘空…

centos7挂载磁盘分区

centos7挂载磁盘分区 当前系统centos7 PV,VG,LV构成了一种易于管理拥有一个或多个硬盘的主机的文件系统,这些硬盘可能只有一个分区也可能有多个。通过将这些物理存在的分区(或称为卷)PV(physical volume)进行整合,组成一个分区(卷)组VG(volume group)&a…

python:xml.etree.ElementTree 读 Freeplane.mm文件,生成测试案例.csv文件

Freeplane 是一款基于 Java 的开源软件,继承 Freemind 的思维导图工具软件,它扩展了知识管理功能,在 Freemind 上增加了一些额外的功能,比如数学公式、节点属性面板等。 强大的节点功能,不仅仅节点的种类很多&#xf…

Python算法题集_图论(课程表)

Python算法题集_课程表 题207:课程表1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【循环递归全算】2) 改进版一【循环递归缓存】3) 改进版二【循环递归缓存反向计算】4) 改进版三【迭代剥离计数器检测】 4. 最优算法5. 相关资源 本…

单片机精进之路-5矩阵键盘扫描

如下图,先在p3口输出0xfe,再读取p3口的电平,如果没有按键按下,temp & 0xf0还是0xf0,如果又第一个键按下,temp & 0xf0还是0xee,其他按键由此类推可得。 //4*4键盘检测程序,按下键后相应…