菜单

数据增强

相关源文件

本文档介绍了YOLOv5中用于提高模型泛化能力和性能的数据增强技术。数据增强通过创建训练图像的修改版本来人为地扩展数据集,使模型能够暴露于各种图像变化。有关数据加载的信息,请参阅数据加载

1. 概述和目的

YOLOv5实现了一个全面的数据增强流程,在训练期间对图像应用各种变换。这些增强通过使模型接触同一对象的不同变体,帮助模型学习鲁棒的特征并提高泛化能力。

增强流程旨在

  • 在不收集新数据的情况下增加有效数据集大小
  • 提高模型对光照、方向、尺度和位置变化的鲁棒性
  • 在训练期间引入受控变化以防止过拟合
  • 通过MixUp和Mosaic等技术处理诸如类别不平衡等常见问题

来源: utils/dataloaders.py772-830 utils/augmentations.py2-3

2. 增强流程

YOLOv5的增强系统在加载训练数据时按特定顺序应用变换。该流程主要在 LoadImagesAndLabels.__getitem__ 方法中实现。

增强流程图

此流程与 LoadImagesAndLabels 类紧密集成,该类协调何时以及如何将增强应用于每个训练数据批次。

来源: utils/dataloaders.py772-846 utils/dataloaders.py879-936

3. 核心增强技术

3.1 Mosaic 增强

Mosaic 增强将4张训练图像合并为一张图像,使模型能够学习在不同尺度和不同上下文中识别对象。

实现细节

  • 创建2x2网格,包含4张图像
  • 以距离中心的随机偏移量放置图像
  • 调整新复合图像的边界框坐标
  • 通过将小对象置于不同的上下文中,帮助模型学习检测小对象

来源: utils/dataloaders.py879-936

3.2 MixUp 增强

MixUp通过使用Beta分布混合两个图像及其标签来创建新的训练样本。

主要特性

  • 使用Beta分布(α=β=32.0)进行混合比例
  • 线性组合像素值:img = img1 * r + img2 * (1-r)
  • 连接两个图像的标签
  • 通过创建中间示例来提高模型的鲁棒性

来源: utils/augmentations.py294-303

3.3 随机透视变换

此技术对图像应用各种几何变换,同时正确调整边界框。

由超参数控制的参数

  • degrees:控制旋转范围(默认为±10°)
  • translate:控制平移百分比(默认为0.1 = 10%)
  • scale:控制缩放因子(默认为0.1 = ±10%)
  • shear:控制剪切量(默认为±10°)
  • perspective:控制透视失真(默认为0.0)

来源: utils/augmentations.py155-234

3.4 HSV 增强

在HSV(色调、饱和度、亮度)颜色空间中修改图像颜色。

实现细节

  • 独立调整色调、饱和度和亮度通道
  • 使用查找表进行高效变换
  • 由超参数控制:hsv_hhsv_shsv_v
  • 帮助模型在不同光照条件下实现泛化

来源: utils/augmentations.py74-87

3.5 翻转与旋转

简单但有效的增强,可以水平或垂直镜像图像。

  • 水平翻转(fliplr):镜像图像左右翻转并调整边界框坐标
  • 垂直翻转(flipud):镜像图像上下翻转并调整边界框坐标

以超参数 fliplrflipud 控制的概率应用

来源: utils/dataloaders.py823-833

4. 高级增强技术

4.1 Copy-Paste 增强

此技术将图像的一部分复制并粘贴到其他位置,以增加对象的实例计数。

实现细节

  • 根据概率 p (默认为0.5)随机选择片段
  • 粘贴前水平翻转片段
  • 验证与现有对象的重叠度较低(<30% IoA)
  • 有效增加稀有类别的对象数量

来源: utils/augmentations.py237-260

4.2 Cutout 增强

Cutout 随机遮盖图像中的矩形区域,迫使模型从部分信息中识别对象。

实现细节

  • 创建不同大小的遮罩(从图像大小的6.25%到3.125%)
  • 用随机的RGB值填充遮罩
  • 当对象被遮盖超过60%时,删除标签
  • 提高模型对遮挡的鲁棒性

来源: utils/augmentations.py263-291

4.3 Albumentations 集成

YOLOv5 可选支持 Albumentations 库,用于额外的增强方法

可用变换(带默认概率)

  • RandomResizedCrop (p=0.0)
  • Blur (p=0.01)
  • MedianBlur (p=0.01)
  • ToGray (p=0.01)
  • CLAHE (p=0.01)
  • RandomBrightnessContrast (p=0.0)
  • RandomGamma (p=0.0)
  • ImageCompression (p=0.0)

来源: utils/augmentations.py20-55

5. 配置与使用

5.1 超参数

YOLOv5 的增强功能通过 YAML 文件中定义的超参数进行控制。以下是关键参数的摘要

参数描述默认值范围
mosaicMosaic 增强的概率1.00.0-1.0
mixupMixUp 增强的概率0.00.0-1.0
degrees图像旋转(+/- 度)0.00.0-45.0
translate图像平移(+/- 比例)0.10.0-1.0
scale图像缩放(+/- 增益)0.50.0-1.0
shear图像剪切(+/- 度)0.00.0-45.0
perspective图像透视(+/- 比例)0.00.0-0.001
flipud图像上下翻转的概率0.00.0-1.0
fliplr图像左右翻转的概率0.50.0-1.0
hsv_h图像 HSV 色调增强(比例)0.0150.0-1.0
hsv_s图像 HSV 饱和度增强(比例)0.70.0-1.0
hsv_v图像 HSV 亮度增强(比例)0.40.0-1.0
copy_paste片段复制粘贴的概率0.00.0-1.0

来源: utils/dataloaders.py776-847

5.2 启用和禁用增强

增强可以通过多种方式控制

  1. 通过命令行参数

    • --augment / --no-augment:启用/禁用所有增强
    • --rect:矩形训练(禁用 mosaic)
    • --image-weights:图像加权(禁用矩形训练)
  2. 通过修改超参数文件

    • 将单个概率设置为 0.0 可禁用特定增强
  3. 程序限制

    • Mosaic 在验证期间或使用矩形训练时禁用
    • 某些增强仅在训练期间应用

来源: utils/dataloaders.py566-567

6. 针对分割的增强

YOLOv5 包含针对分割任务的专用增强处理,这些处理必须同时修改边界框和分割掩码。

主要的分割特定功能

  • 通过变换保持掩码-边界框对齐
  • Mosaic 增强中对分割掩码的专用处理
  • 针对分割的随机透视和 MixUp 自定义实现
  • 翻转操作同时影响边界框和掩码

来源: utils/segment/dataloaders.py130-235 utils/segment/augmentations.py14-92

7. 实现说明

7.1 增强顺序和交互

增强的顺序很重要,以防止冲突

  1. Mosaic 和 MixUp 首先组合多个图像
  2. 接下来应用几何变换(random_perspective)
  3. 颜色/像素级增强(HSV 等)在几何固定后应用
  4. 翻转最后应用以保持一致性

7.2 增强与验证

增强仅在训练期间应用。在验证期间

  • 所有增强都已禁用
  • 仅执行 letterbox 缩放以保持正确的输入尺寸
  • 这确保了在未修改的图像上进行公平的评估

来源: utils/dataloaders.py160-169 utils/dataloaders.py772-776

7.3 性能考量

增强流程针对性能进行了优化

  • 使用多线程加载和预处理图像
  • 预处理图像的缓存选项
  • 使用 numpy 和 OpenCV 实现高效变换

来源: utils/dataloaders.py691-701