# YOLOv5 by Ultralytics, AGPL-3.0 license
# Parameters
nc: 81 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
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
nc: 81
- 表示模型被训练来识别的类别数量为81。
depth_multiple: 0.33
- 模型深度的倍数。这个参数用于调整模型中层的深度。值为0.33意味着每个层的深度为原始设计深度的33%,通常用于减小模型大小和计算需求,但可能会牺牲精度。
width_multiple: 0.50
- 表示层通道的倍数。这个参数用于调整网络层中通道的数量。值为0.50意味着每个层的通道数为原始设计的50%。类似于深度倍数,也可用于减小模型的大小和计算需求。
anchors
- 参数定义了一组锚点框(anchor boxes),这些框用于检测不同尺寸的物体。在YOLO模型中,锚点框是预定义的不同大小和比例的矩形,模型在这些矩形基础上调整以更好地适应实际检测到的物体。这里定义了三组不同尺寸的锚点框,每组用于不同层级的特征图(如P3/8, P4/16, P5/32),这些特征图代表不同的空间分辨率。
锚点框(Anchor Boxes)是一种在目标检测领域常用的技术,用于模型在图像中识别和定位对象。 基本概念
工作原理
优化在实际应用中,锚点框的尺寸和比例通常需要根据具体任务和数据集进行调整。选择与数据集中常见对象尺寸和形状相匹配的锚点框,可以提高模型的检测性能。例如,如果你的数据集主要包含长形对象,你可能会选择更多长形的锚点框。 |
优化建议:
depth_multiple
和width_multiple
的值,提高模型的速度和效率,但这可能会降低模型的精度。如果需要提高模型精度并且计算资源充足,可以增加这些值。# YOLOv5 v6.0 backbone
backbone:
# [from, number, module, args]
[[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4
[-1, 3, C3, [128]], # 2
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 6, C2, [256]], # 4-修改为C2*2
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 3, C3, [512]], # 6-修改为C3*1
# [-1, 1, Conv, [1024, 3, 2]], # 7-删除P5/32
# [-1, 3, C3, [1024]], # 8-删除
[-1, 1, SPPF, [512, 5]], # 9-修改参数;层数变为7
]
这段代码是YOLOv5 v6.0模型的“backbone”(主干网络)的配置。
[-1, 1, Conv, [64, 6, 2, 2]]
- 这行表示从前一层(由-1
表示)向下连接一个卷积层(Conv
),这个卷积层有64个过滤器,过滤器大小为6x6,步长为2,填充为2。这是P1/2层,意味着它将输入的空间分辨率减少一半。
[-1, 1, Conv, [128, 3, 2]]
- 从前一层向下连接一个卷积层,有128个过滤器,大小为3x3,步长为2。这是P2/4层,进一步降低空间分辨率。
[-1, 3, C3, [128]]
- 从前一层向下连接一个由3个C3模块组成的层,每个模块有128个过滤器。C3是YOLOv5特有的一个模块,包含多个瓶颈层(bottleneck layers)。
[-1, 1, Conv, [256, 3, 2]]
- 又一个卷积层,256个过滤器,3x3,步长为2。这是P3/8层。
[-1, 6, C2, [256]]
- 从前一层向下连接一个由6个C2模块组成的层,每个模块有256个过滤器。这是原始代码中的修改,原来是C3模块。
[-1, 1, Conv, [512, 3, 2]]
- 又一个卷积层,512个过滤器,3x3,步长为2。这是P4/16层。
[-1, 3, C3, [512]]
- 从前一层向下连接一个由3个C3模块组成的层,每个模块有512个过滤器。这是原始代码中的修改,原来可能是更多的C3模块。
[-1, 1, SPPF, [512, 5]]
- 从前一层向下连接一个SPPF(Spatial Pyramid Pooling-Fast)层,512个过滤器,核大小为5。SPPF是一种特殊的池化层,可以聚合不同尺度的特征。
# YOLOv5 v6.0 head
head:
[[-1, 1, Conv, [512, 3, 2]], # 修改参数
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P4
[-1, 3, C3, [512, False]], # 13->11
[-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->15 (P3/8-small)
[-1, 1, Conv, [256, 3, 2]],
[[-1, 12], 1, Concat, [1]], # cat head P4 修改层数-2
[-1, 3, C3, [512, False]], # 20->18 (P4/16-medium)
[-1, 1, Conv, [512, 3, 2]],
[[-1, 8], 1, Concat, [1]], # cat head P5 修改层数-2
[-1, 3, C3, [1024, False]], # 23->21 (P5/32-large)
[[15, 18, 21], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5) 修改层数-2
]
这段代码是YOLOv5 v6.0的“head”部分,即模型的输出层,它负责将从主干网络(backbone)提取的特征用于目标的检测。
[-1, 1, Conv, [512, 3, 2]]
- 从前一层向下连接一个卷积层,512个过滤器,核大小为3x3,步长为2。
[-1, 1, nn.Upsample, [None, 2, 'nearest']]
- 使用上采样(upsampling)技术放大特征图的尺寸,这里采用最近邻插值方法,放大比例为2。
[[[-1, 6], 1, Concat, [1]]
- 将当前层与主干网络中的第6层(P4层)的输出进行拼接(Concat)。
[-1, 3, C3, [512, False]]
- 使用3个C3模块,每个模块512个过滤器,这里的False
可能表示不使用残差连接。
接下来的几行代码重复上述过程,但是用于不同的特征图尺寸和通道数。例如,使用256通道的卷积和C3模块处理P3层的特征图,然后通过卷积和拼接操作处理P4和P5层的特征图。
[[15, 18, 21], 1, Detect, [nc, anchors]]
- 这是模型的检测层,它整合了不同层级(P3、P4、P5)的特征图,并使用预定义的类别数(nc)和锚点框(anchors)来检测图像中的对象。
对于卷积层和C3模块的使用,可以根据需要调整过滤器的数量和层数,以找到性能和准确度之间的最佳平衡