4. 数据集构建与增强

在YOLO农作物病虫害识别项目中,模型精度上限往往在数据准备阶段就已经被决定。一个常见误区是:拿到田间采集的几千张图片后,直接全部投入训练,结果验证集mAP虚高、上线后对逆光叶片或病斑小目标几乎失效。问题通常不在网络结构,而在数据划分与增强策略。本节围绕三件事展开:如何科学划分训练/验证/测试集,如何针对病虫害图像设计几何与色彩增强,以及如何用Mosaic与MixUp提升小目标与复杂背景下的鲁棒性。

一、训练/验证/测试集的划分原则

三份数据承担不同职责:训练集用于更新权重;验证集用于调参、早停和选择最佳权重;测试集只在最终评估时使用一次,代表“未来真实数据”。划分时最容易踩的坑是数据泄漏——同一块田、同一株作物、同一拍摄时段的多张连拍图被随机分到训练集和验证集,模型会“记住”背景而非学习病斑特征,导致验证指标虚高。

因此划分应以“采集单元”为粒度,而不是以单张图片为粒度。推荐做法是:先按田块或植株编号分组,再以组为单位做分层抽样,保证各子集中健康、轻度、重度等类别比例接近总体分布。典型比例为训练:验证:测试 = 7:2:1 或 8:1:1;样本量少于2000张时,测试集不宜低于10%,否则评估方差过大。划分完成后应固化文件清单,避免每次训练重新随机划分造成指标不可比。

# 示例:按田块分组分层划分(示例参数,非实测结果)
import random, collections
groups = collections.defaultdict(list)   # 田块ID -> 图片列表
for img, field_id in samples:
    groups[field_id].append(img)

fields = list(groups)
random.seed(42); random.shuffle(fields)
n = len(fields)
train_f = fields[:int(n*0.7)]
val_f   = fields[int(n*0.7):int(n*0.9)]
test_f  = fields[int(n*0.9):]
# 再按类别比例微调,确保各子集病斑类别分布接近

划分后建议输出一份统计表,检查各类别在三份子集中的数量与占比是否合理,尤其关注稀有病害是否在验证/测试集中“消失”。

二、面向病虫害的几何与色彩增强

病虫害图像有其特殊性:病斑常为小目标、颜色是关键判别线索(如锈病的橙黄色、叶枯的灰褐色),而田间光照变化剧烈。增强策略必须“保语义、增变化”,不能破坏判别特征。

几何增强方面,水平翻转、随机缩放(0.5~1.5倍)、随机平移是安全的基础操作;小角度旋转(±15°)可模拟拍摄姿态差异。但垂直翻转需谨慎——叶片正反面纹理差异大,垂直翻转可能生成自然界不存在的样本。裁剪(Random Crop)要保证裁剪后仍保留至少一个完整标注框,否则会产生“无目标”的负样本噪声。

色彩增强方面,HSV空间的色调扰动幅度应小于亮度与饱和度扰动,因为色调直接对应病斑颜色类别。建议色相偏移控制在±10°以内,饱和度与明度可在0.7~1.3倍间随机;同时加入随机亮度对比度扰动模拟阴天/晴天。避免使用过强的色彩抖动,否则会把锈病的橙黄色“洗”成健康叶的绿色,造成标签与外观矛盾。

实操建议:先用小批量(如200张)可视化增强结果,人工抽查10~20张,确认病斑仍清晰可辨、标注框与目标对齐,再投入全量训练。这一步能提前发现“增强过猛”的问题。

三、Mosaic与MixUp实战

Mosaic将4张图像拼接为一张,迫使模型在单张输入中同时学习多尺度、多背景的目标,对小病斑检测提升明显,同时变相扩大了batch内的样本多样性。MixUp则对两张图像及其标签做线性加权混合,生成“半透明叠加”样本,有助于提升模型对遮挡和模糊的鲁棒性。二者在YOLO训练中通常配合使用:Mosaic提供空间多样性,MixUp提供外观平滑性。

实现时需注意标签同步变换。以Mosaic为例,拼接后每张子图的标注框坐标要按其在画布中的偏移量平移,超出边界的框需裁剪或丢弃;MixUp则需按混合系数λ对两组框做加权,实践中常简化为“保留主图标签、按比例保留副图标签”,避免框重叠混乱。以下为Mosaic核心逻辑示意:

# Mosaic 拼接核心步骤(示意)
canvas = np.zeros((2*S, 2*S, 3))
# 随机中心点 (cx, cy),四张图分别放入四个象限
place(img1, 0, 0, cx, cy)          # 左上
place(img2, cx, 0, 2*S, cy)        # 右上
place(img3, 0, cy, cx, 2*S)        # 左下
place(img4, cx, cy, 2*S, 2*S)      # 右下
# 每张子图的框:x += 偏移x, y += 偏移y,再裁剪到画布内
boxes = clip_and_shift(boxes_list, offsets)

参数设置上,Mosaic概率建议0.5~0.8,训练后期(最后10%~20% epoch)可关闭Mosaic,让模型在真实单图分布上收敛;MixUp概率建议0.1~0.3,过高会使小目标框在混合后难以辨认。两者叠加时总增强强度要控制,避免“过度增强”导致训练损失震荡不降。

病虫害数据集构建与增强流程 田间采集图像 含田块/植株编号 按采集单元分组 分层抽样 7:2:1 训练集 70% 验证集 20% 测试集 10% 几何增强 翻转/缩放/平移/±15°旋转 色彩增强 HSV扰动 色相±10° Mosaic 拼接 4图拼1图 · 概率0.5~0.8 标签按偏移平移并裁剪 训练后期关闭 MixUp 混合 两图线性加权 · 概率0.1~0.3 标签按λ加权保留 提升遮挡鲁棒性 增强后批次 → YOLO 训练

四、结果观察与判断依据

增强策略是否有效,不能只看训练损失下降。建议在验证集上对比“无增强基线”与“增强方案”的mAP@0.5及小目标(面积小于32×32像素)召回率;同时观察训练损失曲线是否平稳、验证损失是否出现过拟合拐点。若加入Mosaic后小目标召回明显提升但大目标精度下降,说明拼接导致大目标被裁切过多,应降低Mosaic概率或调整拼接中心点范围。若MixUp后损失长期震荡,应下调其概率或改用“仅对同类样本混合”的约束。最终以测试集一次性评估作为交付依据,并记录增强参数配置,保证实验可复现。

注意:测试集在调参阶段严禁参与任何增强策略选择或阈值调整,否则最终指标将失去对真实场景的代表性。