2. 数据增强策略:Mosaic、MixUp、CutOut、RandomAffine等增强方法对小目标的适用性分析
数据增强,说白了就是给训练集「加料」。做小目标检测,这步尤其关键。我刚开始用YOLO做小目标时,模型怎么都学不会,后来才发现——不是模型不行,是数据里的小目标太少了。
这一章,我把常用的几种增强方法拆开揉碎,讲讲它们对小目标到底有没有用,什么时候该用,什么时候反而会帮倒忙。
核心观点: 没有万能的数据增强。对小目标而言,保留细节比增加多样性更重要。
2.1 Mosaic:小目标的「救命稻草」
Mosaic是YOLOv4开始引入的,把4张图拼成1张。我个人习惯叫它「四合一」。为什么它对小目标友好?
- 缩小了目标尺寸:原图里的大目标,拼完后变成中等目标;原图里的中等目标,变成小目标。相当于免费给你生成了大量小目标样本。
- 增加了上下文:小目标周围多了其他场景,模型能学到更多背景信息。
- 平衡了类别:如果某个类别的小目标很少,Mosaic能强行把它和其他图拼在一起,避免模型忽略它。
我在项目中遇到过一个问题:Mosaic比例太高,模型反而学坏了。比如一张图里全是小目标,拼完后小目标变得更小,连人都看不清了。嗯,这里要注意——
我的建议: Mosaic概率控制在0.5~0.7之间。训练初期用高概率,后期逐渐降低。如果数据集里小目标本来就很多,可以再低一些。
2.2 MixUp:对小目标「不太友好」
MixUp是把两张图按比例叠加,标签也按比例混合。听起来很合理,但实际用在小目标上,效果往往打折扣。
为什么会这样?
- 目标变模糊:叠加后,小目标的边缘和纹理被背景「吃掉」了。本来小目标就只占几个像素,一叠加,几乎消失。
- 标签不确定性增加:混合标签让模型学到的目标边界更模糊,对小目标这种本身就模糊的物体,反而有害。
我曾经在无人机航拍数据集上试过MixUp,结果mAP掉了3个点。后来我把它关了,效果立刻回升。
避坑指南: 如果你做的是小目标检测,不建议使用MixUp。如果非要用,把alpha参数调小(比如0.2以下),减少混合强度。
2.3 CutOut:随机遮挡,小目标的「双刃剑」
CutOut就是在图上随机挖掉一块正方形区域。对小目标来说,这招有点危险。
| 场景 | 效果 | 原因 |
|---|---|---|
| 大目标被遮挡一部分 | ✅ 有效,模型学会利用局部特征 | 大目标剩余部分仍可识别 |
| 小目标被完全遮挡 | ❌ 有害,模型学到「目标消失」 | 小目标本身像素少,一遮就没了 |
| 遮挡区域避开小目标 | ✅ 有效,增加背景多样性 | 小目标不受影响 |
我建议的做法是:把CutOut的遮挡区域限制在图像边缘,或者使用随机大小的矩形而不是固定正方形。这样能减少遮挡小目标的概率。
2.4 RandomAffine:几何变换要「温柔」
RandomAffine包括旋转、缩放、平移、剪切。对小目标来说,缩放和旋转是重点。
- 缩放:缩小会让小目标变得更小,甚至消失。我一般把缩放范围控制在0.8~1.2之间。
- 旋转:小目标旋转后,边界框的IoU计算会变差。尤其是细长型小目标(比如电线杆、笔),旋转后标签不准。
- 平移:相对安全,但要注意不要把小目标移出图像边界。
经验值: 对于小目标检测,RandomAffine的缩放因子建议0.8~1.2,旋转角度建议±15°以内。太激进的变换,不如不做。
2.5 其他增强方法速览
除了上面几种,还有一些常见增强,我简单说说对小目标的适用性:
| 方法 | 对小目标友好度 | 说明 |
|---|---|---|
| HSV颜色抖动 | ⭐⭐⭐⭐⭐ | 不影响目标尺寸,安全 |
| 水平翻转 | ⭐⭐⭐⭐⭐ | 不改变目标大小,推荐 |
| 随机裁剪 | ⭐⭐⭐ | 裁剪区域要包含小目标,否则有害 |
| 高斯噪声 | ⭐⭐ | 小目标纹理本来就弱,加噪声更难识别 |
| 模糊 | ⭐ | 千万别用,小目标一模糊就没了 |
2.6 增强策略组合:我的「黄金配方」
你想想看,每种增强都有优缺点,怎么组合才能最大化收益?我经过多次实验,总结了一套适合小目标的增强策略:
- Mosaic(概率0.6):作为主力,生成大量小目标样本。
- HSV颜色抖动(概率0.5):增加颜色多样性,不影响尺寸。
- 水平翻转(概率0.5):简单有效。
- RandomAffine(概率0.3,缩放0.8~1.2,旋转±10°):温和的几何变换。
- CutOut(概率0.2,遮挡区域限制在边缘):少量使用,增加鲁棒性。
- MixUp:关闭。
注意: 这个配方不是固定的。如果你的数据集里小目标特别多(比如遥感图像),可以适当降低Mosaic概率,提高RandomAffine的缩放上限。关键是要观察训练过程中的mAP变化,及时调整。
2.7 知识结构图:数据增强对小目标的适用性
下面这张图总结了本章的核心逻辑,帮你快速建立知识框架:
2.8 实战建议:如何验证增强策略是否有效
说了这么多,怎么知道自己的增强策略到底好不好?我一般用三步验证法:
- 可视化检查:把增强后的图片拿出来看,小目标是否清晰可见?有没有被遮挡或模糊?
- 消融实验:每次只关掉一种增强,看mAP变化。如果关掉后mAP上升,说明这种增强有害。
- 观察训练曲线:如果训练集loss下降很快但验证集loss不降,说明增强不够;如果两者都降得慢,说明增强太强了。
我曾经踩过的坑: 有一次我同时开了Mosaic、MixUp和RandomAffine,训练了100个epoch,mAP只有0.12。后来逐个排查,发现MixUp和Mosaic叠加后,小目标几乎全消失了。从那以后,我每次改增强策略都会先可视化看一轮。