yolov5s网络结构
鉴于网上关于yolov5s的解读众多然不尽相同,特从YOLOv5官方项目地址:https://github.com/ultralytics/yolov5下载了yolov5的各版本文件并上传至 [资源] 栏目,这里就yolov5s版本的网络结构进行分析展示。
1、yolov5s模型的yaml文件
# Ultralytics YOLOv5 🚀, AGPL-3.0 license
# Parameters
nc: 80 # 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
# 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]],
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 6, 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, 3, C3, [1024]],
[-1, 1, SPPF, [1024, 5]], # 9
]
# YOLOv5 v6.0 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)
]
2、yaml文件解读
Yolov5s模型yaml文件中详细定义了模型的参数(parameters)、主干网络(backbone)和头部(head)结构。
(1)参数(parameters):
nc: 80
:定义模型要检测的类别数,这里是80类(coco数据集)。depth_multiple: 0.33
:模型深度的倍数,用于缩放整个网络的深度。width_multiple: 0.50
:层通道的倍数,用于缩放网络中各层的通道数。anchors
:定义了三个不同尺度的锚框(anchor boxes),用于预测不同大小的物体。每个尺度包含3个锚点,分别对应不同的宽高比。
(对于第一组锚点([10, 13, 16, 30, 33, 23]
):[10, 13]
定义了第1个锚点的宽度和高度,[16, 30]
定义了第2个锚点的宽度和高度,[33, 23]
定义了第3个锚点的宽度和高度。第二组锚点([30, 61, 62, 45, 59, 119]
)和第三组锚点([116, 90, 156, 198, 373, 326]
)遵循相同的模式,分别对应P4/16和P5/32特征图尺度上的两个锚点。这些锚点的尺寸通常比前一组更大,以覆盖更大尺度的目标)
(anchors
是一组预定义的边框,具有固定的宽和高(或宽高比),用于作为检测过程中预测边框的起点或参考点。Anchors 的作用是提高检测效率、适应不同尺度的目标、减少计算量。Anchors的选择通常基于训练数据集中目标的统计信息。例如,在训练YOLO模型之前,可以分析数据集中所有目标的边框尺寸和宽高比,然后从中选择最具代表性的几个作为anchors。这通常是通过聚类算法(如K-means)来实现的,以确保选择的anchors能够最好地覆盖数据集中目标的大小和形状分布。)
(2)主干网络(backbone):
主干网络格式按[[from, number, module, args]]编写,即第1个参数为开始的层,第2个参数为当前操作重复系数,第3个参数为当前采用的模块类型,第4个参数为当前模块的参数:
- (
Conv
模块的参数列表包含了四个值:[输出通道数, 卷积核大小, 步长, 填充]) - (C3模块的参数列表包含两个值:[输入通道数,是否使用BottleneckCSP])
- (SPPF模块的参数列表包含两个值:[输入通道数, 池化核大小])
[-1, 1, Conv, [64, 6, 2, 2]], # 第0层-P1/2
# 对前一个层的输出使用1次卷积操作,输出通道数为64,卷积核为6x6,步长为2,填充为2,生成P1/2特征图。
[-1, 1, Conv, [128, 3, 2]], # 第1层-P2/4
# 对前一个层的输出使用1次卷积操作,输出通道数为128,卷积核为3x3,步长为2,生成P2/4特征图。
[-1, 3, C3, [128]], # 第2层
# 对前一个层的输出使用3次C3模块,输入通道数为128。
[-1, 1, Conv, [256, 3, 2]], # 第3层-P3/8
# 对前一个层的输出使用1次卷积操作,输出通道数为256,卷积核为3x3,步长为2,生成P3/8特征图。
[-1, 6, C3, [256]], # 第4层
# 对前一个层的输出使用6次C3模块,输入通道数为256。
[-1, 1, Conv, [512, 3, 2]], # 第5层-P4/16
# 对前一层的输出使用1次卷积操作,输出通道数为512,卷积核为3x3,步长为2,生成P4/16特征图。
[-1, 9, C3, [512]], # 第6层
# 对前一个层的输出使用9次C3模块,输入通道数为512。
[-1, 1, Conv, [1024, 3, 2]], # 第7层-P5/32
# 对前一个层的输出使用1次卷积操作,输出通道数为1024,卷积核为3x3,步长为2,生成P5/32特征图。
[-1, 3, C3, [1024]], # 第8层
# 对前一个层的输出使用3次C3模块,输入通道数为1024。
[-1, 1, SPPF, [1024, 5]], # 第9层
# 对前一个层的输出使用1次SPPF模块,输入通道数为1024,使用5x5的池化核。
(3)头部网络(head):
头部网络格式与主干网络相同。模块参数:
- nn.Upsample的参数:[尺寸,缩放倍数,模式]
- Concat的参数:[维度索引]
- Detect的参数:[类别数量,锚点列表]
[-1, 1, Conv, [512, 1, 1]], # 第10层
# 对前一层的输出使用1次卷积操作,输出通道数为512,卷积核为1x1,步长为1。
[-1, 1, nn.Upsample, [None, 2, "nearest"]], # 第11层
# 对前一层的输出使用1次上采样,不指定输出尺寸,放大两倍,用最近邻插值方法。
[[-1, 6], 1, Concat, [1]], # 第12层-cat backbone P4
# 对前一层的输出(上采样)与第6层的输出(P4特征图)进行1次拼接,拼接维度为1。
[-1, 3, C3, [512, False]], # 第13层
# 对前一层的输出应用3次C3模块,输入通道数为512,采用默认CSP结构。
[-1, 1, Conv, [256, 1, 1]], # 第14层
# 对前一层的输出使用1次卷积操作,输出通道数为256,卷积核为1x1,步长为1。
[-1, 1, nn.Upsample, [None, 2, "nearest"]], # 第15层
# 对前一层的输出使用1次上采样,不指定输出尺寸,放大两倍,用最近邻插值方法。
[[-1, 4], 1, Concat, [1]], # 第16层-cat backbone P3
# 对前一层的输出(上采样结果)与第4层的输出进行1次拼接,拼接维度为1。
[-1, 3, C3, [256, False]], # 第17层 (P3/8-small)
# 对前一层的输出应用3次C3模块,输入通道数为256,采用默认CSP结构。
[-1, 1, Conv, [256, 3, 2]], # 第18层
# 对前一层的输出使用1次卷积操作,输出通道数为256,卷积核为3×3,步长为2。
[[-1, 14], 1, Concat, [1]], # 第19层-cat head P4
# 对前一层的输出(上采样结果)与第14层的输出进行1次拼接,拼接维度为1。
[-1, 3, C3, [512, False]], # 第20层 (P4/16-medium)
# 对前一层的输出应用3次C3模块,输入通道数为512,采用默认CSP结构。
[-1, 1, Conv, [512, 3, 2]], # 第21层
# 对前一层的输出使用1次卷积操作,输出通道数为512,卷积核为3×3,步长为2。
[[-1, 10], 1, Concat, [1]], # 第22层-cat head P5
# 对前一层的输出(上采样结果)与第10层的输出进行1次拼接,拼接维度为1。
[-1, 3, C3, [1024, False]], # 第23层 (P5/32-large)
# 对前一层的输出应用3次C3模块,输入通道数为1024,采用默认CSP结构。
[[17, 20, 23], 1, Detect, [nc, anchors]], # 第24层-Detect(P3, P4, P5)
# 对第17、20、23层使用1次Detect模块,类别数量为nc、锚点列表为anchors。
# 基于P3、P4和P5特征图进行最终的目标检测。
yolov5共22个模块,具体的模块定义在models.common文件中,可自行下载查看。
3、yolov5s网络结构图
官方yolo文件中Head部分包含了3个Detect,Detect用于输出预测结果,当yolov5作为特征提取器使用时,需去掉Detect。由于卷积操作会向下采样(降低维度),因此Detect1的维度最高、Detect2的维度次之、Detect3的维度最低。维度越高、网格(grid cell)越密,可检测的目标尺寸越小。
最后,附上一篇比较靠谱的博客:
yolov5网络结构https://www.cnblogs.com/goldsunshine/p/18284318