😎😎😎物体检测-系列教程 总目录
有任何问题欢迎在下面留言
本篇文章的代码运行界面均在Pycharm中进行
本篇文章配套的代码资源已经上传
点我下载源码
12、配置文件解读
yolov3的配置文件真的十分复杂,光用鼠标翻完都要好久,竟然接近800行,而yolov5s却不到50行
# parameters
nc: 80 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
# anchors
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
# YOLOv5 backbone
backbone:
# [from, number, module, args]
[[-1, 1, Focus, [64, 3]], # 0-P1/2
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4
[-1, 3, C3, [128]],
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 9, C3, [256]],
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 9, C3, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
[-1, 1, SPP, [1024, [5, 9, 13]]],
[-1, 3, C3, [1024, False]], # 9
]
# YOLOv5 head
head:
[[-1, 1, Conv, [512, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P4
[-1, 3, C3, [512, False]], # 13
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 4], 1, Concat, [1]], # cat backbone P3
[-1, 3, C3, [256, False]], # 17 (P3/8-small)
[-1, 1, Conv, [256, 3, 2]],
[[-1, 14], 1, Concat, [1]], # cat head P4
[-1, 3, C3, [512, False]], # 20 (P4/16-medium)
[-1, 1, Conv, [512, 3, 2]],
[[-1, 10], 1, Concat, [1]], # cat head P5
[-1, 3, C3, [1024, False]], # 23 (P5/32-large)
[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
- 首先看在parameters中的depth_multiple: 0.33,在backbone、head中的每一行第二个数字有1、3、9等数字,如果是1表示这里的层重复一次,如果不是1表示这里将重复 0.33 ∗ 3 = 1 0.33*3=1 0.33∗3=1、 0.33 ∗ 9 = 3 0.33*9=3 0.33∗9=3次,在5x、5l、5m等更大的模型中depth_multiple的值也会更大一些
- 在parameters中的width_multiple: 0.50,在backbone、head中的每一行第3个数字有64、128、…、1024等数字,表示这里的卷积核的个数为 0.50 ∗ 64 = 32 0.50*64=32 0.50∗64=32、 0.50 ∗ 128 = 64 0.50*128=64 0.50∗128=64,也就是输出通道数
- 在yolov5的预训练模型中,l、m、s、x这几个版本的配置参数,除了depth_multiple和width_multiple这两个参数不一样,其他都是完全一样的,也就是说,这几个模型大小不一样仅仅改这两个参数就可以了
- anchors参数,表示的是预选框的参数,即有9组不同尺寸的预选框参数,如 10 ∗ 13 10*13 10∗13、 16 ∗ 30 16*30 16∗30、 33 ∗ 23 33*23 33∗23
- backbone就是特征提取模块, [from, number, module, args],from表示当前这层的输入,-1则表示从上一层的结果直接输入到这层中;number在前面有过解释,就是这一层要重复几次;module表示这一层的模块或操作类型,比如Conv、C3等;args 是传递给该模块的参数列表,具体参数根据模块类型而定
- head就是网络输出和预测模块,每个参数代表的意义和backbone一致,在head中的from有时候存在两个参数
在最后的detect中,在17、20、23层的卷积3个输出中,这3个输出分别是对不同大小物体的检测