【c++面向对象编程】第47篇:C++代码组织:头文件、预编译指令与不透明指针(Pimpl)
2026/5/24 0:28:49
# 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 变体,而不仅仅是目标检测。
nc: 80 # 类别数(COCO 数据集) depth_multiple: 0.33 # 控制网络深度(C3 模块重复次数缩放) width_multiple: 0.5 # 控制通道宽度(卷积输出通道数缩放)width_multipledepth_multiple)三组 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/32基于 CSPDarknet 结构:
Conv(带 stride 的卷积)进行下采样。C3模块(Cross Stage Partial + Bottleneck)提取特征。SPPF(空间金字塔池化快速版)增强感受野。关键层索引:
采用 FPN + PAN 结构进行多尺度融合:
最终输出三个尺度的特征图(P3/8, P4/16, P5/32)送入Segment模块。
[[17, 20, 23], 1, Segment, [nc, anchors, 32, 256]]Segment是 YOLOv5-seg 中新增的模块,同时输出:nc: 类别数anchors: anchor 定义32: 掩码原型(prototype)的 stride(即原型图尺寸为 input_size / 32)256: 原型图的通道数(即生成 256 个原型 mask)✅ 这意味着该模型不仅能检测物体,还能输出每个实例的像素级分割掩码(类似 YOLACT 的思路)。
如果你在训练或推理时遇到问题,可以检查:
yolov5-seg.yaml和对应的models/yolo.py中的Segment类;--task segment)。如需将此配置改为纯检测(非分割),只需将最后一行的Segment改为Detect:
[[17, 20, 23], 1, Detect, [nc, anchors]]需要我帮你生成训练命令、可视化结构图,或解释Segment内部原理吗?