查看 Markdown

libreyolo train

在一个数据集上训练一个模型,并把检查点(checkpoint)、指标和日志写进运行目录。下面每个参数都有一个来自命令定义的默认值,而模型家族自己的训练配置可能会替换它。

命令
libreyolo train
必填
data
输出
检查点、指标和日志,位于 runs/train/<name>;不带 name= 时使用家族自己的运行名,例如 yolo9_exp

概要

bash
libreyolo train data=<dataset.yaml> [model=<name|path>] [key=value ...]

参数是 key=value 形式的键值对,POSIX 形式同样可用,所以 epochs=50 和 --epochs 50 是同一个参数。布尔值接受 true 和 false:对于带否定形式的 标志,amp=false 会变成 --no-amp。

参数

模型与数据

参数默认值含义
data数据集 YAML 的路径(YOLO 格式,例如 coco8.yaml)。必填
modelyolox-s模型名称或权重路径
task显式覆盖任务:detect、segment、semantic、pose、classify、gaze、obb、point、depth
pretrainedtrue使用预训练权重。false 会构建架构并从头训练
allow_download_scriptsfalse允许数据集 YAML 下载块中内嵌的 Python 代码

训练循环

参数默认值含义
epochs300训练轮数
batch16批大小。使用多张 GPU 时它是全局批大小,平均分到各张卡上
imgsz640训练图像尺寸:640(正方形)或 480x640(高×宽)
deviceauto设备:0、cpu、mps、auto。传入 0,1 或 [0,1] 这样的 GPU 列表时在这些 GPU 上训练
workers4数据加载器的工作进程数
cachefalse缓存图像以加快数据加载:ram、disk、true、false
seed0随机种子
resume断点续训:true,或指向某个检查点的路径
amptrue自动混合精度
amp_dtypefloat16CUDA AMP 的 dtype:float16 或 bfloat16
cuda_graphfalse把训练的前向和反向捕获进 CUDA 图。仅限单 GPU 和受支持的家族,其余家族按 eager 模式运行
compilefalse用 torch.compile 编译训练网络:true、false、default、reduce-overhead、max-autotune、max-autotune-no-cudagraphs。仅限单个 CUDA GPU;其他运行按 eager 模式训练并给出警告
lorafalseLoRA 微调,适用于「注意事项」中列出的 transformer 家族
freeze冻结层:一个整数数量、一个索引列表,或模块名

蒸馏

参数默认值含义
distill_model教师:一个检测器检查点,或用于骨干特征蒸馏的基础教师 id,例如 dinov2
dis蒸馏损失权重。未设置时采用该损失类型公开的默认值
distill_loss_typemgd检测器教师使用的特征损失:mgd、cwd。基础教师始终使用 feat_mse

优化器

参数默认值含义
optimizersgd优化器:sgd、adam、adamw
lr00.01初始学习率
momentum0.937SGD 动量,以及 Adam 系优化器的一阶矩系数
weight_decay0.0005L2 正则化
nesterovtrueNesterov 动量
clip_max_norm每次优化器步进之前把梯度的 L2 范数裁剪到这个值;0 关闭裁剪。未设置时采用家族自己的值

调度器

参数默认值含义
scheduleryoloxwarmcos学习率调度类型
warmup_epochs5预热时长
warmup_lr_start0.0预热的初始学习率
min_lr_ratio0.05最小学习率比例
lr_drop100RF-DETR 阶梯式学习率下降的轮次

数据增强

参数默认值含义
mosaic1.0Mosaic 概率
mixup1.0Mixup 概率
hsv_prob1.0HSV 抖动概率
flip_prob0.5水平翻转概率
degrees10.0旋转范围,正负两个方向,单位为度
translate0.1平移比例
shear2.0错切角度
mosaic_scale(0.1,2.0)Mosaic 缩放范围
mixup_scale(0.5,1.5)Mixup 缩放范围
no_aug_epochs15最后 N 轮关闭数据增强

EMA

参数默认值含义
ematrue指数移动平均
ema_decay0.9998EMA 衰减系数

训练中的验证

参数默认值含义
valtrue训练过程中做验证
eval_interval10每 N 轮验证一次,最后一轮结束后也会验证
max_det300验证 NMS 之后每张图像的最大预测数
eval_max_detCOCO 评估器的上限。未设置时采用 pycocotools 的 AP@100 惯例
faster_coco_evaltrue装有 faster-coco-eval 时,用它的 C++ 后端计算 COCO 指标;否则回退到 pycocotools
save_plotsfalse训练过程中保存最终的验证图表
patience50早停的耐心值。0 表示禁用

输出

参数默认值含义
projectruns/train输出目录的根路径
name实验名称。未设置时,运行名取家族 train() 使用的名字,例如 yolo9_exp 或 dfine_exp
exist_okfalse复用已存在的输出目录
save_period10每 N 轮保存一次检查点
log_interval10每 N 个批次记录一次损失

agent 标志

参数默认值含义
jsonfalse向 stdout 输出 JSON
quietfalse抑制 stderr
dry_runfalse解析并打印配置,但不执行
help_jsonfalse把命令 schema 以 JSON 形式打印出来并退出
参数默认值含义
min_samples0小数据集的每轮长度下限:当数据集图像较少时,每轮有放回地抽取此数量的样本(0 = 关闭)
class_balancedFalse对长尾数据集使用 LVIS 风格的重复因子采样(默认关闭)
cls_pw0.0分类逆频率加权的幂次:0 关闭,1 完全启用(类别权重均值为 1;不能与 class_weights=True 合用)
class_weightsFalse旧的按样本数归一化的分类损失权重(默认关闭)
single_clsFalse对支持的检测器训练,将全部标签重新映射到类别 0
classesNone对支持的检测器仅使用指定的原始数据集类别 ID 训练,以逗号分隔(如 '0,3,5');其他类别均作为未标注丢弃。ID 保持原值,不压缩编号
average_best0训练结束时,对监控指标最好的 N 个检查点均匀平均,写入 weights/average.pt(0 = 关闭)
export_checkFalse在第 1 轮之前导出 ONNX,导出失败则终止训练(默认关闭)
precise_bn0最后一轮后,用此数量的训练图像重新计算 BatchNorm 运行统计量(0 = 关闭)
aux_weight仅 YOLO9:PGI 辅助分支的损失权重。给定一个值会按该权重挂上一个新分支,0 只训练主 head。未设置时,只有当权重带有 PGI 张量或从头训练时,才会以 0.25 挂上该分支
fliplrNone水平翻转概率(flip_prob 的生态别名)
flipud0.0垂直翻转概率
auto_augmentNone分类自动增强策略:randaugment、autoaugment、augmix(默认无)
erasing0.0分类 RandomErasing 概率,0 <= erasing < 1
cutmix0.0分类 CutMix 概率(软标签)
scale0.5分类 RandomResizedCrop 面积范围:浮点下限或显式 (min,max)
crop_pctNone分类评估中心裁剪前的缩放比例(默认模型家族原生值)
plot_samples8验证样例图中的图像数:0 为不绘制,-1 为全部验证图像(不改变指标)

示例

基本用法
# coco8.yaml 随包一起分发,首次使用时会下载它的 8 张图片libreyolo train model=LibreYOLO9s.pt data=coco8.yaml epochs=10 imgsz=640 batch=8
先查看解析后的配置
# 打印这次运行会使用的配置,包括家族默认值,然后退出,# 既不训练也不加载数据libreyolo train model=LibreDFINEn.pt data=coco8.yaml epochs=10 dry_run=true
命名运行,显式指定超参数
libreyolo train model=LibreYOLO9s.pt data=coco8.yaml \  epochs=50 batch=8 optimizer=adamw lr0=0.001 weight_decay=0.0001 \  patience=20 save_period=5 project=runs/train name=yolo9s-coco8 exist_ok=true

注意事项

上面的默认值不一定就是实际用到的值

每个模型家族都带着自己的训练配置,只要该配置与基础配置不同,对于你没有显式 设置的参数,它的值就会替换命令的默认值。你自己设置的参数始终优先。 libreyolo cfg 会打印基础默认值和各家族的覆盖值,这是查看某个家族实际会用 什么的办法。

imgsz 是这件事影响最大的参数。命令默认值是 640,而它并不是每个检查点的 原生输入:RF-DETR 公开的检测尺寸是 384、512、576 和 704,YOLOX 的 n 和 t 检查点是 416。RF-DETR 和 DEIMv2 的处理方式是只在显式设置时才转发 imgsz,否则它们自己的尺寸继续生效。其他家族会按给定值拿到它,并以该尺寸 训练。FOMO 是最严格的一个:每种尺寸只接受它自己的原生输入(96、192 和 224),所以一次 FOMO 训练需要把 imgsz 设成匹配的值,否则会报错停止。 RF-DETR 还要求这个值能被它的 patch 尺寸乘以窗口数量整除,不满足时会报出最 接近的两个合法尺寸。

家族会忽略的参数

并不是每个家族都会读取每个参数,数据增强这一组就是体现得最明显的地方。 RF-DETR、D-FINE、DEIM、DEIMv2、RT-DETRv4 和 DINOv2 通过直通式流水线训练, 没有 mosaic、没有 mixup、也没有仿射变换,所以 mosaic、mixup、 hsv_prob、degrees、translate、shear、mosaic_scale 和 mixup_scale 在那里落不到实处。EC 共用同一条流水线,但当它的任务是姿态时 确实会读取 hsv_prob、degrees 和 translate。分类家族会忽略这组参数, 但 mixup 除外,它在分类家族上是批量 MixUp;它们还会读取 flip_prob。 SegFormer、LingBot-Vision 和 NAFNet 会忽略整组参数,连 flip_prob 一起,因为它们的翻转按固定 概率运行,而不是一个可配置的概率。YOLO-NAS 只忽略 mosaic,因为它改用一直开启的逐 样本仿射变换来做增强。RF-DETR 在这份清单之外还要再忽略三个:optimizer、 momentum 和 nesterov。

设置其中某一个并不是错误。运行时会向 stderr 打印一行日志,写明家族以及它将 忽略的参数,然后开始训练,那一行就是所安装版本的权威清单。它也是唯一的信 号,所以带 quiet=true 的脚本化运行会连同 stderr 上的其他内容一起把这条警 告压掉。

val=false 是与此相关的一种情况。它会把 eval_interval 设为 0,从而关闭 训练中的验证,最后一轮也包括在内,这次运行不会写出 best.pt。

其他值得了解的行为

lora=true 会被 RF-DETR、D-FINE、DEIM、DEIMv2、RT-DETR v1、v2 和 v4、EC、 GTR 以及 ConvNeXt 接受。其他任何家族都会以 config_unsupported 退出,而不是在没 有它的情况下训练。

clip_max_norm 被训练配置里声明了它的家族接受:YOLOv9、YOLOv9-E2E 和 YOLOv9-P2, 默认值为 10;以及 D-FINE、Dome-DETR、DEIM、DEIMv2、TinyFormer、RT-DETR、 RT-DETRv2、RT-DETRv4、RF-DETR、DINOv2 和 GTR,默认值为 0.1。其他任何家族都会以 config_unsupported 退出,负值或非有限值会以 config_type_error 退出。

device=0,1 在列出的第一张 GPU 上构建模型,并把列表传给 train(),由它为每张 GPU 启动一个进程。见多卡训练。

RF-DETR 没有从检测到分割的迁移。task=segment 配合 RF-DETR 分割检查点时,不论文件名 如何都会加载那个检查点,因为任务由检查点元数据决定;而检测检查点会报错停止,而不是去 训练一个未经训练的掩码 head。

pretrained=false 与 resume 同时使用,在支持从头训练的家族上会被拒绝,因 为这两者要求的是相反的事情。

mosaic 和 mixup 是配置字段 mosaic_prob 和 mixup_prob 的命令行写法;在分类 模型上,mixup 则是批量 MixUp。在 mixup 只作用于 mosaic 样本的家族上, mixup 大于零而 mosaic 为零时永远不会触发,运行时也会这样提示。

dry_run=true 会解析模型引用、应用家族默认值,并打印它将用来训练的配置。它 不会加载数据集,所以这是确认某个参数是否取到你预期值的廉价办法。

stdout 承载最终的结果对象;进度和警告走 stderr。退出码在成功时是 0,用法 或配置错误是 2,找不到或读不了数据集是 3,模型加载不了是 4,其他运行 时故障是 1。

相关:libreyolo doctor 用于在正式开跑之前检查数据集, libreyolo monitor 用于在浏览器里观察一次运行, libreyolo val 用于衡量结果。

已针对 LibreYOLO v1.6.0 验证。