水稻虫害检测数据集:VOC+YOLO双格式5212张6类即用型农业AI训练资源
简介本资源为面向农业AI研发者与计算机视觉初学者的水稻虫害检测专用图像数据集聚焦解决农田场景下害虫目标识别模型训练的数据匮乏问题。数据集包含5212张高分辨率JPG图像及配套标注采用Pascal VOCXML与YOLOTXT双格式并行组织兼顾算法研究的规范性与工程部署的便捷性6类常见水稻害虫——褐飞虱、绿叶蝉、稻纵卷叶螟、稻水象甲、茎螟、螺纹虫——均经labelImg人工矩形框标注总计8104个高质量边界框类别分布均衡适配YOLOv5/v8、Faster R-CNN等主流检测框架。资源以单个2.08MB DOCX文档形式提供内含完整数据说明、目录结构图示、标注样例截图及classes.txt类别索引便于快速理解数据组织逻辑与使用路径。目前已有126人学习下载是开展农业病虫害智能监测系统开发、课程实验设计或毕业课题实践的理想基础数据支撑。1. 水稻虫害检测数据集VOCYOLO格式5212张6类别不是“又一个农业数据集”而是能直接喂进YOLOv8训练管道、跳过80%格式转换血泪调试的现成燃料你有没有试过花三天配好labelImg环境标注完200张图导出YOLO格式后发现classes.txt顺序和代码里硬编码的类别索引对不上模型训出来全是背景或者把VOC转YOLO时xml解析脚本漏了whorl-maggot这种带连字符的类名导致所有螺纹虫框全丢——这个水稻虫害检测数据集VOCYOLO格式5212张6类别就是专治这类翻车现场的。它不只提供5212张jpg5212个xml5212个txt而是每一对三件套jpg/xml/txt都经人工交叉校验xml里的 字段、txt首列数字、classes.txt第N行文本、实际图像中框内目标四者严格一一对应。6个类别名称全部按YOLO训练惯例小写短横线标准化无空格无大小写混用所有txt文件首列数字从0开始连续编号与classes.txt行号零偏差所有xml文件的 与jpg文件名完全一致含大小写路径层级干净到只有images/和labels/两级。它适合两类人一是农业AI项目刚立项、急需真实田间数据启动baseline训练的工程师二是高校课程设计要交一个“能跑通、能展示、能讲清”的水稻虫害识别demo的学生。别被“5212张”吓住——真正卡住进度的从来不是数据量而是格式错位、类别漂移、路径混乱这三座大山。这份资源是把山炸平后铺好的碎石路。2. VOCYOLO双格式共存结构解析为什么必须同时保留xml和txt以及classes.txt才是唯一真相源2.1 VOC格式xml文件结构细节与不可替代性Pascal VOC格式的xml文件是计算机视觉领域事实标准其结构清晰、语义明确尤其在跨框架迁移、可视化验证、学术论文复现时具有不可替代性。本数据集的每个xml文件严格遵循VOC 2007规范核心字段包括filename值为xxx.jpg与images/目录下文件名100%一致如IMG_00123.jpg不含任何路径前缀size包含width、height、depth其中depth恒为3RGB所有图片均为标准三通道object块每个害虫实例一个块内含name如brown-planthopper、bndboxxmin、ymin、xmax、ymax像素坐标左上角为原点truncated与difficult本数据集中二者全部设为0无截断目标、无难例标记降低初学者理解门槛。提示VOC格式是“可读性锚点”。当你发现YOLO训练结果异常比如某类召回率极低直接打开对应xml文件用浏览器或VS Code查看name和bndbox数值能3秒确认是标注问题还是模型问题——这是txt文件做不到的。2.2 YOLO格式txt文件坐标归一化规则与classes.txt的绝对权威地位YOLO格式的txt文件是训练效率的关键。本数据集每个txt文件严格遵循YOLOv5/v8官方规范每行代表一个目标框格式为class_id center_x center_y width heightclass_id整数取值范围0~5必须且只能与labels/classes.txt文件中对应行号从0开始的类别名一致center_x,center_y,width,height全部归一化到[0,1]区间计算公式为center_x (xmin xmax) / (2 * image_width) center_y (ymin ymax) / (2 * image_height) width (xmax - xmin) / image_width height (ymax - ymin) / image_height所有数值保留6位小数如0.456789避免浮点精度丢失引发的训练抖动。关键点来了classes.txt是整个YOLO流程的“宪法”。它的内容如下逐行brown-planthopper green-leafhopper leaf-folder rice-bug stem-borer whorl-maggot注意没有空行、没有BOM头、换行符为LFUnix风格。这意味着你在YOLO训练配置文件如data.yaml中定义的names字段必须与此完全一致、顺序完全相同。常见错误是手动重排classes.txt顺序或添加中文注释这会导致模型把whorl-maggot第5类当成brown-planthopper第0类学习——后果是模型输出全是褐飞虱。2.3 目录结构设计为什么images/和labels/必须同级且labels/下不嵌套子目录本数据集采用极简扁平化结构rice_pest_dataset/ ├── images/ # 所有5212张.jpg文件在此 ├── labels/ # 所有5212个.txt文件在此 │ └── classes.txt # 唯一类别定义文件 └── annotations/ # 所有5212个.xml文件在此这种设计直击工业部署痛点YOLO训练脚本如train.py默认读取images/和labels/同名文件IMG_001.jpg→labels/IMG_001.txt无需额外映射逻辑VOC工具链如pascal_voc.py默认从annotations/读xml路径无歧义严禁将txt文件按类别分到labels/brown-planthopper/等子目录——这会迫使你重写数据加载器增加3小时调试成本严禁在images/下建train/val/test子目录——本数据集未做划分划分逻辑应由训练代码控制如torch.utils.data.random_split而非靠文件系统隔离。我一般会在项目初始化时执行一次校验# 校验images/与labels/文件名是否完全一致忽略扩展名 diff (ls images/ | sed s/\.jpg$// | sort) (ls labels/ | sed s/\.txt$// | sort) # 若无输出说明一一对应若有差异立即停下手头工作先修复文件名这行命令是我写进每个农业AI项目的precheck.sh里的第一行——它比任何文档都可靠。3. 双格式一致性校验用Python脚本自动揪出xml与txt的3类隐性错位3.1 校验脚本核心逻辑从xml反推txt再比对原始txt光看文件数量相等521252125212远远不够。真正的坑藏在细节里xml里标了3个框txt里却只有2行xml里name是whorl-maggottxt里class_id却是4对应stem-borerxml坐标越界xmax image_width导致归一化后width 1。以下脚本一次性扫清这三类问题# validate_voc_yolo_consistency.py import os import xml.etree.ElementTree as ET from pathlib import Path def parse_xml(xml_path, class_to_id): 从xml提取所有框返回[class_id, cx, cy, w, h]列表 tree ET.parse(xml_path) root tree.getroot() size root.find(size) img_w int(size.find(width).text) img_h int(size.find(height).text) boxes [] for obj in root.findall(object): name obj.find(name).text.strip() if name not in class_to_id: raise ValueError(fXML {xml_path.name}: unknown class {name}) bndbox obj.find(bndbox) xmin int(bndbox.find(xmin).text) ymin int(bndbox.find(ymin).text) xmax int(bndbox.find(xmax).text) ymax int(bndbox.find(ymax).text) # 坐标合法性检查 if xmin 0 or ymin 0 or xmax img_w or ymax img_h or xmin xmax or ymin ymax: raise ValueError(fXML {xml_path.name}: invalid bbox [{xmin},{ymin},{xmax},{ymax}] for {img_w}x{img_h}) # 转YOLO格式归一化 cx (xmin xmax) / (2 * img_w) cy (ymin ymax) / (2 * img_h) w (xmax - xmin) / img_w h (ymax - ymin) / img_h boxes.append([class_to_id[name], cx, cy, w, h]) return boxes def parse_txt(txt_path): 从txt提取所有框返回[class_id, cx, cy, w, h]列表 boxes [] with open(txt_path, r) as f: for line in f: parts line.strip().split() if len(parts) ! 5: continue # 跳过空行或格式错误行 class_id int(parts[0]) cx, cy, w, h map(float, parts[1:5]) boxes.append([class_id, cx, cy, w, h]) return boxes def main(): dataset_root Path(rice_pest_dataset) # 替换为你的解压路径 images_dir dataset_root / images labels_dir dataset_root / labels annotations_dir dataset_root / annotations # 读取classes.txt构建映射 classes_path labels_dir / classes.txt with open(classes_path, r) as f: classes [line.strip() for line in f if line.strip()] class_to_id {cls: i for i, cls in enumerate(classes)} errors [] for img_path in images_dir.glob(*.jpg): base_name img_path.stem xml_path annotations_dir / f{base_name}.xml txt_path labels_dir / f{base_name}.txt # 检查文件存在性 if not xml_path.exists(): errors.append(fMissing XML: {xml_path}) continue if not txt_path.exists(): errors.append(fMissing TXT: {txt_path}) continue try: xml_boxes parse_xml(xml_path, class_to_id) txt_boxes parse_txt(txt_path) # 框数量对比 if len(xml_boxes) ! len(txt_boxes): errors.append(fCount mismatch {base_name}: XML{len(xml_boxes)}, TXT{len(txt_boxes)}) continue # 逐框比对允许1e-5浮点误差 for i, (xml_box, txt_box) in enumerate(zip(xml_boxes, txt_boxes)): if abs(xml_box[0] - txt_box[0]) 1e-5: # class_id errors.append(fClass ID mismatch {base_name} box{i}: XML{xml_box[0]}, TXT{txt_box[0]}) for j in range(1, 5): # cx,cy,w,h if abs(xml_box[j] - txt_box[j]) 1e-5: errors.append(fCoord mismatch {base_name} box{i} dim{j}: XML{xml_box[j]:.6f}, TXT{txt_box[j]:.6f}) except Exception as e: errors.append(fParse error {base_name}: {str(e)}) if errors: print( CONSISTENCY ERRORS FOUND ) for err in errors[:20]: # 只显示前20个避免刷屏 print(err) print(f... and {len(errors)-20} more errors) return False else: print(✅ All VOC and YOLO files are perfectly consistent!) return True if __name__ __main__: main()参数说明与使用逻辑dataset_root指向解压后的根目录脚本会自动遍历images/下所有.jpg并推导对应的.xml和.txt路径class_to_id映射严格依赖labels/classes.txt的行序确保whorl-maggot永远是5坐标比对采用1e-5容差覆盖浮点计算微小差异但拒绝0.123456vs0.123457这种量级偏差错误信息精确到box{i}方便定位具体哪一行标注出错。运行后若输出✅ All ... consistent!说明你可以放心进入训练阶段若报错不要跳过——哪怕只有一处Class ID mismatch也意味着整个类别的学习目标已错乱训100轮也是白费。3.2 为什么不能只信txt文件——YOLO格式的三大脆弱性YOLO格式虽高效但天生脆弱无图像尺寸记录txt文件里只有归一化坐标不知道原始图像是1920x1080还是640x480。一旦训练时imgsz参数设错如用640训1920图模型会学废无类别语义class_id3本身不告诉你这是rice-bug还是stem-borer全靠classes.txt外部约定而约定极易被覆盖或误改无目标存在性证明txt文件可以为空0行但无法告诉你“这张图里真的没有害虫”还是“标注员漏标了”。而xml文件里object块的有无是人工标注意图的直接证据。因此我的工作流永远是用xml做ground truth校验用txt做训练输入用classes.txt做唯一ID源。三者缺一不可但信任权重是xml classes.txt txt。4. 避坑水稻虫害数据集实操中踩过的5个真实坑及血泪解决方案4.1 现象YOLO训练时Loss震荡剧烈mAP0.5在0.1~0.3之间反复横跳原因classes.txt文件末尾有多余空行导致len(names)为7而非6模型内部类别数错配。YOLOv8在build_targets()中按nc7分配内存但实际标签只有0~5造成张量越界和梯度爆炸。解决用vim -b classes.txt检查二进制结尾删除所有空行或执行sed -i /^$/d labels/classes.txtLinux/macOSWindows用户用Notepad → “编辑”→“行操作”→“删除空行”。4.2 现象验证时大量预测框集中在图像边缘且conf值异常高0.95原因xml文件中xmin或ymin被误标为负数如-5归一化后cx/cy超出[0,1]范围YOLO损失函数CIoU对越界框产生巨大惩罚模型被迫“学会”把框打在边缘来规避惩罚。解决运行3.1节校验脚本它会在parse_xml()中直接抛出ValueError手动修复xml将负值改为0并确保xmaxxmin、ymaxymin。4.3 现象val.py评估时提示KeyError: whorl-maggot但classes.txt里明明有这一行原因classes.txt文件编码为UTF-8 with BOMWindows记事本默认Python读取时line.strip()无法清除BOM头\ufeff导致whorl-maggot实际为\ufeffwhorl-maggot字典匹配失败。解决用VS Code打开classes.txt右下角点击编码如“UTF-8 with BOM”选择“Save with Encoding”→“UTF-8”或用Python一键转换with open(labels/classes.txt, r, encodingutf-8-sig) as f: content f.read() with open(labels/classes.txt, w, encodingutf-8) as f: f.write(content)4.4 现象训练几轮后GPU显存OOM但batch_size8在其他数据集上正常原因部分jpg图片为CMYK色彩模式常见于扫描仪直出图OpenCV/PIL读取后自动转为4通道YOLO数据加载器未做通道裁剪导致显存占用翻倍。解决批量检查并转换# Linux/macOS找出非RGB图 find rice_pest_dataset/images -name *.jpg -exec identify -format %f %m %Q\n {} \; | grep -v RGB 8 # 对CMYK图批量转RGB mogrify -colorspace RGB rice_pest_dataset/images/*.jpg注意mogrify会直接修改原图操作前务必备份4.5 现象模型在测试集上对leaf-folder召回率接近0但训练日志显示该类loss正常原因leaf-folder在classes.txt中拼写为leaf_folder下划线而xml中为leaf-folder短横线导致class_to_id映射失败所有该类框在parse_xml()中被raise ValueError拦截实际参与训练的框数为0。解决校验脚本3.1节已覆盖此场景报错信息为unknown class leaf-folder统一修正为短横线与标题、摘要描述一致并确保classes.txt、xml、训练代码names三处完全一致。5. 训练启动与效果验证从解压到mAP提升的完整闭环附YOLOv8配置速查表5.1 5分钟启动YOLOv8训练最小可行配置假设你已安装ultralyticspip install ultralytics解压数据集到./rice_pest_dataset按以下步骤操作第一步编写data.yaml# rice_pest_data.yaml train: ../rice_pest_dataset/images # 注意这里是相对路径相对于yolov8/train.py所在位置 val: ../rice_pest_dataset/images # 本数据集未划分val即全部用于验证或自行切分 nc: 6 # number of classes names: [brown-planthopper, green-leafhopper, leaf-folder, rice-bug, stem-borer, whorl-maggot]关键点train和val路径必须指向images/目录不是./rice_pest_dataset因为YOLOv8默认从images/找图、从labels/找txt同级目录。第二步启动训练CPU/GPU自适应# 使用YOLOv8nnano快速验证流程10分钟出结果 yolo detect train datarice_pest_data.yaml modelyolov8n.pt epochs50 imgsz640 batch16 device0 # 若需更高精度换yolov8mmedium yolo detect train datarice_pest_data.yaml modelyolov8m.pt epochs100 imgsz1280 batch8 device0imgsz640对水稻田间图足够若图像细节丰富如茎螟幼虫特写可升至1280batch16根据GPU显存调整RTX 3090可跑batch32GTX 1660建议batch8device0指定GPU编号多卡时用device0,1。第三步验证与可视化训练完成后runs/detect/train/weights/best.pt即为最佳权重。验证yolo detect val modelruns/detect/train/weights/best.pt datarice_pest_data.yaml结果生成在runs/detect/val/关键文件results.csv包含metrics/mAP50-95(B)主指标、metrics/mAP50(B)、各类别APconfusion_matrix.png直观看出whorl-maggot是否常被误判为leaf-folderval_batch0_pred.jpg随机抽取的预测样例肉眼判断框准不准。5.2 YOLOv8关键参数速查表水稻虫害场景下的推荐值参数默认值水稻场景推荐值为什么这样设imgsz640640初训或1280精调水稻害虫常小而密集1280能保留更多纹理细节但显存翻倍batch168~32依GPU而定batch16在RTX 3090上稳定batch8在GTX 1660上避免OOMepochs10050~150数据集5212张属中等规模50轮可得baseline100轮收敛150轮防过拟合lr0初始学习率0.010.005~0.01农业数据噪声略高稍低学习率更稳若loss下降慢可试0.01optimizerautoautoAdamWAdamW对小目标检测更鲁棒无需手动切SGDrect矩形训练FalseTrue开启后batch内图像按长宽比分组填充减少无效黑边提升小目标密度mosaic马赛克增强1.00.5~1.0全开1.0可能破坏水稻叶片连续性0.5更稳妥提示rectTrue是水稻数据的隐藏加速器。它让同一batch内图像按aspect_ratio分组如所有4:3图一组填充时只补短边避免1920x1080图被压成640x360导致害虫变糊。5.3 效果验证三板斧不止看mAP更要盯住农业场景真需求mAP只是起点农业落地要看三件事单图推理速度用yolo detect predict测time(ms)田间设备要求100ms/图30FPS小目标召回率重点看whorl-maggot和brown-planthopper的AP0.5它们体长常20像素误报容忍度打开val_batch0_pred.jpg检查是否有大量“把叶脉当害虫”的误框——这反映模型是否学到本质特征。我每次训完必做在val_batch0_pred.jpg上用红圈标出所有conf0.7但明显错的框统计这些框的class_id分布若rice-bug误报最多说明数据集中rice-bug与leaf-folder的形态相似样本不足需针对性增补用cv2.resize()把预测图缩放到手机屏大小如1080x2340模拟农户手持查看效果——框太小看不清就是不合格。从那以后我每次拿到新农业数据集都强制走一遍3.1节的校验脚本4.1~4.5的避坑清单再启动训练。省下的不是时间是半夜三点对着loss曲线发呆的崩溃感。希望帮到你。本文还有配套的精品资源点击获取