谨慎使用数据增强
针对部署摄像头测试每种数据增强,制定有依据的配置方案,使用该方案训练,并在训练批次中检查结果。
想象一条分拣流水线,需要区分红色胶囊和橙色胶囊,却使用默认的色调抖动进行训练。每个轮次都会让模型看到被染成橙色的红色胶囊,于是模型学会了颜色不重要,而颜色恰恰是它必须学会区分的特征。只有当部署摄像头确实可能生成相应变换后的图像时,数据增强才能让模型更稳健。本课将介绍一项测试,用它来决定保留哪些变换。
实践操作
数据增强的作用#

数据增强会在训练过程中实时变换图像,因此模型每个轮次都会看到每张图像的略微不同版本。合理的数据增强可以提高模型对光照、尺度和方向变化的鲁棒性,并减少过拟合,因为图像不断变化,模型无法记住图像。错误的数据增强会教会模型识别物理上不可能出现的场景,还会掩盖本应修复的数据集缺陷。
看看上方的色调面板:红色金刚鹦鹉变成了黄色。如果任务是区分“金刚鹦鹉”和“非金刚鹦鹉”,这无伤大雅;但如果颜色是区分两个类别的关键,这种变化就会造成破坏。
重要的默认设置#
以下是 Ultralytics 8.4 中的默认值;数据增强设置参考列出了所有参数:
| 参数 | 默认 | 作用 | 何时更改 |
|---|---|---|---|
hsv_h | 0.015 | 色调抖动 | 当颜色定义类别时设为 0 |
hsv_s / hsv_v | 0.7 / 0.4 | 饱和度和亮度抖动 | 光照固定且受控时调低 |
degrees | 0.0 | 随机旋转(±度数) | 当对象可能以任意角度出现时调高 |
translate / scale | 0.1 / 0.5 | 平移和缩放 | 裁剪可能切掉定义类别的部位时调低 |
fliplr | 0.5 | 水平翻转概率 | 当左右方向很重要(例如文字)时设为 0 |
flipud | 0.0 | 垂直翻转概率 | 俯视、航拍或显微镜视角下调高 |
mosaic | 1.0 | 将四张图像拼接成一张 | 很少使用;参见 close_mosaic |
close_mosaic | 10 | 在最后 N 个轮次关闭马赛克增强 | 训练轮次很少时调低 |
mixup / cutmix | 0.0 / 0.0 | 混合两张图像 / 将一张图像的局部贴到另一张图像上 | 先建立基线,再在小型数据集上尝试 |
copy_paste | 0.0 | 在图像之间粘贴对象实例 | 类别稀少的分割、语义分割和 OBB 数据集 |
深度数据集是个例外:mosaic、mixup、cutmix 和 copy_paste 会生成无效的配对深度图,因此深度数据加载器会自动将它们设为 0。
部署测试#
每种启用的变换都必须先通过一个问题的检验,再通过第二个问题的检验:
| 变换 | 是否真实? | 结论 |
|---|---|---|
| 室外摄像头亮度 ±30% | 是:一天中的不同时段 | 保留 |
| 安防摄像头水平翻转 | 是:人会从两个方向行走 | 保留 |
| 安装在墙上的摄像头垂直翻转 | 否:地面始终在底部 | 禁用 |
| 俯视传送带相机的垂直翻转 | 是:画面里没有“上” | 启用 |
| 固定道路相机旋转 90° | 否:相机从不旋转 | 禁用 |
| 红色和绿色部件属于不同类别时的色相偏移 | 否:会破坏信号 | 禁用 |

对于一架垂直向下观察的无人机来说,倒置的金刚鹦鹉是一张很好的训练图像;对于一台固定在墙上的相机来说,它却毫无用处。无法通过这项检验的变换会产生负面的训练信号:模型学会识别它永远不会看到的图像,却因此损失了学习实际会遇到的图像的能力。
一个完整示例配置#
传送带上方的俯视相机负责分拣仅颜色不同的部件。必须去掉色相抖动,同时垂直翻转和小幅旋转则符合实际情况。以下示例使用 COCO8 演示集运行;替换为你自己的数据 YAML,并设置实际的训练轮数:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.train(
data="coco8.yaml",
epochs=1,
imgsz=320,
hsv_h=0.0, # 颜色是类别信号:保持色相真实
flipud=0.5, # 俯视视角:画面中没有“上方”
degrees=10.0, # 零件可能以任意小角度落下
)在运行目录中打开 train_batch0.jpg 并检查三项:变换后边界框是否仍然贴合目标,定义类别的线索(颜色、形状、文字)是否保留,以及画面是否存在物理上不可能的情况。任何一项不符合,就调低相应变换的幅度。训练你的第一个模型介绍了训练过程本身。
Mosaic 和 close_mosaic#

Mosaic 会将四张图像拼接成一张,并且默认启用。它是检测任务中效益最高的增强方式:每张训练图像都包含多个场景、尺度和目标上下文。但 Mosaic 图像与部署时的画面并不相似,因此 close_mosaic=10 会在最后 10 个训练轮次将其关闭,让模型在真实输入上完成训练。关闭 Mosaic 也会同时关闭 mixup、cutmix 和 copy_paste,而翻转、HSV 和几何变换仍会继续运行。
在不超过 close_mosaic 个训练轮次的运行中(包括上面的单轮次配置),从第一个训练轮次开始就会关闭 mosaic。应根据完整运行的 train_batch0.jpg 来评估 mosaic,而不是依据冒烟测试。
数据增强无法解决的问题#
数据增强只能放大已有数据的作用。如果数据集中没有夜间图像,无论怎么设置都无法生成夜景:只能生成更亮或更暗的日间图像。如果某个类别只有在强力增强后才能识别,说明该类别的数据量不足。请返回收集高质量、有代表性的数据。
对小型数据集把所有数据增强都调到最大,会让模型训练所用图像越来越偏离部署环境,验证集 mAP 往往也会下降。每次只更改一个参数,并说明理由;同时在相同的数据划分上与默认基线进行比较。
如果某个类别由物体的一小部分定义,例如扑克牌角落上的符号,mosaic、translate 和 scale 可能会把这部分裁掉,生成一张看起来与另一个类别完全相同的训练图像。针对该数据集调低这些值,并在 train_batch0.jpg 中确认修复效果。
显示解答
一架无人机从正上方勘察港口,并使用有向边界框检测船只。从这个视角看,画面里没有“上”,船只朝向各不相同,而且颜色不能定义类别:
| 参数 | 选择 | 理由 |
|---|---|---|
flipud | 0.5 | 俯视画面垂直翻转后看起来仍然相同 |
degrees | 180 | 船只的朝向各不相同 |
hsv_h | 默认 | 船体颜色各不相同,不能作为类别判别信号 |
mosaic | 默认 | 每张图像中都有许多小目标;Mosaic 有帮助 |
在 DOTA8 航拍演示集上:
yolo obb train data=dota8.yaml model=yolo26n-obb.pt epochs=1 imgsz=320 flipud=0.5 degrees=180对于固定的街道相机,同样的两项更改无法通过部署检验:壁挂相机的画面里,汽车永远不会上下颠倒。