YOLOv5代码详解 (第三部分)
- 3. yolov5l.yaml
- 3.1 yaml介绍
- 3.2 parameters
- 3.3 anchors
- 3.4 backbone
- 3.5 head
贴一张最近更新的网络结构图,方便读者。
3. yolov5l.yaml
这部分属于代码中的配置文件。该代码是xxxx.yaml使用配置文件,通过./models/yolo.py解析文件加了一个输入构成的网络模块。
与config设置的网络不同,不需要进行叠加,只需要在配置文件中对number进行修改即可。
特别说明是2020.7.4更新的那一版。
3.1 yaml介绍
- YAML(YAML Ain`t Markup language)文件,它不是一个标记语言。配置文件有xml、properties等,但YAML是以数据为中心,更适合做配置文件。
- YAML的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。
- 它使用空格缩进和大量依赖外观的特性,特别适合表达或编辑数据结构、各种配置文件、转储调试内容和文档大纲。
yaml介绍 - 大小写敏感;缩进不允许使用tab,只允许空格;缩进的空格数不重要,只要相同层级的元素左对齐即可;’#’表示注释;使用缩进表示层级关系。
注意,在yaml文件中空格数其实也是重要的!在建立YAML 对象时,对象键值对使用冒号结构表示key: value,冒号后面要加一个空格。
3.2 parameters
# parameters
nc: 15 # number of classes
depth_multiple: 1.0 # model depth multiple
width_multiple: 1.0 # layer channel multiple
- nc:类别数,你的类别有多少就填写多少。从1开始算起,不是0-14这样算。
- depth_multiple:控制模型的深度。
- width_multiple:控制卷积核的个数。
depth_multiple是用在backbone中的number≠1的情况下,即在Bottleneck层使用,控制模型的深度,yolov5s中设置为0.33,假设yolov5l中有三个Bottleneck,那yolov5s中就只有一个Bottleneck。
因为一般number=1表示的是功能背景的层,比如说下采样Conv、Focus、SPP(空间金字塔池化)。
—————————————————————————————————————————————
width_multiple主要是用于设置arguments,例如yolov5s设置为0.5,Focus就变成[32, 3],Conv就变成[64, 3, 2]。
以此类推,卷积核的数量变成了设置的一半。
yolov5提供了s、m、l、x四种,所有的yaml文件都设置差不多,只有上面2和3的设置不同,作者团队很厉害,只需要修改这两个参数就可以调整模型的网络结构。
3.3 anchors
# anchors
anchors:
- [116,90, 156,198, 373,326] # P5/32
- [30,61, 62,45, 59,119] # P4/16
- [10,13, 16,30, 33,23] # P3/8
根据你的检测层相应增加anchors。
3.4 backbone
# 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, BottleneckCSP, [128]],
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 9, BottleneckCSP, [256]],
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 9, BottleneckCSP, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
[-1, 1, SPP, [1024, [5, 9, 13]]],
]
- Bottleneck 可以译为“瓶颈层”。
- from列参数:-1代表是从上一层获得的输入,-2表示从上两层获得的输入(head同理)。
- number列参数:
1表示只有一个,3表示有三个相同的模块。 - SPP、Conv、Bottleneck、BottleneckCSP的代码可以在./models/common.py中获取到。
- [64, 3]解析得到[3, 32, 3] ,输入为3(RGB),输出为32,卷积核k为3;
- [128, 3, 2]这是固定的,128表示输出128个卷积核个数。根据[128, 3, 2]解析得到[32, 64, 3, 2] ,32是输入,64是输出(128*0.5=64),3表示3×3的卷积核,2表示步长为2。
- 骨干网是从大到小的图景,深度不断加深。
- args这里的输入都省去了,因为输入都是上层的输出。为了修改过于麻烦,这里输入的获取是从./models/yolo.py的def parse_model(md, ch)函数中解析得到的。
3.5 head
head检测头:一般表示的是经过主干网后输出的特征图,特征图输入head中进行检测,包括类别和位置的检测。
这里改成了PANet head。
# YOLOv5 head
head:
[[-1, 3, BottleneckCSP, [1024, False]], # 9
[-1, 1, Conv, [512, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P4
[-1, 3, BottleneckCSP, [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, BottleneckCSP, [256, False]],
[-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1]], # 18 (P3/8-small)
[-2, 1, Conv, [256, 3, 2]],
[[-1, 14], 1, Concat, [1]], # cat head P4
[-1, 3, BottleneckCSP, [512, False]],
[-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1]], # 22 (P4/16-medium)
[-2, 1, Conv, [512, 3, 2]],
[[-1, 10], 1, Concat, [1]], # cat head P5
[-1, 3, BottleneckCSP, [1024, False]],
[-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1]], # 26 (P5/32-large)
[[], 1, Detect, [nc, anchors]], # Detect(P5, P4, P3)
]
贴一张解析图,和上面的模型不一样。
更新于2020.7.10
torch.nn.modules.upsampling.Upsample [None, 2, ‘nearest’]
torch.nn.Upsample(size=None, scale_factor=None, mode=‘nearest’, align_corners=None)
- size(int or Tuple[int] or Tuple[int, int] or Tuple[int, int, int], optional) – 根据不同的输入类型制定的输出大小
- scale_factor(float or Tuple[float] or Tuple[float, float] or Tuple[float, float, float], optional) – 指定输出为输入的多少倍数。如果输入为tuple,其也要制定为tuple类型
- mode(str, optional) – 可使用的上采样算法,有’nearest’, ‘linear’, ‘bilinear’, ‘bicubic’ and ‘trilinear’. 默认使用’nearest’
Detect [15, [[116, 90, 156, 198, 373, 326], [30, 61, 62, 45, 59, 119], [10, 13, 16, 30, 33, 23]]]
对应于./models/yolov5l.yaml的Detect,nc=15, anchors = [[116, 90, 156, 198, 373, 326], [30, 61, 62, 45, 59, 119], [10, 13, 16, 30, 33, 23]]。
[116, 90, 156, 198, 373, 326]代表large anchors(P5),[30, 61, 62, 45, 59, 119]代表medium anchors,[10, 13, 16, 30, 33, 23]代表small anchors。
觉得好的话记得给个赞哦~
如有错误,请在评论区指出。转载请注明出处,谢谢!
版权声明:本文为博主Liaojiajia-2020原创文章,版权归属原作者,如果侵权,请联系我们删除!
原文链接:https://blog.csdn.net/mary_0830/article/details/107124459