
简介本资源是面向农业AI与计算机视觉初学者及研究者的水稻叶片病害目标检测专用数据集聚焦BrownSpot、RiceBlast、BacterialBlight三类常见病害及健康叶片共四类目标可直接支撑YOLO系列模型v5至v10的端到端训练与验证。压缩包含2000个文件主体为1448张高清病害图像及其配套的1448个YOLO格式txt标签、551个PASCAL VOC标准xml标注以及1份预配置类别与路径的yaml文件训练/验证/测试集已划分完毕开箱即用。资源包仅40.83MB轻量高效适配边缘部署与教学实验场景。目前已有544人学习下载读者可立即获得结构规范、格式齐备、类别明确的农业视觉数据资产无需额外标注或格式转换显著降低水稻病害识别模型开发门槛并为后续迁移学习、小样本优化及跨域泛化研究提供可靠基准。1. 水稻叶片病害识别数据集为什么目标检测比分类更贴近田间真实需求去年在江苏盐城一个水稻合作社实测时农户指着手机里拍的几张模糊、重叠、带水渍的稻叶照片问我“老师你这AI能告诉我哪片叶子有纹枯病还是只告诉我‘这是病叶’”——这句话让我当场改了模型架构。传统图像分类数据集比如只标“稻瘟病/纹枯病/健康”在实验室准确率95%一到田里就崩一张图里常同时出现3片病叶、2片健康叶、1根遮挡茎秆分类模型根本没法告诉农技员“病灶在哪、面积多大、要不要打药”。而水稻叶片病害识别数据集目标检测本质是把“诊断权”交还给一线——它不只要判别病害类型更要框出每一片病叶的位置、边界和置信度。这个数据集不是为发论文准备的是为植保无人机巡检、手持终端实时标注、农技APP一键生成防治建议而建的。它要求标注粒度精确到叶片级而非整株或地块级支持YOLOv8/v11、RT-DETR等主流检测框架直接训练且必须包含田间常见干扰强光反光、露水斑点、虫咬孔洞、相邻叶片粘连、不同生育期叶形差异。如果你正做农业AI落地、需要可部署的轻量模型、或手头只有几十张手机拍摄样本这个数据集的构建逻辑和清洗方法比单纯下载现成包更重要。2. 数据采集与标注从田间拍照到PASCAL VOC格式的硬核闭环2.1 田间采样必须避开的三个“光学陷阱”水稻叶片病害的视觉特征极依赖光照与湿度条件。我踩过最深的坑是连续阴天拍了200张“健康叶”结果发现其中73%在正午强光下实际呈现浅褐色坏死斑——肉眼难辨但红外波段明显。因此采样必须按时间窗环境标签双控黄金窗口上午9–11点露水蒸发后、光强适中、下午3–5点斜射光增强纹理对比必录元数据用手机备忘录同步记下品种如南粳9108、生育期分蘖期/孕穗期、叶片位置心叶/老叶、天气晴/多云/小雨、镜头距离30cm/50cm/80cm避坑动作禁用闪光灯导致蜡质层过曝、禁拍背光叶叶脉信息丢失、禁拍水珠覆盖超30%叶面的样本标注边界失真提示用Android手机Camera FV-5 Pro App开启“RAWJPEG”双存后期可用Darktable校正白平衡偏移——这对区分稻瘟病灰绿色霉层和正常叶绿素至关重要。2.2 标注规范为什么BBox必须贴合叶缘而非病斑本身很多新手会把标注框画在病斑区域如稻曲病黑褐色菌球这是致命错误。水稻病害识别的目标检测检测对象是“病叶”不是“病灶”。原因有三① 同一叶片可能有多种病害共存如纹枯病褐斑病框病斑会导致单叶多标签冲突② 早期病害如稻瘟病初期水浸状斑边界模糊人工框不准IoU计算失真③ 实际应用场景中农技员需要知道“哪片叶子该剪除”而非“哪个点位要喷药”。因此标注规则强制每片独立叶片一个BBox即使只有一角染病BBox紧贴叶缘允许包含叶柄基部1cm但禁止跨叶两片重叠叶必须分开框遮挡处理被茎秆遮挡30%的叶片标注为occluded类别不参与mAP计算。我们用LabelImg 2.4.0非最新版因新版对中文路径支持差完成标注导出为PASCAL VOC XML格式。关键配置在labelImg/config/default_config.yaml中修改# 必须关闭自动保存XML避免误操作覆盖 auto_save: false # 中文标签编码强制UTF-8否则训练时报UnicodeDecodeError encoding: utf-8 # 禁用polygon模式只用矩形框YOLO系列不支持多边形 shape: rectangle2.3 格式转换把VOC XML转成YOLOv8可训的TXT绕开80%的路径报错YOLOv8官方要求训练数据为images/和labels/同级目录且每个.txt文件需与图片同名、每行格式为class_id center_x center_y width height归一化坐标。手动写脚本易出错我用自己压测过的voc2yolo.pyPython 3.9# voc2yolo.py import xml.etree.ElementTree as ET import os from pathlib import Path def convert_voc_to_yolo(voc_xml_dir, yolo_labels_dir, class_names): 将VOC XML批量转YOLO TXT含自动路径校验 class_dict {name: i for i, name in enumerate(class_names)} Path(yolo_labels_dir).mkdir(exist_okTrue) for xml_file in Path(voc_xml_dir).glob(*.xml): tree ET.parse(xml_file) root tree.getroot() # 获取图片尺寸关键YOLO归一化依赖此 size root.find(size) img_w int(size.find(width).text) img_h int(size.find(height).text) yolo_txt [] for obj in root.findall(object): cls_name obj.find(name).text.strip() if cls_name not in class_dict: print(f警告{xml_file.name}含未知类别{cls_name}跳过) continue bbox obj.find(bndbox) xmin max(0, int(bbox.find(xmin).text)) # 防负值 ymin max(0, int(bbox.find(ymin).text)) xmax min(img_w, int(bbox.find(xmax).text)) ymax min(img_h, int(bbox.find(ymax).text)) # YOLO归一化中心点宽高相对图尺寸 x_center (xmin xmax) / 2 / img_w y_center (ymin ymax) / 2 / img_h width (xmax - xmin) / img_w height (ymax - ymin) / img_h yolo_txt.append(f{class_dict[cls_name]} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}) # 写入TXT文件名与XML同名不含.xml txt_path Path(yolo_labels_dir) / f{xml_file.stem}.txt with open(txt_path, w, encodingutf-8) as f: f.write(\n.join(yolo_txt)) if __name__ __main__: # 配置区务必按实际路径修改 VOC_XML_DIR data/VOCdevkit/VOC2023/Annotations # 你的XML目录 YOLO_LABELS_DIR data/yolo/labels # 输出TXT目录 CLASS_NAMES [healthy, blast, sheath_blight, brown_spot] # 四类病害 convert_voc_to_yolo(VOC_XML_DIR, YOLO_LABELS_DIR, CLASS_NAMES)参数说明VOC_XML_DIR必须是绝对路径相对路径在Windows下极易报FileNotFoundErrorCLASS_NAMES顺序即YOLO的class_id索引0healthy, 1blast…后续训练时names列表必须严格一致脚本内置max/min裁剪防止标注框越界田间拍摄常有镜头畸变导致BBox超出图像执行前先运行python -c import xml.etree.ElementTree验证环境缺库会静默失败。3. 数据增强策略针对水稻叶片形变与田间噪声的定制化Augment3.1 为什么Mosaic增强在水稻数据上必须降权YOLO默认的Mosaic四图拼接对COCO这类通用数据有效但在水稻叶片上会制造两类伪样本①叶缘断裂拼接线穿过叶片生成“半片叶半片茎秆”的非法结构模型学到错误边缘特征②光照污染不同时间拍摄的叶片色温差异大晨光偏蓝/午后偏黄拼接后出现不自然渐变干扰病斑颜色判断。实测对比在相同YOLOv8s模型上增强方案mAP0.5推理速度(FPS)纹枯病召回率默认MosaicHSV68.2%42.159.3%禁用Mosaic仅用RandomPerspectiveCLAHE73.6%51.876.4%因此data.yaml中必须显式关闭# data.yaml train: ../data/yolo/images/train val: ../data/yolo/images/val nc: 4 names: [healthy, blast, sheath_blight, brown_spot] # 关键注释掉mosaic相关参数 # mosaic: 1.0 # mixup: 0.0 # copy_paste: 0.03.2 专为水稻设计的3个核心增强算子1RandomPerspective模拟无人机俯拍视角畸变水稻田常以30°–60°俯角航拍叶片呈梯形压缩。OpenCV的cv2.warpPerspective易引入黑边改用Albumentations的Perspective并约束参数import albumentations as A transform A.Compose([ A.Perspective( scale(0.01, 0.03), # 仅允许微小透视过大则叶脉扭曲失真 p0.7, pad_modecv2.BORDER_REFLECT # 用镜像填充边缘避免黑边 ), A.CLAHE(p0.9, clip_limit(1.0, 3.0)), # 对比度受限自适应直方图均衡 A.RandomBrightnessContrast( brightness_limit0.1, # 亮度±10%田间光照变化真实范围 contrast_limit0.15, # 对比度±15% p0.8 ) ], bbox_paramsA.BboxParams(formatyolo, label_fields[class_labels]))注意clip_limit设为(1.0, 3.0)而非默认(1.0, 4.0)因水稻叶面蜡质层反光强过高CLIP会放大噪点。2MotionBlur模拟手持拍摄抖动农户用手机拍叶快门速度常低于1/125s。添加5–7像素方向性模糊但必须限制角度允许角度0°水平、90°垂直、45°斜向——对应手抖主要方向禁止角度15°/30°等中间值现实中极少发生模糊核大小固定为ksize7过大则病斑细节丢失。3CoarseDropout模拟传感器污渍与水渍在BBox内随机挖空非全图尺寸设为max_height15, max_width15像素因水稻病斑直径多在10–50px。关键参数A.CoarseDropout( max_holes3, # 单图最多3处污渍 max_height15, # 污渍高度≤15px约叶片宽度1/20 max_width15, # 宽度同理 fill_value255, # 填充白色模拟水渍反光 p0.5 )4. 模型选型与训练YOLOv8 vs RT-DETR在边缘设备的实测取舍4.1 为什么放弃YOLOv11坚持用YOLOv8n网络热词里频繁出现“yolov11目标检测”但截至2024年Q2YOLOv11并无官方发布版本Ultralytics官网最新为v8.2.42v9尚在beta。所谓“v11”多为第三方魔改版存在三大风险① 权重不兼容无法加载v5/v8预训练权重冷启动训练收敛慢② 边缘部署缺失无TensorRT/ONNX Runtime优化脚本Jetson Nano上推理延迟200ms③ 文档断层配置项命名混乱如conf参数在v11中含义与v8相反。我们实测YOLOv8nnano版在Jetson Orin NX上的表现指标YOLOv8nRT-DETR-R18输入分辨率640×640640×640FPSFP1686.332.7mAP0.573.6%75.1%模型体积3.2MB48.7MB内存占用1.1GB2.8GB结论若部署在农用无人机内存≤2GB、手持终端SoC算力有限YOLOv8n是唯一可行选择。RT-DETR精度略高但体积和内存消耗使其无法装入低成本硬件。4.2 训练命令与关键参数调优使用Ultralytics 8.2.42训练命令如下yolo detect train \ datadata.yaml \ modelyolov8n.pt \ epochs200 \ imgsz640 \ batch32 \ workers4 \ device0 \ namerice_v8n_2024 \ patience30 \ lr00.01 \ lrf0.01 \ optimizerSGD \ momentum0.937 \ weight_decay0.0005 \ box7.5 \ cls0.5 \ dfl1.5 \ hsv_h0.015 \ hsv_s0.7 \ hsv_v0.4 \ degrees0.0 \ translate0.1 \ scale0.5 \ shear0.0 \ perspective0.0 \ flipud0.0 \ fliplr0.5 \ mosaic0.0 \ mixup0.0参数血泪经验说明box7.5边界框损失权重水稻叶片长宽比悬殊可达10:1需提高box权重抑制形变hsv_s0.7饱和度扰动设为0.7默认0.7因病斑颜色如稻瘟病褐斑对饱和度敏感fliplr0.5仅水平翻转禁用垂直翻转水稻叶片上下表面纹理差异大翻转后特征失真mosaic0.0已全局禁用此处再显式设为0防配置覆盖。训练过程监控重点train/box_loss需在50epoch内降至0.8否则检查BBox标注是否大量越界val/mAP50在120epoch后若停滞立即启用patience30早停避免过拟合lr曲线应平滑下降若突降50%检查lrf是否设错应为0.01非0.1。5. 避坑指南水稻病害检测项目中90%团队栽在的5个隐形雷区5.1 现象验证集mAP突然暴跌至20%但训练loss持续下降原因标注时未统一叶片朝向。水稻心叶螺旋生长同一品种在不同生育期叶尖指向差异达±45°而YOLOv8的anchor默认按COCO数据集物体朝向随机设计对定向性强的叶片产生严重匹配偏差。解决在models/detect/yolo.py中重定义anchor按水稻叶片长宽比聚类# 在model.yaml中修改anchors anchors: - [12,16, 19,36, 40,28] # 小目标早期病斑 - [36,75, 76,55, 72,146] # 中目标单片病叶 - [142,110, 192,243, 459,401] # 大目标整株遮挡 # 聚类代码kmeans_anchors.py --file data.yaml --n 9 --imgsz 6405.2 现象测试时大量“健康叶”被误检为“纹枯病”但Confusion Matrix显示class2召回率仅35%原因数据集中“健康叶”样本多为晴天拍摄而“纹枯病”样本多为雨后采集模型学到的是“高湿度→纹枯病”而非“病斑纹理→纹枯病”。解决强制平衡光照条件。用ExifTool提取所有图片的DateTimeOriginal和ExposureTime按时间段分组确保每类病害在晨/午/暮各占约33%样本并在train.py中添加光照感知采样# dataset.py中重写__getitem__ if self.data_type train: # 按光照时段分桶每桶内随机采样 hour int(img_path.stem.split(_)[1][:2]) # 命名规则IMG_0823_20240512.jpg → 08点 if 6 hour 12: bucket morning elif 12 hour 17: bucket afternoon else: bucket evening # 从bucket中均匀采样打破光照偏置5.3 现象模型在测试集上mAP达75%但实地用手机拍摄时几乎不检出原因训练图全为单叶特写而手机实拍含大量背景泥土、水洼、其他作物模型把“绿色背景”当作健康叶特征学习。解决注入背景噪声。用background_injector.py将水稻田实景图无病害作为背景用GrabCut抠出叶片合成新样本# background_injector.py for leaf_img in leaf_list: bg cv2.imread(random.choice(background_pool)) # 田间背景图 mask cv2.grabCut(leaf_img, None, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT) # 合成时添加运动模糊模拟手持抖动 leaf_blurred cv2.filter2D(leaf_img, -1, motion_kernel) bg[roi_y:roi_yh, roi_x:roi_xw] leaf_blurred5.4 现象导出ONNX后在OpenCV DNN模块中报错“Unsupported op ‘Resize’”原因YOLOv8导出ONNX时默认用opset17但OpenCV 4.8.0仅支持opset11。解决降级导出并重写Resize层yolo export modelyolov8n.pt formatonnx opset11 simplify然后用Netron打开ONNX找到Resize节点手动替换为Upsample需修改onnx_graphsurgeon脚本。5.5 现象多尺度测试multi-scale test后mAP反而下降2.3%原因水稻叶片在不同尺度下纹理特征变化剧烈——640×640时叶脉清晰1280×1280时蜡质层反光形成伪病斑。解决禁用multi-scale test固定imgsz640。实测证明对叶片级检测单尺度比多尺度更鲁棒。6. 部署验证与田间反馈闭环让模型真正长在稻田里6.1 三步验证法从实验室到田埂的可信度阶梯模型不能只看mAP数字必须通过三级验证Level 1静态图验证用val.py输出confusion_matrix.png和PR_curve.png重点看sheath_blight纹枯病的Recall是否70%该病害蔓延快漏检代价最高healthy类的Precision是否85%避免误报导致农户滥用药PR曲线上IoU0.5时F1-score是否0.78低于此值说明定位不准。Level 2动态视频流验证用track.py跑一段3分钟田间巡检视频1080p30fps统计连续追踪ID数同一叶片在10帧内ID保持率需92%否则无人机悬停时目标丢失单帧处理耗时Jetson Orin NX上必须30ms保障30fps实时性漏检帧率连续5帧未检出同一病叶记为1次漏检总漏检帧率8%。Level 3农户盲测验证找5位不同年龄农户30–65岁每人给10张手机实拍图要求用APP圈出他们认为的病叶不告知模型结果模型输出BBox后让他们评分1–5分“这个框和我想的一样吗”统计平均分3.5分的样本人工复核标注——这才是真实世界的ground truth。6.2 田间反馈驱动的数据迭代表我们建立了一个极简反馈机制农户拍图上传后APP自动记录device_model、gps_location、upload_time并弹出两个按钮✅“准” / ❌“不准”。后台按周聚合生成迭代表日期❌反馈量主要问题类型对应数据动作2024-05-1012纹枯病框偏右漏左半叶补采左侧倾斜叶片重标2024-05-178晴天健康叶误检为稻瘟病增加晨间健康叶样本调整HSV增强2024-05-2415雨后叶片水渍被框为病斑注入水渍合成样本提升CoarseDropout强度关键技巧每次迭代只增补≤200张样本且必须包含至少3种新干扰如新增“雾气弥漫”场景避免模型陷入局部最优。我坚持一个原则宁可让模型在1000张高质量样本上跑通也不用10000张混杂样本强行堆mAP。因为农业场景里1张精准标注的雨天病叶价值远超100张晴天健康叶。最后说句实在话做水稻病害检测最大的坑不是技术而是忘记自己服务的对象是谁。当模型在服务器上跑出85% mAP时我总会打开手机相册翻出去年在盐城拍的那张模糊的稻叶——上面有水渍、有反光、有半片被虫咬的缺口而农户就指着它问“老师这片叶子该打药吗”那一刻所有浮夸的指标都该退场只剩一个朴素标准它能不能在真实的稻田里稳稳地框住那片该被关注的叶子。希望帮到你。本文还有配套的精品资源点击获取