4. 数据量不足:小数据集下 YOLO 容易过拟合,数据增强的必要性
做目标检测的人,十有八九都遇到过这个问题:明明模型在训练集上跑得挺好,mAP 都快到 0.9 了,一上验证集直接腰斩。嗯,这就是典型的过拟合。而小数据集,恰恰是过拟合的温床。
我个人习惯把这种现象叫做「死记硬背」。模型把训练集里每张图的背景、光照、物体姿态都背下来了,根本没学会真正的特征。你想想看,如果只给你看 100 张猫的照片,你能总结出「猫」这个概念的通用规律吗?很难。模型也一样。
4.1 小数据集的「三座大山」
我在项目中接手过一个工业质检的案子,总共只有 200 张标注好的缺陷样本。当时 YOLOv5 跑出来的结果,怎么说呢——训练损失降得漂亮,验证集上几乎全崩。后来我总结了一下,小数据集主要带来三个问题:
| 问题 | 表现 | 后果 |
|---|---|---|
| 特征空间稀疏 | 模型只见过有限的角度、光照、尺度 | 换一个场景就检测不到 |
| 背景过拟合 | 模型把背景纹理当成目标特征 | 目标换到新背景上就漏检 |
| 类别不平衡放大 | 少数类样本本来就少,更难学到 | 长尾类别几乎不检出 |
说白了,小数据集下的 YOLO 就像个只会做「原题」的学生。考试题目稍微变一变,立马露馅。
4.2 数据增强:最直接的「解药」
数据增强不是锦上添花,而是雪中送炭。它的核心逻辑很简单:用有限的真实数据,生成无限的虚拟数据。让模型在训练时看到更多样化的输入,从而学到真正鲁棒的特征。
我曾经在一个只有 500 张图片的交通标志检测项目里,靠数据增强把 mAP 从 0.52 提到了 0.78。效果立竿见影。
4.2.1 基础几何变换
这些是最常用的,YOLO 官方代码里基本都集成了:
- 随机翻转(水平/垂直):模拟不同视角
- 随机旋转(±10°~±30°):适应倾斜拍摄
- 随机缩放(0.5~1.5 倍):适应不同距离
- 随机裁剪:模拟部分遮挡
- 随机平移:改变目标在画面中的位置
4.2.2 色彩与光照调整
真实世界的光照千变万化。如果训练集里全是白天拍的,模型到了晚上就抓瞎。我建议至少做这几项:
- 亮度调整:模拟白天/黄昏/夜晚
- 对比度调整:适应不同天气
- 饱和度调整:适应不同摄像头色彩风格
- 色相偏移:模拟不同光源色温
这里有个坑——不要同时把所有参数调到最大。我曾经这么干过,结果模型把红色汽车和绿色汽车当成两个不同的类别去学了。嗯,过犹不及。
4.2.3 高级增强策略
基础增强不够用的时候,可以上一些「狠活」:
| 策略 | 原理 | 适用场景 |
|---|---|---|
| Mosaic | 将 4 张图拼成 1 张,随机缩放裁剪 | 小目标检测、类别不平衡 |
| MixUp | 两张图按比例混合,标签也按比例混合 | 提高泛化性、减少过拟合 |
| CutOut / Random Erasing | 随机遮挡图像中的矩形区域 | 模拟遮挡、提高鲁棒性 |
| Copy-Paste | 把目标对象复制到其他背景上 | 小样本、稀有类别 |
4.3 数据增强的核心逻辑
下面这张图,是我自己总结的数据增强在 YOLO 训练中的位置和作用路径:
4.4 实战:YOLOv8 中的数据增强配置
YOLOv8 的配置文件里,数据增强参数都在 hyp.yaml 里。我直接贴一份我常用的配置,适合小数据集场景:
# 小数据集增强配置(hyp_small.yaml)
lr0: 0.01
lrf: 0.01
momentum: 0.937
weight_decay: 0.0005
warmup_epochs: 3.0
warmup_momentum: 0.8
warmup_bias_lr: 0.1
# 数据增强参数
hsv_h: 0.015 # 色相增强幅度
hsv_s: 0.7 # 饱和度增强幅度
hsv_v: 0.4 # 亮度增强幅度
degrees: 10.0 # 旋转角度(度)
translate: 0.1 # 平移比例
scale: 0.5 # 缩放比例
shear: 2.0 # 剪切角度
perspective: 0.0 # 透视变换(小数据集不建议开)
flipud: 0.5 # 上下翻转概率
fliplr: 0.5 # 左右翻转概率
mosaic: 1.0 # Mosaic 增强概率
mixup: 0.0 # MixUp 增强概率(和 Mosaic 二选一)
copy_paste: 0.1 # Copy-Paste 增强概率
关键参数解读:
mosaic: 1.0— 小数据集下强烈建议开启,相当于把数据量翻了 4 倍mixup: 0.0— 和 Mosaic 冲突,我一般不同时开degrees: 10.0— 旋转角度别太大,10° 以内足够scale: 0.5— 缩放范围 0.5~1.5 倍,覆盖多尺度
4.5 数据增强的「度」
最后说一个很多人容易忽略的点:数据增强不是越多越好。
我见过有人把增强参数拉到满,结果训练出来的模型在真实场景上反而更差了。为什么会这样?因为过度增强会让图像失真,模型学到的特征和真实分布偏离太远。
举个例子:你把亮度调得太暗,图像里全是噪点,模型就会把「噪点」当成特征去学。这叫什么?这叫「增强过拟合」。
我的建议是:
- 先保守:从官方默认参数开始,跑一个 baseline
- 再激进:逐步加大增强幅度,观察验证集 mAP 变化
- 找到拐点:mAP 开始下降的那个点,就是增强的上限
数据增强,说白了就是用「人工多样性」弥补「数据稀缺性」。在小数据集下,它是最直接、最有效、成本最低的防过拟合手段。别偷懒,把增强策略调好,你的 YOLO 模型会感谢你的。