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 实战策略:怎么组合才有效?
增强不是越多越好。我见过有人把十几种增强全堆上,结果模型训练了三天都不收敛。我的建议是:
- 先做减法:从几何变换+颜色抖动开始,跑一个 baseline
- 逐步加高级增强:每次只加一种,观察验证集效果
- 控制概率:高级增强(CutMix、Mosaic)的概率建议 0.3~0.5,别太高
- 注意标签一致性:分类任务用 MixUp/CutMix 没问题,但检测任务要处理好 bbox 坐标
我的配置参考: 工业缺陷检测,我常用的组合是:随机旋转(±20°)+ 颜色抖动(亮度±0.15)+ CutMix(p=0.3)。这个组合在大多数场景下都能稳定提升 2~5 个点的 mAP。
最后说一句:数据增强不是银弹。如果你的原始数据质量太差(比如标注错误、光照极端),再强的增强也救不回来。先把数据清洗干净,再谈增强策略。