
YOLOv10 模型配置文件全指南深入解析ultralytics/cfg/models目录下的 YAML 模型架构【免费下载链接】yolov10YOLOv10: Real-Time End-to-End Object Detection [NeurIPS 2024]项目地址: https://gitcode.com/GitHub_Trending/yo/yolov10本指南以仓库中 models 目录说明文档 为主线系统讲解 YOLO 模型 YAML 配置文件的目录结构、CLI/Python 双入口用法、YAML 内部语法nc、scales、backbone、head及其在parse_model中的解析原理并结合本仓库实际存在的 YOLOv10 六档配置n/s/m/b/l/x逐一拆解。读完本文你将能够独立阅读、选择、修改和扩展任何一份 YOLO 模型配置文件并直接用yolo命令或 Python API 从零构建自定义检测模型。Models 目录一套「YAML 即模型」的配置体系在 Ultralytics YOLO 系列框架中模型的「定义」不依赖一份写死的 Python 类而是以*.yaml文件的形式存在。本仓库的ultralytics/cfg/models/目录正是这些预配置文件的集合地由 README.md 统一说明用法。该目录下按代际与架构划分了多个子目录本仓库YOLOv10 仓库实际包含以下模型家族子目录内容代表文件v10/YOLOv10 六档检测模型yolov10n.yaml、yolov10s.yaml、yolov10m.yaml、yolov10b.yaml、yolov10l.yaml、yolov10x.yamlv8/YOLOv8 全任务模型检测/分割/姿态/OBB/分类/Worldyolov8.yaml、yolov8-seg.yaml、yolov8-pose.yaml、yolov8-obb.yaml、yolov8-cls.yaml等v9/YOLOv9 检测模型yolov9c.yaml、yolov9e.yamlv5/、v6/、v3/早期 YOLO 代际模型yolov5.yaml、yolov6.yaml、yolov3.yaml、yolov3-tiny.yamlrt-detr/实时 DETR 检测模型rtdetr-l.yaml、rtdetr-x.yaml等这些配置覆盖从目标检测到实例分割、姿态估计等场景且设计上兼顾 CPU 到 GPU 的多种硬件平台——即通过统一的scales缩放机制同一份骨架可以按需生成轻量级到超大规模的模型。这与 README 中「既有经验丰富的从业者、也有 YOLO 入门用户均能从本目录找到起点」的定位一致。快速上手CLI 与 Python 双入口README 提供了两种使用模型 YAML 的方式二者接受完全相同的训练参数由 default.yaml 统一定义。方式一命令行接口CLIyolo taskdetect modetrain modelyolov8n.yaml datacoco128.yaml epochs100taskdetect指定任务类型detect/segment/classify/pose/obb 等modetrain指定运行模式train/val/predict/export/benchmark 等modelyolov8n.yaml传入模型配置文件也可传yolov10n.yaml、yolov8s.yaml等datacoco128.yaml指定数据集配置文件位于 ultralytics/cfg/datasets/epochs100指定训练轮数。方式二Python APIfrom ultralytics import YOLO model YOLO(model.yaml) # 从零构建模型此处替换为任意 yaml 路径如 yolov10n.yaml # model YOLO(model.pt) # 若有预训练权重可直接加载 .pt 检查点 model.info() # 打印模型层数、参数量等信息 model.train(datacoco128.yaml, epochs100) # 训练两条路径殊途同归YOLO(xxx.yaml)最终都会调用模型构建入口将 YAML 描述的结构实例化为一个真正的 PyTorch 模块。若手头有预训练权重README 也明确说明可以改用YOLO(model.pt)直接加载检查点配置与权重二者择一即可。YAML 配置文件内部结构与解析原理想要用好这些配置文件需要理解其语法。以 yolov10n.yaml 为例完整内容如下# Parameters nc: 80 # number of classes scales: # model compound scaling constants, i.e. modelyolov8n.yaml will call yolov8.yaml with scale n # [depth, width, max_channels] n: [0.33, 0.25, 1024] # YOLOv8.0n backbone backbone: # [from, repeats, module, args] - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2 - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4 - [-1, 3, C2f, [128, True]] - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8 - [-1, 6, C2f, [256, True]] - [-1, 1, SCDown, [512, 3, 2]] # 5-P4/16 - [-1, 6, C2f, [512, True]] - [-1, 1, SCDown, [1024, 3, 2]] # 7-P5/32 - [-1, 3, C2f, [1024, True]] - [-1, 1, SPPF, [1024, 5]] # 9 - [-1, 1, PSA, [1024]] # 10 # YOLOv8.0n head head: - [-1, 1, nn.Upsample, [None, 2, nearest]] - [[-1, 6], 1, Concat, [1]] # cat backbone P4 - [-1, 3, C2f, [512]] # 13 - [-1, 1, nn.Upsample, [None, 2, nearest]] - [[-1, 4], 1, Concat, [1]] # cat backbone P3 - [-1, 3, C2f, [256]] # 16 (P3/8-small) - [-1, 1, Conv, [256, 3, 2]] - [[-1, 13], 1, Concat, [1]] # cat head P4 - [-1, 3, C2f, [512]] # 19 (P4/16-medium) - [-1, 1, SCDown, [512, 3, 2]] - [[-1, 10], 1, Concat, [1]] # cat head P5 - [-1, 3, C2fCIB, [1024, True, True]] # 22 (P5/32-large) - [[16, 19, 22], 1, v10Detect, [nc]] # Detect(P3, P4, P5)顶层参数区Parametersnc类别数number of classesCOCO 为 80自定义数据集需按你的标签类别修改scales复合缩放常量表每个键n/s/m/b/l/x对应一组[depth, width, max_channels]深度倍数、宽度倍数、最大通道数。这正是「一个 YAML 生成多种规模模型」的关键。网络结构区backbone / head每行一个层格式为[from, repeats, module, args]from输入来源层索引-1表示上一层[-1, 6]表示拼接上一层与第 6 层即跳跃连接repeats该模块重复次数会被深度倍数修正module模块名如Conv、C2f、SCDown、SPPF、PSA、C2fCIB、Concat、nn.Upsample、v10Detectargs构造参数如[64, 3, 2]表示输出 64 通道、3×3 卷积核、stride 2。解析原理parse_model这些 YAML 并非直接被 PyTorch 读取而是由 ultralytics/nn/tasks.py 中的parse_model(d, ch)函数在运行时逐层解析tasks.py#L831。关键逻辑tasks.py#L836-L862可以印证 README 中「一个 YAML 构建任意规模模型」的说法nc, act, scales (d.get(x) for x in (nc, activation, scales)) depth, width, kpt_shape (d.get(x, 1.0) for x in (depth_multiple, width_multiple, kpt_shape)) if scales: scale d.get(scale) if not scale: scale tuple(scales.keys())[0] LOGGER.warning(fWARNING ⚠️ no model scale passed. Assuming scale{scale}.) depth, width, max_channels scales[scale]其要点包括缩放生效若未显式指定scale解析器取scales中第一个键并给出警告指定后depth、width、max_channels三者决定整个网络的规模。深度修正层重复数按n max(round(n * depth), 1)修正深度倍数小于 1 时能显著减少重复模块数量tasks.py#L862。宽度修正非分类输出层的通道数按c2 make_divisible(min(c2, max_channels) * width, 8)计算保证 8 通道对齐、且不超过max_channelstasks.py#L893-L895。模块解析nn.前缀的模块从torch.nn取如nn.Upsample其余从globals()中按名字查找如C2f、PSA、v10Detect字符串参数还会尝试ast.literal_eval转换tasks.py#L856-L860。此外tasks.py还提供guess_model_scale(model_path)tasks.py#L970可根据权重文件名推断对应缩放档位。这解释了为什么在 CLI 中modelyolov10n.yaml会被自动套用scales中的n: [0.33, 0.25, 1024]。本仓库的 YOLOv10 六档模型配置README 强调「先浏览目录、选择最合适的模型」。本仓库ultralytics/cfg/models/v10/下的六个 YAML 通过同一套 backbone/head 骨架 不同scales实现了六个规格配置缩放三元组 [depth, width, max_channels]特点定位依据源码结构推断yolov10n.yaml[0.33, 0.25, 1024]最小规格适合边缘/CPU 部署yolov10s.yaml[0.33, 0.50, 1024]小规格轻量与精度平衡yolov10m.yaml[0.67, 0.75, 768]中等规格常规 GPU 训练yolov10b.yaml[0.67, 1.00, 512]平衡档Balanced宽度不减yolov10l.yaml[1.00, 1.00, 512]大规格追求高精度yolov10x.yaml[1.00, 1.25, 512]超大规格最大宽度注上表「特点定位」为基于缩放参数的合理推断具体参数量与 FLOPs 可通过YOLO(yolov10n.yaml).info()或运行仓库中的 flops.py 查看。对比各规格的骨架差异可以发现缩放不仅作用于scales数字还体现在模块选择上轻量档n/sbackbone 第 8 层用C2f仅在 P5 深层用C2fCIB中大型档m/b/l/xbackbone 第 8 层直接使用C2fCIB且 head 中的特征融合层第 13/19/22 层也多处替换为C2fCIB——通道数越多改用 CIB 结构带来的推理加速收益越明显详见下文模块分析。YOLOv10 关键模块与 One-to-One 端到端设计YOLOv10 的配置与 YOLOv8 最大的区别在于 head 由Detect换成了v10Detect同时在网络后段引入PSAPartial Self-Attention与SCDownSpatial-Channel Downsample在深层使用C2fCIBv10Detect无 NMS 的端到端检测头定义于 ultralytics/nn/modules/head.py#L497继承自Detect。其__init__中通过copy.deepcopy复制出one2one_cv2、one2one_cv3两套预测头forward中同时计算one2one一对一匹配供推理使用与one2many一对多匹配仅训练辅助两路输出head.py#L511-L525。推理阶段只取 one2one 分支因此无需 NMS 后处理导出export阶段则调用ops.v10postprocess直接输出boxes/scores/labels拼接结果。该类还定义了max_det 300head.py#L499限制单图最大检测框数。v10DetectLoss双分支联合损失定义于 ultralytics/utils/loss.py#L717内部用v8DetectionLoss(model, tal_topk10)训练 one2many 分支、用v8DetectionLoss(model, tal_topk1)训练 one2one 分支最终两分支损失相加loss.py#L719-L727。tal_topk的差异正是「一对多」与「一对一」匹配的本质区别。PSA部分自注意力定义于 ultralytics/nn/modules/block.py#L799将输入经cv1一分为二仅对一半通道施加AttentionFFN再与另一半拼接从而以较低计算量引入全局建模能力其使用的Attention模块block.py#L771采用降维键值key_dim head_dim * attn_ratio与深度可分离卷积位置编码。SCDown空间-通道下采样定义于 block.py#L820先用 1×1 卷积压缩通道再对压缩后的特征做分组深度可分离卷积下采样相比普通Conv(k3, s2)大幅降低下采样阶段的计算量。这也是 YOLOv10 在 P4/P5 下采样层将Conv替换为SCDown的原因。C2fCIBC2f CIB 瓶颈定义于 block.py#L760是C2f的加速变体内部重复块为CIB在通道宽的中大模型上兼顾表征能力与速度。如何选择并定制你的模型配置根据 README 的引导选择流程可以归纳为三步按任务选家族目标检测选v10/或v8/yolov8.yaml分割/姿态/OBB/分类分别选v8/下的yolov8-seg.yaml、yolov8-pose.yaml、yolov8-obb.yaml、yolov8-cls.yaml。按算力选档位CPU/边缘设备选n、s中端 GPU 选m、b高性能 GPU 选l、x。按数据定制将nc改为你的类别数数据集路径通过data指定如仓库提供的 coco128.yaml、coco8.yaml 小规模示例集便于快速验证流程。如需进一步定制网络可以直接修改 YAML例如增删C2f的repeats、替换某层模块、调整max_channels保存为新文件后按上述方式加载即可。需要注意scales中每个键的[depth, width, max_channels]会全局影响网络规模改参数前建议先用model.info()确认参数量与层数。向仓库贡献新模型README 最后向社区发出贡献邀请如果你训练出了新的 YOLO 变体或通过特定调优取得了更好的效果可以将其以*.yaml配置的形式贡献进 Models 目录帮助丰富可选模型集。仓库根目录的 CONTRIBUTING.md 提供了详细的 PR 提交流程指引对照 README 中指向的贡献指南。贡献的核心要点依然是「配置先行」新架构以标准 YAML 语法表达并附上可复现的训练配置与结果即可被parse_model体系无缝加载。小结ultralytics/cfg/models/目录的定位是「模型的 YAML 工厂」一份 README.md 说明使用方式各代际子目录提供开箱即用的架构定义。理解nc、scales、backbone、head四要素与parse_model的解析链路就掌握了从零构建、缩放、定制 YOLO 模型的全部钥匙而对v10Detect、v10DetectLoss、PSA、SCDown、C2fCIB等模块的实现细节则能让你在动手改配置时知其然更知其所以然。【免费下载链接】yolov10YOLOv10: Real-Time End-to-End Object Detection [NeurIPS 2024]项目地址: https://gitcode.com/GitHub_Trending/yo/yolov10创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考