2. 数据增强策略

做小目标检测,最头疼的问题是什么?

说白了,就是特征太少。一个 32×32 的交通标志,在 640×640 的输入图上只占 0.25% 的像素。你让模型怎么学?

我刚开始做遥感图像检测时,模型在验证集上 mAP 死活过不了 0.3。后来发现,不是网络结构的问题,是数据根本没喂够。小目标本身在图像里就稀缺,再加上标注框小、背景杂乱,模型很容易过拟合到背景噪声上。

数据增强,就是解决这个问题的第一道防线。今天咱们重点聊四种在小目标场景下特别有效的增强策略:Mosaic、MixUp、CutOut、RandomErasing。

核心观点:小目标检测的数据增强,核心目标不是「让数据变多」,而是「让目标在图像中的分布更密集、更丰富」。Mosaic 和 MixUp 做的是「拼合」,CutOut 和 RandomErasing 做的是「遮挡」。两者思路相反,但都能提升小目标的鲁棒性。
四种数据增强策略在小目标上的应用对比 Mosaic 4张图拼成1张 目标密度↑ 背景多样性↑ 小目标数量×4 MixUp 两张图线性叠加 标签平滑 泛化性↑ 适合小目标+大目标混合 CutOut 随机遮挡正方形区域 防止过拟合到局部特征 遮挡尺寸需小于小目标 RandomErasing 随机擦除矩形区域 可控制擦除比例 比CutOut更灵活 调优关键参数 • Mosaic:拼图缩放比例(scale range)、拼图数量(通常4张,可调为2或9) • MixUp:混合系数 alpha(0.2~0.5 适合小目标,太大导致目标模糊) • CutOut:遮挡区域边长(建议 ≤ 小目标尺寸的 1.5 倍) • RandomErasing:擦除比例(0.02~0.1 适合小目标,太高会擦掉目标本身)

1. Mosaic:把小目标「聚」在一起

Mosaic 是 YOLOv4 开始引入的经典增强。做法很简单:随机取 4 张训练图,各裁一块,拼成一张新图。

为什么对小目标有效?你想想看,原本一张图里可能只有 1~2 个小目标,拼完之后一张图里出现 4~8 个。模型在一个 batch 里看到的小目标数量直接翻倍,梯度更新更稳定。

我的经验:在 VisDrone 数据集上,我试过把 Mosaic 的拼图数量从 4 改成 9(3×3 网格)。小目标的 recall 提升了 3.2%,但训练时间增加了 40%。折中方案是保持 4 张,但把缩放范围从 [0.5, 1.5] 改成 [0.3, 1.0],让拼出来的小目标更小、更密集。

Mosaic 的调优参数主要有三个:

参数 默认值 小目标推荐值 说明
拼图数量 4 4 或 9 数量越多,小目标密度越高,但计算量增大
缩放范围 [0.5, 1.5] [0.3, 1.0] 缩小范围,让小目标在拼图中占比更小,模拟远距离场景
拼图重叠 无 允许 10%~20% 重叠 重叠区域会产生遮挡,提升模型对部分遮挡的鲁棒性
注意:Mosaic 在训练后期建议关闭。我习惯在总 epoch 的前 70% 使用 Mosaic,后 30% 切回普通训练。原因是 Mosaic 生成的图像分布与真实场景有偏差,模型最后需要「回归真实」。

2. MixUp:让标签「软」一点

MixUp 不是 YOLO 原生的增强,但我在小目标场景下试过,效果出乎意料地好。

它的做法是:随机取两张图,按比例 α 和 1-α 叠加像素值,标签也按同样比例混合。比如一张图有「行人」,另一张有「自行车」,混合后标签变成「0.7 行人 + 0.3 自行车」。

为什么对小目标有效?小目标的特征本来就弱,模型很容易「死记硬背」某些背景模式。MixUp 让标签变得模糊,模型被迫学习更通用的特征。

关键参数:混合系数 α 控制两张图的混合比例。α 越大,混合越均匀。我测试下来,α=0.2 对小目标效果最好——既保留了主目标的清晰度,又引入了副目标的干扰。

具体实现时,我建议:

  • α 范围: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(遮挡边长 64 像素)。结果小目标(32×32 的限速牌)的 AP 从 0.45 掉到 0.38。后来把遮挡边长改成 16 像素,AP 才回升到 0.47。记住:遮挡尺寸必须小于小目标尺寸。

我总结了一套参数配置:

策略 参数 小目标推荐值 理由
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]
执行顺序很重要:我建议先做 Mosaic(改变图像结构),再做 MixUp(混合像素),最后做 CutOut/RandomErasing(局部遮挡)。如果顺序反过来,Mosaic 的拼图操作会把遮挡区域「打乱」,效果大打折扣。

5. 实际项目中的调优经验

最后分享几个我在项目中踩过的坑:

  • 不要盲目堆叠增强:有一次我把 Mosaic、MixUp、CutOut、RandomErasing 全开了,概率都设 0.5。结果训练 loss 降不下去,模型根本学不到稳定特征。后来把总增强概率控制在 0.7 以内(即每张图最多被 1~2 种增强命中),效果才正常。
  • 验证集不要做增强:这个看起来是常识,但我真见过有人把 Mosaic 用在验证集上。验证集必须保持原始分布,否则评估结果没有意义。
  • 小目标增强要「温和」:大目标可以承受较强的遮挡和变形,小目标不行。我的原则是:增强强度与小目标尺寸成反比。目标越小,增强越轻。
  • 可视化检查:每次调整增强参数后,我都会随机抽 100 张增强后的图,人工检查小目标是否被破坏。这个习惯帮我避免了很多「看起来有效、实际有害」的参数。