【目标检测新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. 推理运行:最后,使用训练好的模型对新的图像或数据进行预测,以检验模型的实际效果。

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

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

相关文章

深度学习神经网络实战:多层感知机,手写数字识别

目的 利用tensorflow.js训练模型,搭建神经网络模型,完成手写数字识别 设计 简单三层神经网络 输入层 28*28个神经原,代表每一张手写数字图片的灰度隐藏层 100个神经原输出层 -10个神经原,分别代表10个数字 代码 // 导入 Ten…

CSS 的盒模型

CSS 的盒模型 在HTML里,每一个元素就相当于是一个矩形的 “盒子” ,这个盒子由以下这几个部分构成:1.边框border,2.内容content,3.内边距padding,4.外边距margin 边框border 基础属性描述border-width粗…

【Python笔记-设计模式】中介者模式

一、说明 中介者模式是一种行为设计模式,减少对象之间混乱无序的依赖关系。该模式会限制对象之间的直接交互,迫使它们通过一个中介者对象进行合作。 (一) 解决问题 降低系统中对象之间的直接通信,将复杂的交互转化为通过中介者进行的间接交…

新的一年,如何优化企业库存管理?

随着社会的发展和经济的不断增长,库存管理成为了企业运营中非常重要的一环。库存作为企业的资产之一,直接影响着企业的盈利能力和竞争优势。因此,对企业库存进行科学的分析和管理,成为了确保企业持续稳定发展的必要手段之一。企业…

设计模式(十) - 工厂方式模式

前言 在此前的设计模式(四)简单工厂模式中我们介绍了简单工厂模式,在这篇文章中我们来介绍下工厂方法模式,它同样是创建型设计模式,而且又有些类似,文章的末尾会介绍他们之间的不同。 1.工厂方法模式简介 …

CentOS删除除了最近5个JAR程序外的所有指定Java程序

帮我写一个shell脚本,ps -eo pid,lstart,cmd --sort-start_time | grep "pgz-admin"查到的结果,返回的所有进程PID,第六个之上的,全部kill 当然,你可以创建一个简单的Shell脚本来完成这个任务。以下是一个例…

探索创造无限可能——Autodesk AutoCAD 2022(CAD 2022)系统要求

随着科技的不断进步和发展,计算机辅助设计(CAD)已经成为现代设计行业中不可或缺的一部分。在众多CAD软件中,Autodesk AutoCAD 2022(CAD 2022)无疑是最受欢迎和广泛应用的一款软件。作为一款全球领先的CAD软…

(十八)devops持续集成开发——使用docker安装部署jenkins服务

前言 本节内容介绍如何使用docker容器来部署安装jenkins流水线服务。关于docker容器的安装本节内容不做介绍。请读者提前安装。 正文 ①使用docker查找jenkins官方镜像 ② 拉取jenkins官方镜像jenkins/jenkins,选择一个最新稳定版本,避免一些插件不兼…

日更【系统架构设计师知识总结2】指令系统(结合真题)

【原创精华】结合老师的讲授、耗费三个小时的精华总结对正在备考的你一定有用!!自己一点点手打、总结的脑图,把散落在课本以及老师讲授的知识点合并汇总,反复提炼语言,形成知识框架。希望能给同样在学习的伙伴一点帮助…

如何理解介电常数与耗散因子

目录 电介质的极化过程 介电常数的定义 介电常数的物理意义 耗散因子的定义 耗散因子的物理意义 实际应用 结语 电介质的极化过程 电偶极子被定义为一对极性相反但相距很近的等量电荷,与每个偶极子相关联的一个矢量成为偶极矩,如果为每个电荷的带电量,为从负电荷到正电…

OpenHarmony开发之Stage模型卡片服务详解~

介绍 本示例展示了Stage模型卡片提供方的创建与使用。 用到了卡片扩展模块接口,ohos.app.form.FormExtensionAbility。 卡片信息和状态等相关类型和枚举接口,ohos.app.form.formInfo 。 卡片提供方相关接口的能力接口,ohos.app.form.form…

力扣● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

● 1049. 最后一块石头的重量 II 题目要把石头分成两堆,这两堆的重量差值最小。相撞之后剩下的石头重量就最小。其实就是要尽量把石头分为差不多重量的两堆,和昨天的● 416. 分割等和子集相似,这样就转换成了01背包问题。 和416题一样&…

【Git教程】(五)分支 —— 并行式开发,分支相关操作(创建、切换、删除)~

Git教程 分支 1️⃣ 并行式开发2️⃣ 修复旧版本中的 bug3️⃣ 分支4️⃣ 当前活跃分支5️⃣ 重置分支指针6️⃣ 删除分支7️⃣ 清理提交对象🌾 总结 对于版本提交为什么不能依次进行,以便形成一条直线型的提交历史记录,我们认为有 以下两个…

unity37——巧妙运用URP管线基础shader/Lit材质,给头发做出还不错的发丝效果.(应急用,在没时间单独写shader的情况下)

上面两个都是用基础Lit材质调整出来的。不管是,高模,还是低模。虽然没有单的的hair shader那么多可以做效果的滑块去调整效果,但是贵在简单、省事、建模容易、而且还省面。 下面上干货: 1。正常我们游戏里的头发,按照…

49.仿简道云公式函数实战-文本函数-Ip

1. Ip函数 获取当前用户的ip地址 注意是Ipv4的地址 2. 函数用法 IP() 3. 函数示例 获取当前用户的ip地址IP() 4. 代码实战 首先我们在function包下创建text包,在text包下创建IpFunction类,代码如下: package com.ql.util.express.sel…

弱结构化日志 Flink SQL 怎么写?SLS SPL 来帮忙

作者:潘伟龙(豁朗) 背景 日志服务 SLS 是云原生观测与分析平台,为 Log、Metric、Trace 等数据提供大规模、低成本、实时的平台化服务,基于日志服务的便捷的数据接入能力,可以将系统日志、业务日志等接入 …

第十四届校模拟赛第一期(一)

“须知少时凌云志,自许人间第一流” 鄙人11月八号有幸参加学校校选拔赛,题型为5道填空题,5道编程题,总时间为4小时。奈何能力有限,只完成了5道填空和3道编程大题,现进行自省自纠,分享学习&#…

四 . 分支和循环——Java基础篇

四 . 分支和循环 1 . switch的基本语法 if 和 swicth 的对比: if既可以用于范围校验, 也可以用于等值校验swicth对于if效率更高,只能用于等值校验 语法格式: switch(表达式){case 常量值1:语句块1;//break;case 常量值2:语句块2;//break; // ...[default:语句块n1;break;] }…

面试redis篇-10Redis集群方案-主从复制

在Redis中提供的集群方案总共有三种: 主从复制哨兵模式分片集群主从复制 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。 主从数据同步原理 Replication Id:简称replid,是数据集的标记,id一致则说明是同一数据集。每…

Wireshark TS | Linux 系统对时问题

问题描述 节前业务运维同事提交了一个 case ,说是部署在新业务区域的 Linux 服务器和老业务区域的 Linux 服务器无法对时,脚本里使用的是 clockdiff 命令,无法正常返回结果,而在老业务区域两台服务器之间执行命令就正常&#xff…