Ultralytics YOLO 框架采用 YAML 驱动的三层配置体系——默认参数层、任务映射层和自定义覆盖层——协同控制训练、推理、验证、导出等全部工作流。理解这套体系是从"能用 YOLO"迈向"精调 YOLO"的关键一步。本文将从配置源头出发,逐层剖析参数的加载、校验、合并与优先级覆盖机制,并厘清运行时配置(控制训练行为)与模型架构配置(定义网络结构)这两条独立但交互的 YAML 管线。

Sources: default.yaml, __init__.py

配置体系全局架构

YAML 配置体系包含两条截然不同但相互协作的管线:运行时配置控制训练/推理/导出行为(学习率、批次大小、增强策略等),模型架构配置定义神经网络拓扑(骨干网络、检测头、通道数等)。两条管线在 Model 类中汇合,最终形成一个完整的可执行配置。

模型架构配置管线

自定义覆盖层

运行时配置管线

default.yaml
全局默认参数 (135项)

DEFAULT_CFG_DICT
字典形式

IterableSimpleNamespace
DEFAULT_CFG 对象

CLI: yolo train epochs=50

get_cfg() 合并

Python: model.train(epochs=50)

自定义 cfg=my_config.yaml

yolo26.yaml
模型结构定义

yaml_model_load()

yolo26-seg.yaml

yolo26-pose.yaml

模型字典
(backbone + head)

最终运行时配置
SimpleNamespace

模型构建
parse_model()

Sources: __init__.py, model.py

默认参数层:default.yaml 全景

ultralytics/cfg/default.yaml 是整个框架的配置基石,包含 135 个参数项,覆盖 YOLO 工作流的每一个阶段。该文件在模块初始化时被加载为全局字典,供所有训练、推理、导出流程引用。

加载与实例化过程

框架在 ultralytics/utils/__init__.py 初始化阶段执行以下三步:

  1. 路径常量定义DEFAULT_CFG_PATH = ROOT / "cfg/default.yaml"
  2. 字典加载DEFAULT_CFG_DICT = YAML.load(DEFAULT_CFG_PATH) — 通过线程安全的单例 YAML 工具类完成
  3. 命名空间转换DEFAULT_CFG = IterableSimpleNamespace(**DEFAULT_CFG_DICT) — 将字典转换为支持属性访问和迭代的对象

IterableSimpleNamespace 继承自标准库 SimpleNamespace,额外提供了 __iter__(支持 for k, v in cfg 遍历)、自定义 __str__(友好打印)以及 get(key, default) 方法。当访问不存在的属性时,它会给出明确的升级提示,而非抛出晦涩的 AttributeError

Sources: __init__.py, __init__.py, __init__.py

参数分区一览

default.yaml 按功能域划分为 7 个逻辑分区,下表按优先使用频率排序:

分区 参数数量 核心参数 适用模式
训练设置 17+ epochs, batch, imgsz, optimizer, lr0 train
超参数 20+ lr0, lrf, momentum, box, cls, dfl train
验证/测试设置 10 val, conf, iou, max_det, half train, val
预测设置 9 source, augment, agnostic_nms, classes predict, track
可视化设置 8 show, save_txt, save_crop, line_width predict, val
导出设置 9 format, int8, dynamic, simplify export
跟踪器设置 1 tracker track

此外还有两个任务专属参数:分割任务的 overlap_mask/mask_ratio,分类任务的 dropout,它们仅在对应的任务模式下生效。

Sources: default.yaml

参数类型校验体系

框架通过四个冻结集合(frozenset)对参数类型进行严格校验,这是防止"字符串数字"等常见 CLI 陷阱的第一道防线:

校验集合 约束规则 典型参数
CFG_FLOAT_KEYS 必须为 intfloat box, cls, dfl, batch, time
CFG_FRACTION_KEYS 必须为 int/float 且值 ∈ [0.0, 1.0] lr0, momentum, mosaic, conf, iou
CFG_INT_KEYS 必须为 int(不接受浮点) epochs, patience, workers, seed
CFG_BOOL_KEYS 必须为 bool save, half, augment, verbose

校验函数 check_cfg()hard=True 模式运行时,遇到类型不匹配直接抛出 TypeError;以 hard=False 模式运行时则尝试自动转换。特别值得注意的是 分数类型参数的双重校验——既检查类型合法性,又验证数值范围在 [0.0, 1.0] 之间,超出范围立即抛出 ValueError

Sources: __init__.py, __init__.py

任务映射层:从任务类型到默认配置

任务映射是连接"用户意图"与"具体资源"的桥梁。当用户指定 task=detect 而未提供具体的 datamodel 时,框架通过映射表自动填充合理的默认值。

核心映射表

框架定义了 四组映射关系,覆盖数据集、模型、指标与校准数据的全链路:

映射名称 用途
TASK2DATA 任务名 → 默认数据集 YAML 训练/验证缺少 data 时的回退
TASK2MODEL 任务名 → 默认模型权重 CLI 未指定 model 时的回退
TASK2METRIC 任务名 → 主要评估指标键名 日志和回调中引用指标
TASK2CALIBRATIONDATA 任务名 → 校准数据集 INT8 量化导出时的校准集

具体映射值如下:

任务 默认数据集 默认模型 评估指标 校准数据集
detect coco8.yaml yolo26n.pt metrics/mAP50-95(B) coco128.yaml
segment coco8-seg.yaml yolo26n-seg.pt metrics/mAP50-95(M) coco128-seg.yaml
classify imagenet10 yolo26n-cls.pt metrics/accuracy_top1 imagenet100
pose coco8-pose.yaml yolo26n-pose.pt metrics/mAP50-95(P) coco8-pose.yaml
obb dota8.yaml yolo26n-obb.pt metrics/mAP50-95(B) dota128.yaml

任务推断机制

当用户通过 CLI 执行 yolo detect train ... 或通过 Python API 创建 YOLO("yolo26n.pt") 时,任务类型通过以下优先级确定:

  1. 显式指定task=detect 参数直接设定
  2. 模型名推断guess_model_task() 从模型 YAML 的 head 最后一层的模块名推断(如 DetectdetectSegment26segmentPose26poseOBB26obb
  3. 权重文件推断:从 .pt 文件加载的模型中读取 model.task 属性
  4. CLI 特殊处理task=track 会自动转换为 task=detect, mode=track

Sources: __init__.py, __init__.py, tasks.py

自定义覆盖层:三层合并与优先级机制

自定义覆盖是用户介入配置的核心途径。无论是 CLI 参数、Python API 关键字参数,还是自定义 YAML 文件,最终都汇入同一套合并机制。

合并流程全景

优先级从低到高

① DEFAULT_CFG_DICT
全局默认参数

② model.overrides
模型级预设

③ custom 方法默认
predict: conf=0.25
val: rect=True

④ kwargs 用户参数
CLI 或 Python API

核心规则:合并使用字典展开 {**低优先级, **高优先级},右边的键覆盖左边的同名键。以训练为例,实际代码为:

args = {**overrides, **custom, **kwargs, "mode": "train"}
#              ②           ③          ④           强制值

不同模式的默认值(custom 层)存在差异:

模式 方法默认值 (custom) 说明
train data=默认数据集, model=当前模型 确保训练不缺少数据源
predict conf=0.25, batch=1, rect=True 推理默认高置信度阈值
val rect=True 验证使用矩形批次
track conf=0.1, batch=1 跟踪需要低置信度以保留更多候选
export format=torchscript 导出默认格式

get_cfg():配置合并的核心函数

get_cfg() 是所有配置合并的入口,其执行流程为:

  1. 统一输入格式:调用 cfg2dict() 将文件路径、字典或 SimpleNamespace 统一转为字典
  2. 键对齐校验:调用 check_dict_alignment() 确保覆盖参数中没有未知的键名
  3. 字典合并cfg = {**cfg, **overrides},覆盖参数优先
  4. 特殊处理:将数值类型的 project/name 转为字符串;将 name=model 自动替换为模型名
  5. 类型校验:调用 check_cfg() 进行前述的四类参数类型检查
  6. 返回命名空间IterableSimpleNamespace(**cfg) — 支持属性访问和迭代

Sources: __init__.py, model.py, model.py

CLI 参数解析管线

CLI 参数经过一条精密的解析管线转化为字典覆盖:

TASK 关键字

MODE 关键字

key=value

布尔开关

'none'

'true'/'false'

数字字符串

其他

yolo detect train epochs=50 lr0=0.01

merge_equals_args()
合并等号分割的片段

遍历每个参数

参数类型判断

overrides['task'] = 'detect'

overrides['mode'] = 'train'

parse_key_value_pair()

overrides[key] = True

smart_value() 类型推断

值类型

None

bool

int/float via ast.literal_eval

原字符串

smart_value() 函数实现了智能类型推断,使 CLI 参数无需手动指定类型。例如 epochs=50 被解析为整数 50lr0=0.01 被解析为浮点数 0.01augment=True 被解析为布尔值 True

Sources: __init__.py, __init__.py, __init__.py

自定义 YAML 文件覆盖

框架支持通过 cfg= 参数指定自定义配置文件,实现项目级的参数预设:

# CLI 方式
yolo train cfg=my_config.yaml

# Python 方式
model.train(cfg="my_config.yaml")

当检测到 cfg 参数时,框架加载指定 YAML 文件的内容,替换从 default.yaml 读取的基础配置。这种机制特别适合团队协作场景——将常用的参数组合保存为 YAML 文件,避免每次训练都输入长串参数。

框架还提供了 yolo copy-cfg 命令,将 default.yaml 复制到当前工作目录(命名为 default_copy.yaml),用户可在此基础上修改后使用。

Sources: __init__.py, __init__.py

键对齐校验与向后兼容

严格键名校验

check_dict_alignment() 函数确保用户不会因拼写错误而意外传入无效参数。当检测到 base 字典中不存在的键名时,它使用 difflib.get_close_matches() 搜索最相似的合法键名并给出建议:

'epoch' is not a valid YOLO argument. Similar arguments are i.e. ['epochs=100'].

这比直接报"无效参数"的用户体验好得多——用户能立即发现 epoch 少了 s。额外允许的键包括 augmentations(自定义 Albumentations 变换)和 save_dir(运行时生成)。

Sources: __init__.py

废弃参数迁移

框架内置了废弃参数处理机制 _handle_deprecation(),自动将旧参数名映射到新参数名:

废弃参数 新参数 转换逻辑
boxes show_boxes 直接映射
hide_labels show_labels 布尔取反
hide_conf show_conf 布尔取反
line_thickness line_width 直接映射
label_smoothing 已移除,弹出警告
save_hybrid 已移除,弹出警告
crop_fraction 已移除,弹出警告

注意 hide_labels → show_labelshide_conf → show_conf 不仅改变了名称,还反转了语义——从"隐藏"变为"显示"。

Sources: __init__.py

模型架构配置:YAML 定义网络结构

与运行时配置不同,模型架构 YAML 定义了神经网络的拓扑结构。这些文件位于 ultralytics/cfg/models/ 目录下,按版本和任务组织。

模型 YAML 的双轨体系

模型 YAML 文件分为通用模板(如 yolo26.yaml)和尺寸变体(通过 scales 字段):

ultralytics/cfg/models/
├── 26/                          # YOLO26 系列
│   ├── yolo26.yaml              # 检测通用模板
│   ├── yolo26-seg.yaml          # 分割通用模板
│   ├── yolo26-cls.yaml          # 分类通用模板
│   ├── yolo26-pose.yaml         # 姿态估计模板
│   ├── yolo26-obb.yaml          # 旋转框检测模板
│   ├── yolo26-p2.yaml           # P2 小目标检测
│   └── yolo26-p6.yaml           # P6 大尺度检测
├── v8/                          # YOLOv8 系列
├── v10/                         # YOLOv10 系列
├── v3-v9/                       # 历史版本
└── rt-detr/                     # RT-DETR 系列

当用户指定 yolo26n.yaml 时,yaml_model_load() 执行以下处理:

  1. 正则提取尺寸:从文件名 yolo26n.yaml 提取 n 作为 scale 标识
  2. 统一路径映射yolo26n.yaml → yolo26.yaml(去掉尺寸字母,加载通用模板)
  3. 注入 scale:将 d["scale"] = "n" 写入模型字典
  4. 构建时应用parse_model() 根据 scales.n = [0.50, 0.25, 1024] 缩放深度、宽度和最大通道数

模型 YAML 结构解析

yolo26.yaml 为例,其结构由三部分组成:

字段 含义 示例
nc 类别数 80 (COCO)
scales 各尺寸的 [depth, width, max_channels] 缩放因子 n: [0.50, 0.25, 1024]
backbone 骨干网络层定义列表 Conv, C3k2, SPPF, C2PSA
head 检测头/任务头层定义列表 Detect, Segment26, Pose26
end2end 是否使用端到端检测头 True
reg_max DFL 分 bin 数 1
kpt_shape 关键点形状(仅姿态) [17, 3]

每一层的定义格式为 [from, repeats, module, args],其中 from-1 表示来自上一层,列表表示多输入拼接。

任务头差异对比

不同任务的模型 YAML 共享相同的骨干网络,差异集中在 head 的最后一层:

任务 检测头模块 额外参数 额外参数字段
detect Detect [nc]
segment Segment26 [nc, 32, 256] 掩码通道数、原型数
classify Classify [nc] 无 FPN 结构
pose Pose26 [nc, kpt_shape] kpt_shape: [17, 3]
obb OBB26 [nc, 1] 角度参数

guess_model_task() 正是通过检查 head 最后一个模块的名称来推断任务类型的——这种"约定优于配置"的设计使得添加新任务只需创建新的 YAML 文件和对应的检测头模块。

Sources: tasks.py, yolo26.yaml, yolo26-seg.yaml, yolo26-cls.yaml, yolo26-pose.yaml, yolo26-obb.yaml

跟踪器配置

跟踪器配置独立于主配置体系,存放在 ultralytics/cfg/trackers/ 目录下。默认跟踪器为 botsort.yaml,可通过 tracker=bytetrack.yaml 切换。

两个跟踪器的参数对比:

参数 BoT-SORT ByteTrack 说明
tracker_type botsort bytetrack 后端类型
track_high_thresh 0.25 0.25 一阶段匹配阈值
track_low_thresh 0.1 0.1 二阶段匹配阈值
new_track_thresh 0.25 0.25 新建轨迹阈值
track_buffer 30 30 丢失帧保留数
match_thresh 0.8 0.8 关联相似度阈值
gmc_method sparseOptFlow 全局运动补偿
proximity_thresh 0.5 ReID 邻近阈值
appearance_thresh 0.8 外观相似度阈值
with_reid False 启用 ReID

BoT-SORT 在 ByteTrack 基础上增加了全局运动补偿(GMC)和可选的 ReID 特征融合,更适合相机运动场景。

Sources: botsort.yaml, bytetrack.yaml, default.yaml

实战:配置覆盖的完整流程

场景一:CLI 训练覆盖

yolo detect train data=coco8.yaml model=yolo26n.pt epochs=50 lr0=0.01 imgsz=640 batch=32

该命令的参数流转路径:

  1. entrypoint() 解析参数 → overrides = {"task": "detect", "mode": "train", "data": "coco8.yaml", "model": "yolo26n.pt", "epochs": 50, "lr0": 0.01, "imgsz": 640, "batch": 32}
  2. check_dict_alignment() 校验所有键名
  3. model.train(**overrides) → 内部执行:args = {**overrides, **custom, **kwargs, "mode": "train"}
  4. get_cfg() 合并默认值并校验类型
  5. 最终配置传递给 BaseTrainer(overrides=args)

场景二:Python API 覆盖

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
results = model.train(data="coco8.yaml", epochs=50, lr0=0.01)

在 Python API 中,model.overrides 已经包含了从模型文件读取的预设(imgsz, data, task),kwargs 则是用户传入的参数。合并时 kwargs 优先级最高,能覆盖任何预设。

场景三:自定义配置文件

# 第一步:复制默认配置
yolo copy-cfg

# 第二步:编辑 default_copy.yaml,修改 epochs=200, lr0=0.005, mosaic=0.8

# 第三步:使用自定义配置训练
yolo train cfg=default_copy.yaml model=yolo26n.pt data=coco8.yaml

自定义 YAML 文件的参数会替代 default.yaml 成为新的基础层,但仍可被 CLI 参数进一步覆盖。

Sources: __init__.py, model.py

配置流转总结

消费方

运行时合并

初始化阶段

YAML.load

IterableSimpleNamespace

default.yaml

DEFAULT_CFG_DICT

DEFAULT_CFG

get_cfg()

用户覆盖参数

最终配置 SimpleNamespace

BaseTrainer

BasePredictor

BaseValidator

Exporter

理解这套三层配置体系的核心在于把握一个原则:优先级从左到右递增——默认 < 模型预设 < 方法默认 < 用户参数。无论通过 CLI 还是 Python API,所有参数最终都汇入 get_cfg() 进行合并与校验,生成统一的 IterableSimpleNamespace 对象供训练器、预测器、验证器和导出器消费。

Sources: __init__.py


Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐