【AI课程领学】第七课 · 数据扩充与预处理(课时1) 简单的数据扩充方式:从“空间变换”到“像素扰动”(含 PyTorch 可运行代码与实践清单)
【AI课程领学】第七课 · 数据扩充与预处理(课时1) 简单的数据扩充方式:从“空间变换”到“像素扰动”(含 PyTorch 可运行代码与实践清单)
【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. 常见坑(强烈建议你在博客里专门标注)
- 增强破坏标签语义:比如把“阴影/云”增强成“地物纹理”,会误导模型
- 训练增强与验证不一致:验证集不要加随机增强(最多做 resize/center crop)
- 分割 mask 插值错误:双线性插值会把类别变成小数
- 过强增强导致欠拟合:训练 loss 下不去,说明增强把任务变难了
- 增强在 CPU 成瓶颈:大规模训练建议使用更高效的库(albumentations、kornia、DALI)
7. 练习建议
- 在同一模型上对比:无增强 / 弱增强 / 强增强 的验证集指标
- 对分割任务实现一个同步增强 pipeline(image + mask)
- 尝试 Cutout,观察对遮挡鲁棒性的提升
下一篇我们讲“特殊的数据扩充方式”——包括 MixUp/CutMix、RandAugment、AutoAugment、Mosaic、时序增强、遥感专用增强等。
更多推荐


所有评论(0)