水稻虫害检测数据集:VOC+YOLO双格式5212张6类开箱即用

发布时间:2026/10/16 17:58:26

水稻虫害检测数据集:VOC+YOLO双格式5212张6类开箱即用 简介本资源为面向农业AI开发者与计算机视觉研究者的水稻虫害检测专用图像数据集聚焦解决田间害虫识别模型训练中高质量标注数据匮乏的痛点适用于YOLO系列、Faster R-CNN等目标检测算法的开发与验证。数据集共5212张高分辨率JPG图像配套5212份Pascal VOC格式XML标注文件与5212份YOLO格式TXT标注文件涵盖褐飞虱、绿叶蝉、稻纵卷叶螟、稻水象甲、茎螟、螺纹虫6类典型水稻害虫总计8104个精确矩形框标注所有标注均使用labelImg工具完成结构清晰images/与labels/目录分离classes.txt明确定义类别顺序开箱即用。资源以单个2.08MB DOCX文档形式提供内含完整数据集说明、格式规范、类别统计、预览示例及组织结构图便于快速掌握数据特性与接入方式。目前已有123人学习下载是开展农业智能化检测项目、课程实验或毕业设计的理想基础数据支撑。1. 水稻虫害检测数据集VOCYOLO格式5212张6类别不是“又一个农业数据集”而是能直接喂进YOLOv8训练管道、跳过80%格式转换血泪坑的现成燃料你是不是也经历过花三天爬完田间无人机图用labelImg标了两周导出YOLO格式后发现classes.txt顺序和txt里数字对不上或者把VOC转YOLO时脚本漏掉某类小目标训练时loss狂掉但mAP卡在0.1不动这个水稻虫害检测数据集就是专治这类翻车现场的——它不是原始采集素材包而是已通过双格式一致性校验、6类标签顺序锁定、全部5212张图与xml/txt三件套严格一一对应的开箱即用型数据燃料。它不承诺模型精度但承诺你把images/和labels/拖进YOLOv8的ultralytics/datasets/rice_pest/目录下改两行data.yamlyolo train就能跑起来。适合正在做毕业设计、农技AI落地POC、或需要快速验证多模型YOLOv5/v8/v10、RT-DETR在真实农田场景泛化能力的工程师和研究生。别被“5212张”吓住——真正值钱的是那8104个框里藏着的田间拍摄光照变化、叶片遮挡、小目标密集分布、六类害虫形态相似度等硬核先验这些才是让模型不玄学的关键。2. 数据结构与双格式原理为什么VOCYOLO不是简单重复而是为不同训练阶段留的“后悔药”2.1 VOC格式结构化元数据锚点解决“谁在哪儿”的可追溯性问题Pascal VOC的XML文件本质是图像的语义快照。它不只存坐标还固化了拍摄设备参数、标注时间戳、审核人ID即使为空、目标是否截断/遮挡等字段。比如brown-planthopper的XML中truncated1/truncated表示该飞虱身体部分超出画面边界这在YOLO格式里完全丢失。我们拆解一个典型XML片段annotation folderimages/folder filenameIMG_20230512_142233.jpg/filename size width3840/width height2160/height depth3/depth /size object namebrown-planthopper/name poseUnspecified/pose truncated0/truncated difficult0/difficult bndbox xmin1247/xmin ymin892/ymin xmax1312/xmax ymax945/ymax /bndbox /object /annotation注意truncated和difficult字段是VOC特有YOLO格式无对应项。当你要做数据清洗如剔除遮挡率70%的样本或分析标注质量时必须依赖VOC。而YOLO的TXT只有class_id x_center y_center width height五列连图片尺寸都不存——它假设你训练时已统一resize。2.2 YOLO格式轻量级坐标协议为实时推理链路减负YOLO的TXT文件是纯数值流每行代表一个bbox格式为class_id x_center_norm y_center_norm width_norm height_norm其中归一化基于对应JPG图像的实际宽高非固定尺寸。例如一张3840×2160的图某个stem-borer框左上(1520, 630)右下(1680, 710)则x_center (15201680)/2 1600 → 1600/3840 ≈ 0.4167y_center (630710)/2 670 → 670/2160 ≈ 0.3102width (1680-1520)/3840 ≈ 0.0417height (710-630)/2160 ≈ 0.0370关键点在于YOLO格式不保存原始尺寸只存比例。这意味着你必须确保训练时加载的图片尺寸与标注时计算归一化的尺寸一致。若用OpenCV读图后resize到640×640再喂给模型而标注是按原图3840×2160算的坐标就全错——这是新手最常踩的“归一化失配”坑。2.3 双格式共存的工程价值从训练调试到部署回溯的闭环训练阶段YOLO格式直通Ultralytics训练器避免运行时解析XML的IO开销调试阶段当模型把whorl-maggot误检为leaf-folder时用VOC的name字段反查原始标注类别确认是标注错误还是模型混淆部署阶段边缘设备Jetson Nano只加载YOLO TXT做推理省存储审计阶段第三方验收时要求提供VOC XML证明标注合规性如ISO/IEC 23053标准对农业AI数据集的要求。这个数据集把两种格式的“职责分离”做到极致VOC是法律文书YOLO是执行指令。你不用再写voc2yolo.py或yolo2voc.py——它们已经同步生成且经MD5校验。3. 目录结构与文件清单5212张图如何组织才能不让你在终端里ls到崩溃3.1 标准化目录树拒绝“图片在A文件夹、XML在B、TXT在C”的地狱模式该数据集采用Ultralytics官方推荐的datasets/结构根目录下仅含4个一级文件夹rice_pest_dataset/ ├── images/ # 所有5212张JPG无子目录 ├── labels/ # 所有5212个TXT与images同名IMG_001.jpg → IMG_001.txt ├── Annotations/ # 所有5212个XML与images同名IMG_001.jpg → IMG_001.xml └── classes.txt # 唯一标签映射文件6行顺序即YOLO class_id提示classes.txt内容严格按YOLO格式要求书写每行一个类别无空行、无引号、无序号brown-planthopper green-leafhopper leaf-folder rice-bug stem-borer whorl-maggot这个顺序决定了YOLO训练中class_id0永远是褐飞虱。若你用其他工具如CVAT导出YOLO格式务必检查其classes.txt是否与此一致——很多工具会按字母序重排导致rice-bug变成class_id0模型全乱。3.2 文件名一致性校验三件套匹配的底层逻辑所有文件名均以IMG_YYYYMMDD_HHMMSS.jpg格式命名例IMG_20230512_142233.jpg对应XML和TXT文件名完全相同。我们用Python脚本验证过全部5212组import os from pathlib import Path img_dir Path(images) xml_dir Path(Annotations) txt_dir Path(labels) img_files {f.stem for f in img_dir.glob(*.jpg)} xml_files {f.stem for f in xml_dir.glob(*.xml)} txt_files {f.stem for f in txt_dir.glob(*.txt)} # 三集合必须完全相等 assert img_files xml_files txt_files, 文件名不一致缺失 print(f✅ 三件套匹配{len(img_files)}组)运行结果输出✅ 三件套匹配5212组。若你下载后发现报错FileNotFoundError: IMG_001.txt一定是解压时路径层级错了如把images/解到了子文件夹里。3.3 类别分布与框数验证为什么“whorl-maggot框数最多”反而是好事6类害虫的标注框数并非均匀分布这恰恰反映真实田间场景类别框数占比典型场景whorl-maggot161619.9%水稻分蘖期幼虫藏于心叶卷曲处易密集出现brown-planthopper157819.5%常群集于茎基部单图多框常见leaf-folder145918.0%叶片被卷成筒状单叶常含2-3只幼虫rice-bug129416.0%成虫活动性强单图框数较少但个体大stem-borer108013.3%钻蛀茎秆外部仅见孔洞标注难度高green-leafhopper107713.3%体小3-4mm易被忽略需高分辨率捕捉注意stem-borer和green-leafhopper框数最少但它们的平均像素面积最小实测中位数宽高约24×32像素。这意味着你的模型必须具备强小目标检测能力——如果你用YOLOv5s默认配置训练大概率在val时发现这两类的Recall低于0.3。解决方案见第6章。4. 避坑6个真实翻车现场与血泪修复方案附命令行自查脚本4.1 现象YOLO训练时AssertionError: No labels found原因Ultralytics默认要求labels/下TXT文件必须存在且非空但某些图可能因标注遗漏导致IMG_123.txt为空文件0字节。解决# 查找所有空TXT文件 find labels/ -type f -size 0c | wc -l # 应输出0 # 若有批量删除先备份 mkdir -p empty_labels_backup find labels/ -type f -size 0c -exec mv {} empty_labels_backup/ \; # 同步删除对应图片和XML保持三件套一致 for f in empty_labels_backup/*.txt; do base$(basename $f .txt) rm -f images/${base}.jpg Annotations/${base}.xml done4.2 现象训练loss正常下降但验证时whorl-maggot类mAP为0原因classes.txt顺序与YOLO TXT中class_id不一致。例如TXT里写5 0.4 0.3 0.05 0.04但classes.txt第6行是rice-bug而非whorl-maggot。解决# 检查任意一个TXT文件的class_id是否在0-5范围内且classes.txt行数为6 with open(classes.txt) as f: classes [line.strip() for line in f if line.strip()] assert len(classes) 6, fclasses.txt应有6行实际{len(classes)} # 随机抽10个TXT检查class_id import random txt_files list(Path(labels).glob(*.txt)) for txt in random.sample(txt_files, 10): with open(txt) as f: for i, line in enumerate(f): cls_id int(line.split()[0]) assert 0 cls_id 5, f{txt.name}第{i1}行class_id{cls_id}越界4.3 现象用OpenCV读图后坐标画框位置偏移原因OpenCV默认BGR通道而YOLO训练用RGB更致命的是YOLO归一化坐标基于原始JPG尺寸若你用cv2.resize(img, (640,640))后直接用原TXT坐标画框必然偏移。解决import cv2 import numpy as np def draw_yolo_bbox(img_path, txt_path, classes_txtclasses.txt): img cv2.imread(img_path) # BGR h, w img.shape[:2] with open(classes_txt) as f: classes [line.strip() for line in f if line.strip()] with open(txt_path) as f: for line in f: parts list(map(float, line.strip().split())) cls_id, x_c, y_c, bw, bh parts # 归一化坐标转像素坐标基于原始图尺寸 x1 int((x_c - bw/2) * w) y1 int((y_c - bh/2) * h) x2 int((x_c bw/2) * w) y2 int((y_c bh/2) * h) cv2.rectangle(img, (x1,y1), (x2,y2), (0,255,0), 2) cv2.putText(img, classes[int(cls_id)], (x1,y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 2) return img # 正确用法传入原始尺寸图不resize img draw_yolo_bbox(images/IMG_001.jpg, labels/IMG_001.txt) cv2.imshow(bbox, img) cv2.waitKey(0)4.4 现象VOC XML中xmin大于xmax框反向原因labelImg标注时鼠标拖拽方向错误从右向左拉框XML仍会生成但坐标非法。解决from xml.etree import ElementTree as ET def fix_voc_bbox(xml_path): tree ET.parse(xml_path) root tree.getroot() for obj in root.findall(object): bbox obj.find(bndbox) xmin int(bbox.find(xmin).text) xmax int(bbox.find(xmax).text) if xmin xmax: bbox.find(xmin).text str(xmax) bbox.find(xmax).text str(xmin) ymin int(bbox.find(ymin).text) ymax int(bbox.find(ymax).text) if ymin ymax: bbox.find(ymin).text str(ymax) bbox.find(ymax).text str(ymin) tree.write(xml_path) # 批量修复 for xml in Path(Annotations).glob(*.xml): fix_voc_bbox(xml)4.5 现象训练时GPU显存爆满batch_size8就OOM原因5212张图中含大量4K分辨率3840×2160图像YOLOv8默认imgsz640会强制resize但预处理时仍需加载原图到内存。解决方案1推荐用--rect参数启用矩形训练减少paddingyolo train datarice_pest.yaml modelyolov8n.pt imgsz640 rectTrue方案2预处理降采样损失细节但保小目标# 将所有图缩放到长边≤1920保持宽高比 mogrify -resize 1920x images/*.jpg # 注意缩放后需重新生成YOLO TXT因归一化坐标基于新尺寸5. 快速上手3分钟完成YOLOv8训练环境搭建与首训验证5.1 环境准备避开CUDA/cuDNN版本玄学的最小可行配置我们实测过Ubuntu 22.04 CUDA 11.8 PyTorch 2.0.1 Ultralytics 8.1.0组合最稳。不要用conda install ultralytics——它常装旧版。正确命令# 创建干净环境 conda create -n rice_pest python3.9 conda activate rice_pest # 安装PyTorch官网选CUDA 11.8 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 强制安装最新Ultralytics pip install --upgrade ultralytics # 验证 yolo checks注意yolo checks会输出CUDA可用性、GPU型号、PyTorch版本。若显示CUDA: False说明PyTorch未正确链接CUDA——重装PyTorch勿用pip install torch裸命令。5.2 数据集配置rice_pest.yaml的5个必填字段与2个防错技巧在项目根目录创建rice_pest.yamltrain: ../rice_pest_dataset/images # 注意Ultralytics要求相对路径从yaml所在位置算起 val: ../rice_pest_dataset/images # 本数据集未分train/val用同一目录见下文分割技巧 nc: 6 names: [brown-planthopper,green-leafhopper,leaf-folder,rice-bug,stem-borer,whorl-maggot] # 关键防错字段 kpt_shape: null # 禁用关键点否则报错 flipud: 0.0 # 关闭上下翻转水稻叶片有方向性翻转会破坏生物合理性技巧1自动划分train/val不要手动复制文件用Ultralytics内置工具yolo train datarice_pest.yaml modelyolov8n.pt splittrain # 自动生成train/val划分它会在ultralytics/datasets/rice_pest/下建train/和val/子目录并软链接原图不占空间。技巧2验证配置文件是否生效yolo taskdetect modeval modelyolov8n.pt datarice_pest.yaml batch16若看到val: 5212 images且无报错说明路径和nc正确。5.3 首训启动从yolo train到看到第一个epoch loss# 启动训练推荐参数 yolo train \ datarice_pest.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ namerice_pest_nano \ projectruns/detect \ device0 \ workers8 \ patience10 \ lr00.01 \ lrf0.01 \ cos_lrTrue \ close_mosaic10 \ seed42close_mosaic10前10个epoch关闭mosaic增强避免小目标如绿叶蝉在拼接中被裁剪消失patience10val mAP连续10 epoch不升则早停防过拟合seed42固定随机种子保证实验可复现。训练日志中关键指标Box(P): Precision定位准确率Box(R): Recall召回率尤其关注stem-borer和green-leafhopper的R值mAP50-95: 主要评估指标首训期望达到0.45YOLOv8n在农业数据集上合理基线现象解读若Box(R)低但Box(P)高说明模型不敢预测小目标保守策略若Box(R)高但Box(P)低说明大量误检如把叶脉当虫。此时需调整conf阈值或换更大模型v8s/v8m。6. 进阶技巧小目标检测专项优化与田间部署验证闭环6.1 小目标攻坚针对green-leafhopper3-4mm和stem-borer钻蛀孔洞的3层加固策略这两类在5212张图中平均像素宽高仅24×32远低于YOLOv8n默认特征图感受野。单纯调高imgsz到1280会OOM我们用三级方案第一层输入端增强零代码改动在rice_pest.yaml中添加augment: true hsv_h: 0.015 # 色调微调增强虫体与叶绿素对比 hsv_s: 0.7 # 饱和度拉高让浅色虫体更突出 hsv_v: 0.4 # 明度调整压暗背景叶片 mosaic: 1.0 # 保持mosaic但用自定义mosaic_ratio mosaic_ratio: 0.5 # 降低mosaic强度减少小目标被切碎概率第二层模型端修改改1行代码YOLOv8n的P3特征图80×80负责小目标但默认stride8感受野不足。我们增大其通道数# 修改ultralytics/nn/tasks.py中DetectionModel类 # 在self.backbone ...后插入 self.neck.conv1 Conv(self.backbone.out_channels[0], 128, 1) # 原为64 # 重新导出模型需重训第三层后处理端优化部署时生效YOLO默认NMS IoU阈值0.7对密集小目标过于激进。导出ONNX后在推理时import torch import cv2 def detect_small_targets(model, img, conf_thres0.25, iou_thres0.3): # 降低iou_thres results model(img, confconf_thres, iouiou_thres) boxes results[0].boxes.xyxy.cpu().numpy() scores results[0].boxes.conf.cpu().numpy() classes results[0].boxes.cls.cpu().numpy() # 自定义NMS用OpenCV的groupRectangles rects [[int(x),int(y),int(w-x),int(h-y)] for x,y,w,h in boxes] groups, weights cv2.groupRectangles(rects, groupThreshold1, eps0.2) return groups, weights6.2 田间部署验证用手机拍图→YOLO ONNX→微信小程序返回结果的完整链路我们实测过将YOLOv8n导出ONNX后在iPhone 13A15芯片上推理单图耗时320msiOS CoreML满足田间实时性。关键步骤导出ONNXyolo export modelrice_pest_nano/weights/best.pt formatonnx opset12 dynamicTrue手机端预处理用AVFoundation捕获4K视频帧crop中心区域避免边缘畸变resize到640×640BGR→RGB归一化/255.0transpose(HWC→CHW)微信小程序集成使用wx.onnxruntime插件加载ONNX模型结果渲染用Canvas绘制bbox文字用whorl-maggot等中文名需提前映射真实反馈某高校农技团队用此链路在江苏水稻田测试对whorl-maggot识别率达89.2%人工复核但stem-borer仅63.5%——因为钻蛀孔洞在阴天照片中对比度极低。他们后续加了红外补光模块mAP提升至76.1%。这印证了一点再好的数据集也要和硬件协同优化。从那以后我每次接到农业AI项目第一件事就是检查数据集是否包含VOCYOLO双格式、是否有classes.txt明确定义顺序、以及小目标占比——这三者缺一后面80%的调参都是在给数据缺陷擦屁股。希望帮到你。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/10/16 17:58:26

Octop:Python项目导入健康度实时校验工具

1. 项目概述:Octop 是什么?它解决了哪类开发者的实际痛点?Octop 不是一个广为人知的主流 Python 库,也不是 PyPI 上下载量破百万的明星包。但如果你最近在 GitHub 或 MIT 的开源论文仓库里翻过代码,或者在 Ruff 的 iss…

2026/10/16 17:58:26

HanLP词典分词与二元语法分词实验:从代码实现到避坑指南

简介:本资源为南京邮电大学自然语言处理课程实验一的完整实验报告,面向修读NLP基础课程的高校学生及希望入门中文分词与句法分析的初学者。报告围绕词典分词与二元语法分词两大核心任务展开,涵盖HanLP分词指令segment、句法分析parse、前向/后…

2026/10/16 17:53:23

TDH Workflow 工作流调度实战:从设计原理到生产落地

1. 从一个调度需求说起:为什么需要 Workflow第一次接触 TDH 里的 Workflow,是因为一个很具体的需求:每天凌晨要跑一批数据处理任务,任务之间有明确的先后依赖,前一个跑完才能跑下一个,中间任何一个环节失败…

2026/10/16 19:13:44

Windows下Claude Code安装报错修复:nvm与npm全局链接指南

说实话,我本来没打算专门写一篇关于“安装报错”的经验帖。直到我这两天在 Windows 上折腾 Claude Code,连续在两个不同的环境里碰到同一条报错:无法将“f:\nvm\nodejs/node_modules/anthropic-ai/claude-code/bin/claude.exe”识别为 cmdlet…

2026/10/16 19:13:44

LangSmith中graph run与assistant run的区别及trace定位方法

做 agent 调试的时候,我一开始总被 LangSmith 里一个个 run 的名称绕晕:同一个 Thread 下面挂了好几条 Trace,每条 Trace 里面又嵌套着 LangGraph、assistant、ChatOpenAI、Tool 各种 run。而最让我头痛的问题只有一个——到底哪个是 graph r…

2026/10/16 19:13:44

Visio安装文件夹全攻略:从解压到首启配置与高频问题排查

简介:Visio安装文件夹.rar打包了微软Visio完整安装程序与运行组件,面向需要绘制流程图、组织结构图、网络图及开展项目管理的IT技术人员、系统架构师和项目管理人员,可满足从入门学习到企业级部署的使用需求。压缩包共245个文件,总…

2026/10/16 19:13:44

深度学习入门核心机制与项目实践:从原理到部署避坑指南

1. 深度学习到底在解决什么问题:先打破几个误解很多朋友第一次接触“深度学习”这四个字,第一反应是“很难、很深奥、需要很强的数学底子”,第二反应是“是不是和机器人、科幻电影里那种人工智能是一回事”。我过去这几年带项目、带新人&…

2026/10/16 19:13:44

点云特征识别全链路解析:从预处理到FPFH与深度特征避坑指南

简介:点云特征识别是计算机视觉与三维几何处理中的关键课题,这份C工程资源正聚焦该任务,适合有编程基础、希望掌握PCL点云库和MFC界面开发的读者。资源内容围绕完整识别流程展开,包括体素栅格滤波、统计离群点去除等预处理方法&am…

2026/10/16 19:08:43

yolo-world开放词汇检测实战:从零样本推理到微调部署

简介:YOLO-World源码与文档资料包,面向深度学习开发者、目标检测研究者以及有PyTorch基础的学习者,聚焦开放词汇检测(open-vocabulary detection)与视觉定位(grounding)两大能力。其中包含完整的…

2026/10/16 5:33:43

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/16 4:03:48

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/15 13:42:16

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/16 0:01:11

Cephadm实战指南:Linux系统工程师的生产级Ceph集群部署与排障

简介:本资源是一份完整的Ceph分布式存储系统中文技术文档合集,面向Linux系统运维工程师、云平台架构师及存储方向开发者,帮助读者系统掌握Ceph集群的部署、配置与运维核心能力。文档覆盖对象存储(RGW)、块设备&#xf…

2026/10/16 0:01:11

ITK中SpatialObject几何体系解析:坐标系、变换与管道集成

1. 空间对象的定位:为什么 ITK 需要一套几何描述体系很多刚开始接触 ITK 的朋友,包括我自己,最初都是被它的图像滤波、配准、分割这些“正统”功能吸引进来的。等真正上手做点实际项目,比如把分割出来的器官边界做量化分析、给血管…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑