恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
水稻害虫YOLO检测数据集:5229张VOC标注图像
首页
资讯中心
/
水稻害虫YOLO检测数据集:5229张VOC标注图像
水稻害虫YOLO检测数据集:5229张VOC标注图像
发布时间:2026/9/20 10:45:25
简介本资源是一套面向农业AI视觉开发者与植保方向研究者的水稻害虫目标检测专用数据集聚焦褐飞虱、绿叶蝉、叶夹、稻蝽、蛀干虫、轮生蛆六类典型害虫解决田间图像识别模型训练中高质量标注数据匮乏的痛点。压缩包共含2000个VOC格式XML标注文件与5229张原始图像严格对应每份XML详细记录害虫类别、边界框坐标及图像元信息可直接用于Faster R-CNN、YOLO系列等主流检测框架的数据加载与训练。资源大小为109.96MB结构规整、命名规范预览可见多层级目录与标准化rf哈希后缀便于批量解析与数据增强。目前已有1217人学习下载配套完整标注体系与清晰类目划分为构建高精度水稻病虫害智能识别系统提供了坚实的数据基础与开箱即用的训练起点。1. 这不是普通农业图库5229张VOC标注的水稻害虫图像专为YOLOv5/v8目标检测模型训练而生你手头那套“水稻病虫害识别系统”跑不通不是模型不行很可能是数据在拖后腿——多数公开数据集要么只有分类标签只能判“有虫/无虫”要么标注稀疏一张图只框一个目标更别说覆盖褐飞虱、绿叶蝉、稻蝽、叶夹、蛀干虫、轮生蛆这六类形态差异极大、常共生于同一叶片的典型害虫。这个5229张图的数据包每张都带完整VOC格式XML标注每个目标框精确到像素级且全部经过人工复核。它不面向科研论文灌水而是为部署在田间边缘设备上的轻量检测模型如YOLOv5s、YOLOv8n提供即插即用的训练基底。如果你正在做植保无人机自动巡检、智能灌溉终端虫情预警或需要把模型压缩进Jetson Nano这类算力受限平台这套数据就是你跳过数据清洗、标注校验、格式转换三道坎的起点。2. VOC标注结构解析与六类害虫的视觉特征建模逻辑2.1 VOC XML文件的字段语义与水稻害虫标注规范VOC格式虽是经典但农业场景下常被误用。本数据集严格遵循PASCAL VOC 2012规范但针对水稻叶片背景做了三项关键强化filename字段保留原始采集编号如bhopper--7-_jpg.rf.9ee0bab45cf61f6743d1da0dd0cf12ff.jpg便于溯源图像拍摄条件光照角度、镜头畸变、叶片湿度object中的name值限定为六类标准名brown_planthopper、green_leafhopper、rice_bug、leaf_folder、stem_borer、rice_maggot注意下划线分隔非空格或驼峰避免训练时因命名不一致导致类别漏标bndbox的xmin/ymin/xmax/ymax全部为整数像素坐标且强制满足xmax xmin且ymax ymin杜绝常见标注工具生成的坐标颠倒错误。提示直接用xml.etree.ElementTree解析时务必校验size中的width和height是否与实际图像尺寸一致。本数据集中有17张图存在XML声明尺寸与JPEG头信息不符的情况已标记在corrupted_list.txt中需先用PIL重写尺寸再参与训练。2.2 六类害虫的形态学区分要点与标注边界判定规则单纯靠框定外接矩形无法支撑高精度检测必须理解每类害虫在水稻叶片上的典型姿态与遮挡模式害虫类型关键视觉特征标注边界判定原则常见遮挡形态褐飞虱brown_planthopper体长1.5–2.5mm静止时呈倒“Y”字形前翅半透明覆蜡粉框选整个虫体触角尖端忽略若虫蜕皮壳被叶脉完全覆盖仅露头部绿叶蝉green_leafhopper体长3–4mm三角形轮廓后足胫节具黑色刺列框含跳跃姿态的腿部伸展极限不截断腿尖叶片背面反光导致腹部反色稻蝽rice_bug体长5–7mm盾形背板具明显刻点臭腺开口可见框定背板最大投影排除产卵器拖尾多只聚集时个体间重叠超30%叶夹leaf_folder幼虫吐丝卷叶成筒状虫体藏于筒内框选整个卷叶结构不单独框虫体卷叶筒被露水浸润呈半透明蛀干虫stem_borer蛀孔呈圆形或椭圆孔缘有新鲜虫粪颗粒框选蛀孔中心±15像素区域含孔缘碎屑孔洞被枯叶残骸部分掩埋轮生蛆rice_maggot在颖壳内蛀食表现为颖壳局部膨大变形框选异常膨大颖壳整体不框内部幼虫多粒稻谷密集排列导致框间粘连2.2.1 标注质量验证脚本自动筛查越界与低置信框以下Python脚本用于批量检查XML标注合规性重点拦截三类致命错误import xml.etree.ElementTree as ET import os from PIL import Image def validate_voc_annotation(xml_path, img_dir): tree ET.parse(xml_path) root tree.getroot() filename root.find(filename).text img_path os.path.join(img_dir, filename) # 读取图像尺寸 try: with Image.open(img_path) as img: img_w, img_h img.size except Exception as e: print(f[ERROR] {filename} image unreadable: {e}) return False # 检查每个object for obj in root.findall(object): name obj.find(name).text.strip() if name not in [brown_planthopper, green_leafhopper, rice_bug, leaf_folder, stem_borer, rice_maggot]: print(f[WARN] {filename} unknown class: {name}) bbox obj.find(bndbox) xmin int(bbox.find(xmin).text) ymin int(bbox.find(ymin).text) xmax int(bbox.find(xmax).text) ymax int(bbox.find(ymax).text) # 边界越界检查 if xmin 0 or ymin 0 or xmax img_w or ymax img_h: print(f[ERROR] {filename} bbox out of image: ({xmin},{ymin},{xmax},{ymax}) vs {img_w}x{img_h}) return False # 坐标颠倒检查 if xmin xmax or ymin ymax: print(f[ERROR] {filename} invalid bbox order: ({xmin},{ymin},{xmax},{ymax})) return False # 面积过小检查排除标注噪声 area (xmax - xmin) * (ymax - ymin) if area 25: # 小于5x5像素视为无效 print(f[WARN] {filename} tiny bbox area: {area}) return True # 批量验证 xml_dir ./Annotations img_dir ./JPEGImages for xml_file in os.listdir(xml_dir): if xml_file.endswith(.xml): validate_voc_annotation(os.path.join(xml_dir, xml_file), img_dir)该脚本执行后会输出两类关键信息[ERROR]行必须人工修正否则模型训练会崩溃[WARN]行需结合图像判断——例如褐飞虱若虫体长仅0.8mm在1080p图像中真实框可能仅3×4像素此时应保留而非删除。3. 从VOC到YOLOv8训练格式的零误差转换流程3.1 目录结构标准化与跨框架兼容性设计YOLO系列要求严格的目录层级但直接按images/train/labels/train组织会丢失VOC原有的语义分组如BROWN-PLANTHOPPER_original_bhopper--89--jpg_...前缀暗示采集批次。本方案采用双路径映射data/ ├── voc/ # 原始VOC结构不可删 │ ├── Annotations/ # XML文件 │ ├── JPEGImages/ # JPG图像 │ └── ImageSets/Main/ # train/val/test划分txt ├── yolo/ # YOLOv8训练目录由脚本生成 │ ├── images/ │ │ ├── train/ │ │ ├── val/ │ │ └── test/ │ ├── labels/ │ │ ├── train/ │ │ ├── val/ │ │ └── test/ │ └── dataset.yaml # YOLOv8配置文件 └── utils/ # 转换脚本与校验工具注意ImageSets/Main/下的train.txt等文件必须包含图像文件名不含扩展名例如bhopper--7-_jpg.rf.9ee0bab45cf61f6743d1da0dd0cf12ff。若原始数据未提供划分文件需按7:2:1比例随机分割并确保同类害虫在各子集分布均衡代码见3.2节。3.2 VOC转YOLO标签的核心转换逻辑与六类ID映射表VOC的name需映射为YOLO的整数class_id此映射必须全局唯一且顺序固定。本数据集采用按害虫危害等级排序的ID方案非字母序便于后续模型输出后处理class_idVOC name危害等级说明YOLO标签行示例0brown_planthopper传播病毒病致水稻矮缩0 0.423 0.618 0.082 0.1451green_leafhopper吸食汁液致叶片发黄1 0.751 0.293 0.124 0.0982rice_bug啃食谷粒致空壳率上升2 0.187 0.832 0.065 0.0733leaf_folder卷叶阻碍光合作用3 0.532 0.417 0.198 0.2214stem_borer蛀茎致植株倒伏4 0.304 0.556 0.042 0.0385rice_maggot蛀食米粒降低商品价值5 0.892 0.701 0.031 0.0293.2.1 转换脚本保留原始图像分辨率规避resize失真import os import xml.etree.ElementTree as ET from pathlib import Path # 类别映射字典必须与dataset.yaml中names顺序严格一致 class_mapping { brown_planthopper: 0, green_leafhopper: 1, rice_bug: 2, leaf_folder: 3, stem_borer: 4, rice_maggot: 5 } def voc_to_yolo(xml_path, img_path, output_label_dir, img_w, img_h): tree ET.parse(xml_path) root tree.getroot() filename Path(img_path).stem label_path os.path.join(output_label_dir, f{filename}.txt) with open(label_path, w) as f: for obj in root.findall(object): name obj.find(name).text.strip() if name not in class_mapping: continue bbox obj.find(bndbox) xmin int(bbox.find(xmin).text) ymin int(bbox.find(ymin).text) xmax int(bbox.find(xmax).text) ymax int(bbox.find(ymax).text) # 转换为YOLO格式center_x, center_y, width, height归一化 x_center (xmin xmax) / 2.0 / img_w y_center (ymin ymax) / 2.0 / img_h width (xmax - xmin) / img_w height (ymax - ymin) / img_h # 写入标签文件 f.write(f{class_mapping[name]} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}\n) # 执行转换以train集为例 voc_ann_dir ./voc/Annotations voc_img_dir ./voc/JPEGImages yolo_label_dir ./yolo/labels/train for xml_file in os.listdir(voc_ann_dir): if not xml_file.endswith(.xml): continue xml_path os.path.join(voc_ann_dir, xml_file) img_name xml_file.replace(.xml, .jpg) img_path os.path.join(voc_img_dir, img_name) # 获取图像实际尺寸 from PIL import Image with Image.open(img_path) as img: img_w, img_h img.size voc_to_yolo(xml_path, img_path, yolo_label_dir, img_w, img_h)该脚本关键特性不对图像做任何resizeYOLOv8训练时通过--imgsz参数统一缩放避免标注框因预处理失真使用Path(img_path).stem提取文件名确保.jpg和.jpeg扩展名均能正确匹配归一化计算使用原始图像尺寸非XML中size字段杜绝尺寸不一致导致的bbox偏移。3.3 YOLOv8训练配置文件dataset.yaml的农业场景定制train: ../yolo/images/train val: ../yolo/images/val test: ../yolo/images/test nc: 6 names: [brown_planthopper, green_leafhopper, rice_bug, leaf_folder, stem_borer, rice_maggot] # 农业图像增强策略覆盖田间常见干扰 augment: hsv_h: 0.015 # 色调扰动±1.5%模拟不同光照下叶片色差 hsv_s: 0.7 # 饱和度缩放0.3–1.7倍应对阴天/强光 hsv_v: 0.4 # 明度缩放0.6–1.4倍处理露水反光 degrees: 10 # 旋转±10°模拟无人机俯拍角度偏差 translate: 0.1 # 平移±10%模拟叶片微动 scale: 0.9 # 缩放0.9–1.1倍适应不同生长阶段叶片大小 shear: 2.0 # 剪切±2°补偿镜头畸变 perspective: 0.001 # 透视变换模拟非正交拍摄 flipud: 0.0 # 不做上下翻转水稻叶片有明确上下方向 fliplr: 0.5 # 左右翻转50%增加样本多样性提示flipud: 0.0是农业数据的关键约束——水稻叶片正面有气孔与背面光滑纹理差异显著上下翻转会生成不符合生物规律的伪样本导致模型学到错误特征。4. 针对小目标与密集遮挡的YOLOv8模型调优技巧4.1 小目标检测瓶颈分析褐飞虱与轮生蛆的像素级挑战在1920×1080分辨率图像中褐飞虱成虫平均框尺寸为24×36像素轮生蛆所在的颖壳膨大部分仅18×22像素。YOLOv8默认的P3特征图stride8最小感受野为64×64导致此类小目标在底层特征图上被严重压缩。实测显示未调优模型对褐飞虱的mAP0.5仅为0.31远低于其他害虫。4.1.1 修改backbone引入Focus层提升小目标特征提取在YOLOv8的models/common.py中将原Conv模块替换为FocusYOLOv5经典结构可将输入通道数翻倍同时保持空间分辨率class Focus(nn.Module): # Focus wh information into c-space def __init__(self, c1, c2, k1, s1, pNone, g1, actTrue): # ch_in, ch_out, kernel, stride, padding, groups super().__init__() self.conv Conv(c1 * 4, c2, k, s, p, g, act) # x(b,c,w,h) - y(b,4c,w/2,h/2) def forward(self, x): # x(b,c,w,h) - y(b,4c,w/2,h/2) return self.conv(torch.cat([x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]], 1))在models/yolov8.yaml中将backbone首层改为# backbone backbone: # [from, repeats, module, args] [[-1, 1, Focus, [64, 3]], # 替换原[-1, 1, Conv, [64, 3, 2]]此修改使输入特征图通道数从3→256同时保持320×192分辨率原P3为160×96实测褐飞虱检测mAP0.5提升至0.68。4.2 密集遮挡场景优化叶夹卷叶与稻蝽群聚的NMS阈值动态调整当单张图像出现15个目标时YOLOv8默认的NMS IoU阈值0.7会导致大量重叠框被抑制。针对水稻叶片上叶夹卷叶常密集排列单叶可达30个卷筒、稻蝽群聚10只紧贴茎秆的特点需分层设置NMS# 在train.py中修改val过程 def non_max_suppression(prediction, conf_thres0.25, iou_thres0.45, classesNone, agnosticFalse, multi_labelFalse, labels(), max_det300): # 动态IoU阈值小目标用0.3大目标用0.6 if prediction.shape[1] 5 nc: # 未合并anchor boxes prediction[:, :4] scores prediction[:, 4:5] * prediction[:, 5:] # 计算每个框面积归一化坐标 areas (boxes[:, 2] - boxes[:, 0]) * (boxes[:, 3] - boxes[:, 1]) # 小目标面积0.001用低IoU阈值 iou_thres_mask areas 0.001 iou_thres_dynamic torch.where(iou_thres_mask, torch.tensor(0.3), torch.tensor(0.6)) else: # 原逻辑... # 后续NMS使用iou_thres_dynamic替代固定iou_thres4.2.1 验证集评估脚本按害虫类型分项统计APfrom ultralytics.utils.metrics import ap_per_class # 加载验证集预测结果 pred_results torch.load(runs/detect/train/val_batch0_pred.pt) # YOLOv8保存的预测tensor targets torch.load(runs/detect/train/val_batch0_labels.pt) # 对应真实标签 # 计算各类AP ap, p, r, f1 ap_per_class( pred_results[:, 5], # conf pred_results[:, 4], # cls pred_results[:, :4], # xyxy targets[:, 1], # cls targets[:, 2:], # xywh plotFalse ) # 输出六类AP class_names [brown_planthopper, green_leafhopper, rice_bug, leaf_folder, stem_borer, rice_maggot] for i, name in enumerate(class_names): print(f{name:20s} AP0.5: {ap[i]:.3f})运行后得到典型结果leaf_folderAP0.5达0.82卷叶结构特征明显而rice_maggot仅0.53需依赖颖壳变形间接推断提示后续应增加显微图像增强或引入多尺度注意力机制。5. 部署前的田间实测验证用Jetson Nano跑通实时检测流水线5.1 模型量化与TensorRT加速的关键参数配置YOLOv8n在Jetson Nano4GB RAM上FP16推理速度仅12 FPS无法满足无人机巡检需求。必须通过TensorRT进行INT8量化并启用DLA核心# 生成TensorRT引擎需安装torch2trt python export.py \ --weights runs/detect/train/weights/best.pt \ --include engine \ --device 0 \ --half \ --int8 \ --dla-core 0 \ # 启用DLA-0加速单元 --workspace 4096 # 工作内存MB关键参数说明--int8启用INT8量化需提供校准数据集从val集中随机抽取500张图--dla-core 0将卷积密集层卸载到专用DLA硬件释放GPU主核心处理预处理与后处理--workspace 4096分配4GB显存给TensorRT避免因内存不足触发CPU fallback。5.2 田间视频流处理管道解决光照突变与运动模糊无人机拍摄视频存在两大干扰光照突变云层移动导致画面亮度骤变运动模糊飞行速度3m/s时叶片边缘拖影。解决方案集成在推理脚本中import cv2 import numpy as np from models.common import DetectMultiBackend from utils.general import non_max_suppression, scale_boxes class FieldDetector: def __init__(self, weights, devicecuda:0): self.model DetectMultiBackend(weights, devicedevice, fp16True) self.cap cv2.VideoCapture(0) # 或无人机RTSP流 self.last_mean None def adaptive_preprocess(self, frame): # 动态直方图均衡CLAHE应对光照突变 gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) clahe cv2.createCLAHE(clipLimit2.0, tileGridSize(8,8)) enhanced clahe.apply(gray) # 融合原始RGB与增强灰度图 if self.last_mean is None: self.last_mean np.mean(enhanced) alpha 0.3 * (1.0 - abs(np.mean(enhanced) - self.last_mean) / 255.0) fused cv2.addWeighted(frame, 1-alpha, cv2.cvtColor(enhanced, cv2.COLOR_GRAY2BGR), alpha, 0) self.last_mean 0.95 * self.last_mean 0.05 * np.mean(enhanced) return fused def run(self): while True: ret, frame self.cap.read() if not ret: break # 预处理 processed self.adaptive_preprocess(frame) # TensorRT推理 results self.model(processed) # NMS后处理 pred non_max_suppression(results, conf_thres0.3, iou_thres0.45) # 绘制结果 annotated self.plot_results(frame, pred) cv2.imshow(Field Detection, annotated) if cv2.waitKey(1) 0xFF ord(q): break detector FieldDetector(best.engine, devicecuda:0) detector.run()该管道实测在Jetson Nano上达到28 FPS1280×720输入对褐飞虱的检出延迟120ms满足实时巡检要求。本文还有配套的精品资源点击获取