目录
[1.2.1Programmable Gradient Information](#1.2.1Programmable Gradient Information)
[(1)Auxiliary Reversible Branch](#(1)Auxiliary Reversible Branch)
[(2)Multi-level Auxiliary Information](#(2)Multi-level Auxiliary Information)
[1.2.2Generalized ELAN](#1.2.2Generalized ELAN)
论文:yolov9
模型:yolov9
一、模型介绍
1.1摘要
今天的深度学习方法关注的是如何设计最合适的目标函数,使模型的预测结果最接近地面的真实情况。同时,必须设计一个适当的体系结构,以方便获取足够的预测信息。现有方法忽略了一个事实,即输入数据在逐层进行特征提取和空间变换时,会丢失大量的信息。本文将深入研究数据在深度网络中传输时的重要数据丢失问题,即信息瓶颈和可逆函数。我们提出了可编程梯度信息(PGI) 的概念,以应对深度网络实现多个目标所需的各种变化。PGI可以为目标任务提供完整的输入信息来计算目标函数,从而获得可靠的梯度信息来更新网络权值。此外,设计了一种新的基于梯度路径规划的轻量级网络结构------广义高效层聚合网络(GELAN)。GELAN的架构证实了PGI在轻量化模型上取得了卓越的成果。我们在基于MS COCO数据集的目标检测上验证了提出的GELAN和PGI。结果表明,与基于深度卷积的最新方法相比,GELAN仅使用常规卷积算子可以获得更好的参数利用率。PGI可用于从轻型到大型的各种模型。它可以用来获取完整的信息,使得从头开始训练的模型比使用大数据集预训练的最先进的模型获得更好的结果。
1.2模型概要
PGI和相关的网络体系结构和方法:
(a)路径聚合网络(PAN)
(b)可逆列(RevCol)
(c)传统深度监督
(d)可编程梯度信息(PGI)。
PGI主要由三个部分组成:
(1)主分支:用于推理的架构;
(2)辅助可逆分支:生成可靠的梯度,为主分支提供反向传输;
(3)多级辅助信息:控制主分支学习可规划的多级语义信息。
1.2.1Programmable Gradient Information
我们提出了一种新的辅助监督框架,称为可编程梯度信息(Programmable Gradient Information, PGI),如图3 (d)所示。PGI主要包括三个部分,即(1)主分支,(2)辅助可逆分支,(3)多级辅助信息。从图3 (d)可以看出,PGI的推理过程只使用了主干分支,因此不需要任何额外的推理成本。至于其他两个组件,它们用于解决或减缓深度学习方法中的几个重要问题。其中,设计了辅助可逆分支来解决神经网络深度化带来的问题。网络深化会造成信息瓶颈,使损失函数无法产生可靠的梯度。对于多级辅助信息,设计用于处理深度监督带来的误差积累问题,特别是针对多预测分支的架构和轻量化模型。接下来,我们将逐步介绍这两个组件。
(1)Auxiliary Reversible Branch
在PGI中,我们提出了辅助可逆分支来生成可靠的梯度和更新网络参数。通过提供从数据到目标的映射信息,损失函数可以提供指导,并避免从与目标不太相关的不完整前馈特征中发现虚假关联的可能性。我们提出通过引入可逆体系结构来维护完整的信息,但是在可逆体系结构中增加主干会消耗大量的推理成本。
我们分析了图3 (b)的架构,发现当添加从深层到浅层的额外连接时,推理时间将增加20%。当我们将输入数据反复添加到网络的高分辨率计算层(黄色框)时,推理时间甚至超过了时间的两倍。
由于我们的目标是使用可逆架构来获得可靠的梯度,因此"可逆"并不是推理阶段的唯一必要条件。鉴于此,我们将可逆分支作为深度监督分支的扩展,然后设计辅助可逆分支,如图3 (d)所示。对于因信息瓶颈而丢失重要信息的主分支深度特征,将能够从辅助可逆分支接收到可靠的梯度信息。
这些梯度信息将驱动参数学习,帮助提取正确的重要信息,以上动作可以使主分支获得对目标任务更有效的特征。此外,可逆结构在浅层网络上的表现比一般网络差,因为复杂的任务需要在深层网络中进行转换。我们提出的方法并不强制主分支保留完整的原始信息,而是通过辅助监督机制生成有用的梯度来更新原始信息。这种设计的优点是,所提出的方法也可以应用于较浅的网络。
最后,由于在推理阶段可以去除辅助可逆分支,因此可以保留原始网络的推理能力。我们也可以在PGI中选择任意可逆体系结构来充当辅助可逆分支的角色。
(2)Multi-level Auxiliary Information
在本节中,我们将讨论多层辅助信息是如何工作的。包含多个预测分支的深度监督架构如图3 (c)所示。对于对象检测,可以使用不同的特征金字塔来执行不同的任务,例如它们可以一起检测不同大小的对象。因此,在连接到深度监督分支后,将引导浅层特征学习小目标检测所需的特征,此时系统将其他大小目标的位置作为背景。然而,上述行为会导致深层特征金字塔丢失大量预测目标物体所需的信息。对于这个问题,我们认为每个特征金字塔都需要接收到所有目标对象的信息,这样后续的主干分支才能保留完整的信息来学习对各种目标的预测
多级辅助信息的概念是在辅助监督的特征金字塔层次层和主分支之间插入一个集成网络,然后利用它来组合来自不同预测头的返回梯度,如图3 (d)所示。多级辅助信息就是将包含所有目标对象的梯度信息进行聚合,传递给主分支,然后更新参数。此时,主要分支的特征金字塔层次结构的特征就不会被某些特定对象的信息所支配。因此,该方法可以缓解深度监督中的信息破碎问题。此外,任何集成网络都可以使用多层次的辅助信息。
因此,我们可以规划所需的语义层次来指导不同规模的网络架构的学习。
1.2.2Generalized ELAN
在本节中,我们描述了提出的新网络架构- GELAN。通过结合CSPNet[64]和ELAN[65]这两种采用梯度路径规划设计的神经网络架构,我们设计了兼顾轻量级、推理速度和准确性的广义高效层聚合网络(GELAN)。它的整体架构如图4所示。我们将最初仅使用卷积层堆叠的ELAN[65]的能力推广到可以使用任何计算块的新架构。
二、环境配置
创建环境:
conda create -n yolov9 python=3.8
激活环境:
conda activate yolov9
注意!!requirments中的torch和torchvision下载完后为cpu版本,不能用!!
此时,有一种方法,先下requirements中的包,然后卸载torch和torchvison,然后下载对应cuda版本的gpu的torch和torchvison。
pip install -r requirements.txt -i https://mirrors.bfsu.edu.cn/pypi/web/simple/
pip uninstall torch
pip uninstall torchvision
我的cuda版本是11.3,大家根据自己的cuda版本进行下载:
pip install torch==1.12.0+cu113 torchvision==0.13.0+cu113 --extra-index-url https://download.pytorch.org/whl/cu113
三、数据集准备
准备下面格式的数据集
其中,fall.yaml文件内容如下,路径,类别以及类别数量需要根据自己的进行修改:
train: C:/Users/24480/Desktop/yolov9-main/data/pp_fall/train/images
val: C:/Users/24480/Desktop/yolov9-main/data/pp_fall/val/images
test: C:/Users/24480/Desktop/yolov9-main/data/pp_fall/test/images
# number of classes
nc: 1
# class names
names: ['fall']
四、预训练权重下载
目前只能下载YOLOv9-C和YOLOv9-E
五、训练
如果加载的是YOLOv9-C的预训练权重的话,需要修改yolov9-c.yaml
修改train_dual.py中的参数
然后运行
训练结束,保存在下面这个路径下:
六、模型评估
修改val_dual.py的参数
七、模型推理
修改detect.py中的参数
此时会发现报错:
bug解决:
修改general.py,将903行prediction = prediction[0]改为prediction = prediction[0][1]
问题解决
大佬链接: