YOLOv5(四):models/yolov5s.yaml
在YOLOv5中,models目录是核心模块之一,主要用于存放模型的配置文件(.yaml格式)。这些配置文件定义了不同版本YOLOv5模型的网络结构、参数规模、特征提取方式等关键信息,是模型构建的“蓝图”。以下结合你提供的yolov5s.yaml及其他相关配置文件,详细解读models目录的核心内容:
一、配置文件的核心作用
models目录下的.yaml文件通过简洁的参数和层定义,描述了YOLOv5模型的完整结构。训练或推理时,YOLOv5会根据这些配置文件动态构建神经网络,无需手动编写大量代码。不同文件名(如yolov5s.yaml、yolov5l6.yaml)对应不同规模或功能的模型,可满足不同场景(如实时性优先、精度优先)的需求。
二、配置文件的结构解析(以yolov5s.yaml为例)
所有配置文件的结构一致,主要包含3个核心部分:Parameters(参数)、backbone(主干网络)、head(检测头)。
1. Parameters(模型基础参数)
这部分定义了模型的全局参数,决定了模型的规模、类别数、先验框等基础属性:
nc: 80 # 类别数(默认80,对应COCO数据集的80个类别)
depth_multiple: 0.33 # 深度倍数(控制模型深度,即网络层的数量)
width_multiple: 0.50 # 宽度倍数(控制模型宽度,即每层特征图的通道数)
anchors: # 锚框(先验框),每个尺度3组,用于目标检测的初始框预测- [10, 13, 16, 30, 33, 23] # P3/8(8倍下采样,对应小目标)- [30, 61, 62, 45, 59, 119] # P4/16(16倍下采样,对应中目标)- [116, 90, 156, 198, 373, 326] # P5/32(32倍下采样,对应大目标)
depth_multiple和width_multiple是控制模型规模的关键参数:
数值越大,模型越深(层更多)、越宽(通道数越多),精度通常更高,但速度更慢、参数更多。例如:yolov5n.yaml(nano):depth=0.33,width=0.25(最小模型,速度最快);yolov5x.yaml(extra-large):depth=1.33,width=1.25(最大模型,精度最高)。
2. backbone(主干网络)
主干网络负责从输入图像中提取多层级的特征(从小目标到大全局特征),YOLOv5的主干基于CSPNet结构,配置格式为[from, number, module, args],其中:
from:当前层的输入来源(-1表示上一层,6表示第6层输出);number:模块重复次数(实际次数=该值×depth_multiple,取整数);module:模块类型(如Conv卷积、C3残差模块、SPPF池化等);args:模块参数(如输出通道数、卷积核大小、步长等)。
以yolov5s.yaml的backbone为例:
backbone:[[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2(输出64通道,6x6卷积,步长2,下采样2倍)[-1, 1, Conv, [128, 3, 2]], # 1-P2/4(128通道,3x3卷积,步长2,下采样至4倍)[-1, 3, C3, [128]], # 2(C3模块重复3次,输出128通道,增强特征提取)[-1, 1, Conv, [256, 3, 2]], # 3-P3/8(下采样至8倍,对应小目标特征)[-1, 6, C3, [256]], # 4(C3模块重复6次,强化P3特征)[-1, 1, Conv, [512, 3, 2]], # 5-P4/16(下采样至16倍,对应中目标特征)[-1, 9, C3, [512]], # 6(强化P4特征)[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32(下采样至32倍,对应大目标特征)[-1, 3, C3, [1024]], # 8(强化P5特征)[-1, 1, SPPF, [1024, 5]], # 9(SPPF池化,融合多尺度上下文信息)]
- 主干网络通过多次卷积(步长2)实现下采样,生成
P3~P5三个尺度的特征图(8x、16x、32x下采样),分别对应小、中、大目标的特征。
3. head(检测头)
检测头负责将主干网络提取的特征进行融合、处理,并最终输出目标检测结果(类别、坐标、置信度)。YOLOv5采用“上采样+特征融合”的方式(类似FPN结构),将高层大尺度特征(语义强但分辨率低)与低层小尺度特征(细节多但语义弱)融合,提升检测精度。
以yolov5s.yaml的head为例:
head: [[-1, 1, Conv, [512, 1, 1]], # 10(将SPPF输出的1024通道降为512)[-1, 1, nn.Upsample, [None, 2, "nearest"]], # 11(上采样2倍,与P4特征对齐)[[-1, 6], 1, Concat, [1]], # 12(融合上采样特征与主干P4特征,通道数相加)[-1, 3, C3, [512, False]], # 13(C3模块处理融合特征,False表示无残差分支)[-1, 1, Conv, [256, 1, 1]], # 14(降维至256通道)[-1, 1, nn.Upsample, [None, 2, "nearest"]], # 15(上采样2倍,与P3特征对齐)[[-1, 4], 1, Concat, [1]], # 16(融合上采样特征与主干P3特征)[-1, 3, C3, [256, False]], # 17(P3/8-small,输出小目标检测特征)[-1, 1, Conv, [256, 3, 2]], # 18(下采样2倍,与P4特征对齐)[[-1, 14], 1, Concat, [1]], # 19(融合下采样特征与head的P4中间特征)[-1, 3, C3, [512, False]], # 20(P4/16-medium,输出中目标检测特征)[-1, 1, Conv, [512, 3, 2]], # 21(下采样2倍,与P5特征对齐)[[-1, 10], 1, Concat, [1]], # 22(融合下采样特征与head的P5中间特征)[-1, 3, C3, [1024, False]], # 23(P5/32-large,输出大目标检测特征)[[17, 20, 23], 1, Detect, [nc, anchors]], # 最终检测层,融合3个尺度特征输出结果]
- 检测头通过“上采样融合-下采样增强”的流程,生成
P3、P4、P5三个尺度的检测特征图,分别对应小、中、大目标的预测。 - 最后通过
Detect模块,基于预设的anchors和nc(类别数),输出每个目标的类别概率、边界框坐标和置信度。
三、不同模型配置的差异(以s、l、s6为例)
models目录下的不同配置文件(如yolov5s.yaml、yolov5l.yaml、yolov5s6.yaml)主要差异体现在:
- 规模参数:
depth_multiple和width_multiple不同(如s的0.33/0.5vsl的1.0/1.0),导致模型大小、参数、速度不同(参考README中的表格,s更轻量快速,l精度更高)。 - 输出尺度:普通模型(如
s、l)输出3个尺度(P3P5),适用于640x640输入;带`6`的模型(如`s6`、`l6`)输出4个尺度(P3P6),支持1280x1280大输入,更擅长检测大目标。 - 锚框设置:
6系列模型的anchors多一组(对应P6/64下采样),适配更大的目标尺寸。
总结
models目录是YOLOv5模型设计的核心,通过.yaml配置文件灵活定义了不同规模、不同检测能力的网络结构。用户可根据需求选择现成配置(如实时场景选yolov5s.yaml,高精度场景选yolov5x.yaml),也可通过修改参数(如调整depth_multiple、增减网络层)自定义模型。文档已就绪,你可以直接编辑,或告诉我如何修改。
文字版YOLOv5s分层结构图(1:1对应yaml配置)
按“输入→Backbone→Head→输出”顺序,标注每层的yaml层号、模块类型、输入输出尺寸、对应配置项,方便逐行对照:
| 层级类型 | yaml层号 | 模块名称 | 输入尺寸(H×W×C) | 输出尺寸(H×W×C) | 对应yolov5s.yaml配置内容 | 核心作用 |
|---|---|---|---|---|---|---|
| 输入层 | - | 图像输入 | 640×640×3 | 640×640×3 | 无(默认输入尺寸) | 模型输入源 |
| Backbone(主干) | 0 | Conv+BN+SiLU | 640×640×3 | 320×320×32 | [-1,1,Conv,[64,6,2,2]](64×0.5=32) | 首次下采样,提取浅层特征 |
| 1 | Conv+BN+SiLU | 320×320×32 | 160×160×64 | [-1,1,Conv,[128,3,2]](128×0.5=64) | 二次下采样,特征升维 | |
| 2 | C3(无残差) | 160×160×64 | 160×160×64 | [-1,3,C3,[128]](3×0.33≈1次重复,128×0.5=64) | 强化中层特征,减少梯度消失 | |
| 3 | Conv+BN+SiLU | 160×160×64 | 80×80×128 | [-1,1,Conv,[256,3,2]](256×0.5=128) | 三次下采样,生成P3特征 | |
| 4 | C3(无残差) | 80×80×128 | 80×80×128 | [-1,6,C3,[256]](6×0.33≈2次重复) | 强化P3特征(小目标基础) | |
| 5 | Conv+BN+SiLU | 80×80×128 | 40×40×256 | [-1,1,Conv,[512,3,2]](512×0.5=256) | 四次下采样,生成P4特征 | |
| 6 | C3(无残差) | 40×40×256 | 40×40×256 | [-1,9,C3,[512]](9×0.33≈3次重复) | 强化P4特征(中目标基础) | |
| 7 | Conv+BN+SiLU | 40×40×256 | 20×20×512 | [-1,1,Conv,[1024,3,2]](1024×0.5=512) | 五次下采样,生成P5特征 | |
| 8 | C3(无残差) | 20×20×512 | 20×20×512 | [-1,3,C3,[1024]](3×0.33≈1次重复) | 强化P5特征(大目标基础) | |
| 9 | SPPF(池化融合) | 20×20×512 | 20×20×512 | [-1,1,SPPF,[1024,5]](1024×0.5=512) | 多尺度池化,融合上下文 | |
| Head(检测头) | 10 | Conv+BN+SiLU | 20×20×512 | 20×20×256 | [-1,1,Conv,[512,1,1]](512×0.5=256) | 降维,为上采样做准备 |
| 11 | 上采样( nearest) | 20×20×256 | 40×40×256 | [-1,1,nn.Upsample,[None,2,“nearest”]] | 尺寸对齐P4特征 | |
| 12 | Concat(通道拼接) | 40×40×256(P4)+40×40×256(层11) | 40×40×512 | [[-1,6],1,Concat,[1]] | 融合P4与上采样特征 | |
| 13 | C3(无残差) | 40×40×512 | 40×40×256 | [-1,3,C3,[512,False]](512×0.5=256) | 压缩特征,优化P4检测层 | |
| 14 | Conv+BN+SiLU | 40×40×256 | 40×40×128 | [-1,1,Conv,[256,1,1]](256×0.5=128) | 二次降维,为上采样做准备 | |
| 15 | 上采样( nearest) | 40×40×128 | 80×80×128 | [-1,1,nn.Upsample,[None,2,“nearest”]] | 尺寸对齐P3特征 | |
| 16 | Concat(通道拼接) | 80×80×128(P3)+80×80×128(层15) | 80×80×256 | [[-1,4],1,Concat,[1]] | 融合P3与上采样特征 | |
| 17 | C3(无残差) | 80×80×256 | 80×80×128 | [-1,3,C3,[256,False]](256×0.5=128) | P3检测层(小目标输出) | |
| 18 | Conv+BN+SiLU | 80×80×128 | 40×40×256 | [-1,1,Conv,[256,3,2]](256×0.5=128→256?注:此处通道按配置不缩放,直接256) | 下采样,对齐P4尺寸 | |
| 19 | Concat(通道拼接) | 40×40×256(层13)+40×40×256(层18) | 40×40×512 | [[-1,14],1,Concat,[1]] | 融合P4中间特征与下采样特征 | |
| 20 | C3(无残差) | 40×40×512 | 40×40×256 | [-1,3,C3,[512,False]](512×0.5=256) | P4检测层(中目标输出) | |
| 21 | Conv+BN+SiLU | 40×40×256 | 20×20×512 | [-1,1,Conv,[512,3,2]](512×0.5=256→512?同层18,按配置直接512) | 下采样,对齐P5尺寸 | |
| 22 | Concat(通道拼接) | 20×20×512(层10)+20×20×512(层21) | 20×20×1024 | [[-1,10],1,Concat,[1]] | 融合P5中间特征与下采样特征 | |
| 23 | C3(无残差) | 20×20×1024 | 20×20×512 | [-1,3,C3,[1024,False]](1024×0.5=512) | P5检测层(大目标输出) | |
| 输出层 | 24 | Detect(检测模块) | 80×80×128+40×40×256+20×20×512 | 3个尺度的预测结果 | [[17,20,23],1,Detect,[nc,anchors]] | 输出类别、坐标、置信度 |
