一、yolov5s-seg.yaml
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license # Parameters nc: 80 # number of classes depth_multiple: 0.33 # model depth multiple width_multiple: 0.5 # 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, Segment, [nc, anchors, 32, 256]], # Detect(P3, P4, P5) ]你提供的这段 YAML 配置文件是YOLOv5(Ultralytics 版本)中用于定义模型结构的配置,具体对应的是YOLOv5s(small)模型(因为depth_multiple=0.33、width_multiple=0.5是 YOLOv5s 的典型参数)。
不过,最后一行使用了Segment模块而非标准的Detect模块,这表明该配置实际上是YOLOv5-seg—— 即支持实例分割(Instance Segmentation)的 YOLOv5 变体,而不仅仅是目标检测。
逐部分解析
1.全局参数
nc: 80 # 类别数(COCO 数据集) depth_multiple: 0.33 # 控制网络深度(C3 模块重复次数缩放) width_multiple: 0.5 # 控制通道宽度(卷积输出通道数缩放)- 这些是 YOLOv5s 的默认设置。
- 实际通道数 = 原始值 ×
width_multiple - 实际 C3 层数 = round(原始数 ×
depth_multiple)
2.Anchors
三组 anchor boxes,分别用于 P3(小目标)、P4(中目标)、P5(大目标)特征图:
anchors: - [10,13, 16,30, 33,23] # P3/8 - [30,61, 62,45, 59,119] # P4/16 - [116,90, 156,198, 373,326] # P5/323.Backbone(主干网络)
基于 CSPDarknet 结构:
- 使用
Conv(带 stride 的卷积)进行下采样。 - 使用
C3模块(Cross Stage Partial + Bottleneck)提取特征。 - 最后用
SPPF(空间金字塔池化快速版)增强感受野。
关键层索引:
- 层 4:P3 特征(stride=8)
- 层 6:P4 特征(stride=16)
- 层 10:P5 特征(stride=32)
4.Head(检测头 + 分割头)
采用 FPN + PAN 结构进行多尺度融合:
- 上采样路径(从 P5 → P4 → P3):
- 上采样 + 与 backbone 对应层 concat → C3 融合
- 下采样路径(P3 → P4 → P5):
- 下采样 + 与上一阶段 head 特征 concat → C3 融合
最终输出三个尺度的特征图(P3/8, P4/16, P5/32)送入Segment模块。
5.Segment 模块(关键区别!)
[[17, 20, 23], 1, Segment, [nc, anchors, 32, 256]]- 输入来自第 17、20、23 层(即三个尺度的检测特征)
Segment是 YOLOv5-seg 中新增的模块,同时输出:- 边界框(bbox)
- 类别(class)
- 掩码系数(mask coefficients)
- 参数说明:
nc: 类别数anchors: anchor 定义32: 掩码原型(prototype)的 stride(即原型图尺寸为 input_size / 32)256: 原型图的通道数(即生成 256 个原型 mask)
✅ 这意味着该模型不仅能检测物体,还能输出每个实例的像素级分割掩码(类似 YOLACT 的思路)。
总结
- 模型类型:YOLOv5s-seg(实例分割版本)
- 输入分辨率:通常为 640×640(可变)
- 输出:
- 检测框(x, y, w, h, conf, cls)
- 实例掩码(通过原型图 + 线性组合生成)
- 适用场景:需要同时做目标检测和像素级分割的任务(如自动驾驶、医学图像分析等)
补充建议
如果你在训练或推理时遇到问题,可以检查:
- 是否使用了正确的
yolov5-seg.yaml和对应的models/yolo.py中的Segment类; - 数据集是否包含掩码标注(如 COCO 格式的 segmentation 字段);
- 训练命令是否启用了分割任务(如使用
--task segment)。
如需将此配置改为纯检测(非分割),只需将最后一行的Segment改为Detect:
[[17, 20, 23], 1, Detect, [nc, anchors]]需要我帮你生成训练命令、可视化结构图,或解释Segment内部原理吗?