4、配置文件详解:模型配置文件(yaml)结构、数据集配置文件(yaml)编写、超参数配置文件解析

配置文件这东西,说白了就是 YOLO 的「说明书」。你想想看,一个模型怎么搭、数据从哪读、训练怎么跑,全得靠这几个 yaml 文件来告诉它。我刚开始接触 YOLOv5 的时候,总觉得配置文件可有可无,直接改代码多痛快。结果有一次改乱了网络结构,模型直接不收敛,查了两天才发现是 yaml 里一个缩进写错了。嗯,从那以后我再也不敢小看这些配置文件了。

YOLOv11 延续了 Ultralytics 的设计哲学——配置驱动。你不需要动一行 Python 代码,改改 yaml 就能换模型、调参数。这一章,我就带你把这几个配置文件彻底吃透。

核心要点:YOLOv11 的三大配置文件——模型配置(model.yaml)、数据集配置(dataset.yaml)、超参数配置(hyp.yaml)。掌握它们,你就掌握了 YOLOv11 的「遥控器」。

YOLOv11 配置文件体系 YOLOv11 配置体系 模型配置文件 数据集配置文件 超参数配置文件 网络结构定义 模块参数配置 数据路径设置 类别名称定义 学习率策略 数据增强参数 三者协同工作:模型结构 + 数据定义 + 训练策略 = 完整训练流程 修改任意一个,都可能影响最终模型性能

4.1 模型配置文件(model.yaml)结构

模型配置文件,就是 YOLOv11 的「骨架图纸」。它定义了网络长什么样——从输入到输出,每一层用什么模块、参数怎么设,全写在这里面。

YOLOv11 的模型配置沿用了 Ultralytics 的 yaml 格式,核心结构就三部分:参数区(parameters)、主干网络(backbone)、检测头(head)。我带你拆开看。

4.1.1 参数区

文件最开头,一般是几个全局参数:

# YOLOv11 模型配置示例(精简版)
nc: 80                    # 类别数量
scales:                   # 模型缩放因子
  n: [0.50, 0.25, 1024]  # [深度因子, 宽度因子, 最大通道数]
  s: [0.50, 0.50, 1024]
  m: [0.50, 0.75, 1024]
  l: [1.00, 1.00, 1024]
  x: [1.00, 1.25, 1024]

这里 nc 就是你要检测的类别数。COCO 数据集是 80 类,换成你自己的数据集,记得改这个值。scales 定义了不同版本模型的缩放系数——n/s/m/l/x 分别对应 Nano 到 XLarge。我个人习惯先用 m 版本调参,稳定了再换 l 或 x 冲精度。

小技巧:如果你显存不够,把 scales 里的宽度因子调小一点,模型立马瘦身。我曾经在 4GB 显存的卡上跑 YOLOv11n,宽度因子降到 0.25,照样能跑,就是精度掉了点。

4.1.2 主干网络(backbone)

主干网络负责提取特征。YOLOv11 的 backbone 主要用 C2f 和 SPPF 模块:

backbone:
  - [-1, 1, Conv, [64, 3, 2]]     # 0-P1/2
  - [-1, 1, Conv, [128, 3, 2]]    # 1-P2/4
  - [-1, 3, C2f, [128, True]]     # 2
  - [-1, 1, Conv, [256, 3, 2]]    # 3-P3/8
  - [-1, 6, C2f, [256, True]]     # 4
  - [-1, 1, Conv, [512, 3, 2]]    # 5-P4/16
  - [-1, 6, C2f, [512, True]]     # 6
  - [-1, 1, Conv, [1024, 3, 2]]   # 7-P5/32
  - [-1, 3, C2f, [1024, True]]    # 8
  - [-1, 1, SPPF, [1024, 5]]      # 9

每一行的格式是:[输入层, 重复次数, 模块名, [参数列表]]。-1 表示上一层的输出作为输入。你看第 2 行,C2f 重复了 3 次,通道数 128。YOLOv11 的 C2f 比 v8 多了个残差连接,梯度流更顺畅。

注意:修改 backbone 结构时,一定要保证下采样倍数正确。P3/8 表示下采样 8 倍,P4/16 是 16 倍,P5/32 是 32 倍。搞错了这个,特征图尺寸对不上,模型直接报错。

4.1.3 检测头(head)

检测头负责在特征图上做预测。YOLOv11 的 head 用了 Detect 模块:

head:
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]  # 10 上采样
  - [[-1, 6], 1, Concat, [1]]                    # 11 拼接
  - [-1, 3, C2f, [512]]                          # 12
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]  # 13
  - [[-1, 4], 1, Concat, [1]]                    # 14
  - [-1, 3, C2f, [256]]                          # 15
  - [15, 1, Conv, [256, 3, 2]]                   # 16 下采样
  - [[-1, 12], 1, Concat, [1]]                   # 17
  - [-1, 3, C2f, [512]]                          # 18
  - [18, 1, Conv, [512, 3, 2]]                   # 19
  - [[-1, 9], 1, Concat, [1]]                    # 20
  - [-1, 3, C2f, [1024]]                         # 21
  - [[15, 18, 21], 1, Detect, [nc]]              # 22 Detect(P3, P4, P5)

这里用了 FPN+PAN 结构,上采样拼接再下采样。最后 Detect 模块从三个尺度(P3、P4、P5)输出预测结果。我刚开始看这个配置时,总觉得层数太多记不住。后来发现一个规律——看数字编号,负数是引用前面的层,正数是层号。搞明白这个,读配置就快了。

4.2 数据集配置文件(dataset.yaml)编写

数据集配置文件,就是告诉 YOLO:「你的训练数据在哪、验证数据在哪、要检测哪些东西」。

一个标准的 dataset.yaml 长这样:

# 数据集配置文件示例
path: ../datasets/coco128  # 数据集根目录
train: images/train2017    # 训练集图片路径(相对 path)
val: images/val2017        # 验证集图片路径(相对 path)
test:                      # 测试集(可选)

# 类别信息
nc: 80                     # 类别数量
names:                     # 类别名称列表
  0: person
  1: bicycle
  2: car
  # ... 省略中间类别
  79: toothbrush

这里有几个坑,我一个个说。

第一,路径问题。path 是根目录,train 和 val 是相对路径。我建议用路径,省得出错。曾经有一次我换了台机器跑训练,相对路径对不上,折腾了半小时才发现是路径问题。

第二,类别名称顺序。names 的索引必须从 0 开始连续编号,不能跳号。你的标注文件里的类别 ID 要和这里一一对应。比如标注里 ID 是 2,那 names[2] 就应该是「car」。

第三,图片和标签的对应关系。YOLO 要求图片和标签文件名相同,只是后缀不同。图片是 000001.jpg,标签就是 000001.txt。标签文件放在和图片同名的目录下,但目录名是 labels 而不是 images。比如:

datasets/coco128/
├── images/
│   ├── train2017/
│   │   ├── 000001.jpg
│   │   └── ...
│   └── val2017/
│       ├── 000100.jpg
│       └── ...
└── labels/
    ├── train2017/
    │   ├── 000001.txt
    │   └── ...
    └── val2017/
        ├── 000100.txt
        └── ...

重要:YOLOv11 会自动根据 train 路径推断标签路径——把 images 换成 labels,目录结构不变。所以你的数据集目录结构必须严格遵循这个约定。

4.3 超参数配置文件解析

超参数配置文件,就是训练的「调节旋钮」。学习率、批量大小、数据增强强度……全在这里调。

YOLOv11 的超参数配置在 ultralytics/cfg/default.yaml 里,核心参数我整理成了一张表:

参数名 默认值 说明 我的建议
lr0 0.01 初始学习率 小数据集用 0.001,大数据集用 0.01
lrf 0.01 最终学习率(lr0 的倍数) 一般保持默认
momentum 0.937 SGD 动量 0.9~0.98 之间调,越大越稳定
weight_decay 0.0005 权重衰减(L2 正则化) 防止过拟合,小数据集可适当增大
warmup_epochs 3.0 预热轮数 大 batch 时建议增加到 5
batch 16 批量大小 根据显存调整,能大则大
hsv_h 0.015 色调增强强度 0~0.1,颜色变化大的场景可调高
hsv_s 0.7 饱和度增强强度 0~1,光照变化大时调高
hsv_v 0.4 明度增强强度 0~1,暗光场景可调高
degrees 0.0 旋转角度范围 0~180,物体方向多变时使用
translate 0.1 平移比例 0~1,物体位置多变时使用
scale 0.5 缩放比例 0~1,物体尺寸多变时使用
fliplr 0.5 水平翻转概率 0.5 一般够用,对称物体可调高

数据增强这部分,我多说两句。YOLOv11 默认的增强策略已经很猛了,但具体场景要具体调。比如我做工业检测时,产品方向是固定的,就把 degrees 设成 0,fliplr 也关了——因为翻转后的样本不符合实际情况,反而会误导模型。

反过来,做自动驾驶场景时,光照变化大、物体角度多变,我就把 hsv_h 调到 0.05,degrees 调到 30,模型鲁棒性明显提升。

调参经验:我一般先跑 50 个 epoch 看 loss 曲线。如果 loss 降得慢,就调大 lr0;如果 loss 震荡厉害,就调大 momentum 或减小 lr0。数据增强别一上来就拉满,先默认跑一轮,再根据过拟合情况逐步增加。

4.4 配置文件实战:从零搭建一个自定义数据集

光说不练假把式。我带你走一遍完整流程——从标注好的数据到跑通训练。

第一步:整理数据集目录

my_dataset/
├── images/
│   ├── train/
│   │   ├── img_001.jpg
│   │   ├── img_002.jpg
│   │   └── ...
│   └── val/
│       ├── img_100.jpg
│       └── ...
└── labels/
    ├── train/
    │   ├── img_001.txt
    │   ├── img_002.txt
    │   └── ...
    └── val/
        ├── img_100.txt
        └── ...

第二步:编写 dataset.yaml

# my_dataset.yaml
path: /home/user/projects/my_dataset
train: images/train
val: images/val

nc: 3
names:
  0: cat
  1: dog
  2: bird

第三步:选择模型配置

直接用官方提供的 yolov11n.yaml,只改 nc 为 3:

# yolov11n_custom.yaml
nc: 3  # 改成你的类别数
# 其他部分保持原样

第四步:调整超参数

新建一个 hyp_custom.yaml,只覆盖你要改的参数:

# hyp_custom.yaml
lr0: 0.005          # 小数据集,学习率调低
degrees: 0.0        # 我的物体方向固定,不旋转
fliplr: 0.0         # 不翻转
hsv_h: 0.02         # 轻微颜色增强

第五步:启动训练

yolo train model=yolov11n_custom.yaml data=my_dataset.yaml hyp=hyp_custom.yaml epochs=100 batch=16 imgsz=640

搞定。就这么简单。

避坑提醒:我曾经犯过一个低级错误——标注文件里类别 ID 从 1 开始,但 yaml 里 names 从 0 开始。结果模型把「猫」识别成「狗」,因为 ID 对不上。检查标注文件时,记得确认 ID 从 0 开始。

4.5 本章小结

配置文件是 YOLOv11 的「遥控器」。你不需要改一行代码,改改 yaml 就能换模型、换数据、调参数。记住三个核心:

  • 模型配置:定义网络骨架,改 nc 和 scales 最常用
  • 数据集配置:告诉 YOLO 数据在哪、要检测什么,路径和类别名别搞错
  • 超参数配置:训练过程的调节旋钮,数据增强要因场景而异

把这些搞明白了,YOLOv11 你就掌握了三分之一。剩下的,就是跑数据、调参数、看结果——这些我们后面章节慢慢聊。