数据增强
数据增强由 TrainConfig 上的参数配置,但每个模型家族跑的是自己的训练流水线,而一条没有 mosaic 分支的流水线会直接忽略 mosaic_prob,而不是拿别的东西去近似它。
设置这些参数
数据增强参数就是普通的 train() 参数。
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt")model.train( data="my-dataset.yaml", epochs=100, mosaic_prob=1.0, mixup_prob=0.15, hsv_prob=1.0, flip_prob=0.5, no_aug_epochs=15,)# CLI 把 mosaic_prob 写作 mosaic,把 mixup_prob 写作 mixuplibreyolo train model=LibreYOLO9s.pt data=my-dataset.yaml \ epochs=100 mosaic=1.0 mixup=0.15 hsv_prob=1.0 \ flip_prob=0.5 no_aug_epochs=15其中三个有更短的写法,train() 和 CLI 都接受:mosaic 对应 mosaic_prob,fliplr
对应 flip_prob,在检测上 mixup 对应 mixup_prob。同时传入简短写法和它对应的字段
且取值不同时会报错。其余参数在两边的写法完全一致。
三种状态,而不是两种
一个参数是否真的起作用,取决于家族。库里维护了一张声明式的表,每一项都是三种状态 之一。
used 表示这个参数会进入流水线并改变样本。ignored 表示它根本进不了流水线,设了
也没用。gated_by_mosaic 表示它只作用于走了 mosaic 分支的样本,所以在
mosaic_prob=0 时,即使它已经接好了线也永远不会触发。
第三种状态才是让人意外的那个。在 YOLOX 风格的流水线上,仿射变换跑在 mosaic 画布
上,MixUp 混合的也是 mosaic 样本,所以 mosaic_prob=0 会一次性悄悄关掉
degrees、translate、shear、perspective、mosaic_scale、mixup_prob 和
mixup_scale。训练器只针对 MixUp 这种情况打了一条警告:
mixup_prob=0.15 has no effect for YOLOv9: mixup only applies to mosaic samplesand mosaic_prob=0. Set mosaic_prob > 0 to enable mixup.CLI 也会对被忽略的参数发出警告,而且只列出你真正写了的那几个:
Warning: RF-DETR ignores these parameters: degrees, mosaic四种流水线形态
各个家族归到四条训练流水线里,而流水线几乎决定了所有答案。
YOLOX 风格的 mosaic 流水线按样本做 HSV 抖动和翻转,然后在 mosaic 分支里跑仿射变换 和 MixUp。它覆盖 YOLOX、YOLOv7、YOLOv9 及其 E2E 和 P2 变体、RTMDet、PicoDet、 RT-DETR、RT-DETRv2 和 FOMO。
DETR 风格的直通流水线既没有 mosaic 也没有仿射变换。它的光度失真、zoom-out 和 IoU
裁剪都是配方里的常量,而不是配置参数,所以只有 flip_prob 和 no_aug_epochs 是
活的。它覆盖 D-FINE、Dome-DETR、DEIM、DEIMv2、RT-DETRv4、EC,以及改了一处的
RF-DETR。
分类 ImageFolder 流水线有自己的数据增强控制。flip_prob 控制水平翻转,默认为 0.5;fliplr 是它的别名。
YOLO-NAS 自成一种形态:完全没有 mosaic,逐样本的仿射变换始终开着,MixUp 是独立应用
的,而不是被门控的。它的 mosaic_scale 值被复用为仿射变换的缩放范围。
SegFormer、LingBot-Vision 和 NAFNet 各自跑一条任务专属的流水线,其随机性写死在家族里,不可配置。对
SegFormer 和 LingBot-Vision 来说,活的参数是类属性 semantic_scale_jitter 和 semantic_hsv_prob,
而不是 mosaic_scale 和 hsv_prob。NAFNet 的裁剪和翻转是输入与目标耦合的操作,概
率固定为 0.5。
哪个家族认哪个参数
下面这张表就是随库分发的 spec,位于 libreyolo/data/augment/spec.py,库自己的测试
会拿它和真实的流水线接线做断言。请直接去那里读,而不是从架构去推。
from libreyolo.data.augment.spec import AUG_KNOBS, aug_support for knob, description in AUG_KNOBS.items(): support = aug_support("yolo9")[knob] print(f"{knob:16} {support.status:16} {support.note or description}")from libreyolo.data.augment.spec import ignored_aug_params print(sorted(ignored_aug_params("rfdetr")))按流水线汇总,只看基础参数:
| 参数 | YOLOX 风格 | YOLO-NAS | DETR 风格 | 分类 |
|---|---|---|---|---|
mosaic_prob | 使用 | 忽略 | 忽略 | 忽略 |
mixup_prob | 由 mosaic 控制 | 使用 | 忽略 | 忽略 |
hsv_prob | 使用 | 使用 | 忽略 | 忽略 |
flip_prob | 使用 | 使用 | 使用 | 使用 |
flipud | 使用 | 使用 | 忽略 | 使用 |
degrees | 由 mosaic 控制 | 使用 | 忽略 | 忽略 |
translate | 由 mosaic 控制 | 使用 | 忽略 | 忽略 |
shear | 由 mosaic 控制 | 使用 | 忽略 | 忽略 |
perspective | 由 mosaic 控制 | 使用 | 忽略 | 忽略 |
mosaic_scale | 由 mosaic 控制 | 使用 | 忽略 | 忽略 |
mixup_scale | 由 mosaic 控制 | 使用 | 忽略 | 忽略 |
no_aug_epochs | 使用 | 使用 | 使用 | 使用 |
这些列内部还有一些例外,全都是收窄的:
- RTMDet、PicoDet、RT-DETR、RT-DETRv2 和 FOMO 没有垂直翻转,所以
flipud被忽略。 FOMO 的 mosaic 包装器构建时也不带 perspective。 - RF-DETR 原生的流水线没有 HSV 抖动,所以在 DETR 风格那一列之外,
hsv_prob也被 忽略。 - EC 认
hsv_prob、degrees和translate,但仅限task="pose",因为只有它那个 感知关键点的变换会读这些值。它的 detect 和 segment 路径用的是固定的光度配方。 - DINOv2 的 detect 和 semantic 任务遵循 DETR 风格那一列,并为
task="classify"加 上分类参数包。
no_aug_epochs 在所有流水线中都是 used,但含义并不相同。在 mosaic 流水线中,它会在最后几轮关闭 mosaic 和 MixUp。在 DETR 风格流水线中,它停止光度、缩小和裁剪数据增强,并控制学习率调度的尾段。在分类流水线中,它禁用自动增强、擦除、MixUp 和 CutMix;裁剪与翻转保留。
perspective 在旋转、缩放、剪切和平移之上再加一个投影变换。画布的每个角点向内移动一个随机量,每个轴最多为 min(perspective * 100, 0.2) 乘以画布边长的一半,所以 perspective=0.001 在任何分辨率下最多把一个角点移动边长的 5%,而从 0.002 起的每个取值都达到同一个最大值。默认值 0 让变形保持为仿射,负值会在第一个样本被变形时抛出 ValueError。YOLOv9 及其 E2E 和 P2 变体、YOLOX、YOLOv7、YOLO-NAS、PP-YOLOE、RTMDet、PicoDet、RT-DETR 和 RT-DETRv2 都会应用它。
YOLOv9 的 mosaic 流水线中的 MixUp(YOLOv9 及其变体、YOLOv7、RT-DETR 和 RT-DETRv2 都经由它训练)从 Beta(1, 1) 中抽取混合比例,即在 [0, 1] 上均匀分布。YOLOX、RTMDet 和 PicoDet 使用的 YOLOX mosaic 封装则以固定的 0.5 混合。
分类参数包
有四个参数只驱动分类流水线,别的什么都不驱动。检测家族对这四个一律忽略。
from libreyolo import LibreYOLO model = LibreYOLO("LibreConvNeXtt-cls.pt")model.train( data="my-classification-dataset", epochs=50, auto_augment="randaugment", erasing=0.25, mixup=0.2, cutmix=0.2,)auto_augment 接受 "randaugment"、"autoaugment"、"augmix" 或 None。
erasing 是 RandomErasing 的概率。mixup 和 cutmix 是按批生效的概率,产生软标
签;每批最多跑一个,MixUp 优先,所以两者是相加的,总和不应超过 1。
四个默认都是关的,所以除非你主动要求,分类训练不会有任何变化。
train() 和 CLI 按任务分发 mixup:分类使用批量混合,检测使用 mixup_prob。
scale=0.5 表示随机裁剪面积范围为 (0.5, 1.0);显式传入一对数值可设置两个边界。crop_pct=None 保留家族的评估缩放比例;覆盖它会影响训练期间和验证的评估,而导出保持家族原生预处理。
CLI 提供 auto_augment、erasing、cutmix、fliplr 和 flipud。分类 mixup 表示批量混合,默认为 0.0。水平翻转默认为 0.5,垂直翻转默认为 0.0。mixup + cutmix 不得超过 1。
no_aug_epochs 在最后几轮禁用自动增强、擦除、MixUp 和 CutMix,保留裁剪与翻转。分类配方默认将这个尾段设为 0。
家族专属参数
有些参数挂在某个家族的配置子类上,而不是基类上,所以它们只对那个家族存在,也没有 CLI flag。
| 家族 | 参数 | 作用 |
|---|---|---|
| YOLOv9, YOLOv9-E2E, YOLOv9-P2 | copy_paste | copy-paste 实例增强的概率,仅 task="segment" |
| YOLOv9, YOLOv9-E2E, YOLOv9-P2 | copy_paste_mode | "flip" 复用同一张样本的镜像,"mixup" 会再取一张样本 |
| YOLOv9, YOLOv9-E2E, YOLOv9-P2 | rot90 | 随机 90 度旋转的概率 |
| YOLOv9、YOLOv9-E2E、YOLOv9-P2 | max_labels | 训练变换里每张图的真值(ground truth)上限,默认 300 |
| RF-DETR | copy_paste, copy_paste_mode | 用于 task="segment" 的 copy-paste,仅 "flip" 模式 |
| RF-DETR, D-FINE, EC | crop_resize_prob | 随机裁剪缩放的概率 |
| EC, YOLO-NAS | brightness_contrast_prob, affine_prob | pose 路径的抖动概率和感知关键点的仿射变换概率 |
max_labels 是那个会丢数据的参数。超过上限的检测框会被丢掉,只发出一次警告而不报错,所以
航拍这类密集图像需要把它调大。标签分配的内存取决于批次中最密集的那张图像,而不是这个上限。
不管参数怎么设,旋转框训练都会禁用 mosaic 和 MixUp,因为针对旋转框、感知角点的增强 还没有实现。