资讯动态

水稻叶片病害识别数据集构建与YOLOv8训练全流程

发布时间:2026/9/11 2:53:40 来源:尧图企业网站定制
简介面向目标检测与深度学习入门及进阶学习者这份水稻叶片病害识别数据集覆盖三种常见水稻病害褐斑病、稻瘟病、细菌性枯萎病共含1448张图片。图片与txt标签已按训练集、验证集和测试集划分同时提供xml标签和记录类别信息的yaml配置文件可直接接入YOLOv5至YOLOv10等YOLO系列算法进行训练与验证。压缩包内共2000个文件其中1448个txt标签、551个xml标签、1个yaml配置整体仅40.83MB文件与图片按编号一一对应目录结构清晰便于快速查找和二次处理。目前已有543人学习浏览适合用于病害检测模型效果对比、数据增强实验、课程设计或毕业设计。拿到后即可省去自行标注和格式转换的时间按指定配置完成数据加载与模型训练xml标签也可兼容VOC格式检测框架方便在YOLO与Faster R-CNN等不同算法间迁移使用。1. 水稻叶片病害识别数据集卡住目标检测的是标注粒度水稻叶片病害识别数据集的质量直接决定目标检测模型在田间的表现上限。我接过一个农科院项目几百张田间叶片照片标注也做了YOLOv8 训练三周mAP50 卡在 0.6 上不去。问题不在模型架构在数据集——稻瘟病的梭形病斑只有几十个像素白叶枯病却蔓延半片叶子标注粒度不统一检测器根本学不到稳定特征。这篇把图像采集、标注格式转换、YOLOv8 训练到评估的完整链路讲清楚适合做农业 CV 落地以及需要自建小目标检测数据集的工程师。2. 目标检测数据集的组织方式从田间图像到 YOLO 格式的转换水稻叶片病害数据集的质量首先取决于检测目标怎么定义。同一个病害病斑级标注和叶片级标注训练出来的模型行为完全不同这一步定错了后面所有工作都在错误的地基上堆叠。2.1 先定义检测目标病斑级还是叶片级水稻叶片病害的常见类型有稻瘟病、白叶枯病、纹枯病和褐斑病四种形态差异极大。稻瘟病在叶片上形成典型的梭形病斑中央灰白、边缘褐色单斑长度在 1~3 cm白叶枯病沿叶缘或叶脉形成枯白条斑往往连片蔓延纹枯病呈云纹状大斑块边界模糊褐斑病则是直径 1~3 mm 的小圆点在高清照片里也只有几十个像素。四种病害在同一张图里尺度跨度超过两个数量级标注前必须统一约定粒度。我一般的做法是离散病斑按病斑级标注连片病斑按感染区域级标注。具体对应关系如下表病害病灶形态推荐标注粒度备注稻瘟病梭形/纺锤形中央灰白病斑级离散病斑一个完整病斑一个框褐斑病胡麻叶斑病1~3 mm 小圆点病斑级小目标必须保证原图分辨率足够白叶枯病叶缘条状枯白连片蔓延感染区域级强行拆小框会让框数爆炸纹枯病云纹状大斑块边界模糊感染区域级框允许向外扩 2~3 像素病斑级意味着每个病斑单独一个框适合稻瘟病和褐斑病这类离散病灶感染区域级意味着一个连续的发病区一个框不拆分、不把健康组织包进框里。这两类规则写进标注规范后还要在每个标注任务开始前用两三张样例图做对齐标注员对「粘连病斑算一个还是两个」「遮挡超过多少不标」的理解如果不一致后期返工成本极高。2.2 图像采集与初筛分辨率、光照和去重采集环节决定数据集的天花板。病斑识别依赖纹理细节叶片在画面里的宽度建议不低于 1500 像素否则病斑在缩放到 640 之后就只剩几个像素目标检测算法再强也回天乏术。拍摄时间选阴天或上午 9 点前散射光下病斑边缘最清晰正午直射光会在叶面形成镜面反射病斑中央的灰白区域容易过曝成一片死白。初筛用两个硬指标清晰度和曝光。模糊检测用拉普拉斯方差import cv2 def is_blurred(path: str, threshold: float 80.0) - bool: gray cv2.imread(path, cv2.IMREAD_GRAYSCALE) if gray is None: return True variance cv2.Laplacian(gray, cv2.CV_64F).var() return variance threshold拉普拉斯算子提取图像二阶梯度方差越小说明边缘越弱、图像越模糊。阈值 80 是经验值3000×4000 的叶片特写通常落在 200 以上低于 80 的基本是对焦失败或运动模糊直接剔除。曝光问题看灰度直方图叶片区域集中在 0~30 或 230~255 的高光/暗部占比超过三成就要重新调整拍摄参数而不是靠后期拉曲线。同一个田块拍摄时记得做相邻帧去重连拍模式下两张几乎相同的图都会进入数据集会让验证集虚高。2.3 标注工具与标签体系标注工具的选择直接影响效率。LabelImg 是传统方案支持 VOC XML 和 YOLO 格式导出类别少、上手快但新版 LabelImg 在 YOLO 格式切换上有不少坑容易误存成 PASCAL。我更推荐 X-AnyLabeling 这类带 SAM 辅助分割的标注器先框一个大概区域再用分割模型微调边缘对纹枯病这种边界模糊的斑块能明显省时间。标注规范要同时约定两件事框的贴合度和漏标标准。病斑框贴紧外缘允许 2~3 像素余量两个病斑粘连时边界可辨就分别标框不可辨就合并为一个框被遮挡面积超过 50% 的病斑不标标进去只会产生噪声标签。标注完成后导出一份类别统计如果某一类只有几十个框趁采集窗口还没关赶紧补拍比事后靠增强硬凑靠谱得多。2.4 目录结构与 VOC 转 YOLO 脚本YOLOv8 的数据集目录约定是 images 和 labels 两个根目录各自再分 train/val标签文件与图像同名、扩展名为 .txt。目录结构如下rice_disease/ ├── images/ │ ├── train/ # 1200 张 │ └── val/ # 300 张 ├── labels/ │ ├── train/ # 与 images/train 同名 .txt │ └── val/ └── data.yaml如果标注阶段导出的是 VOC XML需要转成 YOLO 的归一化中心点格式。转换脚本的关键逻辑import xml.etree.ElementTree as ET CLASSES [blast, bacterial_blight, sheath_blight, brown_spot] def voc_to_yolo(xml_path: str, out_path: str) - None: root ET.parse(xml_path).getroot() w int(root.findtext(size/width)) h int(root.findtext(size/height)) lines [] for obj in root.iter(object): name obj.findtext(name) if name not in CLASSES: continue b obj.find(bndbox) x1, y1 float(b.findtext(xmin)), float(b.findtext(ymin)) x2, y2 float(b.findtext(xmax)), float(b.findtext(ymax)) xc, yc (x1 x2) / 2 / w, (y1 y2) / 2 / h bw, bh (x2 - x1) / w, (y2 - y1) / h lines.append(f{CLASSES.index(name)} {xc:.6f} {yc:.6f} {bw:.6f} {bh:.6f}) open(out_path, w).write(\n.join(lines))YOLO 格式每行是「类别 id、中心点 x、中心点 y、框宽、框高」全部归一化到 [0,1]。注意两点类别 id 必须从 0 开始连续编号data.yaml 里的 names 顺序要和这里的 CLASSES 完全一致浮点保留 6 位足够保留更多位只会让文件变大对训练结果没有影响。data.yaml 同时指定路径和类别名path: /data/rice_disease train: images/train val: images/val names: 0: blast 1: bacterial_blight 2: sheath_blight 3: brown_spot提示不要在生产数据集里混用病斑级和区域级标注。混用会让目标尺度分布出现两个极值小目标召回率和整体 mAP 同时受损。3. 用 YOLOv8 在自建水稻叶片病害数据集上完成训练闭环数据集组织好之后训练环节反而相对标准化。YOLOv8 是目前做自定义目标检测最省事的一条路径从训练到导出一条命令走完但参数怎么给、训练时盯哪些指标仍然有不少讲究。3.1 环境安装与标签预检环境只需要 ultralytics 一个包Python 3.9 以上即可pip install ultralytics装完后先别急着训练。标签预检是 yolo 目标检测流程里最容易被跳过的环节常见问题有两种类别 id 越界、坐标超出图像范围。下面的脚本可以快速扫一遍 labels 目录from pathlib import Path for split in [labels/train, labels/val]: for txt in sorted(Path(split).glob(*.txt)): for line in txt.read_text().strip().splitlines(): parts list(map(float, line.split())) if parts[0] 0 or parts[0] 4: print(类别越界:, txt, line) if parts[1] 0 or parts[1] 1 or parts[3] 0: print(坐标异常:, txt, line)这段脚本把每行拆成五个浮点数先检查第一个数是类别 id 是否落在 [0,4) 区间再检查中心点 x 和框宽 w 是否越界、宽度是否为负。坐标越界多数是 VOC 转 YOLO 时除错了宽高比如用了缩放后的尺寸去归一化原始坐标类别越界则是 CLASSES 列表顺序和标注工具里的显式 id 不一致。3.2 data.yaml 与训练命令预检通过后直接用命令行训练yolo detect train \ modelyolov8s.pt \ datadata.yaml \ epochs200 \ imgsz640 \ batch16 \ device0 \ patience30 \ lr00.005 \ cos_lrTrue \ projectruns/ricemodel 指定 COCO 预训练权重yolov8s 是速度和精度的平衡点数据量只有一两千张时用默认的 yolov8n 也可以但病斑属于纹理细节s 级的特征图深度更够用。imgsz 用 640 起步如果褐斑病这类小目标召回率上不去再提到 896 或 960代价是显存占用和训练时间大约翻倍。关键参数的选择理由和常见误区整理成下表参数推荐值理由常见误区imgsz640最小病斑约 30 像素640 输入下仍保留结构直接上 1280显存爆炸且收益很小batch16迁移学习下 16 足够稳定 BN 统计量数据量小时开 64泛化反而变差patience3030 轮无改善即早停省一半时间设成 100过拟合后还在空跑lr00.005微调阶段比默认 0.01 更稳学习率给太低又配大 epoch收敛过慢cos_lrTrue余弦退火让后期学习率平滑下降和线性衰减混用曲线抖动batch 越小BN 的统计量越不稳定batch 太大则权重更新次数减少小数据集上容易把训练集背下来。lr0 的取值和冻结策略相关如果用了冻结层lr0 可以放心给到 0.01因为浅层参数不参与更新。3.3 迁移学习与冻结策略COCO 预训练权重里包含大量通用边缘和纹理特征水稻叶片病斑虽然不在 COCO 类别里但低层卷积对边缘、颜色的响应可以直接复用。常见做法是冻结前 10 层让浅层保持通用特征提取能力只更新深层yolo detect train ... freeze10冻结前 10 层后显存占用下降约两成训练速度也更快但有一个前提训练集和 COCO 图像的真实分布不能差太远。如果数据里有大量合成图或者拍摄环境是实验室白背景而没有田间纹理冻结反而会锁住不适用的特征此时应改为 freeze0 全量微调。判断依据很简单训练 20 个 epoch 后看 val mAP50冻结方案如果落后全量微调超过 3 个点就放开冻结重新跑。3.4 训练监控盯哪几个指标训练会在 project 目录下生成 results.png 和 confusion_matrix.png。我一般盯四个指标train/val 的 box_loss 曲线、mAP50、mAP50-95、precision 和 recall 的交叉点。val box_loss 连续 10 个 epoch 不降说明学习率过低或模型容量不够train loss 降而 val loss 升是过拟合信号优先加数据增强而不是加深模型。混淆矩阵重点看两类错误易混类之间的互相误检以及背景被预测成病斑的假阳率。如果背景误检集中在叶片边缘和叶脉位置多半是标注时把健康叶脉区域框了进去需要回查标注而不是调后处理阈值掩盖问题。4. 数据增强与样本不均衡处理让水稻叶片病害模型扛住田间光照模型下田之后的失败方式一大半在部署前就能从数据集上预判。田间光照变化、类别样本悬殊、同源图泄漏这三个问题在训练阶段处理掉比部署后补丁式修复划算得多。4.1 针对病斑尺度设计的增强参数水稻叶片病害数据集的增强核心是模拟田间光照变化和拍摄角度差异而不是无脑堆强度。YOLOv8 的增强参数可以直接在命令行覆盖yolo detect train ... \ degrees30 \ translate0.1 \ scale0.5 \ fliplr0.5 \ hsv_h0.02 \ hsv_s0.7 \ hsv_v0.5 \ mosaic1.0 \ close_mosaic10逐个解释degrees30 表示最大旋转 30 度叶片在田间姿态随机这个范围够用且不会产生过多无效背景translate0.1 允许图像平移 10%模拟病斑不在画面中心的情况scale0.5 是缩放尺度配合 Mosaic 能制造出不同拍摄距离的样本对褐斑病这种小目标尤其重要。HSV 三个参数分别扰动色相、饱和度和明度——色相扰动要控制在小范围因为病斑颜色是区分稻瘟病和健康叶的关键线索饱和度和明度可以放宽模拟阴天、背光和高光环境。close_mosaic10 是容易被忽略的参数它让最后 10 个 epoch 关闭 Mosaic 增强。Mosaic 把四张图拼在一起病斑会被裁剪、拼接边缘会产生伪框最后阶段关闭它能让模型在接近真实分布的图像上微调val 的 mAP 通常能再涨 1~2 个点。注意不要开过于激进的翻转组合。水平翻转 fliplr0.5 没问题垂直翻转 flipud 在 YOLOv8 里默认关闭因为叶片上下方向在田间有固定语义叶尖朝上强行翻转会引入错误先验。4.2 类别不均衡少样本病害的三种补法田间采集的数据天然不均衡纹枯病在高温高湿的田块里可能占了一半的框白叶枯病只在特定生育期出现往往不足 5%。先用统计脚本看清楚分布from collections import Counter from pathlib import Path counts Counter() for txt in Path(labels/train).glob(*.txt): for line in txt.read_text().splitlines(): counts[int(line.split()[0])] 1 print(counts)输出类似Counter({2: 3210, 0: 450, 1: 120, 3: 86})时就要处理了。三种办法按优先级用方法适用场景风险图像级重采样少样本类图像数量不足复制过量会过拟合copy-paste 增强病斑可分离、背景较单调拼接痕迹被模型当特征加权采样器数据已完整、不想改文件需要自定义 DataLoader 逻辑第一图像级重采样最直接把白叶枯病、褐斑病的图像复制 5~10 份放进训练集只复制图像不改标签。第二copy-paste 增强从少样本图像里抠出病斑区域随机粘贴到健康叶片上但必须保证粘贴区域的光照方向和原图一致否则模型会学到「病斑周围有拼接痕迹」这种伪特征部署时一遇到真实病斑反而不识别。第三加权采样器让每个 batch 里少样本类别的出现概率不低于 10%实现成本稍高但不动原始文件。这三种方法可以叠加但每加一种都要用 val mAP 验证。常见误区是先把少样本复制 30 份再叠加增强结果验证集里少样本类过拟合val 数字好看换一块田就崩。4.3 按田块划分数据集防止同源泄漏划分训练/验证集时最常见的错误是随机划分。同一个田块、同一个拍摄批次采的图像光照、土壤背景、叶片品种高度一致随机划分会让验证集里出现大量「训练集同源」的图mAP50 虚高 5~10 个点下田部署时立刻打回原形。正确的做法是按采集批次或田块分组划分from sklearn.model_selection import GroupShuffleSplit image_ids [...] # 所有图像文件名 groups [img_id.split(_)[0] for img_id in image_ids] # 批次前缀如 田块A_20240912_001.jpg gss GroupShuffleSplit(n_splits1, test_size0.2, random_state42) train_idx, val_idx next(gss.split(image_ids, groupsgroups))GroupShuffleSplit 保证同一个 group 的所有图像要么全在训练集、要么全在验证集不会出现同源泄漏。group 的粒度建议取「田块日期」因为同一天不同田块的光照不同同一田块不同日期的病害形态可能已经变化粒度太粗会把时间信息也泄漏进验证集。group 字段用文件名前缀最省事前提是采集时就约定命名规范田块_日期_序号.jpg这类命名会让后续所有数据集管理操作都轻松不少。5. 用四组快查项验收水稻叶片病害数据集的标注质量训练推到部署前先别急着调置信度阈值。把数据集的标注质量过一遍四组检查能省下大量试错时间。第一查类别分布与框数量。每个类别至少要有 300 个框低于这个数的类别要么补采、要么裁剪放大类别间框数量差距超过 10 倍按上一章的重采样处理。第二查空标签和坏标注from pathlib import Path empty, bad, sizes [], [], [] for txt in Path(labels/train).glob(*.txt): lines [ln for ln in txt.read_text().strip().splitlines() if ln] if not lines: empty.append(txt.name) continue for ln in lines: c, x, y, w, h map(float, ln.split()) if not (0 x 1 and 0 y 1 and 0 w 1 and 0 h 1): bad.append(f{txt.name}: {ln}) sizes.append(w * h) print(空标签:, empty, 坏坐标:, bad, 框数:, len(sizes))第三查目标尺度分布。框面积占比w×h是评估小目标占比的直接依据面积占比小于 1% 的框如果超过总数的 30%说明 imgsz 640 下病斑太小要么提高输入分辨率要么把大图切块后再训练。第四查混淆矩阵里的易混类稻瘟病和褐斑病形态接近如果互相误判超过 10%逐张翻标注通常会发现一批边界框松紧不一致的样本。快查项通过标准不通过时的处理类别框数每类 ≥ 300补采或图像级重采样空标签/坏坐标0 个删除图像或修正标注小目标占比面积比 1% 的框 ≤ 30%提高 imgsz 或切图易混类误判混淆矩阵误判 10%回查边界框一致性把这四组检查固化成make check目标输入是 labels 目录输出是空标签、坏坐标、尺度分布和类别统计四份报告每次新增数据后先跑make check再触发训练标注问题会在进入训练前被拦下来。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价