方法 | 原理 | 常用参数 | 适用场景 |
---|---|---|---|
图像增强(Augmentation) | 改变图像外观/几何结构,提升泛化能力 | 翻转、旋转、缩放、色调扰动等 | 分类、检测、分割等 |
Mixup / CutMix | 合成新图像/标签组合,提升鲁棒性 | alpha(混合程度) | 小数据集、过拟合任务 |
标准化(Normalization) | 均值为0,方差为1,提升训练稳定性 | mean、std | 图像分类、迁移学习等 |
图像去噪 | 去除无效噪声 | 滤波核大小等 | 医学图像、工业图像等 |
图像压缩与分辨率调整 | 减小内存/提高兼容性 | 尺寸参数 | 超大图像、模型输入要求 |
自动增强(AutoAugment / RandAugment) | 使用搜索或随机策略自动增强 | policy、N、M 等 | 高精度需求任务 |
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
通过对图像进行旋转、翻转、裁剪、亮度调整等,模拟更多样本,增强模型泛化能力。
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()
组合增强策略
Mixup:将两张图像按比例混合,标签也按比例混合。
CutMix:将一部分图像区域替换为另一张图像,标签按区域面积加权混合。
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
将图像像素值转化为均值为0、方差为1的分布,加速收敛,提升稳定性。
normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
mean
, std
: 每通道的均值和标准差,通常根据数据集统计或跟预训练模型一致
任何图像任务,尤其是使用预训练模型时
若训练模型从零开始,可以自己计算均值和标准差
可用 transforms.ToPILImage()
逆变换还原图像
使用搜索算法(AutoAugment)或随机采样策略(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 中调试效果
利用滤波技术去除图像中不必要的噪声,保留结构信息。
import cv2
denoised = cv2.fastNlMeansDenoisingColored(image, None, 10, 10, 7, 21)
h
: 强度参数,控制去噪程度
templateWindowSize
: 模板窗口大小
searchWindowSize
: 搜索窗口大小
噪声严重的数据,如医学图像、红外图像
与 CLAHE(自适应直方图均衡)结合效果更佳
需注意保持边缘清晰,避免信息损失
统一图像尺寸以适配模型,避免不同大小导致 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]),
])