Yolov5的源码中,是将yolov5s的结构封装在"yolov5s.yaml"中,但是他没有单独写neck,将neck分开在了backbone和head里面。
yaml文件的内容会在yolo.py中进行调用,只需要修改"width_multiple"和"depth_multiple"两个参数就可以,可以灵活地修改网络的结构,具体分析如下。
- 第一部分是三个参数,第一个是数据集中的类别数.
- 第二个用来调整网络的深度.
- 第三个用来调整网络的宽度,具体怎么调整的结合后面的backbone代码解释。
在项目models/yolov5s.yaml文件中 第13~14行,定义如下:
backbone:
# [from, number, module, args]
四个参数的意义分别是:
- 第一个参数 from :从哪一层获得输入,-1表示从上一层获得,[-1, 6]表示从上层和第6层两层获得。
- 第二个参数 number:表示有几个相同的模块,如果为9则表示有9个相同的模块。
- 第三个参数 module:模块的名称,这些模块写在common.py中。
- 第四个参数 args:这个参数就与第一部分的"width_multiple"参数有关了,上面把width_multiple设置为了0.5,那么第一个 [64, 6, 2, 2] 就会被解析为[3,64*0.5=32,6,2,2],其中第一3为输入channel(因为输入),32为输出channel。(具体可以通过第三个参数(module) 在common.py文件中找到对应传入参数。)
在yolo.py的256行 有对yaml 文件的nc,depth_multiple等参数读取,具体代码如下:
anchors, nc, gd, gw = d['anchors'], d['nc'], d['depth_multiple'], d['width_multiple']
"width_multiple"参数的作用已经介绍过了,那么"depth_multiple"又是什么作用呢?
在yolo.py的257行有对参数的使用:
n = n_ = max(round(n * gd), 1) if n > 1 else n # depth gain 暂且将这段代码当作公式(1)
其中gd就是depth_multiple的值,n的值就是backbone中列表的第二个参数: 根据公示(1) 很容易看出gd影响 n 的大小,从而影响网络的结构。
接下来可以通过运行python models/yolo.py 脚本得到网路结构,结果如下:
yolo: cfg=yolov5s.yaml, batch_size=1, device=, profile=False, line_profile=False, test=False
YOLOv5 🚀 v6.1-383-g7a40e2b Python-3.8.13 torch-1.10.0+cu113 CUDA:0 (NVIDIA GeForce RTX 3080 Ti, 12054MiB)
from n params module arguments
0 -1 1 3520 models.common.Conv [3, 32, 6, 2, 2]
1 -1 1 18560 models.common.Conv [32, 64, 3, 2]
2 -1 1 18816 models.common.C3 [64, 64, 1]
3 -1 1 73984 models.common.Conv [64, 128, 3, 2]
4 -1 2 115712 models.common.C3 [128, 128, 2]
5 -1 1 295424 models.common.Conv [128, 256, 3, 2]
6 -1 3 625152 models.common.C3 [256, 256, 3]
7 -1 1 1180672 models.common.Conv [256, 512, 3, 2]
8 -1 1 1182720 models.common.C3 [512, 512, 1]
9 -1 1 656896 models.common.SPPF [512, 512, 5]
10 -1 1 131584 models.common.Conv [512, 256, 1, 1]
11 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest']
12 [-1, 6] 1 0 models.common.Concat [1]
13 -1 1 361984 models.common.C3 [512, 256, 1, False]
14 -1 1 33024 models.common.Conv [256, 128, 1, 1]
15 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest']
16 [-1, 4] 1 0 models.common.Concat [1]
17 -1 1 90880 models.common.C3 [256, 128, 1, False]
18 -1 1 147712 models.common.Conv [128, 128, 3, 2]
19 [-1, 14] 1 0 models.common.Concat [1]
20 -1 1 296448 models.common.C3 [256, 256, 1, False]
21 -1 1 590336 models.common.Conv [256, 256, 3, 2]
22 [-1, 10] 1 0 models.common.Concat [1]
23 -1 1 1182720 models.common.C3 [512, 512, 1, False]
24 [17, 20, 23] 1 229245 Detect [80, [[10, 13, 16, 30, 33, 23], [30, 61, 62, 45, 59, 119], [116, 90, 156, 198, 373, 326]], [128, 256, 512]]
YOLOv5s summary: 270 layers, 7235389 parameters, 7235389 gradients, 16.6 GFLOPs
Fusing layers...
YOLOv5s summary: 213 layers, 7225885 parameters, 7225885 gradients, 16.4 GFLOPs
看到这,,,好人顺便帮忙点赞关注哈。感谢!