机器学习数据增强 - 实用图像增强技术
什么是数据增强 - 为什么要扩展训练数据
数据增强是通过对现有训练图像施加各种变换来人工扩大数据集规模的技术。深度学习模型需要大量数据才能学习到鲁棒的特征,但收集和标注真实数据成本高昂。数据增强以极低的成本将数据集有效扩大数倍甚至数十倍。
数据增强的核心思想:对图像施加不改变其语义标签的变换。例如将猫的图片水平翻转后仍然是猫,调整亮度后仍然是猫。模型通过学习这些变体,获得对位置、角度、光照等变化的不变性。
数据增强的效果:通常可以将模型精度提升 2-10 个百分点;显著减少过拟合(训练集和验证集精度差距缩小);提高模型对真实世界变化的鲁棒性。
注意事项:增强策略需要与任务匹配。例如文字识别任务中不应使用垂直翻转(会改变语义);医学影像中颜色增强需要谨慎(颜色可能携带诊断信息)。
数据增强 (Data Augmentation) 的量化效果:数据增强是对已有训练数据施加变换、生成新样本,从而实质上扩大训练数据集的手法。
- CIFAR-10:仅靠基本增强 (水平翻转 + 随机裁剪) 就能让测试精度提升 2-3%
- ImageNet:套用 AutoAugment 后 Top-1 精度提升 0.83% (从 77.63% 到 78.46%)
- 医学影像:数据量仅 100-500 张时,与不做增强相比 AUC 提升 0.05-0.15
在线增强与离线增强:在线增强在训练循环内对每个批次施加随机变换,每个 epoch 生成不同的变体;离线增强则预先生成并保存扩充后的数据。现代框架 (PyTorch、TensorFlow) 标准上采用在线增强。
几何增强 - 改变位置和形状
几何增强通过改变图像中物体的空间位置和形状来增加多样性。
水平/垂直翻转:最简单有效的增强。水平翻转几乎适用于所有自然图像任务。垂直翻转适用于航拍、显微镜等无固定方向的图像。
随机旋转:在指定角度范围内(如 -15° 到 +15°)随机旋转。模拟相机倾斜和物体自然摆放角度。大角度旋转(90°、180°)适用于无方向性的图像。
随机裁剪:从图像中随机裁剪一个区域并缩放到原始尺寸。模拟不同的拍摄距离和构图。需要确保裁剪后目标物体仍然可见。
仿射变换和透视变换:模拟不同的拍摄角度。仿射变换保持平行线平行(平移、旋转、缩放、剪切的组合);透视变换模拟相机角度变化,平行线可能汇聚。
弹性变形:对图像施加随机的局部扭曲。特别适用于手写文字识别和医学影像分割,模拟组织的自然形变。
几何增强的实现写法:
- 水平翻转 (Horizontal Flip):最单纯也最有效的增强之一。PyTorch 中用
transforms.RandomHorizontalFlip(p=0.5)套用 - 旋转 (Rotation):在指定角度范围内随机旋转图像。Albumentations 中用
A.Rotate(limit=15, border_mode=cv2.BORDER_REFLECT)设定,边界以镜像填充可避免出现黑边 - 随机裁剪:ResNet 的训练标准上使用 224 × 224 的随机裁剪
- 仿射变换:像
A.Affine(scale=(0.8, 1.2), shear=(-10, 10))这样可以同时施加多种变换 - 弹性变形 (Elastic Deformation):生成随机的位移场,让图像像橡胶一样局部扭曲的变换
颜色和像素增强 - 改变外观
颜色增强通过改变图像的色彩属性来模拟不同的光照和拍摄条件。
亮度和对比度调整:随机改变图像的整体亮度(模拟不同光照强度)和对比度(模拟不同的曝光设置)。通常在 ±20-30% 范围内调整。
色相和饱和度偏移:在 HSV 空间中随机偏移色相(模拟不同的白平衡设置)和饱和度(模拟不同的色彩鲜艳度)。
高斯噪声:添加随机噪声模拟低光照条件下的传感器噪声。提高模型对噪声图像的鲁棒性。
高斯模糊:随机模糊模拟对焦不准或运动模糊。使模型不过度依赖高频细节。
随机擦除(Random Erasing):随机遮挡图像的一个矩形区域(用随机值或均值填充)。迫使模型学习物体的多个部分而非依赖单一特征。类似于 Dropout 的正则化效果。
通道随机交换:随机交换 RGB 通道顺序,增强模型对颜色排列的不变性。
颜色增强的常用参数:
- 亮度/对比度:一般用
A.RandomBrightnessContrast(brightness_limit=0.2, contrast_limit=0.2)设定 - 色相/饱和度/明度:用
A.HueSaturationValue(hue_shift_limit=20, sat_shift_limit=30, val_shift_limit=20)设定 - 高斯噪声:用
A.GaussNoise(var_limit=(10, 50))指定方差范围 - CLAHE (局部对比度强调):用
A.CLAHE(clip_limit=4.0, tile_grid_size=(8, 8))套用
基于混合的增强 - MixUp、CutMix 与 Mosaic
混合增强通过组合多张图像创建新的训练样本,是近年来最有影响力的增强技术之一。
MixUp:将两张图像按随机比例 λ 线性混合:x_new = λ * x1 + (1-λ) * x2,标签也相应混合。产生"半透明叠加"效果。显著减少过拟合,提高模型的泛化能力。λ 通常从 Beta(0.2, 0.2) 分布采样。
CutMix:从一张图像中裁剪一个矩形区域,粘贴到另一张图像上。标签按面积比例混合。比 MixUp 更自然(没有半透明效果),同时保留了局部特征的完整性。
Mosaic:将 4 张图像拼接成一张(YOLO v4 引入)。每张图像占据四分之一区域。极大地增加了单次前向传播中看到的物体数量和上下文多样性。特别适合目标检测任务。
CutOut:CutMix 的简化版,只是将随机区域置零(黑色)而非替换为另一张图像。效果类似 Random Erasing。
这些方法的共同优势:不增加数据收集成本、实现简单、效果显著(通常提升 1-3% 精度)、可以与其他增强方法叠加使用。
混合类增强的出处与实测:
- MixUp (Zhang et al., 2018):把 2 张图像及其标签线性插值生成新样本。混合比从 Beta 分布 Beta(alpha, alpha) 采样,按 x_new = lambda*x1 + (1-lambda)*x2 计算。alpha=0.2 较为常见,在 CIFAR-10 上报告了约 1% 的精度提升
- CutMix (Yun et al., 2019):剪下一张图像的矩形区域,贴到另一张图像上。在 ImageNet 上 Top-1 精度提升 1% 以上,对目标检测与分割同样有效
- Mosaic (YOLOv4):把 4 张图像合成为 1 张,一次即可看到多种尺度与背景的组合;YOLOv5 之后也作为标准使用
- GridMask:对图像施加规则的网格状遮罩,隐藏一部分区域的手法。它是 Cutout 的发展形,通过规则地隐藏多个小区域,防止模型过度依赖局部特征
自动增强 - AutoAugment 与 RandAugment
手动设计增强策略需要大量实验。自动增强方法通过搜索或随机化找到最优的增强组合。
AutoAugment:Google 提出的方法,使用强化学习搜索最优的增强策略。在 ImageNet 上搜索到的策略可以迁移到其他数据集。缺点是搜索成本极高(数千 GPU 小时)。
RandAugment:大幅简化的替代方案。只有两个超参数:N(每次应用的变换数量)和 M(变换强度)。从预定义的变换池中随机选择 N 个变换,每个以强度 M 应用。简单有效,搜索成本极低。
TrivialAugment:进一步简化,每次只应用一个随机变换,强度也随机。令人惊讶地,性能与 RandAugment 相当甚至更好。证明了增强策略的随机性本身就是有价值的。
实践建议:对于大多数项目,RandAugment(N=2, M=9)是一个很好的起点。如果计算资源充足,可以对 N 和 M 进行小范围网格搜索。不需要从头搜索策略,使用已发表的策略作为起点即可。
自动增强策略的三代演进:
- AutoAugment (Cubuk et al., 2019):用强化学习搜索最优的增强策略。策略由 25 个子策略构成,各子策略包含 2 个变换操作。搜索需要 15,000 GPU 小时,但发现的策略可以迁移到其他数据集
- RandAugment (Cubuk et al., 2020):大幅削减 AutoAugment 搜索成本的手法,只用变换个数 N 与强度 M 两个超参数
- TrivialAugment (2021):把 RandAugment 进一步简化,对每张图像只以随机强度施加 1 个变换
实现例:PyTorch 中用 transforms.RandAugment(num_ops=2, magnitude=9) 即可直接使用;timm 库的 create_transform 函数提供包含 AutoAugment/RandAugment 的完整增强流水线。
任务特定策略与 Albumentations 实现
不同的计算机视觉任务需要不同的增强策略。
图像分类:可以使用所有不改变语义的增强。RandAugment + MixUp/CutMix 是标准组合。强增强(大角度旋转、强颜色变换)通常有益。
目标检测:几何变换需要同步变换边界框坐标。Mosaic 增强特别有效。注意裁剪后边界框可能部分或完全超出画面,需要处理这些边界情况。
语义分割:几何变换需要同步变换分割掩码。颜色增强不影响掩码。弹性变形对医学影像分割特别有效。
Albumentations 库:Python 最流行的图像增强库。优势:速度快(基于 OpenCV)、支持同步变换图像和标注(边界框、掩码、关键点)、丰富的变换种类、与 PyTorch/TensorFlow 无缝集成。
基本用法:transform = A.Compose([A.HorizontalFlip(p=0.5), A.RandomBrightnessContrast(p=0.3), A.Normalize()])。p 参数控制每个变换的应用概率。
性能提示:增强应在数据加载时在线执行(而非预先生成),这样每个 epoch 看到的增强版本都不同。使用多进程 DataLoader 并行执行增强,避免成为训练瓶颈。
库的选择与速度:Albumentations 是基于 OpenCV 的高速图像增强库,与 torchvision.transforms 相比快 2-10 倍,可达 1000 张/秒以上的处理速度。
- torchvision.transforms:基于 Pillow,PyTorch 标准配置。速度约为 Albumentations 的 1/3-1/5
- Kornia:在 GPU 上执行变换,最适合批处理
- DALI (NVIDIA):优化整条 GPU 流水线,可在大规模训练中消除 CPU 瓶颈
任务特定的要点:EfficientNet 的训练标准是 RandAugment + Mixup + CutMix 的组合。目标检测中,Albumentations 用 bbox_params=A.BboxParams(format='pascal_voc', min_visibility=0.3) 支持边界框的自动变换。测试时增强 (TTA) 则在推理时也施加增强,通过平均多个预测结果提升精度。