Ultralytics YOLO27: 加入候补名单。
Get Started
构建高性能 YOLO 数据集·准备·课程 7/10
课程初级

谨慎使用数据增强

针对部署摄像头测试每种数据增强,制定有依据的配置方案,使用该方案训练,并在训练批次中检查结果。

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

学习成果

为每个改动的参数选择数据增强配置,并给出一句部署场景方面的理由;使用该配置训练,并在 train_batch0.jpg 中验证。

快速通道
如果你已经熟悉相关内容,以下是简要版。
  1. 首先使用默认数据增强进行训练,并记录基线结果。

  2. 禁用摄像头绝不可能生成的变换,例如当颜色定义类别时禁用色调偏移。

  3. 启用摄像头可能生成的变换,例如为俯视视角使用 flipud。

  4. 打开 train_batch0.jpg,确认边界框贴合目标,且类别特征仍然清晰。

实践操作

数据增强的作用#

同一张金刚鹦鹉照片的数据增强效果:水平翻转、裁剪、中值模糊、对比度调整、色调-饱和度-明度偏移和伽马调整

数据增强会在训练过程中实时变换图像,因此模型每个轮次都会看到每张图像的略微不同版本。合理的数据增强可以提高模型对光照、尺度和方向变化的鲁棒性,并减少过拟合,因为图像不断变化,模型无法记住图像。错误的数据增强会教会模型识别物理上不可能出现的场景,还会掩盖本应修复的数据集缺陷。

看看上方的色调面板:红色金刚鹦鹉变成了黄色。如果任务是区分“金刚鹦鹉”和“非金刚鹦鹉”,这无伤大雅;但如果颜色是区分两个类别的关键,这种变化就会造成破坏。

重要的默认设置#

以下是 Ultralytics 8.4 中的默认值;数据增强设置参考列出了所有参数:

参数默认作用何时更改
hsv_h0.015色调抖动当颜色定义类别时设为 0
hsv_s / hsv_v0.7 / 0.4饱和度和亮度抖动光照固定且受控时调低
degrees0.0随机旋转(±度数)当对象可能以任意角度出现时调高
translate / scale0.1 / 0.5平移和缩放裁剪可能切掉定义类别的部位时调低
fliplr0.5水平翻转概率当左右方向很重要(例如文字)时设为 0
flipud0.0垂直翻转概率俯视、航拍或显微镜视角下调高
mosaic1.0将四张图像拼接成一张很少使用;参见 close_mosaic
close_mosaic10在最后 N 个轮次关闭马赛克增强训练轮次很少时调低
mixup / cutmix0.0 / 0.0混合两张图像 / 将一张图像的局部贴到另一张图像上先建立基线,再在小型数据集上尝试
copy_paste0.0在图像之间粘贴对象实例类别稀少的分割、语义分割和 OBB 数据集

深度数据集是个例外:mosaic、mixup、cutmix 和 copy_paste 会生成无效的配对深度图,因此深度数据加载器会自动将它们设为 0。

部署测试#

每种启用的变换都必须先通过一个问题的检验,再通过第二个问题的检验:

变换是否真实?结论
室外摄像头亮度 ±30%是:一天中的不同时段保留
安防摄像头水平翻转是:人会从两个方向行走保留
安装在墙上的摄像头垂直翻转否:地面始终在底部禁用
俯视传送带相机的垂直翻转是:画面里没有“上”启用
固定道路相机旋转 90°否:相机从不旋转禁用
红色和绿色部件属于不同类别时的色相偏移否:会破坏信号禁用

旋转增强 180 度:一只倒置的金刚鹦鹉,这是固定直立相机永远不会拍到的画面

对于一架垂直向下观察的无人机来说,倒置的金刚鹦鹉是一张很好的训练图像;对于一台固定在墙上的相机来说,它却毫无用处。无法通过这项检验的变换会产生负面的训练信号:模型学会识别它永远不会看到的图像,却因此损失了学习实际会遇到的图像的能力。

一个完整示例配置#

传送带上方的俯视相机负责分拣仅颜色不同的部件。必须去掉色相抖动,同时垂直翻转和小幅旋转则符合实际情况。以下示例使用 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 会将四张图像拼接成一张,并且默认启用。它是检测任务中效益最高的增强方式:每张训练图像都包含多个场景、尺度和目标上下文。但 Mosaic 图像与部署时的画面并不相似,因此 close_mosaic=10 会在最后 10 个训练轮次将其关闭,让模型在真实输入上完成训练。关闭 Mosaic 也会同时关闭 mixup、cutmix 和 copy_paste,而翻转、HSV 和几何变换仍会继续运行。

短时间运行不会使用 mosaic

在不超过 close_mosaic 个训练轮次的运行中(包括上面的单轮次配置),从第一个训练轮次开始就会关闭 mosaic。应根据完整运行的 train_batch0.jpg 来评估 mosaic,而不是依据冒烟测试。

数据增强无法解决的问题#

数据增强只能放大已有数据的作用。如果数据集中没有夜间图像,无论怎么设置都无法生成夜景:只能生成更亮或更暗的日间图像。如果某个类别只有在强力增强后才能识别,说明该类别的数据量不足。请返回收集高质量、有代表性的数据。

把所有参数都调到最大会掩盖真正的问题

对小型数据集把所有数据增强都调到最大,会让模型训练所用图像越来越偏离部署环境,验证集 mAP 往往也会下降。每次只更改一个参数,并说明理由;同时在相同的数据划分上与默认基线进行比较。

裁剪会抹掉类别特征时

如果某个类别由物体的一小部分定义,例如扑克牌角落上的符号,mosaic、translate 和 scale 可能会把这部分裁掉,生成一张看起来与另一个类别完全相同的训练图像。针对该数据集调低这些值,并在 train_batch0.jpg 中确认修复效果。

试试看

针对你的部署场景,在默认值表中将每个参数标记为保留、更改或禁用,并为每项更改写一句理由。使用相同的数据划分,分别用默认配置和你的配置训练一次,并记录两次的验证集 mAP50-95。交付内容:已标注的表格、两项分数,以及自定义运行生成的 train_batch0.jpg。

完成条件
满足以下所有条件,即表示你已完成本课程。
  • 每个已更改的参数都有一句部署理由。

  • 默认配置和自定义配置使用相同的验证集划分进行比较。

  • 自定义运行生成的 train_batch0.jpg 显示边界框贴合目标,且类别线索完好。

显示解答

一架无人机从正上方勘察港口,并使用有向边界框检测船只。从这个视角看,画面里没有“上”,船只朝向各不相同,而且颜色不能定义类别:

参数选择理由
flipud0.5俯视画面垂直翻转后看起来仍然相同
degrees180船只的朝向各不相同
hsv_h默认船体颜色各不相同,不能作为类别判别信号
mosaic默认每张图像中都有许多小目标;Mosaic 有帮助

在 DOTA8 航拍演示集上:

yolo obb train data=dota8.yaml model=yolo26n-obb.pt epochs=1 imgsz=320 flipud=0.5 degrees=180

对于固定的街道相机,同样的两项更改无法通过部署检验:壁挂相机的画面里,汽车永远不会上下颠倒。

接下来做什么

数据集、划分和数据增强都已准备就绪;下一课将客观判断数据集是否已达到训练条件。

登录以保存学习进度