做农业害虫识别最让人头疼的不是模型调参而是数据。我一朋友做智能测报灯拍了上万张虫子照片发现真正能用来训练的没几张模糊、重影、角度单一、背景混乱都算小事更麻烦的是稻飞虱和白背飞虱、黏虫和二化螟幼虫光靠肉眼看都容易搞混。所以一套设计合理的农业害虫计算机视觉数据集放在智慧农业链条里价值一点都不比模型小。它要解决的不是“能不能识别”的演示问题而是“在田间真实场景下能不能稳定识别”的落地问题。这次梳理的这套数据集覆盖水稻、小麦、玉米、大豆四大主粮作物上的黏虫、豆科芫菁、红蜘蛛、稻瘿蚊、稻纵卷叶螟、稻飞虱、稻水象甲、小麦皮蓟马、白背飞虱、二化螟十类害虫内容围绕图像识别、数据标注、模型训练展开也把容易踩的坑一并聊清楚。对刚接触农业AI的人或者正在做虫情监测项目但数据集一团乱麻的团队应该都能少走些弯路。1. 项目概述这套数据集到底要解决什么问题1.1 智慧农业为什么绕不开害虫识别植保工作里有一句老话叫“虫情不明施药不灵”。过去田间虫情调查靠植保人员或农户到田里数虫子、看危害状效率低、时效差而且很依赖经验。一个经验丰富的老植保员看一眼就知道这茬稻飞虱该防了但这样的人数量有限一个县里可能就那么几个人靠他们跑完所有田块不现实。智慧农业要做的就是把这种“人肉巡检”变成“自动监测”。现在比较成熟的硬件方案是智能虫情测报灯晚上用特定波长的灯光把害虫诱集过来落到一个拍摄平台上自动拍照、自动上传后台再用图像识别模型做分类计数。整个链路里识别模型就是“自动植保员的眼睛”它的输入直接就是图像输出是“哪一类害虫、多少只、什么虫态”精度直接决定了预警和决策的质量。所以害虫识别不是锦上添花的包装功能而是智慧植保的核心环节。而做图像识别第一步就是要有干净、规范、类别清晰的数据集。这套数据集定位很清楚服务水稻、小麦、玉米、大豆四大主粮作物上的关键害虫自动识别给虫情测报、移动端识虫、精准施药提供可以落地的训练数据。不管你是做算法、做系统集成还是做植保数据服务都需要先有一份靠谱的底料。1.2 数据集的定位、适用对象与核心价值这套数据集不是实验室里“摆拍”出来的精修图而是面向田间真实场景设计的。它重点覆盖四类群体一是算法工程师拿它做多类害虫检测模型的训练和评估二是农业信息化集成商把它嵌入智能测报灯、虫情监控站的后台系统三是农技推广和科研团队用它做虫口数量统计、区域性害虫趋势分析四是刚入行的人想理解农业图像识别怎么落地拿这份数据梳理流程特别直观。数据集中十个类别选得有讲究。黏虫属于跨作物迁飞害虫水稻、小麦、玉米都会遭殃二化螟、稻纵卷叶螟、稻飞虱、白背飞虱、稻瘿蚊、稻水象甲这六个是水稻上的重点关注对象小麦皮蓟马盯的是小麦穗部豆科芫菁和红蜘蛛则给大豆、玉米等旱地作物补充了场景覆盖。这样既照顾了水稻这一“大户”也不让小麦、玉米、大豆成为盲区。我把这个数据集比喻成“给识别模型喂的第一顿饭”如果第一顿饭都营养不均衡后面怎么练都容易虚。它的核心价值不在于“图多”而在于类别分布合理、易混类有足够的样本、图像贴近真实采集环境。后面训练模型的时候你就能感觉到靠这套数据训出来的模型到田里才不会“水土不服”。1.3 作物与害虫的对应关系梳理作物对应害虫类别危害类型水稻二化螟、稻纵卷叶螟、稻飞虱、白背飞虱、稻瘿蚊、稻水象甲钻蛀、卷叶、刺吸、成瘿、食根小麦小麦皮蓟马、黏虫锉吸穗部汁液、暴食叶片玉米黏虫暴食叶片、幼虫群集为害大豆豆科芫菁、红蜘蛛啃食叶片、刺吸汁液这里要说明一下黏虫是迁飞性害虫在水稻、小麦、玉米上都能看到所以它虽然放在“跨作物”的位置类别上只算一个。数据集在设计时其类别标签是害虫种类和作物没有耦合。也就是说模型最终学到的是“长这样的是黏虫”而不是“在玉米上看到的就是黏虫”。这种解耦设计对跨作物推广很重要换个作物种植区模型照样能认虫。2. 核心拆解十类害虫的图像识别特征与易混点2.1 水稻上的害虫为什么都难认水稻上的六个类别基本把害虫的各种危害方式都覆盖了。先看钻蛀类的二化螟它的幼虫会钻进水稻茎秆里导致枯心、白穗。识别特征上二化螟成虫前翅灰黄色外缘有七个小黑点幼虫体背有五条紫褐色纵线这一点在鳞翅目幼虫里相对独特。不过麻烦在于幼虫藏在茎秆里外面拍到的大多是从茎秆爬出或者转株危害时的个体体色会随龄期变化从淡褐色到灰褐色都有数据里必须覆盖不同龄期。再看卷叶类的稻纵卷叶螟。幼虫会把稻叶纵卷起来躲在里面取食叶肉形成白色条斑。它的成虫前翅有三条暗褐色横线外缘还有一条暗褐色宽带很好认。但在数据集构建时有个细节数量最多的是“卷叶状态下的危害状”和“爬出叶苞的幼虫”纯成虫照片反而不多。如果只按成虫来收集模型在田间对幼虫和危害状的检测能力就会很弱。刺吸类的稻飞虱和白背飞虱是水稻产区最难分的一对。稻飞虱中胸背板茶褐色白背飞虱中胸背板黄白色其他形态极其相似体型也都在三四毫米左右。更麻烦的是它们常常混发一张照片里可能两种都有。数据标注的时候这类图像必须放大放大再放大看清楚胸背板颜色才能落框否则就是给模型“喂错答案”。稻瘿蚊的识别点比较特殊最具辨识度的不是成虫而是它造成的“标葱”危害状——心叶停止生长叶鞘愈合形成像葱管一样的结构。成虫本身就是小蚊子样落在叶面上不显眼。所以这个类别在数据集中要有“标葱”图像和成虫图像两类建议统一做在一个类别里让模型同时学会看虫和看危害状。稻水象甲是水稻上的检疫性害虫成虫有一个明显的象鼻状口器前胸背板和鞘翅上有灰白色鳞片辨识度高。但它的幼虫生活在土里啃食稻根很难拍到数据集中仍然要以成虫为主。如果采集条件允许可以补充一些根部危害状的照片方便模型做间接判断。2.2 小麦、玉米、大豆上的害虫识别要点黏虫是小麦和玉米上的重点类别。黏虫幼虫最典型的特征是头壳上有“八”字形纹体色变化极大从绿色到黑褐色都有这很容易让新手误以为不同颜色是不同的虫子。数据集设计时要注意同一类别内必须容忍这种体色差异不能只采某一两种色型。黏虫成虫是黄褐色的夜蛾前翅上有明显斑纹夜间灯光下经常被诱到测报灯里是灯光采集的常见对象。小麦皮蓟马是出了名的小目标。成虫体长只有一到两毫米黑色或黑褐色在麦穗的颖壳之间锉吸籽粒汁液导致麦粒瘪小。图像里它往往只占几十个像素肉眼在屏幕上看就是个黑色小点点。这种类别做目标检测特别考验数据标注的分寸框太小了模型学不到纹理特征框大了就带着一堆背景噪声。我一般建议这类图像用更高的输入分辨率训练或者采用切图推理后面详细说。豆科芫菁在大豆田比较常见成虫鞘翅黑色上面有黄色纵条纹体长十毫米以上行动迟缓遇到惊吓会从关节分泌芫菁素。它的识别不算难但和其他一些黑色甲虫容易混淆比如部分步甲、拟步甲。数据采集时多拍不同角度尤其是背面和侧面能帮模型把甲虫类的共同特征和区别特征都学到。红蜘蛛在大豆和玉米上都可能发生学名里更多叫叶螨。它的体长不到一毫米肉眼几乎看不清细节叶片受害后先出现黄白小点严重时叶片变红、卷缩、脱落。图像识别中红蜘蛛是典型的“极小目标”只有在高倍微距拍摄或者显微镜下才能看清楚身体轮廓。数据集里这类图像建议单独标注“虫体区域”不要和受害叶片混在一起否则模型学到的可能是“红叶”而不是“红蜘蛛”。2.3 易混类别是数据集设计的头号重点构建农业害虫数据集和做通用目标检测数据集最大的不同在于类间相似度极高。稻飞虱与白背飞虱、黏虫幼虫与二化螟幼虫、豆科芫菁与其他黑色甲虫都属于“放一起连专家都要多看一眼”的组合。如果数据量不够、角度单一、拍摄距离远模型很容易被绕晕。我的处理思路是给易混对单独“加餐”每个易混类别的样本量要比普通类别多百分之三十到五十并且在标注审核时重点复查这些类别。还有一个经验是对于形态相似的类别可以有意多放一些“同框图”——即一张照片里同时出现两个易混物种逼迫模型去学区分性特征而不是依赖背景或整体颜色蒙答案。这个策略在实践中对提升混淆矩阵的准确率很有效。另一个容易被忽视的是类内差异。同一类害虫不同龄期、不同性别、不同地区种群外观差异可能比不同类别之间还大。黏虫就是个典型不同龄期幼虫体长、体色、斑纹变化极大。所以数据集构建不能只追求“每类几百张”还要追求“每个形态阶段都有覆盖”。这也是我给每个类别做形态覆盖清单的原因卵、幼虫/若虫、成虫、危害状尽量一个不落。3. 数据集构建实操采集、筛选、标注全流程3.1 图像采集方案从测报灯到大田采集场景决定了数据集能不能落到真实环境。我常用的采集途径有四条。第一条是智能测报灯或诱虫灯采集。夜间灯光把害虫诱来后用固定的俯拍相机拍摄得到的图像背景统一、光照稳定适合做基准数据集。但要注意灯光诱集的虫子往往都是成虫且趋光性强的种类会占优势。如果只靠测报灯二化螟幼虫、红蜘蛛这种几乎没有趋光性的种类就会缺席所以必须配合其他采集方式。第二条是田间人工拍摄。在大田里找受害植株用手机微距镜头或者单反相机近距离拍摄叶片、茎秆、穗部的害虫。这种方式能拍到幼虫和若虫但背景复杂有土壤、水滴、杂草、其他昆虫模型训练时需要这种“脏”数据来提高泛化能力。拍摄时尽量多换地点、多换时间保证光照和背景的多样化。第三条是粘虫板拍照。黄色或蓝色粘虫板上粘着各种小型害虫尤其适合收小麦皮蓟马、稻飞虱这类小虫。粘虫板图像背景为纯色目标对比度高标注起来相对轻松但训练出来的模型容易依赖“粘虫板背景”这个线索到大田里效果会掉。所以粘虫板数据只能作为补充不建议作为唯一来源。第四条是体视显微镜或高倍微距补拍。针对红蜘蛛、小麦皮蓟马这种毫米级目标用手机根本拍不出细节必须上显微镜或者带环形补光灯的微距镜头。这类图像数量不用太多但分辨率高、纹理清晰可以让模型在小目标上的特征学习明显增强。3.2 图像筛选哪些图必须扔掉采集回来的原始图像不可能全部进训练集。第一步是去模糊。虫子在爬、相机抖动、聚焦不准都会导致图像糊掉用肉眼快速过一遍能筛掉一半。如果要量化可以直接用拉普拉斯算子计算图像梯度方差方差低于阈值的判为模糊图批量剔除。第二步是去重。测报灯一个晚上可能对同一个体拍好几张造成高度相似的重复样本。如果重复样本同时落在训练集和验证集验证指标会虚高模型实际部署时表现就没那么好。我习惯用感知哈希算法计算图像指纹对比重复图像按采集时间或角度差异保留其中最有代表性的一张。第三步是处理严重遮挡。目标被叶片、水珠、其他虫子挡住超过一半时标注难度大模型学到的是残缺特征容易造成误检。这类图不是不能用而是应该单独建一个“困难样本”子集用于后期测试模型鲁棒性不放进主训练集。第四步是控制目标尺寸。对于黄色粘虫板上的微型蓟马如果目标在原始图中只有不到十六乘十六像素直接标注训练YOLO这类检测模型很难学到有效特征。我的做法是保留原图同时在模型训练阶段使用高分辨率输入或者对这类图像做切图处理。切图本质上就是把大图切成若干小图让原本很小目标在切完后相对变大。3.3 标注规范、工具选型与格式转换标注是整个流程中最费人力的环节也是最不能省的一环。我常用的标注工具是labelImg和X-AnyLabeling。labelImg适合快速标注VOC格式的XML文件X-AnyLabeling功能更全支持VOC、YOLO、COCO多格式导出还带一些辅助标注功能。无论选哪个工具关键是规定一套大家都遵守的标注规范而不是几个人各标各的。标注规范上我一般定三条要求一是边界框尽量贴合目标轮廓不要留大片空白二是当一个目标被遮挡超过一半时不标遮挡少于一半时按完整目标标但要在备注里写清楚三是极小目标小于三十二乘三十二像素单独标记不要和普通目标混在一起统计。审核采用双人交叉检查对所有易混类别进行二次确认稻飞虱和白背飞虱的中胸背板颜色必须放大核对。标注完成后需要统一格式。模型训练最常用的是YOLO格式的txt文件一行记录一个目标类别序号、中心点x、中心点y、宽、高所有坐标都归一化到0到1。如果团队已有COCO或VOC格式的数据写个转换脚本就行。这里有个小坑类别顺序一旦确定就不要轻易改动否则旧标注文件和新的类别映射对不上训练直接报错或者错位。3.4 数据划分与目录结构设计数据集划分要按“采集批次”而不是按“文件名随机洗牌”。同一台相机在同一个测报灯下拍的图背景、光照、虫子落位方式都高度相似如果随机划分训练集里出现过的背景模式在验证集里也大量出现模型很容易“背答案”。按批次划分把某几个夜晚的采集图整体归为验证集才能模拟真实部署时遇到的新场景。比例上我习惯按8比1比1划分训练、验证、测试三部分。如果总量少至少也要保证验证集和测试集各有每类二三十个实例以上否则评估结果波动太大看不出模型真实水平。目录结构可以按下面这样组织既能喂给YOLO训练脚本也方便后续转其他格式。agri_pest_dataset/ ├── images/ │ ├── train/ │ │ ├── lamp_20240001_005.jpg │ │ ├── field_rice_084.jpg │ │ └── ... │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ │ ├── lamp_20240001_005.txt │ │ └── ... │ ├── val/ │ └── test/ ├── annotations/ │ ├── train.json │ ├── val.json │ └── test.json ├── classes.txt └── data.yamlclasses.txt里按固定顺序写入十个类别名称data.yaml是YOLO训练需要的配置文件里面包含数据路径、类别数量和类别名称列表。这一步做完数据集就具备被模型直接消费的形态了。4. 模型训练实战从零到可部署的虫害检测模型4.1 环境准备与配置文件我这里以YOLOv8系列为例说一种比较通用、好复现的训练流程。环境方面Python 3.9以上PyTorch版本根据显卡驱动安装对应的稳定版再装ultralytics库就够了。GPU显存八G以上的话可以跑yolov8m显存紧一点yolov8s也能出不错的效果。数据集准备好之后先写data.yamltrain: ./images/train val: ./images/val test: ./images/test nc: 10 names: 0: 黏虫 1: 豆科芫菁 2: 红蜘蛛 3: 稻瘿蚊 4: 稻纵卷叶螟 5: 稻飞虱 6: 稻水象甲 7: 小麦皮蓟马 8: 白背飞虱 9: 二化螟注意names的顺序必须和标注txt里的类别序号一一对应。我在项目里曾因为调整了names顺序忘记同步改旧标注文件导致训练时类别对不上浪费了整整一个周末排查。现在无论项目多急我都会先写一个脚本统计标签文件和names映射是否一致确认无误再开训。4.2 数据增强策略怎么配农业害虫图像和通用图像的增强策略不太一样。先说说YOLO自带增强参数的默认值再讲我实际调整后的思路。augment: hsv_h: 0.015 hsv_s: 0.5 hsv_v: 0.4 fliplr: 0.5 flipud: 0.1 scale: 0.3 translate: 0.1 mosaic: 1.0 mixup: 0.2 copy_paste: 0.3田间图像的光照变化非常大清晨、正午、傍晚的色温、亮度都不一样所以HSV色彩抖动我保留让模型不至于对光线过度敏感。左右翻转比较安全上下翻转在测报灯俯拍图像里问题也不大但在田间自然拍摄里“害虫趴在叶面上”的朝向有生物学约束上下翻转太多反而会让模型学到不真实的构图所以flipud我只给了0.1。Mosaic增强把四张图拼在一起能显著增加背景多样性但对小目标类别不太友好因为拼接后目标可能变得更小。我的做法是如果红蜘蛛、小麦皮蓟马这类极小目标在验证集上表现始终上不去就把Mosaic概率调低或者对包含小目标的批次单独关闭Mosaic让模型保留对小目标原始尺寸的感知能力。Copy-Paste增强对类别不均衡很有帮助把稀疏类别的目标“粘贴”到其他背景图上相当于无中生有多出不少训练样本。4.3 训练超参数与执行我自己常用的训练命令大概是这样的yolo train datadata.yaml modelyolov8m.pt epochs200 imgsz1280 batch16 device0 patience40这里有两个关键选择。第一个是输入分辨率imgsz。很多通用检测任务用640就够但农业害虫里红蜘蛛、小麦皮蓟马、稻飞虱都是小目标640下这些虫子可能只有十几个像素模型根本看不清楚。我把分辨率拉到1280训练时间和显存占用都涨了但小目标类别的召回率提升非常明显。如果显存不够可以先用640训一版看基线再用1280微调也比一直卡在640强。第二个是预训练权重。直接用yolov8m.pt从头在农业数据上训练收敛慢还容易过拟合。我通常只改最后一层的类别数微调所有层让模型在通用目标特征的基础上适配昆虫特征。实测下来迁移学习比随机初始化能快三分之一的收敛速度最终mAP一般也高几个点。训练期间要跑耐心值patience模型在验证集上连续四十个epoch没提升就自动停。因为农业数据总量通常只有几千张训到两百轮以后一般就开始过拟合了等着看早停信号比机械训满所有epoch更科学。4.4 效果评估盯哪些指标才不会被骗多类害虫检测的评估我主要看这几个mAP50、mAP50-95、Precision、Recall以及每类单独的AP值。mAP50衡量的是目标框和真值框的IoU超过0.5才算检测成功的平均精度比较接近“框得差不多就行”的宽松标准。mAP50-95更严格能反映框的定位精度但农业场景里尤其是小目标框稍微偏几个像素其实不影响计数所以不用对它太过焦虑。真正要盯的是每类AP和混淆矩阵。全局mAP高有时候是因为稻飞虱这类样本多、又容易认的类别把指标拉高了小麦皮蓟马或者红蜘蛛的AP可能低得没法用。混淆矩阵能直接告诉你模型把哪两类搞混了如果稻飞虱和白背飞虱互相错说明模型还没学到胸背板的颜色差异需要补充同框图并复查标注质量。在农业预警场景下我一般把Recall看得比Precision重一点。预警系统漏掉一次虫情可能导致整片田防治延误误报一次顶多多跑一趟田核实。所以我的目标是优先保证Recall再通过调置信度阈值把Precision拉到一个可接受的水平。这个取舍不一定适合所有项目但有测报灯这种“先拍照再复核”的环节时多检少漏往往更实用。5. 常见问题与排查技巧5.1 类别不均衡导致模型“偏科”训练数据里稻飞虱、黏虫这种常见害虫样本量大红蜘蛛、小麦皮蓟马这种难采或微小的类别样本少模型很容易偏向多数的类别少数类几乎检不出来。我在初期就吃过这个亏整体mAP看着有0.7但红蜘蛛的AP只有0.15基本等于没用。排查思路有三条先看每个类别的AP和样本数量确认是不是样本越少AP越低再看混淆矩阵确认少数类是被漏检还是被误判成其他类别。解决办法分数据侧和训练侧。数据侧就是继续补拍、或者用Copy-Paste把少数类目标贴到其他背景上把样本量拉平训练侧可以给少数类更高的损失权重让模型在优化时多关注这些类别的错误。我一般两件事同时做效果最明显。5.2 小目标检测不到怎么办红蜘蛛不到一毫米小麦皮蓟马一到两毫米这类目标在图像里就是几个或几十个像素。小目标检测不了的直接原因往往是网络下采样层数太深小目标的特征在深层特征图上已经被“稀释”掉了。最直接的解法是把输入分辨率从640提到1280甚至1536相当于让目标在图像里占据更多像素。如果显存有限可以试试切图推理。把原始大图切成一堆重叠的方块每个方块独立送进模型检测再把结果按坐标拼回去原理类似“放大镜”逐块找虫。YOLO生态里有一些现成的切图工具直接用即可。还有一个思路是使用带P2层的高分辨率特征模型它对细小目标更友好但推理耗时也会增加部署前需要权衡。5.3 田间复杂背景带来的误检大田图像里背景有土壤、水珠、稻叶纹理、其他无害虫子模型可能把叶片的卷曲边缘误认成稻纵卷叶螟或者把土壤颗粒误认为红蜘蛛。这类误检的根源往往是训练集背景太单一模型根本没有“负面样本”的概念。我的做法是单独准备一批负样本图图像里只有背景、没有目标害虫训练时作为不含目标的图像参与训练。还有一个更简单的方法在真实场景部署时统计误检大多出在哪个置信度区间然后把置信度阈值从0.25提高到0.35或0.4。阈值提高确实会牺牲少量召回但在“宁可再核一遍也不要频繁报错”的测报灯场景里这个策略很实用。5.4 数据回流与模型迭代模型部署之后工作没有结束数据回流才是让模型越用越准的关键。我习惯把部署后的所有推理结果存下来置信度低于0.5的、被后处理滤掉的、和人工复核结果不一致的都定期拉出来看挑出典型的误检和漏检样本交给标注团队补标然后回流进训练集。这个闭环跑起来之后模型每个版本都会贴近真实的田间分布多一点。现象常见原因排查方向少数类检不出样本不足、类别不均衡补样本、损失加权、Copy-Paste微小目标检测不到输入分辨率低、特征丢失imgsz提到1280、切图推理背景物体被误判训练背景单一、阈值过低增加负样本、调高置信度验证指标高但田间掉点数据划分泄露、场景分布差异按采集批次划分、补充田间实拍图稻飞虱和白背飞虱混淆标注错误、细节特征学习不足重点复核胸背板颜色、增加同框图训练后期过拟合数据量少、epoch过多开启早停、增强正则、扩充数据5.5 几个容易被忽略的细节标注类别名称尽量用中文固定名称加拼音首字母做标记避免不同成员写“稻飞虱”“褐飞虱”“飞虱”等不同叫法。采集测报灯图像时记录时间、地点、作物和温湿度这些元信息暂时用不上但以后做区域虫情分析时非常宝贵。另外同一个目标的连续帧图像不要既放训练集又放验证集否则验证集被“剧透”评估结果虚高。我在实际跑完一轮模型之后最大的感受是数据集的构建速度往往决定了整个项目的推进速度。很多团队一上来就调模型结构、换网络参数量最后发现最花时间的还是数据。先花一两周把采集方案定清楚把标注重心放在易混类别上模型训练就会顺很多。这套农业害虫计算机视觉数据集更适合被当成整个智慧植保闭环的起点而不是终点。后续还可以给样本增加虫态标签让模型输出“成虫若干、幼虫若干”甚至结合作物和虫量给出防治建议那就离真正的“数字植保助手”更近了。