
简介这份蚜虫与黏虫目标检测数据集面向农业AI开发者、智能植保设备团队及农业院校师生用于构建田间害虫自动识别模型解决蚜虫、黏虫早期监测与精准施药问题。资源共950张农业监控图像按训练集830张、测试集120张划分标注采用YOLO格式含边界框坐标与类别标签可直接用于YOLOv5/v8等主流框架训练。压缩包共1902个文件以950个jpg图像与950个txt标注为主另附1个yaml数据配置和1份docx说明文档整体约45.57MB目录结构清晰便于快速接入训练流程。数据覆盖多角度田间实拍场景两类害虫样本均衡适合中小型项目快速部署与验证。目前已有221人学习下载可作为农业害虫智能监测、无人机巡检及移动端识别应用的基础数据也适合教学演示与算法对比实验。1. 蚜虫与黏虫检测数据集从农业场景到 YOLO 训练的第一手拆包记录蚜虫和黏虫是两类让种植户头疼的害虫前者体型极小、聚集在嫩叶背面后者暴食性强、夜间活动靠人工巡田发现往往已经错过最佳防治窗口。这份「蚜虫与黏虫目标检测数据集.zip」解决的就是把这两类虫害的识别任务交给视觉模型——你拿到的是一批已经标注好的图像可以直接喂给 YOLO 系列做训练或微调。它适合做农业植保方向算法验证的工程师、想拿真实行业数据练手的学生以及需要快速搭一个虫情监测原型的开发者。数据集本身不绑定框架但标注格式和目录结构决定了它最顺的落地路径是 YOLO 目标检测流程。下面按「先看清数据长什么样、再跑通训练、最后避开标注和增强的坑」这条线拆开讲。2. 拆包先看结构图像、标签与类别映射怎么对应拿到压缩包别急着解压完就开训先花十分钟把目录结构和标注格式摸清楚这一步省下来的时间后面会加倍还给你。农业类数据集常见的坑是图像和标签不同名、类别 id 从 1 开始而不是 0、或者混进了非目标类别的负样本这些都会让训练 loss 莫名其妙地不收敛。2.1 目录结构与文件命名规则解压后典型的结构是images/和labels/两个平行目录图像是.jpg或.png标签是 YOLO 格式的.txt。YOLO 标签每行五列class_id x_center y_center width height后四个都是归一化到 0~1 的相对坐标。先跑一段脚本确认图像和标签能一一对上对不上的直接列出来。import os from pathlib import Path img_dir Path(dataset/images) lbl_dir Path(dataset/labels) img_stems {p.stem for p in img_dir.glob(*.*) if p.suffix.lower() in (.jpg, .png, .jpeg)} lbl_stems {p.stem for p in lbl_dir.glob(*.txt)} # 图像有标签没有或标签有图像没有都要警惕 missing_lbl img_stems - lbl_stems missing_img lbl_stems - img_stems print(f图像数: {len(img_stems)}, 标签数: {len(lbl_stems)}) print(f缺标签的图像: {len(missing_lbl)} - {list(missing_lbl)[:5]}) print(f缺图像的标签: {len(missing_img)} - {list(missing_img)[:5]})这段脚本的核心是集合差集运算img_stems - lbl_stems找出有图无标签的样本。参数上注意glob(*.*)会把非图像文件也扫进来所以用后缀白名单过滤。如果缺标签的数量超过总数 5%大概率是打包时漏了需要回头找数据来源确认别硬训。2.2 类别 id 与类别名的映射核对YOLO 训练依赖一个data.yaml里面names列表的顺序必须和标签里的class_id严格对应。蚜虫和黏虫两类的话常见写法是0: aphid、1: armyworm但有些数据集会把 id 从 1 开始或者把「蚜虫」写成aphids复数。先统计标签里实际出现的 id 分布再决定names怎么写。from collections import Counter counter Counter() for txt in lbl_dir.glob(*.txt): for line in txt.read_text().strip().splitlines(): if line: counter[int(line.split()[0])] 1 print(类别 id 分布:, dict(sorted(counter.items())))如果输出是{0: 3200, 1: 2800}这种从 0 开始的连续 id直接按顺序写names即可如果出现{1: ..., 2: ...}缺 0说明标注工具导出时偏移了要么改names补一个占位类要么批量把 id 减 1。这一步不做训练时模型会把背景当目标学mAP 直接崩。2.3 标注质量抽检小目标与遮挡的边界蚜虫是典型的小目标几十个像素甚至更小标注框稍微偏一点IoU 就掉到 0.3 以下。抽 20 张图把框画出来目视检查重点看三类问题框是否把整簇蚜虫都框住、黏虫被叶片遮挡时框是否只标了可见部分、有没有漏标。常见做法是用matplotlib快速叠框或者用labelImg、labelme打开原图核对。如果发现大量框贴着图像边缘被截断训练时要做裁剪增强否则模型学到的都是残缺目标。3. 转成 YOLO 训练格式data.yaml 与目录切分数据看清楚了接下来把它整理成 YOLO 能直接吃的结构。Ultralytics 系的 YOLOv5/v8/v11 对目录的要求是train/val/test三个子集各自带images和labels或者用一个大目录加 txt 列表指定。农业数据集样本量通常不大切分比例要偏保守验证集留够才能看出过拟合。3.1 划分 train/val 并生成标准目录按 8:1:1 或 8:2 切分蚜虫和黏虫的样本要尽量均匀分布到各子集避免验证集里某一类特别少导致该类 mAP 波动大。下面脚本按类别分层抽样保证每个子集里两类都有。import random import shutil from pathlib import Path from collections import defaultdict random.seed(42) img_dir Path(dataset/images) lbl_dir Path(dataset/labels) out_root Path(yolo_dataset) # 按每张图包含的类别做分层键 img_to_classes defaultdict(set) for txt in lbl_dir.glob(*.txt): for line in txt.read_text().strip().splitlines(): if line: img_to_classes[txt.stem].add(int(line.split()[0])) # 以类别组合为键分组组内随机切分 groups defaultdict(list) for stem, classes in img_to_classes.items(): groups[tuple(sorted(classes))].append(stem) splits {train: [], val: [], test: []} for key, stems in groups.items(): random.shuffle(stems) n len(stems) n_val max(1, int(n * 0.1)) n_test max(1, int(n * 0.1)) splits[val] stems[:n_val] splits[test] stems[n_val:n_val n_test] splits[train] stems[n_val n_test:] for split, stems in splits.items(): (out_root / split / images).mkdir(parentsTrue, exist_okTrue) (out_root / split / labels).mkdir(parentsTrue, exist_okTrue) for stem in stems: for ext in (.jpg, .png, .jpeg): src img_dir / f{stem}{ext} if src.exists(): shutil.copy(src, out_root / split / images / src.name) break shutil.copy(lbl_dir / f{stem}.txt, out_root / split / labels / f{stem}.txt) print({k: len(v) for k, v in splits.items()})分层键用「该图包含的类别集合」这样只含蚜虫、只含黏虫、两者都有的图会各自成组再切分验证集不会出现某类完全缺失。random.seed(42)固定随机性方便复现。切分比例这里 val 和 test 各 10%如果总样本少于 500 张建议只留 train/valtest 并进 val否则验证集太小指标没意义。3.2 写 data.yaml 并核对路径YOLO 训练入口认的是data.yaml路径写错是最常见的翻车点。path用绝对路径最稳train、val相对path写。path: /abs/path/to/yolo_dataset train: train/images val: val/images test: test/images names: 0: aphid 1: armywormnames的键必须是整数顺序和前面统计的 id 分布一致。如果数据集里蚜虫是 0、黏虫是 1这里就不能反。写完用yaml.safe_load读一遍确认没语法错误缩进用空格不用 Tab这是 YAML 的老坑。3.3 用 Ultralytics 起训命令与关键参数环境装好ultralytics后一条命令就能起训。农业数据集样本少建议从预训练权重微调别从零训。yolo detect train \ data/abs/path/to/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/aphid_armyworm \ nameexp1modelyolov8n.pt用 nano 版先跑通流程显存不够就降到batch8。imgsz640对小目标偏大蚜虫如果普遍小于 32 像素可以试imgsz1024但显存和速度要权衡。patience20表示 20 轮没提升就早停防止过拟合。lr00.01是微调的常规起点如果 loss 震荡厉害降到 0.001。训练日志里重点盯mAP50和mAP50-95前者看召回后者看框的精度小目标通常后者偏低。4. 避坑与排查标注、增强和显存的血泪经验这一章是实打实踩出来的。农业数据集不像 COCO 那么规整虫害图像的背景复杂度高、光照变化大很多在通用数据集上没问题的操作到这里就翻车。4.1 现象训练 loss 正常但 mAP 一直是 0原因data.yaml里names的顺序和标签class_id对不上或者标签坐标没归一化还是像素值。YOLO 期望的是 0~1 相对坐标如果标签里出现大于 1 的数说明导出时选了绝对坐标格式。解决跑一遍坐标范围检查max(x_center)超过 1 就批量除以图像宽高重新归一化。4.2 现象验证集 mAP 高但实际推理漏检严重原因训练集和验证集来自同一批连续拍摄的图像分布太像模型记住了背景而不是虫子。农业数据常见于同一块田同一天拍的照片。解决切分时按拍摄批次或地块分组让验证集来自不同批次或者引入外部图像做测试。这个坑很隐蔽指标好看但上线就废。4.3 现象小目标蚜虫几乎检不出原因默认 anchor 或特征图尺度对小目标不友好加上下采样后小目标信息丢失。解决提高imgsz到 1024 或 1280开启mosaic增强的同时注意 mosaic 会把小目标缩得更小可以调低 mosaic 概率另外检查标注框宽高是否小于 3 像素太小的框建议合并或剔除。4.4 现象训练中途 CUDA out of memory原因batch或imgsz设太大或者 dataloader 的workers开太多导致内存泄漏。解决先把batch减半imgsz降到 640workers设成 CPU 核数的一半。如果还爆用ampFalse关掉混合精度试试有些老显卡对 AMP 支持不好。4.5 现象增强后图像出现黑边或目标被裁掉原因mosaic、mixup或random_perspective参数过激蚜虫这种小目标被裁到只剩半个。解决把mosaic概率从默认 1.0 降到 0.5degrees、translate调小或者针对小目标数据集直接关掉mixup。增强是为了泛化不是为了把目标搞没。5. 进阶小目标检测的调参与验证习惯跑通 baseline 之后真正决定这套数据能不能用的是小目标召回。蚜虫在 640 分辨率下可能只有十几个像素常规 YOLO 的 P3 特征图 stride 是 8感受野和分辨率都吃紧。我一般会做两件事一是加一个更高分辨率的检测头二是用切片推理SAHI在推理阶段把大图切块再检测。加检测头的做法是在模型配置里增加 P2 层stride 为 4代价是显存和推理时间上升。以 YOLOv8 为例改yolov8.yaml的 head 部分把 P2 接进 neck 和 detect 层然后从预训练权重加载时忽略新增层的参数。这个操作对新手不友好更稳妥的替代是直接用imgsz1280训练让 P3 特征图覆盖更多像素。切片推理更适合已经训好的模型。SAHI 的思路是把原图切成带重叠的小块每块单独推理再合并框对小目标提升明显。验证时别只看整体 mAP按目标面积分桶统计面积小于 32² 的算小目标单独看这一桶的召回。如果小目标召回低于 0.3说明当前配置不够要么加分辨率要么换更密集的检测头。还有一个习惯每次改完参数固定用同一批验证图跑推理并保存可视化结果肉眼对比框的位置变化。指标会骗人框画出来骗不了人。从那以后我每次调完小目标参数都强制走一遍「分桶统计 可视化抽检」确认不是指标虚高才收工。希望帮到你。本文还有配套的精品资源点击获取