4. 数据增强策略:几何变换、颜色抖动、CutMix、Mosaic、MixUp 实战

数据增强,说白了就是给模型“喂”更多样化的数据。工业场景下,缺陷样本往往稀缺,你不可能指望每类缺陷都拍几千张。这时候,数据增强就是性价比最高的手段。

我个人习惯把增强策略分成两类:基础几何/颜色变换 和 高级混合增强。前者解决视角和光照变化,后者解决样本不足和过拟合。下面我们逐个拆解。

4.1 几何变换:让模型学会“看”不同角度

工业相机安装位置固定,但工件摆放可能有偏差。几何变换就是模拟这种偏差。

变换类型 适用场景 注意事项
随机旋转(±30°) 圆形工件、PCB板 注意填充模式,避免黑边干扰
随机裁剪(0.8~1.0) 大尺寸图像,目标居中 裁剪后需resize回原尺寸
水平/垂直翻转 对称性工件 文字类缺陷慎用翻转
仿射变换 透视畸变场景 参数不宜过大,否则失真严重
我的经验: 旋转角度别超过45度。我曾经在轴承缺陷检测中用了±90度旋转,结果模型把倒置的工件误判为缺陷——因为油污在重力作用下会流动,倒过来就不对了。
# 几何变换实战代码(PyTorch)
import torchvision.transforms as T

geo_transform = T.Compose([
    T.RandomRotation(degrees=30, fill=0),      # 填充黑色
    T.RandomResizedCrop(size=(224, 224), scale=(0.8, 1.0)),
    T.RandomHorizontalFlip(p=0.5),
    T.RandomAffine(degrees=0, translate=(0.1, 0.1))
])

4.2 颜色抖动:应对光照变化

工厂产线的光照不可能永远恒定。早上和晚上的色温不同,灯管老化也会导致亮度波动。颜色抖动就是让模型对这些变化“脱敏”。

常用的参数范围:

  • 亮度:±0.2(即0.8~1.2倍)
  • 对比度:±0.2
  • 饱和度:±0.2
  • 色相:±0.05(色相变化太敏感,别调太大)
避坑: 色相调整要谨慎。我曾经在手机外壳划痕检测中,把色相范围设到±0.1,结果模型把金色外壳的划痕和银色外壳的划痕当成了两种缺陷——其实它们只是颜色不同。后来我把色相范围缩到±0.02,问题就解决了。
# 颜色抖动
color_transform = T.ColorJitter(
    brightness=0.2,
    contrast=0.2,
    saturation=0.2,
    hue=0.05
)

4.3 CutMix:让模型学会“局部”判断

CutMix 的思路很简单:把一张图的某个区域切下来,贴到另一张图上,标签也按面积比例混合。这样做的好处是,模型不能只靠整体特征判断,必须关注局部细节。

工业场景下,CutMix 特别适合小缺陷检测。比如,把有划痕的区域贴到正常工件上,模型就能学到“划痕长什么样”,而不是“整张图有划痕”。

# CutMix 核心逻辑(简化版)
def cutmix(image1, image2, label1, label2, alpha=1.0):
    lam = np.random.beta(alpha, alpha)
    bbx1, bby1, bbx2, bby2 = rand_bbox(image1.size(), lam)
    image1[:, bbx1:bbx2, bby1:bby2] = image2[:, bbx1:bbx2, bby1:bby2]
    lam = 1 - ((bbx2 - bbx1) * (bby2 - bby1) / (image1.size(-1) * image1.size(-2)))
    return image1, label1 * lam + label2 * (1. - lam)
关键点: CutMix 的 alpha 参数控制混合强度。alpha=1.0 时,混合比例均匀分布;alpha 越小,混合越极端。我一般从 alpha=0.5 开始调。

4.4 Mosaic:一张图顶四张

Mosaic 是 YOLOv4 提出的方法,把四张图拼成一张。它的好处是:

  • 变相增大 batch size:一张图里包含四个样本的信息
  • 丰富上下文:模型能看到不同尺度的目标
  • 缓解小目标问题:四张图拼在一起,小目标相对变大

我在电子元器件缺陷检测项目中用过 Mosaic。当时芯片引脚缺陷很小,单张图里只有几个像素。用了 Mosaic 后,模型终于能“看见”那些小引脚了。

# Mosaic 拼图逻辑(伪代码)
def mosaic(images, labels, img_size=640):
    # 随机选择中心点
    cx, cy = random.randint(img_size//4, img_size*3//4), random.randint(img_size//4, img_size*3//4)
    # 将四张图分别放置于左上、右上、左下、右下
    # 每张图按比例缩放并裁剪
    # 标签坐标做相应偏移
    return mosaic_img, mosaic_labels
注意: Mosaic 会改变目标的宽高比。如果你的缺陷对长宽比敏感(比如裂纹),建议配合其他增强一起用,或者降低 Mosaic 的使用概率。

4.5 MixUp:最简单的混合

MixUp 比 CutMix 更“暴力”——直接把两张图按像素比例叠加,标签也按同样比例混合。它不关心区域,只关心整体。

工业场景下,MixUp 适合纹理类缺陷。比如布料上的污渍,混合后模型能学到“污渍和背景的融合关系”。

方法 混合方式 标签处理 适用场景
CutMix 区域替换 按面积比例混合 小缺陷、局部特征
Mosaic 四图拼接 坐标偏移+类别不变 小目标、多尺度
MixUp 像素叠加 按比例混合 纹理、整体特征

4.6 实战策略:怎么组合才有效?

增强不是越多越好。我见过有人把十几种增强全堆上,结果模型训练了三天都不收敛。我的建议是:

  1. 先做减法:从几何变换+颜色抖动开始,跑一个 baseline
  2. 逐步加高级增强:每次只加一种,观察验证集效果
  3. 控制概率:高级增强(CutMix、Mosaic)的概率建议 0.3~0.5,别太高
  4. 注意标签一致性:分类任务用 MixUp/CutMix 没问题,但检测任务要处理好 bbox 坐标
我的配置参考: 工业缺陷检测,我常用的组合是:随机旋转(±20°)+ 颜色抖动(亮度±0.15)+ CutMix(p=0.3)。这个组合在大多数场景下都能稳定提升 2~5 个点的 mAP。
数据增强策略知识图谱 数据增强 几何变换 旋转 · 裁剪 · 翻转 仿射变换 颜色抖动 亮度 · 对比度 饱和度 · 色相 CutMix 区域替换 标签按面积混合 Mosaic 四图拼接 坐标偏移 MixUp 像素叠加 标签按比例混合 实战建议:几何+颜色做基础,CutMix/Mosaic/MixUp按需叠加

最后说一句:数据增强不是银弹。如果你的原始数据质量太差(比如标注错误、光照极端),再强的增强也救不回来。先把数据清洗干净,再谈增强策略。