常用的高级数据预处理的方法总结
🧠 一、图像数据高级预处理方法汇总表
方法 | 原理 | 常用参数 | 适用场景 |
---|---|---|---|
图像增强(Augmentation) | 改变图像外观/几何结构,提升泛化能力 | 翻转、旋转、缩放、色调扰动等 | 分类、检测、分割等 |
Mixup / CutMix | 合成新图像/标签组合,提升鲁棒性 | alpha(混合程度) | 小数据集、过拟合任务 |
标准化(Normalization) | 均值为0,方差为1,提升训练稳定性 | mean、std | 图像分类、迁移学习等 |
图像去噪 | 去除无效噪声 | 滤波核大小等 | 医学图像、工业图像等 |
图像压缩与分辨率调整 | 减小内存/提高兼容性 | 尺寸参数 | 超大图像、模型输入要求 |
自动增强(AutoAugment / RandAugment) | 使用搜索或随机策略自动增强 | policy、N、M 等 | 高精度需求任务 |
Cutout:
- 原理:随机在图像上遮盖一个固定大小的矩形区域(置为 0 或均值),迫使模型关注非遮盖区域。
- 作用:
- 模拟遮挡,增强鲁棒性。
- 防止模型过度依赖局部特征(如 CIFAR-10 的物体纹理)。
- 参数:
- size:遮盖区域大小(像素)。
- p:应用概率。
- 代码
-
class Cutout: def __init__(self, size, p=0.5): self.size = size self.p = p def __call__(self, img): if torch.rand(1) > self.p: return img h, w = img.shape[1:] cx = torch.randint(0, w, (1,)) cy = torch.randint(0, h, (1,)) x1 = torch.clamp(cx - self.size // 2, 0, w) x2 = torch.clamp(cx + self.size // 2, 0, w) y1 = torch.clamp(cy - self.size // 2, 0, h) y2 = torch.clamp(cy + self.size // 2, 0, h) img[:, y1:y2, x1:x2] = 0 return img
1. 图像增强(Image Augmentation)
原理:
通过对图像进行旋转、翻转、裁剪、亮度调整等,模拟更多样本,增强模型泛化能力。
PyTorch 示例代码:
import torchvision.transforms as transforms
transform = transforms.Compose([
transforms.RandomHorizontalFlip(p=0.5), # 水平翻转概率为0.5
transforms.RandomRotation(degrees=15), # 旋转±15度
transforms.ColorJitter(brightness=0.2, contrast=0.2), # 颜色扰动
transforms.RandomResizedCrop(224, scale=(0.8, 1.0)), # 随机裁剪并调整大小
transforms.ToTensor(),
])
参数说明:
-
p
: 操作发生的概率 -
degrees
: 最大旋转角度 -
scale
: 随机裁剪区域占比范围 -
brightness
,contrast
: 颜色变化范围,数值越大变化越强烈
适用场景:
-
数据少或容易过拟合的任务
-
对图像形态鲁棒性的模型训练(如 ResNet)
调试技巧:
-
增强过强可能破坏语义,建议先可视化
-
可以用
torchvision.transforms.RandomApply()
组合增强策略
2. Mixup / CutMix
原理:
-
Mixup:将两张图像按比例混合,标签也按比例混合。
-
CutMix:将一部分图像区域替换为另一张图像,标签按区域面积加权混合。
Mixup 示例代码:
def mixup_data(x, y, alpha=1.0):
lam = np.random.beta(alpha, alpha)
index = torch.randperm(x.size(0))
mixed_x = lam * x + (1 - lam) * x[index, :]
y_a, y_b = y, y[index]
return mixed_x, y_a, y_b, lam
参数说明:
-
alpha
: 控制 Beta 分布的参数,值越大混合越均匀
适用场景:
-
小数据集或模型容易过拟合
-
强化模型对边界样本的泛化能力
调试技巧:
-
可视化混合结果确认是否失真
-
训练时需改动 loss 计算:
loss = lam * loss_a + (1 - lam) * loss_b
3. 标准化(Normalization)
原理:
将图像像素值转化为均值为0、方差为1的分布,加速收敛,提升稳定性。
示例代码(适配 ImageNet 预训练):
normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
参数说明:
-
mean
,std
: 每通道的均值和标准差,通常根据数据集统计或跟预训练模型一致
适用场景:
-
任何图像任务,尤其是使用预训练模型时
调试技巧:
-
若训练模型从零开始,可以自己计算均值和标准差
-
可用
transforms.ToPILImage()
逆变换还原图像
4. 自动增强(AutoAugment / RandAugment)
原理:
使用搜索算法(AutoAugment)或随机采样策略(RandAugment)自动生成增强策略。
示例代码(RandAugment):
from torchvision.transforms import RandAugment
transform = transforms.Compose([
RandAugment(num_ops=2, magnitude=9),
transforms.ToTensor(),
])
参数说明:
-
num_ops
: 应用的随机操作数量 -
magnitude
: 操作强度,0~10之间
适用场景:
-
高精度任务,如 ImageNet、医学图像
-
自动寻找最优增强组合
调试技巧:
-
在大模型上训练更有效
-
可以将 RandAugment 作为子模块嵌入到主 pipeline 中调试效果
5. 图像去噪
原理:
利用滤波技术去除图像中不必要的噪声,保留结构信息。
示例代码(OpenCV):
import cv2
denoised = cv2.fastNlMeansDenoisingColored(image, None, 10, 10, 7, 21)
参数说明:
-
h
: 强度参数,控制去噪程度 -
templateWindowSize
: 模板窗口大小 -
searchWindowSize
: 搜索窗口大小
适用场景:
-
噪声严重的数据,如医学图像、红外图像
调试技巧:
-
与 CLAHE(自适应直方图均衡)结合效果更佳
-
需注意保持边缘清晰,避免信息损失
6. 图像尺寸调整(Resize + Padding)
原理:
统一图像尺寸以适配模型,避免不同大小导致 shape 错误。
示例代码:
transform = transforms.Compose([
transforms.Resize((256, 256)), # 固定缩放
transforms.CenterCrop(224), # 居中裁剪
transforms.ToTensor()
])
参数说明:
-
Resize
: 指定输出尺寸,元组表示高宽 -
Crop
: 中心或随机裁剪
适用场景:
-
输入大小必须一致的 CNN 模型
-
多种原始尺寸图像混合训练时
调试技巧:
-
保持长宽比时可用
transforms.Resize(256)
+transforms.CenterCrop(224)
-
如果要求输入为正方形,可配合 ZeroPadding
总结:推荐组合模板(分类任务)
transform = transforms.Compose([
transforms.RandomResizedCrop(224, scale=(0.8, 1.0)),
transforms.RandomHorizontalFlip(),
transforms.ColorJitter(0.4, 0.4, 0.4, 0.1),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]),
])