查看 Markdown

数据增强矩阵

设置一个数据增强参数,并不保证它真的会到达流水线。本页记录每个可训练家族如何对待 TrainConfig 上的每个参数,依据的是库自带的那张声明式表格——它是唯一的事实来源。

参数一览

这些是 TrainConfig 的字段名,不是 CLI 的写法。train() 和 CLI 会把简短写法映射到 它们上面,所以 mosaic 设置的是 mosaic_prob。

参数含义
mosaic_prob构建一个 4 图 mosaic 样本的概率
mixup_prob混入第二个样本的概率
hsv_probHSV 颜色抖动的概率
flip_prob水平翻转概率
degrees仿射变换的随机旋转范围,单位为度
translate仿射变换的随机平移比例
mosaic_scale仿射变换的随机缩放范围
mixup_scale施加在 MixUp 配对图像上的抖动缩放范围
shear仿射变换的随机错切范围,单位为度
perspective叠加在仿射变换上的投影变换强度:画布四角每个轴向内移动,最多为 min(perspective * 100, 0.2) 乘以画布边长的一半;0 表示关闭
flipud垂直翻转概率
no_aug_epochs训练末尾关闭强增强的轮数
auto_augment分类的 AutoAugment 策略:randaugment、autoaugment 或 augmix
erasing分类的 RandomErasing 概率
mixup分类的 batch-MixUp 概率,带软标签
cutmix分类的 batch-CutMix 概率,带软标签

最后四项属于分类参数组。检测家族忽略它们。train() 和 CLI 将分类器的 mixup 分发到分类批量混合,将检测器的 mixup 分发到 mixup_prob。

直接查询 spec
from libreyolo.data.augment.spec import (    AUG_KNOBS,    aug_support,    ignored_aug_params,    uses_mosaic_gating,) print(sorted(AUG_KNOBS)) table = aug_support("yolo9")print(table["mixup_prob"].status, table["mixup_prob"].note) print(sorted(ignored_aug_params("dfine")))print(uses_mosaic_gating("yolo9"), uses_mosaic_gating("yolonas"))

三种状态

状态含义
used参数会到达该家族的训练流水线,并改变样本
gated_by_mosaic参数只作用于走了 mosaic 分支的样本,所以当 mosaic_prob == 0 时它永远不会触发
ignored参数永远到不了流水线;设置它没有任何效果

ignored 是开始训练之前值得检查的那一个,因为不会有任何东西报错。当显式设置的某个训练 参数正好是所选家族忽略的参数时,CLI 会发出警告;当 mixup_prob > 0 却因为该家族把 MixUp 门控在 mosaic 上、而 mosaic_prob 为零而无法触发时,训练器会发出警告。

流水线原型

本页覆盖的每个家族都遵循六种流水线之一,个别家族另有偏差,列在下面。

参数YOLOX 风格YOLO-NASDETR 风格分类语义分割图像恢复
mosaic_prob使用忽略忽略忽略忽略忽略
mixup_prob受门控使用忽略忽略忽略忽略
hsv_prob使用使用忽略忽略忽略忽略
flip_prob使用使用使用使用忽略忽略
degrees受门控使用忽略忽略忽略忽略
translate受门控使用忽略忽略忽略忽略
mosaic_scale受门控使用忽略忽略忽略忽略
mixup_scale受门控使用忽略忽略忽略忽略
shear受门控使用忽略忽略忽略忽略
perspective受门控使用忽略忽略忽略忽略
flipud使用使用忽略使用忽略忽略
no_aug_epochs使用使用使用使用使用使用
auto_augment忽略忽略忽略使用忽略忽略
erasing忽略忽略忽略使用忽略忽略
mixup忽略忽略忽略使用忽略忽略
cutmix忽略忽略忽略使用忽略忽略

在 YOLOX 式流水线里,逐样本的预处理会施加 HSV 抖动和翻转,而仿射变换和 MixUp 只在 mosaic 分支内部运行。YOLO-NAS 则是跑一个始终开启的逐样本仿射,忽略 mosaic,并独立 施加 MixUp,把 mosaic_scale 复用为仿射的缩放范围。

DETR 风格流水线是没有 mosaic 的直通变换。光度畸变、缩小和 IoU 裁剪是配方常量,不是可配置参数,因此 hsv_prob 和几何参数不会传入这条流水线。分类使用 flip_prob 控制水平翻转,使用 flipud 控制垂直翻转。语义分割的尺度扰动和 HSV 来自家族类属性,而不是配置参数;图像恢复的翻转同时作用于输入与目标,概率固定为 0.5。

no_aug_epochs 在各处都生效,但关闭的内容不同:YOLOX 风格关闭 mosaic 和 MixUp,YOLO-NAS 关闭仿射和 MixUp,DETR 风格关闭强光度与裁剪增强并调整学习率尾段,分类关闭自动增强、擦除、MixUp 和 CutMix。分类的裁剪和翻转保持启用。

各原型下的家族

原型家族
YOLOX 式yolox、yolo7、yolo9、yolo9_e2e、yolo9_p2、rtmdet、picodet、rtdetr、rtdetrv2、fomo
YOLO-NASyolonas、ppyoloe
DETR 式dfine、gtr、domedetr、deim、deimv2、tinyformer、rtdetrv4、rfdetr、ec、dinov2
分类resnet、convnext、convnextv2、mobilenetv4、efficientnetv2
语义分割segformer、unet、lingbotvision
复原nafnet

一共覆盖三十一个家族。不在这份列表里的家族会返回一个空的忽略集合,所以不会为它发出 任何警告。

偏差

家族与其原型的差异
rtmdet忽略 flipud:它的变换里没有垂直翻转
picodet忽略 flipud
rtdetr忽略 flipud
rtdetrv2忽略 flipud
fomo忽略 perspective 和 flipud
ppyoloe忽略 flipud:源配方改用随机 90 度旋转
gtr会使用 mosaic_prob 和 mixup_prob,作用于前 mosaic_epochs 轮;degrees、translate 和 mosaic_scale 决定 mosaic 之后的仿射
ec会使用 hsv_prob、degrees 和 translate,但仅限 task="pose";detect 和 segment 使用固定的光度配方
dinov2会使用分类那一组,但仅限 task="classify"

ec 和 dinov2 是多任务家族,所以只有当该家族每一个可训练任务都忽略某个参数时,这 个参数才会被标为 ignored。这样一来,CLI 的警告就不会出现对一个任务说错、对另一个任 务说对的情况。

Dome-DETR 原样继承 D-FINE 的变换。它唯一吃不下的是多尺度训练,而关掉它的是它自己的 配置文件,不是数据增强 spec。

家族专有参数

有些家族把数据增强参数挂在自己的 TrainConfig 子类上,而不是基类上。CLI 不暴露这些 参数;请通过 Python API 设置。

家族参数含义
yolo9、yolo9_e2e、yolo9_p2copy_pastecopy-paste 实例增强的概率,仅限 task="segment"
yolo9、yolo9_e2e、yolo9_p2copy_paste_modecopy-paste 的来源:flip 镜像同一个样本,mixup 使用第二个样本
yolo9、yolo9_e2e、yolo9_p2rot90随机 90 度旋转的概率
rfdetrcopy_pastetask="segment" 的 copy-paste 概率,仅支持 flip 模式
rfdetrcopy_paste_modetask="segment" 的 copy-paste 来源模式
rfdetrcrop_resize_prob原生流水线里随机裁剪缩放的概率
dfinecrop_resize_prob随机裁剪缩放的概率,task="segment"
eccrop_resize_prob随机裁剪缩放的概率,task="segment"
ec、yolonasbrightness_contrast_prob亮度和对比度抖动的概率,task="pose"
ec、yolonasaffine_prob关键点感知的仿射概率,task="pose"

在 yolo9 上,rot90 作用于 detect 和 OBB。

查询 spec

辅助函数返回
aug_support(family)参数到 Support 的对照表,未知家族返回 None
ignored_aug_params(family)该家族忽略的参数名集合;未知家族返回空集合
uses_mosaic_gating(family)该家族的 MixUp 是否只在 mosaic 样本上触发
display_name(family)警告里使用的、面向人的家族名
mixup_gating_warning(family, mosaic_prob, mixup_prob)MixUp 永远无法触发时的警告文本,否则为 None

Support 是一个由 status 和 note 组成的具名元组,其中 note 说明某个参数为什么在 该家族上被忽略或被门控。

mosaic 门控

对 YOLOX 式家族来说,mixup_prob=0.5 配上 mosaic_prob=0 会完全关掉 MixUp,因为 MixUp 只作用于 mosaic 样本。在训练后期关掉 mosaic 时,很容易凑出这个组合。训练器会 记一条点名该家族的警告,mixup_gating_warning 就是它背后的纯函数。

参数列表、状态、原型、各家族的差异以及辅助函数,均读自 v1.6.0 的 libreyolo/data/augment/spec.py。那张表格由 tests/unit/test_augment_spec.py 锁定到真实的流水线上。