数据增强策略:Mosaic、MixUp、CutOut、RandomErasing在小目标上的应用与调优
做小目标检测,最头疼的问题是什么?
说白了,就是特征太少。一个 32×32 的交通标志,在 640×640 的输入图上只占 0.25% 的像素。你让模型怎么学?
我刚开始做遥感图像检测时,模型在验证集上 mAP 死活过不了 0.3。后来发现,不是网络结构的问题,是数据根本没喂够。小目标本身在图像里就稀缺,再加上标注框小、背景杂乱,模型很容易过拟合到背景噪声上。
数据增强,就是解决这个问题的第一道防线。今天咱们重点聊四种在小目标场景下特别有效的增强策略:Mosaic、MixUp、CutOut、RandomErasing。
1. Mosaic:把小目标「聚」在一起
Mosaic 是 YOLOv4 开始引入的经典增强。做法很简单:随机取 4 张训练图,各裁一块,拼成一张新图。
为什么对小目标有效?你想想看,原本一张图里可能只有 1~2 个小目标,拼完之后一张图里出现 4~8 个。模型在一个 batch 里看到的小目标数量直接翻倍,梯度更新更稳定。
Mosaic 的调优参数主要有三个:
| 参数 | 默认值 | 小目标推荐值 | 说明 |
|---|---|---|---|
| 拼图数量 | 4 | 4 或 9 | 数量越多,小目标密度越高,但计算量增大 |
| 缩放范围 | [0.5, 1.5] | [0.3, 1.0] | 缩小范围,让小目标在拼图中占比更小,模拟远距离场景 |
| 拼图重叠 | 无 | 允许 10%~20% 重叠 | 重叠区域会产生遮挡,提升模型对部分遮挡的鲁棒性 |
2. MixUp:让标签「软」一点
MixUp 不是 YOLO 原生的增强,但我在小目标场景下试过,效果出乎意料地好。
它的做法是:随机取两张图,按比例 α 和 1-α 叠加像素值,标签也按同样比例混合。比如一张图有「行人」,另一张有「自行车」,混合后标签变成「0.7 行人 + 0.3 自行车」。
为什么对小目标有效?小目标的特征本来就弱,模型很容易「死记硬背」某些背景模式。MixUp 让标签变得模糊,模型被迫学习更通用的特征。
具体实现时,我建议:
- α 范围:0.1~0.3,不要超过 0.5。超过 0.5 后两张图都看不清,小目标直接消失。
- 应用概率:0.3~0.5,不要每张图都用。MixUp 太频繁会导致模型「迷茫」。
- 目标尺寸过滤:只对包含小目标(面积 < 32×32)的图做 MixUp,大目标图跳过。
我曾经在一个无人机航拍数据集上做过对比:不加 MixUp 的模型,小目标 AP 是 0.21;加了 α=0.2、概率 0.4 的 MixUp 后,AP 涨到 0.26。提升很明显。
3. CutOut 与 RandomErasing:故意「弄丢」目标
这两个策略思路类似,都是故意遮挡图像的一部分,强迫模型用剩余信息做判断。
CutOut 是固定形状(正方形)的遮挡,RandomErasing 更灵活,可以控制遮挡区域的长宽比和位置。
对小目标来说,这两个策略有个致命陷阱:遮挡区域太大,直接把小目标盖住了。模型学到的不是「遮挡鲁棒性」,而是「怎么猜被遮住的目标」——这完全没用。
我总结了一套参数配置:
| 策略 | 参数 | 小目标推荐值 | 理由 |
|---|---|---|---|
| CutOut | 遮挡边长 | 8~16 像素 | 小于小目标尺寸,只遮挡局部特征 |
| CutOut | 遮挡数量 | 1~2 个 | 太多遮挡会破坏目标结构 |
| RandomErasing | 擦除比例 | 0.02~0.05 | 擦除面积占全图比例,小目标场景要更低 |
| RandomErasing | 擦除长宽比 | 0.3~3.0 | 允许细长遮挡,模拟电线杆、树枝等干扰 |
4. 四种策略的搭配方案
实际项目中,我不会只用一种增强。我的习惯是组合使用,但要注意顺序和概率。
下面是我在多个小目标数据集上验证过的搭配方案:
# 推荐的小目标数据增强流水线(YOLOv8 风格配置)
augmentations:
mosaic:
enable: true
prob: 1.0 # 前70% epoch 开启
scale_range: [0.3, 1.0]
n_patches: 4
mixup:
enable: true
prob: 0.4
alpha: 0.2
# 只对包含小目标的图像做 MixUp
filter_by_target_size: true
max_target_size: 64
cutout:
enable: true
prob: 0.3
size: [8, 16] # 随机在 8~16 之间选
n_holes: 1
random_erasing:
enable: true
prob: 0.2
area_ratio: [0.02, 0.05]
aspect_ratio: [0.3, 3.0]
5. 实际项目中的调优经验
最后分享几个我在项目中踩过的坑:
- 不要盲目堆叠增强:有一次我把 Mosaic、MixUp、CutOut、RandomErasing 全开了,概率都设 0.5。结果训练 loss 降不下去,模型根本学不到稳定特征。后来把总增强概率控制在 0.7 以内(即每张图最多被 1~2 种增强命中),效果才正常。
- 验证集不要做增强:这个看起来是常识,但我真见过有人把 Mosaic 用在验证集上。验证集必须保持原始分布,否则评估结果没有意义。
- 小目标增强要「温和」:大目标可以承受较强的遮挡和变形,小目标不行。我的原则是:增强强度与小目标尺寸成反比。目标越小,增强越轻。
- 可视化检查:每次调整增强参数后,我都会随机抽 100 张增强后的图,人工检查小目标是否被破坏。这个习惯帮我避免了很多「看起来有效、实际有害」的参数。