
简介这份水稻叶片病害识别数据集面向从事农业图像识别与目标检测的深度学习开发者、学生及科研人员旨在解决水稻病害检测中样本获取难、标注格式不统一的问题。数据集覆盖BrownSpot、RiceBlast、BacterialBlight等类别可用于YOLO系列算法的训练与验证。资源包共2000个文件包含1448个txt标签、551个xml标签及1个yaml类别配置文件压缩包约40.83MBtxt与xml分别适配YOLO和VOC两种标注格式yaml文件则指定了类别信息图片与标签已按训练集、验证集、测试集划分完毕可直接投入YOLOv5至YOLOv10等模型的训练流程。目前已有544人学习下载适合需要快速搭建病害检测基线、验证模型效果或开展对比实验的读者能省去数据清洗与格式转换的繁琐步骤将精力集中于算法调优与场景落地。1. 水稻叶片病害识别数据集1448 张图、四类病害YOLO 和 VOC 双格式开箱即用水稻叶片病害这块做目标检测的人最头疼的往往不是模型选型而是数据。网上能找到的公开集要么类别对不上要么只有分类标签没有检测框要么格式乱到得自己写脚本重标一遍。这份水稻叶片病害识别数据集算是把前期最脏的活干完了1448 张图四类病害——BrownSpot胡麻斑病、RiceBlast稻瘟病、BacterialBlight白叶枯病外加一个背景/健康类图片、txt 标签、xml 标签、yaml 配置文件全给齐而且已经按训练集、验证集、测试集切好。YOLOv5 到 YOLOv10 系列直接改个路径就能跑VOC 格式的 xml 也在想转其他框架也不费劲。如果你正在做目标检测的本科毕业设计、课程项目或者想拿农业场景练手小目标检测这份资源能省掉至少两天的数据清洗时间。2. 数据集结构与格式解析txt、xml、yaml 到底怎么对应2.1 目录组织与文件命名逻辑拿到压缩包解压后常见的目录结构是这样的不同版本可能略有差异但核心逻辑一致dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ ├── annotations/ # VOC 格式 xml │ ├── 00840.xml │ ├── 00841.xml │ └── ... ├── data.yaml └── classes.txt图片和标签是分开存放的但文件名一一对应。比如images/train/00843.jpg对应labels/train/00843.txt。项目正文里列出的00843.txt、00845.txt、00844.txt、00840.txt、00841.txt、00842.txt、01256.txt、00753.txt、00752.txt、00751.txt就是标签文件名的示例说明编号是连续的没有跳号这对训练时做数据校验很友好——你写个脚本遍历一遍就能确认图片和标签是否完全配对。VOC 格式的 xml 放在annotations/下文件名和图片名一致。xml 里包含size宽高、object类别名和 bbox 坐标坐标是绝对像素值。YOLO 格式的 txt 则是归一化后的class_id x_center y_center width height每行一个目标没有目标就是空文件。2.2 四类病害的类别映射与 yaml 配置data.yaml是 YOLO 系列训练时的核心配置文件内容大致如下path: ./dataset train: images/train val: images/val test: images/test nc: 4 names: 0: BrownSpot 1: RiceBlast 2: BacterialBlight 3: Healthy这里有几个点需要确认nc是类别数四类names的顺序必须和 txt 里的class_id严格对应。如果你拿到的 yaml 里names顺序和实际标注不一致训练出来的模型会把类别全搞混。我一般会先跑一个小脚本统计每个类别在训练集里出现的次数确认没有某一类为 0 的情况。import os from collections import Counter label_dir dataset/labels/train counter Counter() for fname in os.listdir(label_dir): if not fname.endswith(.txt): continue with open(os.path.join(label_dir, fname)) as f: for line in f: line line.strip() if line: cls_id int(line.split()[0]) counter[cls_id] 1 print(类别分布, dict(sorted(counter.items())))这段代码遍历训练集所有 txt 标签统计每个class_id出现的次数。如果某个类别计数为 0说明训练集里没有该类样本需要检查划分逻辑或者补充数据。正常情况四类都应该有几百到上千个实例分布不会太极端。2.3 VOC 与 YOLO 格式的互转脚本虽然数据集已经提供了两种格式但实际项目中经常需要从 VOC 转 YOLO或者反过来。这里给一个从 xml 转 YOLO txt 的脚本方便你校验或重新生成标签import xml.etree.ElementTree as ET import os classes [BrownSpot, RiceBlast, BacterialBlight, Healthy] xml_dir dataset/annotations out_dir dataset/labels_from_xml os.makedirs(out_dir, exist_okTrue) for xml_file in os.listdir(xml_dir): if not xml_file.endswith(.xml): continue tree ET.parse(os.path.join(xml_dir, xml_file)) root tree.getroot() size root.find(size) w int(size.find(width).text) h int(size.find(height).text) lines [] for obj in root.findall(object): cls_name obj.find(name).text if cls_name not in classes: continue cls_id classes.index(cls_name) bbox obj.find(bndbox) xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) x_center (xmin xmax) / 2.0 / w y_center (ymin ymax) / 2.0 / h bw (xmax - xmin) / w bh (ymax - ymin) / h lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {bw:.6f} {bh:.6f}) out_path os.path.join(out_dir, xml_file.replace(.xml, .txt)) with open(out_path, w) as f: f.write(\n.join(lines))逻辑说明先解析 xml 拿到图片宽高再遍历每个object把绝对坐标转成归一化的中心点加宽高。classes列表的顺序必须和data.yaml里的names一致否则类别 ID 会错位。转换完可以随机抽几张图用可视化脚本画框确认坐标没跑偏。3. 用 YOLOv8 跑通训练从环境到推理的完整链路3.1 环境准备与依赖安装YOLOv8 用 ultralytics 包安装比较干净pip install ultralytics如果你要用 GPU 训练确认 CUDA 和 PyTorch 版本匹配。我一般会先跑一行python -c import torch; print(torch.cuda.is_available())确认 GPU 能被识别。CPU 也能训但 1448 张图用 CPU 跑 100 个 epoch 大概要几个小时GPU 上十几分钟就能出结果。数据集放到项目目录下假设路径是./datasetdata.yaml里的path改成绝对路径或相对路径都行但建议用绝对路径避免训练时找不到文件。3.2 训练命令与关键参数yolo detect train \ data./dataset/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/train \ namerice_disease参数说明modelyolov8n.pt是 nano 版本参数量小适合快速验证。如果精度不够可以换yolov8s.pt或yolov8m.pt。imgsz640是输入分辨率水稻叶片病害的病灶区域通常不大640 够用想提升小目标检测效果可以上 1024但显存占用会翻倍。batch16根据显存调整8G 显存跑 640 分辨率大概能到 16不够就降到 8。patience20是早停耐心值20 个 epoch 验证集指标不提升就停省时间。训练过程中会输出每一轮的 box_loss、cls_loss、mAP50、mAP50-95。重点关注 mAP50-95这个指标比 mAP50 严格能反映框的定位精度。四类病害如果标注质量好mAP50 通常能到 0.85 以上mAP50-95 在 0.6 到 0.7 之间。3.3 推理验证与结果可视化训练完在runs/train/rice_disease/weights/best.pt拿到最优权重。推理命令yolo detect predict \ modelruns/train/rice_disease/weights/best.pt \ source./dataset/images/test \ conf0.25 \ saveTrueconf0.25是置信度阈值低于这个值的框不显示。实际部署时这个值要根据误检和漏检的权衡来调病害检测场景通常宁可误检不可漏检可以降到 0.15 到 0.2。推理结果默认保存在runs/detect/predict/下每张图会画出框和类别标签。如果想用 Python 脚本批量跑并拿到结构化结果from ultralytics import YOLO model YOLO(runs/train/rice_disease/weights/best.pt) results model.predict(source./dataset/images/test, conf0.2, saveTrue) for r in results: boxes r.boxes for box in boxes: cls_id int(box.cls[0]) conf float(box.conf[0]) xyxy box.xyxy[0].tolist() print(f类别: {model.names[cls_id]}, 置信度: {conf:.3f}, 坐标: {xyxy})这段代码把每张图的检测框类别、置信度和坐标打印出来方便后续做统计或接入业务逻辑。model.names是类别 ID 到名称的映射直接从模型里读不用再手动维护一份。4. 避坑与排查标注、划分、训练里最容易翻车的几件事4.1 图片和标签不配对训练时直接报错现象训练启动后报FileNotFoundError或者AssertionError: train: No labels found。原因图片目录和标签目录的文件名没有严格一一对应。常见情况是图片是.jpg标签是.txt但中间有空格或大小写不一致或者划分时只复制了图片没复制标签。解决跑一个配对检查脚本遍历图片目录检查每个文件名在标签目录下是否存在同名 txt。不匹配的列出来手动处理。我一般会在训练前强制走一遍这个检查花不了几秒钟但能省掉半小时的 debug。import os img_dir dataset/images/train lbl_dir dataset/labels/train img_files {os.path.splitext(f)[0] for f in os.listdir(img_dir)} lbl_files {os.path.splitext(f)[0] for f in os.listdir(lbl_dir)} missing_labels img_files - lbl_files missing_images lbl_files - img_files print(有图无标签, missing_labels) print(有标签无图, missing_images)4.2 类别 ID 从 0 还是从 1 开始搞错全盘皆输现象训练 loss 正常下降但推理时类别全乱或者某一类永远检测不到。原因YOLO 格式的class_id从 0 开始VOC 的类别名没有数字 ID转换时如果手动映射错了顺序就会导致类别错位。另外有些标注工具默认从 1 开始编号直接拿来用会多出一个不存在的类别。解决确认data.yaml里names的顺序和 txt 里实际使用的class_id一致。跑一遍 2.2 节的类别分布统计脚本看输出的 ID 是不是 0、1、2、3。如果出现 4 或更大的 ID说明标注有问题需要重新映射。4.3 训练集和验证集分布不均mAP 虚高现象验证集 mAP 很高但测试集或实际场景里效果差很多。原因划分数据时没有做分层抽样某一类病害大部分落在训练集验证集里只有零星几个实例导致验证指标不能反映真实泛化能力。解决检查三个集合的类别分布。如果某一类在验证集里实例数少于 50建议重新划分。常见做法是按 7:2:1 分层抽样保证每个集合里四类都有足够样本。数据集已经切好了但你可以自己再校验一遍不放心就重新分。4.4 小目标漏检严重病灶区域太小现象大面积的病害能检测到早期小斑点漏检。原因输入分辨率不够或者 anchor 尺寸和实际目标尺寸不匹配。YOLOv8 默认 anchor 是基于 COCO 的水稻叶片上的早期病斑可能只有十几个像素。解决把imgsz从 640 提到 1024 或 1280同时适当降低conf阈值。如果显存不够可以用yolov8s或yolov8m配合imgsz1024batch 降到 4 或 8。另外可以在训练时开启mosaic和mixup增强提升小目标的鲁棒性。4.5 推理时框重叠严重NMS 参数没调好现象同一片病斑上画出好几个重叠的框。原因NMS 的 IoU 阈值默认 0.7对于密集小目标来说太宽松导致相邻框都被保留。解决推理时加iou0.5或更低让 NMS 更激进地合并重叠框。但注意别调太低否则相邻的真实目标会被误合并。我一般从 0.5 开始试看可视化结果再微调。5. 进阶技巧用测试集做一次严格的泛化验证训练完拿到 best.pt 之后很多人直接看验证集指标就收工了。但验证集在训练过程中被用来调早停和选最优权重已经间接参与了模型选择不能完全代表泛化能力。真正严格的验证要用测试集而且只跑一次。yolo detect val \ modelruns/train/rice_disease/weights/best.pt \ data./dataset/data.yaml \ splittest \ imgsz640 \ batch16splittest指定用测试集评估。输出会给出每一类的 precision、recall、mAP50、mAP50-95。如果测试集指标比验证集低超过 10 个百分点说明模型过拟合了需要加数据增强、减模型容量或者早停。另一个实用技巧是导出 ONNX 做跨平台部署yolo export modelruns/train/rice_disease/weights/best.pt formatonnx imgsz640导出的 ONNX 模型可以用 OpenCV DNN、TensorRT 或 ONNX Runtime 加载不依赖 ultralytics 环境。部署到边缘设备时还可以进一步做 INT8 量化速度能提升 2 到 3 倍精度损失通常在 1 到 2 个百分点以内。最后说一个我自己的习惯每次拿到新数据集不管它标称切分得多好我都会先跑一遍配对检查、类别分布统计和随机可视化。这三步走完心里才有底。水稻叶片病害这个集整体质量不错四类病害的标注框比较规整1448 张图的规模也够跑出一个能用的基线模型。希望帮到你。本文还有配套的精品资源点击获取