【AI课程领学】第七课 · 数据扩充与预处理(课时1) 简单的数据扩充方式:从“空间变换”到“像素扰动”(含 PyTorch 可运行代码与实践清单)

【AI课程领学】第七课 · 数据扩充与预处理(课时1) 简单的数据扩充方式:从“空间变换”到“像素扰动”(含 PyTorch 可运行代码与实践清单)



欢迎铁子们点赞、关注、收藏!
祝大家逢考必过!逢投必中!上岸上岸上岸!upupup

大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文。详细信息可扫描博文下方二维码 “学术会议小灵通”或参考学术信息专栏:https://ais.cn/u/mmmiUz
详细免费的AI课程可在这里获取→www.lab4ai.cn


前言

数据扩充(Data Augmentation)在深度学习中不是“锦上添花”,而是许多任务里决定模型泛化上限的关键组件。尤其当你的数据:

  • 标注成本高(遥感/医学/工业质检)
  • 训练集规模有限
  • 类别不均衡明显
  • 场景分布变化大(季节、光照、传感器、观测角度)

在这种情况下,扩充既能增加“有效样本量”,也能显著提升模型对扰动的鲁棒性

这一篇讲“简单但高收益”的扩充:主要包括几何变换与基本像素扰动,适用于大多数视觉/栅格数据任务(分类、检测、分割)。

1. 为什么扩充有效?从深度学习视角理解“归纳偏置”

深度模型容量巨大,训练集不够时很容易记住数据(过拟合)。扩充的作用可以理解为:

1. 注入任务不变性(invariance)

  • 比如物体旋转不影响类别,扩充把这种先验注入训练过程。

2. 覆盖真实分布的局部邻域

  • 用合理扰动采样数据的“邻近样本”,逼近真实数据分布。

3. 正则化(regularization)

  • 扩充让模型在不同扰动下输出一致,约束更强,减少方差。

一个经典总结:

模型想学到“稳定规律”,数据扩充就在告诉它:什么变化不重要,什么变化必须保持一致。

2. 简单扩充的两大类:几何变换与像素变换

2.1 几何变换(Spatial / Geometric)

  • 随机水平/垂直翻转(Flip)
  • 随机旋转(Rotate)
  • 随机裁剪与缩放(RandomResizedCrop / Scale)
  • 平移(Translate)
  • 轻微仿射变换(Affine)

适合:绝大多数自然图像、遥感裁块、医学切片等。
不适合:方向具有强语义的任务(例如车道线方向、文字识别),需要谨慎。

2.2 像素变换(Photometric / Intensity)

  • 亮度/对比度/饱和度/色相扰动(ColorJitter)
  • 高斯噪声、椒盐噪声
  • 模糊(Gaussian Blur)
  • Cutout(随机遮挡局部区域)
  • 轻微 gamma 变换

适合:光照变化明显、传感器差异明显、噪声大、真实世界背景复杂的任务。

3. PyTorch 实战:torchvision 的标准增强流水线

  • 下面示例以图像分类为例(分割/检测会在后面说明如何同步变换 label)。
import torch
from torchvision import transforms
from PIL import Image

train_tf = transforms.Compose([
    transforms.RandomResizedCrop(224, scale=(0.6, 1.0), ratio=(0.75, 1.33)),
    transforms.RandomHorizontalFlip(p=0.5),
    transforms.RandomVerticalFlip(p=0.2),
    transforms.RandomRotation(degrees=15),
    transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.05),
    transforms.ToTensor(),
    # 归一化放到“预处理”里也行,这里演示一体化
    transforms.Normalize(mean=[0.485, 0.456, 0.406],
                         std=[0.229, 0.224, 0.225]),
])

# 测试:读一张图片,看看输出张量形状
img = Image.new("RGB", (256, 256), color=(128, 128, 128))
x = train_tf(img)  # (3,224,224)
print(x.shape, x.dtype, x.min().item(), x.max().item())

3.1 增强强度怎么调?一个实用经验

  • 数据越少 → 可以增强更强(但不要破坏标签语义)
  • 类别差异越细 → 增强要更保守(避免引入错误样本)
  • 模型越大 → 更依赖强增强(否则更容易过拟合)

常用策略:先弱后强。先跑 baseline(弱增强),再逐渐加大增强强度观察验证集表现。

4. 对分割任务:图像与 mask 必须“同步几何变换”

分类任务增强只作用于 image 即可;分割不同:

  • image 旋转/裁剪,mask 必须同样旋转/裁剪
  • mask 不能用双线性插值(会产生非整数类别),通常用最近邻插值

torchvision.transforms.v2(新版)或 albumentations 更方便。这里给一个思路示例(albumentations):

# pip install albumentations opencv-python
import albumentations as A
import numpy as np

aug = A.Compose([
    A.RandomResizedCrop(height=256, width=256, scale=(0.7, 1.0)),
    A.HorizontalFlip(p=0.5),
    A.Rotate(limit=15, p=0.5),
], additional_targets={"mask": "mask"})

image = np.zeros((300, 300, 3), dtype=np.uint8)
mask  = np.zeros((300, 300), dtype=np.uint8)

out = aug(image=image, mask=mask)
img_aug, mask_aug = out["image"], out["mask"]
print(img_aug.shape, mask_aug.shape)

  • 重点:对 mask 的插值与变换必须保持语义不变。

5. 常见“简单增强”清单与适用性

增强 适用场景 注意事项
Flip 多数视觉任务 对方向敏感任务慎用
Rotate(±10°~±30°) 目标方向无固定意义 文字/道路方向类慎用
RandomResizedCrop 分类很常用 分割需同步 mask
ColorJitter 光照/传感器差异大 遥感多光谱需谨慎(见下一篇)
Noise/Blur 噪声、低质图像 不要过强导致信息丢失
Cutout 遮挡、遮云、缺失 遮挡比例需合理

6. 常见坑(强烈建议你在博客里专门标注)

  1. 增强破坏标签语义:比如把“阴影/云”增强成“地物纹理”,会误导模型
  2. 训练增强与验证不一致:验证集不要加随机增强(最多做 resize/center crop)
  3. 分割 mask 插值错误:双线性插值会把类别变成小数
  4. 过强增强导致欠拟合:训练 loss 下不去,说明增强把任务变难了
  5. 增强在 CPU 成瓶颈:大规模训练建议使用更高效的库(albumentations、kornia、DALI)

7. 练习建议

  1. 在同一模型上对比:无增强 / 弱增强 / 强增强 的验证集指标
  2. 对分割任务实现一个同步增强 pipeline(image + mask)
  3. 尝试 Cutout,观察对遮挡鲁棒性的提升

下一篇我们讲“特殊的数据扩充方式”——包括 MixUp/CutMix、RandAugment、AutoAugment、Mosaic、时序增强、遥感专用增强等。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐