首页 > 其他分享 >YOLOv9改进策略 | 代码逐行解析(一)| 项目目录构造分析

YOLOv9改进策略 | 代码逐行解析(一)| 项目目录构造分析

时间:2024-03-14 12:33:39浏览次数:39  
标签:文件 解析 训练 模型 py YOLOv9 512 256 逐行

一、本文介绍

本文给家带来的是YOLOv9系列的代码逐行解析,对于一个新发布的项目来说,我们首先需要做的就是去了解它的项目结构,然后再去了解其代码(例如代码从训练文件开始->yaml文件定义->模型定义->yaml文件解析->模型结构定义->训练->损失计算->反向传播),这一整个流程下来我们如果能够完全了解下来对于我们来说收获是非常大的,同时这对于我们优化模型和魔改模型来说也是一个非常必要的步骤,有的读者问我没有深度学习基础能优化模型么,答案是可以的,因为我的文章里都给了详细的步骤,但是如果你能对项目有了解,那么出了报错你自己也能够解决,这也是本专栏代码逐行解析系列的目的。

代码逐行解析系列大概会更新4-7篇文章左右,具体篇幅由专栏情况决定,本文为第一篇

专栏地址YOLOv9有效涨点专栏-持续复现各种顶会内容-有效涨点-全网改进最全的专栏 

目录

一、本文介绍

二、模型获取

三、YOLOv9项目目录 

3.1 assets

3.2 classify

3.3 data

3.4 figure

3.5 models(重要)

3.6 panoptic

3.7 runs

3.8 scripts 

3.9 segment 

3.10 utils

四、 单独文件分析

4.1 benchmarks.py

4.2 detect.py

4.3 export.py 

4.4 hubconf.py

4.5 README.md

4.6 requirements.txt

4.7 train.py ,train_dual.py,train_triple.py

4.8 val.py,val_dual.py,val_triple.py 

五、全文总结 



二、模型获取

在开始之前我们需要先获得一份YOLOv9的代码,下面的链接我们点击即可跳转官方Github地址下载即可。

官方代码地址: 官方代码地址点击即可跳转


三、YOLOv9项目目录 

YOLOv9的项目目录构造的分析如下图所示,目前来看共有10个目录13个单独的文件(不包含目录内的文件)。

 

下面我们来挨个分析每个目录及其文件的功能及大概作用。


3.1 assets

assetes目录下的内容如下图所示,里面存放了YOLO系列两张最经典的图片,bus和zidane,这两张图片用于我们做推理的时候可以简单的使用一下。

zidane.jpg的图片如下图所示。 

 


3.2 classify

这个文件下的内容如下图所示->

YOLO系列的最基础三大功能是目标检测、分类、分割。这个文件下的内容就是存放了分类的三个基本功能的代码,分别是

  • train.py训练数据集的作用
  • predict.py 训练数据集得到权重之后进行预测的作用
  • val.py 验证我们训练出来的权重各项指标的作用

 


3.3 data

第三个目录名字为data,其内容如下所示->

这个文件里主要存放了我们的超参数文件和一个coco数据集的配置示例,

  • data/coco.yaml 这个是COCO数据集的配置示例
  • data/hyps/hyp.scratch-high.yaml 这个是超参数的文件,这里存在一个bug这个high文件是用于YOLOv9的,但是GELAN的参数文件官方并没有提供这里,所以算是一个漏洞把。

下面的代码内容为 hyp.scratch-high.yaml文件内容可以看到存放着各种超参数主要是优化器的配置。

lr0: 0.01  # initial learning rate (SGD=1E-2, Adam=1E-3)
lrf: 0.01  # final OneCycleLR learning rate (lr0 * lrf)
momentum: 0.937  # SGD momentum/Adam beta1
weight_decay: 0.0005  # optimizer weight decay 5e-4
warmup_epochs: 3.0  # warmup epochs (fractions ok)
warmup_momentum: 0.8  # warmup initial momentum
warmup_bias_lr: 0.1  # warmup initial bias lr
box: 7.5  # box loss gain
cls: 0.5  # cls loss gain
cls_pw: 1.0  # cls BCELoss positive_weight
dfl: 0.7  # obj loss gain (scale with pixels)
obj_pw: 1.0  # obj BCELoss positive_weight
dfl: 1.5  # dfl loss gain
iou_t: 0.20  # IoU training threshold
anchor_t: 5.0  # anchor-multiple threshold
# anchors: 3  # anchors per output layer (0 to ignore)
fl_gamma: 0.0  # focal loss gamma (efficientDet default gamma=1.5)
hsv_h: 0.015  # image HSV-Hue augmentation (fraction)
hsv_s: 0.7  # image HSV-Saturation augmentation (fraction)
hsv_v: 0.4  # image HSV-Value augmentation (fraction)
degrees: 0.0  # image rotation (+/- deg)
translate: 0.1  # image translation (+/- fraction)
scale: 0.9  # image scale (+/- gain)
shear: 0.0  # image shear (+/- deg)
perspective: 0.0  # image perspective (+/- fraction), range 0-0.001
flipud: 0.0  # image flip up-down (probability)
fliplr: 0.5  # image flip left-right (probability)
mosaic: 1.0  # image mosaic (probability)
mixup: 0.15  # image mixup (probability)
copy_paste: 0.3  # segment copy-paste (probability)

 


3.4 figure

这个文件的内容如下所示->

里面存放了一个performance.png主要就是YOLOv9的效果图对比图和其它的模型。 

 


3.5 models(重要)

这个文件是比较重要的也是整个项目的核心内容所在!该文件结构图如下所示->

这个文件目录主要由yaml文件和py文件组成,yaml文件主要是我们的模型配置文件,其余的文件我下面来分别进行解释。

yolov9.yaml : 我们运行模型的配置文件。 

common.py : 存放我们一些基础的代码操作,例如Conv、提出的ADown等操作的代码

experimental.py :这里主要存放着一个重要的方法def attempt_load(weights, device=None, inplace=True, fuse=True):该代码主要用于我们训练时候加载模型所用。

tf.py : tensorflow版本的文件,我们无需理会,目前跑深度学习基本都是Pytorch。 

yolo.py : 这里存放着我们的检测头以及训练时候最重要的模型解析方法 parse_model后面我也会讲到这个方法。

 YOLOv9.yaml文件内容

# YOLOv9

# parameters
nc: 80  # number of classes
depth_multiple: 1  # model depth multiple
width_multiple: 1  # layer channel multiple
#activation: nn.LeakyReLU(0.1)
#activation: nn.ReLU()

# anchors
anchors: 3

# YOLOv9 backbone
backbone:
  [
   [-1, 1, Silence, []],
   # conv down
   [-1, 1, Conv, [64, 3, 2]],  # 1-P1/2
   # conv down
   [-1, 1, Conv, [128, 3, 2]],  # 2-P2/4
   # elan-1 block
   [-1, 1, RepNCSPELAN4, [256, 128, 64, 1]],  # 3
   # conv down
   [-1, 1, Conv, [256, 3, 2]],  # 4-P3/8
   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 256, 128, 1]],  # 5
   # conv down
   [-1, 1, Conv, [512, 3, 2]],  # 6-P4/16
   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 7
   # conv down
   [-1, 1, Conv, [512, 3, 2]],  # 8-P5/32
   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 9
  ]

# YOLOv9 head
head:
  [
   # elan-spp block
   [-1, 1, SPPELAN, [512, 256]],  # 10

   # up-concat merge
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 7], 1, Concat, [1]],  # cat backbone P4

   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 13

   # up-concat merge
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 5], 1, Concat, [1]],  # cat backbone P3

   # elan-2 block
   [-1, 1, RepNCSPELAN4, [256, 256, 128, 1]],  # 16 (P3/8-small)

   # conv-down merge
   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 13], 1, Concat, [1]],  # cat head P4

   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 19 (P4/16-medium)

   # conv-down merge
   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5

   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 22 (P5/32-large)
   
   # routing
   [5, 1, CBLinear, [[256]]], # 23
   [7, 1, CBLinear, [[256, 512]]], # 24
   [9, 1, CBLinear, [[256, 512, 512]]], # 25
   
   # conv down
   [0, 1, Conv, [64, 3, 2]],  # 26-P1/2

   # conv down
   [-1, 1, Conv, [128, 3, 2]],  # 27-P2/4

   # elan-1 block
   [-1, 1, RepNCSPELAN4, [256, 128, 64, 1]],  # 28

   # conv down fuse
   [-1, 1, Conv, [256, 3, 2]],  # 29-P3/8
   [[23, 24, 25, -1], 1, CBFuse, [[0, 0, 0]]], # 30  

   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 256, 128, 1]],  # 31

   # conv down fuse
   [-1, 1, Conv, [512, 3, 2]],  # 32-P4/16
   [[24, 25, -1], 1, CBFuse, [[1, 1]]], # 33 

   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 34

   # conv down fuse
   [-1, 1, Conv, [512, 3, 2]],  # 35-P5/32
   [[25, -1], 1, CBFuse, [[2]]], # 36

   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 37

   # detect
   [[31, 34, 37, 16, 19, 22], 1, DualDDetect, [nc]],  # DualDDetect(A3, A4, A5, P3, P4, P5)
  ]


3.6 panoptic

panoptic segmentation的训练和验证以及预测文件,前面所过了这里不再赘述了。


3.7 runs

runs这个文件大家刚开始可能没有,只有在运行了某些训练或者检测文件之后生成的,里面只要包含我们一些训练或者其它操作的运行结果。


3.8 scripts 

里面包含了一个数据集下载脚本是COCO的,但是不建议通过这种方式下载coco数据因为数据集很大基本上都会失败。

 


3.9 segment 

分割的训练测试以及验证文件。


3.10 utils

utils这个文件目录就是一些我们的模型所需要的工具存放的地方,以及我们计算损失函数的文件存放的地方和一些绘图的代码,反正就是utils名字就是工具,存放的就是一些杂七杂八的内容。

这些代码文件我不讲了,后面的文章里会讲到,这里大家只需要大概知道一些内容即可。

最重要的就是三个文件分别是loss_tal.py,loss_tal_dual.py,loss_tal_triple.py三个文件分别为,

单主分支的损失计算文件,辅助分支 + 主分支损失计算文件, 双辅助分支 + 主分支损失计算文件。

 


四、 单独文件分析

4.1 benchmarks.py

这个文件的作用是测试我们的模型一些基础性能测试就是我们的模型训练出来以后在一些场景下的应用之后的性能基础测试,需要注意的是该文件需要通过命令行启动,单独运行文件会报错。

python .\benchmarks.py


4.2 detect.py

这个文件主要用于我们训练完模型或者用官方给的模型进行一些推理工作,下面是一个运行之后的结果图。

 


4.3 export.py 

这个文件主要用于我们训练模型在部署到其它设备上时候一个模型导出工作。


4.4 hubconf.py

hubconf.py是与 PyTorch Hub 相关的一个文件,它在 PyTorch 社区中扮演着重要的角色。PyTorch Hub 是一个预训练模型库,使研究人员和开发者能够轻松地共享和访问模型。hubconf.py文件包含了一系列定义,这些定义指导 PyTorch Hub 如何加载和使用这些预训练模型。

这个文件的作用具体包括:

1. 模型定义: 它列出了该仓库中可用的所有预训练模型及其对应的函数。这些函数返回预训练模型的实例,使得用户可以直接通过 PyTorch Hub API 调用和使用这些模型。

2. 依赖声明: hubconf.py 可以声明加载模型所需的依赖项,确保用户在尝试加载模型之前已经安装了所有必要的库和框架。

3. 自定义逻辑: 对于需要特殊处理的模型(如需要特定的数据预处理或后处理步骤),hubconf.py 允许模型作者编写和包含这些自定义逻辑,从而确保模型的正确加载和使用。

4. 版本控制和兼容性: hubconf.py文件还可以指定模型的不同版本,使得用户能够根据需要加载特定版本的模型。

5. 示例和文档: 通过提供示例调用和适当的文档,hubconf.py可以帮助用户理解如何使用仓库中的模型,以及模型的功能和限制。

简而言之,hubconf.py为 PyTorch 用户提供了一个标准化和简便的方法来发现、加载和利用预训练模型。

 


4.5 README.md

里面存放了一些模型的信息。

 


4.6 requirements.txt

一些模型需要的依赖文件,我们下载文件之后如果想要运行需要在命令行输入如下的命令才能够开始训练。

pip install -r requirements.txt


4.7 train.py ,train_dual.py,train_triple.py

模型的训练文件,用来训练我们数据集的文件。

  • train:主分支
  • train_dual:一个辅助分支+一个主分支。
  • triple_branch:2个辅助分支+1个主分支

我们填好各项参数配置之后,就可以运行train.py文件了,模型就会开始训练(在此之前大需要配置好环境,安装好依赖,以及拥有一个数据集文件),下面是正式训练之后的控制台输出截图。

训练好之后的文件就会保存到路径'runs/train/exp12'下面,其中的全部内容如下所示。

 


4.8 val.py,val_dual.py,val_triple.py 

同理这三个文件是用于我们模型训练完权重文件之后(保存在runs文件目录下)利用训练出来的权重文件进行模型性能验证的文件的。

我们按照自己的文件配置好参数之后,运行val.py文件控制台就会输出内容。 

输出的全部文件如下图所示! 


五、全文总结 

到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv9改进有效涨点专栏,本专栏目前为新开的,后期我会根据各种最新的前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏(目前免费订阅,后期不迷路),关注后续更多的更新~

专栏地址YOLOv9有效涨点专栏-持续复现各种顶会内容-有效涨点-全网改进最全的专栏 

 

标签:文件,解析,训练,模型,py,YOLOv9,512,256,逐行
From: https://blog.csdn.net/java1314777/article/details/136615969

相关文章

  • MogDB openGauss wal日志解析工具 mog_xlogdump
    MogDB/openGausswal日志解析工具mog_xlogdump本文出处:https://www.modb.pro/db/398124概述mog_xlogdump是云和恩墨独立开发的wal日志离线解析工具。熟悉PG的小伙伴应该都使用pg_xlogdump/pg_waldump查看过PG数据库的wal文件,解析的wal数据结果是没有办法直接拿......
  • MyBatis原理解析
    MyBatis入门的四行代码 //<1>加载配置文件 InputStreamis=Resources.getResourceAsStream("mybatis.xml"); //<2>创建sessionFactory对象 sessionFactory=newSqlSessionFactoryBuilder().build(is); //<3>获取sqlSession对象信息SqlSessionsessio......
  • SpringBoot 中使用自定义参数解析器修改请求对象
    SpringBoot中使用自定义参数解析器修改请求对象在SpringBoot应用中,有时我们需要在控制器方法执行之前对请求对象进行修改。自定义参数解析器提供了一种灵活的方式来实现这一需求。1.创建自定义参数解析器首先,我们需要创建一个自定义参数解析器来处理对CommonRequest......
  • pcm5102芯片解析之基本概念
    一前记1在音频领域深耕,那就要不断的前行。最近有几个项目需要用到pcm5102这颗料,藉此机会,针对这个料进行深入的研究一下。做一一些简要的分析。二概念音频芯片的指标,其实,很多年都没啥变化了,唯一的问题就是这个应用形态有些变化。下面是该芯片的性能指标。 ......
  • 全面解析 qiankun 源码
    本文将针对微前端框架qiankun的源码进行深入解析,在源码讲解之前,我们先来了解一下什么是微前端。微前端是一种类似于微服务的架构,它将微服务的理念应用于浏览器端,即将单页面前端应用由单一的单体应用转变为多个小型前端应用聚合为一的应用。各个前端应用还可以独立开发、独立......
  • DNS域名解析过程详解
    一、DNS系统域名系统(DomainNameSystem),是因特网使用的命名系统,用来把人们方便记忆的主机名转换为机器方便处理的IP地址。DNS协议属于应用层协议,一般是运行在UDP协议之上,使用53端口。二、域名因特网采用层次树状结构的命名方法。采用这种命名方法,任何一个连接到因特网的主机......
  • Linux线程池的创建(超详细解析)
    线程池:若干个线程组合在一起形成线程池;为什么需要线程池:多线程版本服务器一个客户端就需要创建一个线程,如果客户端太多,明显不太合适;创建思路:我们需要一个线程池结构体,然后这个结构体里面包含任务池,这个线程池结构体是全局变量,需要使用互斥锁,当子线程执行回调函数时,把该线程......
  • 信息学奥赛一本通题目解析:2086:【22CSPJ普及组】乘方(pow)
    2086:【22CSPJ普及组】乘方(pow)题目描述小文同学刚刚接触了信息学竞赛,有一天她遇到了这样一个题:给定正整数aaa和b......
  • JUC源码讲解:逐步解析 join()
    JUC源码讲解:逐步解析join()问题抛出join()在源码中其实是使用了wait()方法的,因此,wait()的特性join()都能继承过来,我们知道wait()有什么特性呢?wait()的特性:会释放锁对中断异常敏感会释放CPU时间片我也对wait()做了讲解,想了解可移步https://www.cnblogs.......
  • CASA模型原理深度解析:揭示生态系统净初级生产力的奥秘
    植被,作为陆地生态系统的重要基石,对维护生态环境功能具有不可替代的作用。其中,植被净初级生产力(NPP)是衡量植被生态系统健康与功能的关键指标。它反映了单位面积上绿色植被通过光合作用生产的有机质总量在扣除自养呼吸后的剩余部分,不仅直接体现了生态系统在自然条件下的生产能......