一、本文介绍
本文给家带来的是YOLOv9系列的代码逐行解析,对于一个新发布的项目来说,我们首先需要做的就是去了解它的项目结构,然后再去了解其代码(例如代码从训练文件开始->yaml文件定义->模型定义->yaml文件解析->模型结构定义->训练->损失计算->反向传播),这一整个流程下来我们如果能够完全了解下来对于我们来说收获是非常大的,同时这对于我们优化模型和魔改模型来说也是一个非常必要的步骤,有的读者问我没有深度学习基础能优化模型么,答案是可以的,因为我的文章里都给了详细的步骤,但是如果你能对项目有了解,那么出了报错你自己也能够解决,这也是本专栏代码逐行解析系列的目的。
代码逐行解析系列大概会更新4-7篇文章左右,具体篇幅由专栏情况决定,本文为第一篇。
目录
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改进有效涨点专栏,本专栏目前为新开的,后期我会根据各种最新的前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏(目前免费订阅,后期不迷路),关注后续更多的更新~
标签:文件,解析,训练,模型,py,YOLOv9,512,256,逐行 From: https://blog.csdn.net/java1314777/article/details/136615969