使用 Ultralytics YOLO 进行数据增强
简介
数据增强 是计算机视觉中一项至关重要的技术,它通过对现有图像应用各种转换来人为地扩展您的训练数据集。在训练像 Ultralytics YOLO 这样的 深度学习 模型时,数据增强有助于提高模型的鲁棒性,减少过拟合,并增强对真实场景的泛化能力。
VIDEO
观看: 如何使用 Mosaic、MixUp 等数据增强方法来帮助 Ultralytics YOLO 模型更好地泛化 🚀
为什么数据增强至关重要
数据增强在训练计算机视觉模型中具有多个关键目的:
扩展数据集 : 通过创建现有图像的变体,您可以有效地增加训练数据集的大小,而无需收集新数据。
泛化能力提升 : 模型学习识别各种条件下的对象,使其在实际应用中更强大。
减少过拟合 :通过在训练数据中引入变异性,模型不太可能记住特定的图像特征。
增强的性能 :使用适当的增强训练的模型通常在验证集和测试集上获得更好的准确性 。
Ultralytics YOLO 的实现提供了一套全面的增强技术,每种技术都有特定的用途,并以不同的方式为模型性能做出贡献。本指南将详细探讨每个增强参数,帮助您了解何时以及如何在您的项目中使用它们。
配置示例
您可以使用 Python API、命令行界面 (CLI) 或配置文件来自定义每个参数。以下是如何在每种方法中设置数据增强的示例。
配置示例
Python CLI
from ultralytics import YOLO
# Load a model
model = YOLO ( "yolo11n.pt" )
# Training with custom augmentation parameters
model . train ( data = "coco.yaml" , epochs = 100 , hsv_h = 0.03 , hsv_s = 0.6 , hsv_v = 0.5 )
# Training without any augmentations (disabled values omitted for clarity)
model . train (
data = "coco.yaml" ,
epochs = 100 ,
hsv_h = 0.0 ,
hsv_s = 0.0 ,
hsv_v = 0.0 ,
translate = 0.0 ,
scale = 0.0 ,
fliplr = 0.0 ,
mosaic = 0.0 ,
erasing = 0.0 ,
auto_augment = None ,
)
# Training with custom augmentation parameters
yolo detect train data = coco8.yaml model = yolo11n.pt epochs = 100 hsv_h = 0 .03 hsv_s = 0 .6 hsv_v = 0 .5
使用配置文件
您可以在 YAML 配置文件(例如,)中定义所有训练参数,包括增强。 train_custom.yaml
)。 mode
参数仅在使用 CLI 时才需要。这个新的 YAML 文件将覆盖 默认的 位于 ultralytics
软件包。
# train_custom.yaml
# 'mode' is required only for CLI usage
mode : train
data : coco8.yaml
model : yolo11n.pt
epochs : 100
hsv_h : 0.03
hsv_s : 0.6
hsv_v : 0.5
然后使用 Python API 启动训练:
色彩空间增强
色调调整(hsv_h
)
范围 : 0.0
- 1.0
默认值 : 0.015
用法 :在保留图像颜色关系的同时移动图像颜色。 hsv_h
超参数定义了平移幅度,最终调整值在 -hsv_h
和 hsv_h
。例如,使用 hsv_h=0.3
,平移量在范围内随机选择-0.3
到 0.3
。对于高于 0.5
,色调偏移会环绕色轮,这就是为什么增强在两者之间看起来相同的原因 0.5
和 -0.5
.
目的 : 特别适用于室外场景,在这些场景中,光照条件会极大地影响物体的外观。例如,香蕉在明亮的阳光下可能看起来更黄,但在室内可能看起来更绿。
Ultralytics 的实现 :RandomHSV
饱和度调整(hsv_s
)
范围 : 0.0
- 1.0
默认值 : 0.7
用法 :修改图像中颜色的强度。 hsv_h
超参数定义了平移幅度,最终调整值在 -hsv_s
和 hsv_s
。例如,使用 hsv_s=0.7
,强度在以下范围内随机选择-0.7
到 0.7
.
目的 : 帮助模型处理不同的天气条件和相机设置。例如,在晴天,红色的交通标志可能看起来非常鲜艳,但在多雾的条件下看起来会显得暗淡和褪色。
Ultralytics 的实现 :RandomHSV
亮度调整 (hsv_v
)
范围 : 0.0
- 1.0
默认值 : 0.4
用法 : 更改图像的亮度。 hsv_v
超参数定义了平移幅度,最终调整值在 -hsv_v
和 hsv_v
。例如,使用 hsv_v=0.4
,强度在以下范围内随机选择-0.4
到 0.4
.
目的 : 对于训练需要在不同光照条件下执行的模型至关重要。例如,一个红色的苹果在阳光下可能看起来很亮,但在阴凉处看起来会暗得多。
Ultralytics 的实现 :RandomHSV
旋转 (degrees
)
范围 : 0.0
到 180
默认值 : 0.0
用法 :在指定范围内随机旋转图像。“” degrees
超参数定义了旋转角度,最终调整值在 -degrees
和 degrees
。例如,使用 degrees=10.0
,旋转是在以下范围内随机选择的-10.0
到 10.0
.
目的 : 对于对象可以出现在不同方向的应用至关重要。例如,在航空无人机图像中,车辆可以朝任何方向定向,要求模型识别对象,而不管其旋转方向如何。
Ultralytics 的实现 :RandomPerspective
平移(translate
)
范围 : 0.0
- 1.0
默认值 : 0.1
用法 :按照图像大小的随机分数水平和垂直移动图像。“” translate
超参数定义了平移幅度,最终调整值在范围内进行两次随机调整(每个轴一次) -translate
和 translate
。例如,使用 translate=0.5
,图像转换在范围内随机选择-0.5
到 0.5
在 x 轴上,并在同一范围内选择另一个独立的随机值在 y 轴上。
目的 : 帮助模型学习检测部分可见的物体,并提高对物体位置的鲁棒性。例如,在车辆损坏评估应用中,汽车部件可能会根据摄影师的位置和距离,在画面中完整或部分显示,平移增强将教会模型识别这些特征,而无论其完整性或位置如何。
Ultralytics 的实现 :RandomPerspective
注意 : 为了简单起见,以下应用的所有翻译对于两者都是相同的 x
和 y
坐标轴。值 -1.0
和 1.0
不会显示,因为它们会将图像完全移出画面。
缩放(scale
)
范围 :≥0.0
默认值 : 0.5
用法 :在指定范围内按照随机因子调整图像大小。“” scale
超参数定义了缩放因子,最终调整值在 1-scale
和 1+scale
。例如,使用 scale=0.5
,缩放是在以下范围内随机选择的0.5
到 1.5
.
目的 : 使模型能够处理不同距离和大小的对象。例如,在自动驾驶应用中,车辆可以出现在距离相机不同的距离处,要求模型识别它们,而不管其大小如何。
Ultralytics 的实现 :RandomPerspective
注意 :
值 -1.0
未显示,因为它会使图像消失,而 1.0
只会导致 2 倍放大。
下表中显示的值是通过超参数应用的值 scale
,而不是最终的缩放因子。
可视化参数: scale
大于 1.0
,图像可能非常小或翻转,因为缩放因子是在两者之间随机选择的 1-scale
和 1+scale
。例如,使用 scale=3.0
,缩放是在以下范围内随机选择的-2.0
到 4.0
。如果选择负值,则图像会翻转。
剪切 (shear
)
范围 : -180
到 +180
默认值 : 0.0
用法 : 引入一种几何变换,使图像沿 x 轴和 y 轴倾斜,有效地在一个方向上移动图像的各个部分,同时保持平行线。此 shear
超参数定义了剪切角度,最终调整值在 -shear
和 shear
。例如,使用 shear=10.0
,剪切是在以下范围内随机选择的-10
到 10
在 x 轴上,并在同一范围内选择另一个独立的随机值在 y 轴上。
目的 : 帮助模型泛化由轻微倾斜或倾斜视点引起的视角变化。例如,在交通监控中,由于非垂直相机放置,汽车和道路标志等物体可能会出现倾斜。应用剪切增强可确保模型学习识别对象,即使存在这种倾斜的扭曲。
Ultralytics 的实现 :RandomPerspective
注意 :
shear
这些值可能会迅速扭曲图像,因此建议从较小的值开始,然后逐渐增加。
与透视变换不同,错切不会引入深度或消失点,而是通过改变物体的角度(同时保持对边平行)来扭曲物体的形状。
透视 (perspective
)
范围 : 0.0
- 0.001
默认值 : 0.0
用法 : 在 x 轴和 y 轴上应用完整的透视变换,模拟从不同深度或角度观看对象时的显示效果。 perspective
超参数定义了透视变换的幅度,最终调整值在 -perspective
和 perspective
。例如,使用 perspective=0.001
,透视是在以下范围内随机选择的-0.001
到 0.001
在 x 轴上,并在同一范围内选择另一个独立的随机值在 y 轴上。
目的 : 透视增强对于处理极端的视点变化至关重要,尤其是在物体由于透视偏移而显得透视缩短或扭曲的场景中。例如,在基于无人机的物体检测中,建筑物、道路和车辆可能会根据无人机的倾斜度和高度而显得拉伸或压缩。通过应用透视变换,模型可以学习识别物体,而无需考虑这些透视引起的扭曲,从而提高它们在实际部署中的鲁棒性。
Ultralytics 的实现 :RandomPerspective
-0.001
-0.0005
0.0
0.0005
0.001
上下翻转(flipud
)
范围 : 0.0
- 1.0
默认值 : 0.0
用法 :通过沿 y 轴反转图像来执行垂直翻转。此转换将整个图像从上到下镜像,但保留对象之间的所有空间关系。flipud 超参数定义了应用转换的概率,其值为“”。 flipud=1.0
确保所有图像都被翻转,值为 flipud=0.0
完全禁用转换。例如,使用 flipud=0.5
,每张图片有 50% 的几率上下翻转。
目的 : 适用于物体可能倒置的场景。例如,在机器人视觉系统中,传送带或机器人手臂上的物体可能会被拾取并放置在不同的方向上。垂直翻转有助于模型识别物体,而无需考虑其自上而下的位置。
Ultralytics 的实现 :RandomFlip
flipud
关闭
flipud
在
左右翻转(fliplr
)
范围 : 0.0
- 1.0
默认值 : 0.5
用法 :通过沿 x 轴镜像图像来执行水平翻转。此转换交换左右侧,同时保持空间一致性,这有助于模型推广到出现在镜像定向中的对象。“” fliplr
超参数定义了应用变换的概率,值为 fliplr=1.0
确保所有图像都被翻转,值为 fliplr=0.0
完全禁用转换。例如,使用 fliplr=0.5
,每张图像有 50% 的几率左右翻转。
目的 : 水平翻转广泛应用于目标检测、姿势估计和面部识别,以提高对左右变化的鲁棒性。例如,在自动驾驶中,车辆和行人可能出现在道路的任一侧,水平翻转有助于模型在两种方向上同样好地识别它们。
Ultralytics 的实现 :RandomFlip
fliplr
关闭
fliplr
在
BGR 通道交换 (bgr
)
范围 : 0.0
- 1.0
默认值 : 0.0
用法 :将图像的颜色通道从 RGB 交换为 BGR,改变颜色的表示顺序。“” bgr
超参数定义了应用变换的概率,具有 bgr=1.0
确保所有图像都经过通道交换和 bgr=0.0
禁用它。例如,使用 bgr=0.5
,每张图像有 50% 的几率从 RGB 转换为 BGR。
目的 : 提高对不同颜色通道排序的鲁棒性。例如,当训练必须跨各种相机系统和图像库工作的模型时,这些系统和图像库中 RGB 和 BGR 格式可能使用不一致,或者当将模型部署到输入颜色格式可能与训练数据不同的环境中时。
Ultralytics 的实现 :Format
bgr
关闭
bgr
在
Mosaic(mosaic
)
范围 : 0.0
- 1.0
默认值 : 1.0
用法 : 将四张训练图像合并为一张。 mosaic
超参数定义了应用变换的概率,具有 mosaic=1.0
确保所有图像都被组合和 mosaic=0.0
禁用转换。例如,使用 mosaic=0.5
,每张图像有 50% 的几率与其他三张图像组合。
目的 : 对于提高小物体检测和上下文理解非常有效。例如,在野生动物保护项目中,动物可能出现在不同的距离和尺度上,马赛克增强通过从有限的数据中人工创建多样化的训练样本,帮助模型学习识别不同大小、局部遮挡和环境背景下的相同物种。
Ultralytics 的实现 :Mosaic
注意 :
即使 mosaic
数据增强使模型更具鲁棒性,但同时也可能使训练过程更具挑战性。
字段 mosaic
可以通过设置以下参数在训练结束时禁用数据增强: close_mosaic
到完成前的 epoch 数,达到该 epoch 数时应关闭。例如,如果 epochs
设置为 200
和 close_mosaic
设置为 20
, mosaic
数据增强将在以下时间后禁用 180
epochs。如果 close_mosaic
设置为 0
, mosaic
数据增强将在整个训练过程中启用。
生成的马赛克的中心是使用随机值确定的,并且可以在图像内部或外部。
当前的实现 mosaic
数据增强结合了从数据集中随机选择的 4 个图像。如果数据集很小,则同一图像可能会在同一 mosaic 中多次使用。
mosaic
关闭
mosaic
在
Mixup (mixup
)
范围 : 0.0
- 1.0
默认值 : 0.0
用法 : 以给定的概率混合两张图像及其标签。 mixup
超参数定义了应用变换的概率,具有 mixup=1.0
确保所有图像都被混合和 mixup=0.0
禁用转换。例如,使用 mixup=0.5
,每张图片有 50% 的几率与其他图片混合。
目的 : 提高模型鲁棒性并减少过拟合。例如,在零售产品识别系统中,mixup 通过混合不同产品的图像来帮助模型学习更稳健的特征,从而教会模型识别物品,即使它们部分可见或被拥挤的商店货架上的其他产品遮挡。
Ultralytics 的实现 :Mixup
注意 :
字段 mixup
ratio是从a中随机选择的值 np.random.beta(32.0, 32.0)
beta 分布,意味着每张图像大约贡献 50%,略有变化。
第一张图片, mixup
关闭
第二张图像, mixup
关闭
mixup
在
CutMix (cutmix
)
范围 : 0.0
- 1.0
默认值 : 0.0
用法 : 以给定的概率从一张图像中剪切一个矩形区域,并将其粘贴到另一张图像上。 cutmix
超参数定义了应用变换的概率,具有 cutmix=1.0
确保所有图像都经过此转换和 cutmix=0.0
完全禁用它。例如,使用 cutmix=0.5
,每张图片有 50% 的几率将其中的一个区域替换为另一张图片中的补丁。
目的 : 通过创建逼真的遮挡场景同时保持局部特征完整性来增强模型性能。例如,在自动驾驶系统中,cutmix 帮助模型学习识别车辆或行人,即使它们被其他物体部分遮挡,从而提高复杂现实环境中重叠物体的检测精度。
Ultralytics 的实现 :CutMix
注意 :
裁剪区域的大小和位置是为每个应用程序随机确定的。
与全局混合像素值的 mixup 不同, cutmix
保持裁剪区域内的原始像素强度,保留局部特征。
只有当区域与任何现有边界框不重叠时,才会将其粘贴到目标图像中。此外,仅保留至少 0.1
(10%)的原始区域保留在粘贴区域内。
此最小边界框面积阈值无法通过当前实现更改,并设置为 0.1
默认情况下。
第一张图片, cutmix
关闭
第二张图像, cutmix
关闭
cutmix
在
特定于分割的增强
复制-粘贴 (copy_paste
)
范围 : 0.0
- 1.0
默认值 : 0.0
用法 :仅适用于分割任务,此增强根据指定的概率,在图像内或图像之间复制对象,由“”控制。 copy_paste_mode
。 copy_paste
超参数定义了应用变换的概率,具有 copy_paste=1.0
确保所有图像都被复制和 copy_paste=0.0
禁用转换。例如,使用 copy_paste=0.5
,每张图片有 50% 的几率从另一张图片中复制对象。
目的 : 特别适用于实例分割任务和稀有物体类别。例如,在工业缺陷检测中,某些类型的缺陷出现频率较低,复制粘贴增强可以通过将这些稀有缺陷从一个图像复制到另一个图像来人为地增加这些稀有缺陷的出现次数,从而帮助模型更好地学习这些代表性不足的案例,而无需额外的缺陷样本。
Ultralytics 的实现 :CopyPaste
注意 :
如下图 gif 所示, copy_paste
数据增强可用于将对象从一个图像复制到另一个图像。
一旦复制了对象,无论 copy_paste_mode
,它的 Intersection over Area (IoA) 是根据源图像的所有对象计算的。如果所有 IoA 都低于 0.3
(30%),则将对象粘贴到目标图像中。如果只有一个 IoA 高于 0.3
,则不会将对象粘贴到目标图像中。
在当前实现中,IoA 阈值无法更改,并设置为 0.3
默认情况下。
copy_paste
关闭
copy_paste
开启 copy_paste_mode=flip
可视化 copy_paste
过程
复制-粘贴模式 (copy_paste_mode
)
选项 : 'flip'
, 'mixup'
默认值 : 'flip'
用法 : 确定用于的 复制-粘贴 数据增强。如果设置为 'flip'
,这些对象来自同一张图像,而 'mixup'
允许从不同的图像复制对象。
目的 : 允许灵活地将复制的对象集成到目标图像中。
Ultralytics 的实现 :CopyPaste
注意 :
IoA 原则对两者都适用 copy_paste_mode
,但复制对象的方式不同。
根据图像大小,物体有时可能会被部分或完全复制到框架之外。
根据多边形标注的质量,与原始物体相比,复制的物体可能存在轻微的形状差异。
参考图像
选择的图片用于 copy_paste
copy_paste
开启 copy_paste_mode=mixup
特定于分类的增强
自动增强 (auto_augment
)
选项 : 'randaugment'
, 'autoaugment'
, 'augmix'
, None
默认值 : 'randaugment'
用法 : 应用于分类的自动增强策略。 'randaugment'
选项使用 RandAugment, 'autoaugment'
使用 AutoAugment,并且 'augmix'
使用 AugMix。设置为 None
禁用自动增强。
目的 :为分类任务自动优化增强策略。区别如下:
AutoAugment : 此模式应用从 ImageNet、CIFAR10 和 SVHN 等数据集学习的预定义增强策略。用户可以选择这些现有的策略,但无法在 Torchvision 中训练新的策略。要发现特定数据集的最佳增强策略,需要外部库或自定义实现。参考 AutoAugment 论文 。
RandAugment :应用具有统一幅度的随机变换选择。这种方法减少了对广泛搜索阶段的需求,使其在计算上更有效,同时仍能增强模型的鲁棒性。参考RandAugment 论文 。
AugMix : AugMix 是一种数据增强方法,通过随机组合简单变换来创建多样化的图像变体,从而增强模型的鲁棒性。请参考AugMix 论文 。
Ultralytics 的实现 :classify_augmentations()
注意 :
本质上,这三种方法的主要区别在于定义和应用数据增强策略的方式。
您可以参考本文 ,其中详细比较了这三种方法。
Random Erasing(erasing
)
范围 : 0.0
- 0.9
默认值 : 0.4
用法 :在分类训练过程中随机擦除图像的部分。“” erasing
超参数定义了应用变换的概率,具有 erasing=0.9
确保几乎所有图像都被擦除和 erasing=0.0
禁用转换。例如,使用 erasing=0.5
,每张图片有 50% 的几率被部分擦除。
目的 : 帮助模型学习稳健的特征,防止过度依赖特定的图像区域。例如,在面部识别系统中,随机擦除有助于模型更好地应对诸如太阳镜、口罩或可能部分遮盖面部特征的其他物体等局部遮挡。这通过迫使模型使用多个面部特征来识别个体,而不是仅仅依赖可能被遮挡的独特特征,从而提高实际性能。
Ultralytics 的实现 :classify_augmentations()
注意 :
字段 erasing
数据增强自带一个 scale
, ratio
和 value
无法通过以下方式更改的超参数 当前实现 。它们的默认值是 (0.02, 0.33)
, (0.3, 3.3)
和 0
,分别如 PyTorch 中所述 文档 .
的上限 erasing
超参数设置为 0.9
以避免将变换应用于所有图像。
erasing
关闭
erasing
开启(示例 1)
erasing
开启(示例 2)
erasing
开启(示例 3)
常见问题
有太多的数据增强方法可供选择。我如何知道该使用哪一种?
选择正确的增强方法取决于您的具体用例和数据集。以下是一些通用指南,可帮助您做出决定:
在大多数情况下,颜色和亮度上的细微变化是有益的。以下是 hsv_h
, hsv_s
和 hsv_v
是一个坚实的起点。
如果相机的视角是一致的,并且在模型部署后不会改变,您可以跳过几何变换,例如 rotation
, translation
, scale
, shear
或 perspective
。但是,如果相机角度可能会发生变化,并且您需要模型更加稳健,那么最好保留这些增强。
使用 mosaic
仅当接受部分遮挡的对象或每个图像的多个对象,并且不更改标签值时,才进行数据增强。或者,您可以保留 mosaic
处于活动状态,但会增加 close_mosaic
用于在训练过程中更早地禁用它的值。
简而言之:保持简单。从一小组增强开始,并根据需要逐步添加更多。目标是提高模型的泛化能力和鲁棒性,而不是使训练过程过于复杂。此外,请确保您应用的增强反映了您的模型在生产中将遇到的相同数据分布。
开始训练时,会看到一个 albumentations: Blur[...]
参考。这是否意味着 Ultralytics YOLO 运行额外的增强,如模糊处理?
如果 albumentations
package 安装后,Ultralytics 会自动应用一组额外的图像增强。这些增强在内部处理,无需额外配置。
您可以在我们的文档中找到已应用转换的完整列表 技术文档 ,以及我们的 Albumentations 集成指南 。请注意,只有概率 p
大于 0
处于活跃状态。这些效果会有意地以低频率应用,以模仿真实世界的视觉伪影,例如模糊或灰度效果。
开始训练时,我看不到任何对albumentations的引用。为什么?
检查是否 albumentations
package 已安装。如果未安装,可以通过运行以下命令安装: pip install albumentations
。安装完成后,Ultralytics 应该会自动检测并使用该软件包。
如何自定义我的数据增强?
您可以通过创建自定义数据集类和训练器来自定义数据增强。例如,您可以将默认的 Ultralytics 分类数据增强替换为 PyTorch 的 torchvision.transforms.Resize 或其他变换。有关实现细节,请参见分类文档中的自定义训练示例 。
Tweet
分享