数据增强:图像翻转、裁剪与 Mixup

FreeGuideOnline 23阅读 2026-07-03

python from torchvision import transforms

随机裁剪到224x224

transform = transforms.RandomResizedCrop(224, scale=(0.6, 1.0), ratio=(3./4., 4./3.))


- `scale`:控制裁剪区域相对原图面积的比例范围。
- `ratio`:裁剪区域的宽高比范围。
- 在目标检测中,需对裁剪导致的边界框越界部分调整,常见做法是保留完全位于裁剪区域内的框或截断框坐标。
- 避免在验证集使用随机裁剪,通常使用中心裁剪或直接缩放以保证评估的一致性。

## Mixup

### 原理与动机

Mixup 是一种基于插值的数据增强策略,其核心思想是:**通过线性混合两个随机样本及其标签来生成虚拟训练样本**。这种方法迫使模型的预测在样本之间平滑过渡,避免过度尖锐的决策边界,从而大幅提升泛化能力和对抗鲁棒性。

给定两个样本 (xᵢ, yᵢ) 和 (xⱼ, yⱼ),以及从 Beta 分布中采样的混合系数 λ ∈ [0,1](通常 λ ∼ Beta(α, α),α 控制混合强度),生成新样本:

- 增强图像:x̃ = λ·xᵢ + (1-λ)·xⱼ
- 增强标签:ỹ = λ·yᵢ + (1-λ)·yⱼ

由于标签变成了概率形式的软标签,Mixup 只能与能处理软目标的损失函数配合使用,如交叉熵损失直接接收 one-hot 之外的分布作为目标。

### 超参数选择与效果

超参数 α 控制了混合的“粘稠度”:

- α → 0 时,λ 几乎总是 0 或 1,混合退化到朴素样本切换。
- α 较大时(如 1.0 以上),混合更加均匀,样本偏离原始分布严重。
- 实验证明,α 在 0.1~0.4 之间对多数图像分类任务效果良好,较大 α 适用于需要强正则化的小数据集。

Mixup 显著提高了分类准确率,尤其在小数据集上。它还提升了模型对对抗样本的鲁棒性,降低了置信度过度自信的问题。

### 实现与适用场景

核心代码片段如下:

```python
import torch
import numpy as np

def mixup_data(x, y, alpha=0.2, device='cuda'):
    if alpha > 0:
        lam = np.random.beta(alpha, alpha)
    else:
        lam = 1

    batch_size = x.size()[0]
    index = torch.randperm(batch_size).to(device)  # 随机打乱索引

    mixed_x = lam * x + (1 - lam) * x[index, :]
    y_a, y_b = y, y[index]
    return mixed_x, y_a, y_b, lam

def mixup_criterion(criterion, pred, y_a, y_b, lam):
    return lam * criterion(pred, y_a) + (1 - lam) * criterion(pred, y_b)

注意事项:

  • Mixup 产生的图片并不是自然的,但实验表明不影响模型学习有效特征。
  • 仅适用于分类任务,无法直接用于检测或分割(因标签变为混合的软标签,边界框等结构信息丢失)。对分割任务,有 CutMix、ClassMix 等变体。
  • 建议训练初期使用 vanilla 训练数 epoch 后再加入 Mixup,或训练全程使用。通常全程使用效果更优。

组合使用与工程实践

现代深度学习训练管线通常将多种增强方法串联,并使用概率和随机参数控制。例如一个典型的图像分类增强组合:

train_transform = transforms.Compose([
    transforms.RandomResizedCrop(224),
    transforms.RandomHorizontalFlip(),
    transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2),
    transforms.ToTensor(),
    transforms.Normalize(mean, std)
])