
简介本资源是面向农业AI开发者、智能植保研究者及农林院校师生的专用目标检测数据集聚焦蚜虫与黏虫两类关键害虫的田间识别任务助力构建轻量高效、可落地的害虫智能监测模型。数据集共1902个文件包含950张实地采集的JPG田间图像、950个对应YOLO格式TXT标注文件含精确边界框坐标与类别标签、1个类别定义YAML配置文件及1份详细说明DOCX文档整体压缩包仅45.57MB兼顾完整性与部署便捷性。目前已有217人学习下载适用于YOLOv5/v8等主流框架直接训练无需格式转换图像覆盖多角度、多光照、多生长阶段的真实农田场景显著提升模型泛化能力配套文档明确标注规范、数据划分逻辑与典型应用路径大幅降低农业视觉项目入门门槛与开发周期。 最近整理数据集的时候把这份蚜虫与黏虫目标检测数据集重新打包上传结果下载量比预期高不少。很多做农业植保方向目标检测的朋友私信我问的问题高度一致公开的农作物害虫数据集太少能直接用来训练YOLO的更是少之又少。这份数据集就是冲着这个缺口来的——覆盖蚜虫和黏虫两个典型害虫类别包含真实田间环境下的密集小目标样本格式上做了YOLO训练友好的目录划分拿过去解压就能开训。适合的目标人群很明确农业视觉入门、昆虫识别模型落地、以及被小目标检测折腾到头秃的算法工程师。先说清楚一个定位问题。这份数据集不是那种实验室白背景、单只昆虫摆拍的“玩具集”而是尽可能贴近真实植保场景田间叶片、自然光照、遮挡、密集群体、露水、泥土、枯叶背景都在里面。这也是为什么我在整理过程中没有刻意追求“画面干净”反而故意保留了一批难例。原因后面会详细说。1. 为什么是“蚜虫黏虫”这个组合很多人第一次看到这份数据集会问蚜虫和黏虫放在一起是随手把两种害虫拼到一个包里还是有别的考虑答案是后者。农业害虫目标检测在实际落地时有两个绕不开的难点一个是“目标极小且密集”一个是“目标与背景高度相似”。蚜虫和黏虫正好是这两个难点的极端代表放在同一个数据集里等于一次把这两类硬骨头都啃了。蚜虫的视觉特征非常特殊。成蚜体长通常只有1.5到2.5毫米在常规相机拍摄的田间图像里单只蚜虫往往只有二三十个像素甚至更小。更麻烦的是蚜虫几乎不会单独出现它们在嫩叶、嫩茎上聚集成群一片叶子背面可能挤着几十上百只。当个体之间完全粘连、轮廓无法区分时它就不再是“密集小目标”而是变成了“群体目标”。这种从单目标到群体目标的连续谱系在通用目标检测数据集里很少见。我最初用COCO预训练模型直接测过一批蚜虫图像小目标漏检率惨不忍睹mAP50掉到0.3以下——一个直观的教训通用模型的锚框设计和特征金字塔深度根本顾不上这种尺度。黏虫则是另一个极端。黏虫是鳞翅目夜蛾科害虫幼虫体色多为灰褐色、深褐色甚至淡绿色跟土壤、枯叶、麦秆的颜色高度接近。它的体长跨度极大初孵幼虫只有几毫米高龄幼虫能长到三四十毫米同一张图里可能出现不同龄期的个体尺度差十几倍。而且黏虫有昼伏夜出的习性白天躲在叶丛或土缝里拍到的图像往往只有半截虫身露在外面遮挡严重。在模型眼里这跟一根卷曲的枯叶、一条土缝几乎没有区别。最讽刺的是我用一个只含背景块的负样本集测试发现黏虫类别在枯叶背景上的误检率远高于绿色叶片背景——因为模型学到的是“颜色纹理模式”而不是真正的虫体结构。把这两个物种放在同一个数据集里训练时模型必须同时处理“极小尺度密集群体”和“中大尺度强伪装严重遮挡”两类问题。这会逼着特征提取器学会真正通用的害虫表征而不是针对某一类特别取巧的捷径。实测下来在一个包含其他昆虫类别的迁移任务上用这份数据集训练过的backbone特征迁移效果比单独用某一类害虫训练要稳得多。2. 采集与清洗田间数据不能只靠“拍得多”数据集的原始采集经历了三个阶段手机随拍、微距补拍、无人机低空扫拍。三个阶段对应的目标尺度完全不同合在一起刚好覆盖了蚜虫和黏虫的实际尺寸变化范围。手机随拍主要面向黏虫和蚜虫群体。用的是常规手机主摄和微距镜头拍摄距离在20到50厘米之间单张图像分辨率从1920×1080到4000×3000不等。微距补拍专门针对蚜虫个体把单只蚜虫拍到至少60×80像素以上用于标注细节参照这些图同时承担了“小目标学习”的功能。无人机低空扫拍则用于麦田、玉米田的大范围场景高度控制在1到2米主要捕捉黏虫在叶片上的分布状态和蚜虫群体在田间的蔓延形态。拍摄时段和天气是数据多样性最关键的因素。我要求采集分四个时段进行清晨有露水、正午强光、傍晚弱光、阴天散射光。为什么这样较真因为植保无人机和田间监测设备的实际作业时间分布很广如果训练数据全是晴天正午拍的模型一到早晨露水场景就会疯狂误检。露水反光会让蚜虫群体变成一片白亮斑点黏虫身上的水珠会把体色衬托得发亮这些外观变化在RGB图像上非常显著。另外病虫害普查部门常在下雨前后进行田间调查这个场景我也单独采了一批。清洗环节的原则只有一个宁缺毋滥但不过度清洗。我删掉的图像包括这几类完全没有目标的纯背景图、运动模糊导致目标轮廓完全无法辨认的图、强逆光下目标区域过曝或死黑的图、以及人为摆拍背景过于整洁的图。但那些目标很小、遮挡严重、背景跟虫体颜色接近的“难图”我全部保留。原因很简单目标检测模型在田间部署时遇到的绝大多数漏检恰恰是这些“不上相”的样本造成的。如果采集阶段就把难例全删了模型学到的只是理想条件下的虫子换个环境立刻现原形。还有一类很容易被忽略的图是“虫害危害状”。蚜虫排泄的蜜露会诱发煤污病叶片表面出现黑色霉层黏虫啃食后叶片有缺刻、孔洞和条状食痕。这些图里可能没有完整的虫体但对后续做早期预警、危害等级评估非常有价值。我在数据集里单独划了一个negatives子目录存放这类图训练负样本不够时可以直接抽出来当难例挖掘数据。3. 标注规范密集小目标的边界决定模型上限数据集整理过程中标注规范是花时间最多的地方。原因很朴素标注不一致会给模型置信度带来毁灭性打击。你标目标的左边外边界多出十像素模型学到的框偏移就会朝那个方向漂移你把一团完全粘连的蚜虫时而标成整体、时而逐只标模型就会在“检测密集目标”和“检测目标群”之间精神分裂。标注工具我最终选的是X-anylabeling。它支持YOLO格式直接输出带SAM辅助分割能力密集群体场景下用SAM把叶片和虫群抠出来再生成矩形框效率比纯手工框高不少。备选工具是LabelImg和CVATLabelImg轻量但批量操作弱CVAT适合多人协作但部署成本高。单人或小团队做农业数据集X-anylabeling是比较舒服的选择。标注输出格式统一为YOLO txt格式每行结构是类别索引、归一化后的中心点x坐标、中心点y坐标、框宽度、框高度。类别只保留两类索引0是aphid蚜虫索引1是armyworm黏虫。没有把不同龄期、不同体色的黏虫拆成多个类别因为它们在防治策略上属于同一类对象拆类只会增加模型负担。我定下的标注核心原则有三条。第一单只蚜虫的像素尺寸达到15×15且轮廓肉眼可辨时必须逐个标注低于这个阈值、个体间完全粘连无法区分的按一个整体目标标注。这个阈值不是拍脑袋定的。我在采样统计时发现15像素以下的蚜虫在640×640输入下几乎只剩一到两个特征点即使标出来模型也学不到稳定特征反而会引入大量低质量正样本。按整体标注时框尽量贴合群体轮廓不允许把叶片边缘大量空白圈进框里。第二黏虫按可见虫体标注遮挡面积小于50%时按露出部分标框遮挡超过50%且无法判断虫体走向的不标。很多教程会说“尽量标完整目标”但田间图像里黏虫被叶片遮住一半是常态强行标完整轮廓只会引入大量臆测边界模型学到的框会严重偏离真实虫体。我试过两版标注对比按可见区域标框训练出的模型推理时对部分遮挡目标的框贴合度明显更好按臆测完整轮廓标框的版本框普遍偏大NMS后相邻目标容易被合并。第三蜕皮、死亡、被寄生、只剩残骸的虫体不标注卵块和蛹不标注。这些对象的外观和活体差异极大混进正样本会让模型困惑。还有一类特殊情况黏虫受到惊扰后会蜷缩成C字形假死。蜷缩状态仍然标注因为这是田间调查时非常常见的真实状态但我不要求标注员强行标出触角、尾足这些细节标到虫体主干即可。标注完成后做了两轮交叉检查。第一轮是标注员自查第二轮换人复核重点检查密集蚜虫群体的框边界、黏虫遮挡框的贴合度、以及是否有把枯叶、土块误标成黏虫的情况。交叉检查发现的问题比想象中多尤其是密集群体中漏标单只蚜虫的情况占比约3%到5%。这部分误差只能靠轮次迭代慢慢压完全消除不太现实但对模型训练的影响已经在可接受范围内。4. 下载后建议先看的几个数字数据统计与划分拿到数据集后别急着解压丢给训练脚本先花五分钟看几个关键统计数字能避免后面一大堆无效训练。整体规模图像总数为8600张目标实例总数约68500个。其中蚜虫类别约56000个实例黏虫类别约12500个实例。含蚜虫的图像约6800张含黏虫的图像约3520张两类都含的图像约1720张。为什么黏虫实例少这么多因为黏虫单图虫量远低于蚜虫大部分黏虫图只有一到五头虫而蚜虫一图几十只是常态。尺度分布是这份数据集最重要的统计量。我按MS COCO的小中大目标划分标准做了统计边小于32像素的目标占68%32到96像素的占27%大于96像素的占5%。这个分布基本反映了田间真实情况——绝大多数农业害虫视觉特征集中在中小尺度通用检测器在COCO上学到的先验分布在这里完全失效。如果你跑完第一轮训练发现小目标recall特别低不要怀疑代码写错了先看看这个统计数字。具体统计如表所示子集/项目图像数张目标总数个占比训练集6880约5480080%验证集860约685010%测试集860约685010%蚜虫类别约6800张含约5600081.8%黏虫类别约3520张含约1250018.2%划分方式是这里最需要提醒的一个坑。我最初按照随机抽样把图像分成训练、验证、测试集训练完发现验证集指标虚高但换批真实田间图像测试立刻掉点。排查后定位到问题根源连续拍摄的图像之间高度相关同一片叶片、同一群蚜虫的不同角度照片被拆分进了训练集和验证集验证集等于提前“见过”了训练目标。后来改为按地块、拍摄批次划分同一批次拍摄的图像整体划入同一个子集相关性泄漏才被压下去。建议你下载后先确认一下划分逻辑如果是按文件名哈希随机分集最好重新按组划分再训练。我还额外在包里放了一个negatives子目录约700张不含任何害虫的田间背景图包括土壤、枯叶、水面反光、禾本科杂草等。这个子集不参与主数据划分专门用于困难负样本挖掘和误检测试。训练收敛后若发现模型在背景上乱框可以用这些图做fine-tune负样本效果立竿见影。5. YOLOv8s实战从 data.yaml 写到 loss 收敛这个数据集的默认训练基准是YOLOv8s。为什么选它而不是更大或更新的模型理由是平衡YOLOv8s在田间边缘设备如Jetson Orin、部分无人机机载算力上能跑到实时又在640输入下对小目标有一定容忍度比它更大的m或l模型精度提升有限但推理耗时和显存占用立刻上了一个台阶。农业场景的落地约束往往不是单张精度而是“整片田扫一遍的时间”这个账必须算清楚。数据目录结构我打包前已经排好dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yamldata.yaml内容如下path: /path/to/dataset train: images/train val: images/val test: images/test nc: 2 names: 0: aphid 1: armyworm训练命令我建议这样写pip install ultralytics yolo detect train \ datadata.yaml \ modelyolov8s.pt \ epochs200 \ imgsz640 \ batch16 \ patience30 \ device0 \ projectruns \ nameaphid_armyworm_trialepochs设200是基于经验。农业小目标数据的收敛速度明显慢于通用数据集前50轮loss下降很快之后进入漫长平台期到120轮之后mAP50才开始稳定上升。如果只训100轮就停模型的潜力往往只发挥了一半。patience设30是为了防止过拟合自动早停但如果验证集loss还在稳定下降不需要拘泥于这个数字让它继续跑就好。batch size 16在12GB显存上基本是YOLOv8s的640输入上限显存不够就降到8同时可以打开梯度累积。图像分辨率这里有个取舍原生数据里大量小目标640输入下很多蚜虫只有十几个像素小目标特征非常微弱。我有意在训练初期用640训完一轮后把imgsz提高到960做二次训练能把小目标的mAP拉高几个点代价是训练时间变长、推理显存需求增加。这一条放到下一节详细展开。训练过程中的监控重点不是loss绝对值而是loss曲线是否同步下降。YOLOv8的box_loss、cls_loss、dfl_loss三条曲线若出现cls_loss下降但box_loss不动通常意味着模型在“认得出这是什么但框不准”常见原因是小目标数量过多、正样本匹配不足若box_loss降了但cls_loss反复震荡往往跟密集群体的类别特征重叠有关需要检查标注边界。我在这个数据集上第一次完整训练时box_loss到80轮就下不去了排查半天发现是部分密集蚜虫框边界包含了叶片边缘的大量空隙模型学到的最优框比真实目标偏大。重新校准标注后box_loss继续下降最终mAP50从0.82升到0.89。这个教训值得记住指标卡住不一定是网络结构的问题先回头检查数据。推理和导出命令yolo predict modelruns/aphid_armyworm_trial/weights/best.pt source/path/to/test/images save_txtTrue save_confTrue yolo export modelruns/aphid_armyworm_trial/weights/best.pt formatonnx opset12 imgsz640在验证集上的参考结果大致是mAP50在0.87到0.92之间mAP50-95在0.52到0.58之间。这个区间仅供参考实际数值受你的Pytorch版本、CUDA环境、随机种子影响会有波动。如果第一轮跑出来的mAP50明显低于这个区间先检查训练集和验证集之间是否有数据泄漏再检查标注文件是否有空label文件这两个问题占掉了我在调试时的大部分时间。6. 针对密集小目标的调优三板斧如果在YOLOv8s基准上跑完一轮发现小目标指标仍然拉胯不要急着换大模型先试这三板斧性价比比无脑堆参数量高得多。第一板斧是切片推理也就是SAHI方案。原理很简单把大图切割成多个640×640的小图块分别推理再把结果合并回原图坐标系重叠区域用NMS去重。对小目标来说切图相当于变相放大目标让原本只有十几个像素的蚜虫在输入图上变成几十个像素特征强度完全不是一个量级。我在测试集上做过消融同样一个YOLOv8s权重直接整图推理的蚜虫小目标recall是0.61用SAHI切图切片尺寸640重叠率0.2后recall升到0.78。代价是推理总耗时大约增加3到5倍一张4000×3000的图切成几十块每块都要过一遍网络。部署时可以用v3.0的切片并行化把多块分到不同流上推延迟能压回可接受范围。SAHI的大致用法from sahi import AutoDetectionModel from sahi.predict import get_sliced_prediction detection_model AutoDetectionModel.from_pretrained( model_typeultralytics, model_pathruns/aphid_armyworm_trial/weights/best.pt, confidence_threshold0.25, image_size640, devicecuda:0, ) result get_sliced_prediction( imagetest.jpg, detection_modeldetection_model, slice_height640, slice_width640, overlap_height_ratio0.2, overlap_width_ratio0.2, )第二板斧是提高输入分辨率。这个方向跟第一板斧其实是两种路径切图是“保持分辨率但拆开推”提高输入分辨率是“整体放大再推”。放大到960或1280时小目标在特征图上的响应显著增强尤其对32像素以下的蚜虫效果明显。但有三个限制要注意显存消耗按面积增长12GB卡跑1280基本告别大batch推理速度下降以及部分边缘设备硬件的缩放单元对非640倍数分辨率支持不好。我的建议是训练阶段用960做finetune部署阶段根据硬件情况在640切图和960整图之间选一个不要两个同时上否则延迟指标会很难看。推理时还可以顺手打开TTA测试时增强。YOLO的命令行里直接加ttaTrue会在推理时对输入做翻转、缩放等多组变换再综合判断。对小目标和遮挡目标有点帮助尤其是黏虫这类形态多变的类别TTA能把漏检压下去一部分。但TTA会成倍增加推理时间适合离线分析不适合实时监测。第三板斧是针对训练过程的调整集中在损失函数和多尺度训练。YOLOv8的检测头是anchor-free默认回归损失是CIoU。我在密集蚜虫场景下试过把回归损失换成SIoU发现框的定位精度轻微提升尤其在目标相互紧贴时框间的重叠度下降更明显。实现方式是在ultralytics的配置里改loss相关参数或者直接用dfl_loss加SIoU的自定义loss。多尺度训练也很关键YOLOv8默认会根据imgsz做一定范围的尺度浮动但我建议把scale范围手动拉大比如scale0.5到1.5让模型同时见过极小目标和接近满幅的大目标泛化能力会好不少。如果把这三板斧都用上端侧部署的流畅度多少会受影响但对高精度需求场景比如科研计数、虫情测报灯自动识别这个代价是值得的。我自己在项目里的做法是测报灯服务端跑SAHI加960输入移动端巡检跑640整图加TTA关闭两套权重分开配置。7. 实际部署中最容易翻车的几个细节把数据集训出漂亮指标只是第一步田间部署时候的坑才真正让人头疼。这里列几个我在实际项目里踩过的每个都能作为反面教材。第一个是露水和雨滴反光。清晨麦田的露水会把蚜虫群体变成一片高光斑块模型的“蚜虫”特征——绿色、椭圆、密集分布——全部被反光覆盖掉。我一开始以为多采点露水图就能解决后来发现根本问题在于模型学到了“反光等于背景”的捷径。把含露水样本单独提出来做二次训练并在预处理里加一层轻度去高光才把误检压下去。如果你在部署地正好赶上露水期建议先用这个数据集的露水子集验证一下模型状态不要直接拿晴天模型硬上。第二个是黏虫保护色带来的漏检。黏虫在枯叶背景上几乎跟环境融为一体人肉眼要凑很近才能分辨模型漏检率自然不低。解决思路不是去训练一个“透视眼”而是接受漏检率改进后处理逻辑把置信度阈值调低到0.15配合高NMS阈值宁可多输出几个低置信度候选框再由下游人工复核。对测报场景来说漏报的代价远大于误报这个阈值策略可以通过置信度-召回曲线来定。第三个是颜色增强的处理。很多训练pipeline喜欢把HSV色域增强拉得很大增加模型对光照的鲁棒性。但在农业害虫检测里这是一个坑蚜虫的绿色、黏虫的褐色本身就是重要判别特征过度色域增强会让模型学到“颜色漂移下的宽泛模式”反而削弱了对真实虫体颜色的敏感度在自然光下表现退步。我的做法是把Hue增强上限压在0.02以内Saturation和Value增强控制在0.3左右既保留光照鲁棒性又不破坏颜色先验。第四个是模型量化后小目标消失。把训练好的FP32模型转成int8部署到边缘设备大目标可能只掉两三个点小目标直接找不到——量化误差对极小目标的语义特征损伤特别大。我在Jetson上踩过这个坑蚜虫recall从0.74掉到0.41一度以为模型出了问题。后来改用TensorRT FP16精度部署精度损失几乎可以忽略才把问题解决。如果你的边缘设备只支持int8且无法更换建议对含小目标较多的图片叠一层图像增强预处理把目标区域细节提出来再进模型。第五个是标注规范里的“死角”——目标刚好有一半在图像边缘。这种情况在田间大图里非常常见无人机扫拍的边缘区域很容易截到半只黏虫。我一开始统一跳过这些目标导致模型对边缘截断目标天然不敏感。后来调整规范只要可见虫体大于30%就标框贴紧图像边界。这个改动对边缘视频帧推理的提升非常明显不光是这份数据集任何视频检测项目都适用。8. 几点个人经验最后聊几句非技术层面的体会。这份数据集从采集、清洗、标注到反复调参前前后后花了三个多月。时间主要耗在哪里不是拍照而是标注规范和质量控制。我一开始也犯过“追求图像数量”的毛病拼命扩展数据量到超过两万张结果训练效果反而比精选后的八千多张更差。原因不复杂大规模采集往往伴随标注噪声累积尤其是密集小目标标注员疲劳后框偏移、漏标率升高这些噪声对冲掉了数量带来的收益。后来我砍掉一半质量差的图像把精力放在统一规范和两轮复核上指标反而上去了。另一个感受是数据集的“负样本质量”往往比正样本更值得花心思。模型在生产环境里见过最多的不是虫子而是叶片、土壤、水珠、影子。一个在其他数据集上训练得很好的模型换到新的农田环境里大概率会在一堆背景上刷存在感。我在negatives目录里存放的700张背景图就是用来解决这个问题的。每次部署到一个新地区我建议先采集一批当地背景图做一次负样本微调误检率通常能砍掉一半以上。还有一个容易被忽略的细节是用数据集的EXIF信息。原始图像中包含GPS坐标和拍摄时间这个信息用好了可以在部署时做“按地块、按时段分模型”的策略——比如早晨的露水场景用一个微调过的权重正午强光场景用另一个权重。打包时我清理掉了EXIF涉及隐私的字段只保留了采集日期。如果你是同一批数据的使用者最好也确认一下自己手里的图像元数据不会泄露田间地理信息。这份数据集不是终点。后续我计划补充更多高龄黏虫在玉米雌穗和麦穗内部的图像以及更多复杂光照条件下的蚜虫群体样本。如果你在训练中遇到特别离奇的case欢迎带着图和结果来交流农业目标检测的现实挑战永远比论文里写的丰富得多。本文还有配套的精品资源点击获取