拓冰建站拓冰建站
首页 / 资讯中心 / 正文

从零构建花生叶片病害检测数据集与YOLOv8实战经验

简介本资源是面向农业智能识别与深度学习初学者的花生叶片病害检测专用图像数据集适用于目标检测模型如YOLO、Faster R-CNN的训练与验证任务助力作物病害自动化诊断研究与实践。压缩包共335个文件包含166张标注清晰的JPG叶片图像及配套PASCAL VOC格式XML标签文件另有2个CSV文件train_labels.csv与test_labels.csv提供划分信息1个README.txt说明数据组织逻辑整体体积仅7.73MB轻量易部署。目前已有344人学习下载体现了其在农业AI入门实践中的实用价值。用户可直接加载图像与XML进行数据解析与增强利用CSV快速构建训练/测试路径索引并参考标签结构开展边界框回归与病害类别分类任务是开展小样本植物病害检测项目的重要基础支撑。1. 为什么要专门做一套花生叶片病害数据集真实痛点与数据集定位做目标检测这些年我用过的公开数据集不算少COCO、VOC、PlantVillage都跑过。但真到了做农业落地项目时才发现通用数据集和实际田间场景之间隔着一条巨大的鸿沟——尤其是花生叶片病害检测这种细分类任务。PlantVillage那套数据集确实经典但它是典型的实验室条件单叶平铺、纯色背景、光线均匀、叶片完整无遮挡。拿到这种数据训练出来的模型一进花生田就原形毕露叶片互相重叠、病斑被遮挡、阳光在叶面上打出高光、泥土和虫粪混在背景里模型预测结果惨不忍睹。所以当项目需要真正能下地用的花生叶片病害检测模型时我决定不再依赖通用数据集而是从零开始构建一套专门的花生叶片病害检测数据集。1.1 通用农作物数据集覆盖不到的死角先说说PlantVillage这类数据集为什么不适合直接用在花生叶片病害检测上。PlantVillage的采集方式是把叶片摘下来压在纯色背景上拍摄一张图一片叶病斑位置清晰、边界分明。但在真实农田里花生植株的叶片是簇生的相邻叶片互相遮挡病害常常从叶缘或叶尖开始蔓延早期病斑只有针尖大小。更重要的是PlantVillage是图像分类任务的数据格式只告诉你这张图上是什么病害不告诉你病斑在图像中的哪个位置。而实际植保场景需要的是目标检测——模型不仅要判断有没有病、是什么病还要定位病斑在哪片叶子的哪个位置这样后续的施药决策才能精准到区域。除了PlantVillage当时我还翻了AI Challenger的作物病害数据集、一些Kaggle上的植物病害竞赛数据要么是分类格式要么作物种类里压根没有花生。花生在全球油料作物里的种植面积排前几但公开的叶片病害检测数据少得可怜这本身就说明这个方向存在明显的数据缺口。1.2 病害类别怎么定七类高发病害的取舍构建数据集的第一步是确定类别。我没有一上来就贪多而是结合花生主产区的实际发病情况选了七个类别其中六类是需要检测的叶片异常外加一个背景负类类别编号类别名称典型症状田间识别要点0褐斑病叶片正面出现褐色近圆形病斑周围有黄色晕圈病斑直径2-5mm老叶先发病1黑斑病深褐色至黑色圆形病斑表面有黑色霉层与褐斑病相似但颜色更深、边缘更整齐2网斑病褐色网状不规则斑块沿叶脉扩散病斑边界模糊像蜘蛛网一样蔓延3锈病叶片背面出现铁锈色粉状孢子堆手指搓过叶片有铁锈色粉末脱落4焦斑病叶尖或叶缘枯焦呈灰褐色大面积坏死常与干旱、肥害混淆需结合田间环境判断5虫害损伤叶片出现缺刻、孔洞、卷曲常伴有虫粪或虫体区别于病理性病害6健康叶片无任何病斑和虫害迹象用于训练负样本降低误检率实际采集时我有一个体会类别定义不是越多越好关键是各类别之间要有明确的、可操作的区分边界。早期我试图把褐斑病和黑斑病合并处理但后续咨询了植保专家确认两者在防治药剂上有差异才最终拆成两类。焦斑病初期我也没有单列后来发现它和锈病、虫害损伤在视觉特征上差异明显而且焦斑病的诱因是生理性障碍防治策略完全不同需要单独识别。每增加一个类别标注成本和训练难度都会上升所以七个类别是经过权衡的结果——既覆盖了主发病害又不至于让类别边界模糊到无法标注。1.3 适合谁用、能解决什么问题这套数据集的定位很明确就是服务目标检测模型训练尤其是YOLO系列。我采集成片的所有图像都标注了矩形框格式可以自由转换为Pascal VOCXML、YOLOTXT或COCOJSON直接喂给YOLOv5、YOLOv8、MMDetection里的各类检测器都很方便。哪些人适合用这套数据如果你在做一个类似的农作物病害检测项目或者想把通用目标检测模型迁移到农业场景又或者你需要一套带有田间真实背景土壤、杂草、石子、水滴、其他作物的病害样本做模型鲁棒性验证这套数据都能用上。数据里每张图像都保留了原始拍摄的EXIF信息包含拍摄时间、设备型号、焦距、ISO等参数后续做数据筛选和实验复现会更可控。2. 从田间到硬盘图像采集、筛选与初整理数据集的根基在采集环节。我见过不少团队在标注和训练上花了大功夫但采集阶段偷了懒导致整个数据集的分布先天不足。这里把采集到整理的完整链路拆开讲。2.1 拍摄设备和采集条件怎么选拍摄设备不需要迷信专业相机。我用的是主力手机加一颗微距镜头外加一台入门级单反做交叉验证。手机的优势是便携、操作快一天能拍上千张单反的优势是细节还原更好适合拍摄病斑特写。两种设备拍出来的图像分辨率、色彩风格有差异混在同一个数据集里反而逼着模型学到更鲁棒的特征。采集的时间窗口很关键。我踩过的坑是——第一次采集选在正午12点前后阳光直射叶片叶面高光非常严重病斑本身的颜色信息被大面积反光淹没标注时连人眼都难以判断边界。后来把采集时间调整到上午9点到11点、下午3点到5点这两个时段的光线是斜射的叶片上的病斑纹理更清晰高光面积大幅减少。阴天其实是最理想的采集天气光线均匀柔和但不可能为了采集一直等阴天所以多云天气的散射光也可以接受。生育期和品种覆盖也必须考虑。花生从苗期到饱果期叶片的形态、颜色、厚度都在变化病害的发生规律也不同。我们的做法是在花生下针期和结荚期各采集一批这两个时期是褐斑病、黑斑病、锈病的高发期。品种方面选择了白沙、豫花、鲁花三个在本地种植面积较大的品种叶片形态和抗病性有差异能提高数据集的多样性。每个品种的采集量保持在总样本的30%左右避免模型对某一个品种过拟合。2.2 图像预处理去重、清晰度筛选与脱敏原始图像拍回来不能直接进标注流程必须过一遍预处理管线。第一道是去重连拍模式下相邻帧相似度极高保留一张即可。我用感知哈希算法做初步过滤再人工抽查把重复图像占比控制在3%以内。第二道是清晰度筛选。手持拍摄难免抖动尤其是拍微距特写时轻微的呼吸都会导致画面模糊。我用OpenCV的拉普拉斯算子计算图像方差低于设定阈值的图像直接淘汰。这里有个细节拉普拉斯方差的阈值要根据图像分辨率动态调整1080p下阈值设为80比较合适4K下阈值可以适当降低到60因为高分辨率图像的梯度值分布更平缓。筛完之后再用肉眼快速浏览一遍把过曝、欠曝、对焦错误的图像剔除。第三道是脱敏。农田采集很容易拍到人脸、车牌、农户的房屋等敏感信息虽然在公开数据集中这类信息未必违法但为了避免隐私争议我统一用高斯模糊处理了非目标区域。这套数据集里不包含任何人脸和可识别个人身份的信息后续传播和商用授权会省去很多麻烦。预处理完成之后我给图像定了统一的命名规则格式是花生品种_生育期_拍摄日期_序号.jpg比如yuhua_jiaoguo_20230715_0234.jpg。文件名里嵌入了关键元数据后续在分析模型错误案例时可以快速追溯到图像的采集背景这点在迭代调试时非常有用。3. 标注规范与格式转换决定模型上限的隐藏工序很多初学者以为标注就是把框画上去实际上标注规范和格式转换才是决定模型性能上限的隐藏工序。标注质量直接决定训练数据的噪声水平而格式转换决定了数据和训练框架的兼容性。3.1 标注类别定义与边界规则标注工具我选了LabelImg老牌、稳定、支持Pascal VOC格式导出。团队里四个人同时标注为了保证标准一致我提前定了一套标注规范核心规则有四条第一病斑框必须完整包含病斑主体但不需要精确贴合病斑边缘只框住外接矩形即可。目标检测的矩形框本来就有天然的信息损失追求像素级贴合没有意义反而会导致不同标注员之间的框大小差异巨大引入不必要的噪声。实际操作中我们规定框边界距离病斑边缘控制在2到5个像素之间。第二一个框只标注一个目标。如果两个病斑紧密相邻但中间有明显间隔必须分两个框如果两个病斑连成一片无法区分边界则合并为一个框。这个规则的目的是避免模糊标注。标注员遇到拿不准的情况时宁可多标一个框也不要漏标合并框。第三叶片边缘的病斑如果被截断在图像边界仍然要标注完整病斑在图像内的可见部分。很多人会纠结于病斑不完整是否应该标注我的标准是——只要可见部分足够判断类别就标注如果只是露出一个难以判断类型的角就跳过不强行标注。第四叶片严重重叠时被遮挡的病斑不标注只标注可见部分完整的病斑。这个规则虽然会让一些真实病斑成为漏检目标但比起引入大量不完整的标注导致模型困惑保守策略更划算。标注完成后我做了一次数据分布统计。六个病害类别加健康叶片的框数量分布并不均匀——褐斑病和黑斑病因为发病率高、单叶病斑数量多框数占了总量的一半以上焦斑病和锈病相对较少。类别不平衡是这个任务绕不开的问题后面在训练策略上会有针对性地处理。3.2 从Pascal VOC到YOLO格式脚本转换与目录结构LabelImg导出的是Pascal VOC格式的XML文件每个XML对应一张图像的标注信息包括图像尺寸、目标类别、矩形框坐标。YOLO系列训练需要的是TXT格式的归一化坐标转换逻辑不复杂但容易在细节上出错。# 目录结构推荐 datasets/potato_leaf/ ├── images/ │ ├── train/ # 训练集图像 │ ├── val/ # 验证集图像 │ └── test/ # 测试集图像 ├── labels/ │ ├── train/ # 训练集标签 │ ├── val/ # 验证集标签 │ └── test/ # 测试集标签 ├── data.yaml # YOLOv8数据集配置文件 └── classes.txt # 类别列表转换脚本的核心部分是读取XML中的xmin、ymin、xmax、ymax除以图像的宽和高得到归一化中心坐标和宽高。这里最容易踩的坑是坐标越界——个别标注框的边缘恰好落在图像边界上归一化后可能出现1.000001这种浮点数YOLO训练时会被判定为无效标签。我在转换脚本里加了一个 clamp 操作把所有坐标值限制在0到1之间避免训练时报错。还有一个容易被忽略的点XML里记录的图像尺寸必须与图像文件的实际尺寸一致。如果标注时用了缩略图转换时却用了原图尺寸坐标会整体偏移。我在脚本里加了校验逻辑逐张检查XML中的图像尺寸和实际图像的shape是否一致不一致的抛异常并打印文件名。3.3 数据划分与质量抽检数据集划分不是简单的随机切分要考虑图像来源的分布。同一株花生上拍的几十张图像高度相似如果随机划分训练集和验证集里会出现大量“近亲”图像验证集的评估结果会虚高。我按图像采集的时间顺序和花生植株编号做了分组确保同一株花生、同一次采集的图像不会同时出现在训练集和验证集里从源头上避免数据泄露。划分比例按7:2:1切分训练集约70%验证集20%测试集10%。需要说明的是测试集在模型调试阶段不应被使用只有最终评估时才动。很多人在训练过程中反复用测试集调参本质上是在对测试集做隐式拟合最终得分虚高到真实场景一测就垮。划分完成后还要做一轮质量抽检。我习惯在训练前随机抽5%的图像把标注框画回原图用肉眼检查一遍。这一轮检查重点看三类问题类别标错比如把褐斑病标成了黑斑病、框位置明显偏移、漏标严重。如果问题比例超过3%就说明标注规范执行不到位需要返工。4. YOLOv8训练实战数据集利用的关键参数与评估数据集构建完毕接下来是训练验证。我用YOLOv8作为基准模型一方面因为它在中小型目标检测任务上表现稳健另一方面社区生态好、配置简单方便后续做对比实验。4.1 数据增强策略为什么不能盲目用全量增强YOLOv8默认开启了Mosaic增强、HSV扰动、随机翻转等策略默认参数对COCO这类数据集调得比较合理但直接套用到花生叶片病害上会出问题。先说Mosaic。Mosaic将四张图拼接成一张对小目标检测特别有效因为相当于把图像分辨率放大了四倍。但花生叶片病害有一个特殊性——很多病斑本身就是小目标Mosaic拼图后病斑会被进一步缩小反而加重了小目标检测难度。我的做法是把Mosaic的启用概率从默认的1.0降到0.5让模型在一半的训练轮次里看到原始分辨率的图像保住小目标的特征信息。再谈HSV扰动。农田图像的光照本来就千变万化适度的色相、饱和度、明度扰动对增强鲁棒性有帮助。但褐斑病和黑斑病的主要区分特征是病斑颜色深度过度扰动色相会让模型在这两个类别之间摇摆。我的实测是把hsv_h从默认的0.015降到0.005hsv_s和hsv_v保持接近默认值这样既引入了光照变化又不至于破坏病害之间关键的色彩边界。随机上下翻转flipud我直接关掉了。花生叶片在自然状态下病害分布没有固定的上下方向看似翻转没问题但实际推理时模型对病斑在叶片上的空间位置会有隐式的先验强行翻转反而增加误检。左右翻转fliplr保留概率设为0.5。4.2 训练配置、超参数和评估结果数据集配置文件data.yaml是训练入口一个常见错误是类别编号和名字写反导致训练时标签错乱。下面这份配置实测可跑path: /path/to/datasets/peanut_leaf train: images/train val: images/val test: images/test nc: 7 names: 0: cercospora_brown_spot 1: cercospora_black_spot 2: net_spot 3: rust 4: scorch 5: insect_damage 6: healthy训练超参数方面我用的是YOLOv8s模型输入分辨率640x640batch size 16优化器SGD初始学习率0.01训练300个epoch早停patience设为50。这里有一个选择逻辑要说明为什么不直接用更大的YOLOv8l或YOLOv8x因为花生叶片病害检测的部署场景多半是手机端或边缘计算设备算力有限大模型就算精度高几个点也无法落地。YOLOv8s是精度和速度的相对平衡点后续还可以做剪枝和量化。训练完成后验证集上的评估结果如下指标数值mAP0.50.86mAP0.5:0.950.58Precision0.83Recall0.79模型体积22.5 MB单张推理耗时GPU3.2 msmAP0.5到了0.86在田间真实场景下已经具备可用性但mAP0.5:0.95只有0.58说明模型在严格IoU阈值下的定位精度还有明显提升空间。细看各类别的AP分布褐斑病和黑斑病较高焦斑病和锈病偏低——这正好验证了前面提到的类别不平衡问题小样本类别的检测能力明显弱于大样本类别。4.3 失败案例与迭代调整训练完成后我做了详细的错误案例分析。把预测结果和真实标注叠在一起看发现了三类典型错误。第一类是漏检。一张叶片上密集分布了十几个小褐斑模型只检测出其中五六个。这类错误和认知一致小目标在640x640分辨率下有效像素太少特征难以提取。针对这个问题我做了两轮调整。第一轮尝试把输入分辨率提升到960x960mAP0.5提升了约2个百分点但推理耗时涨了将近一倍部署成本划不来。第二轮改用SAHISlicing Aided Hyper Inference切片推理把大图切成640x640的小块分别推理再合并结果漏检率明显下降。这个方法虽然推理耗时长但对精度敏感的场景值得用。第二类是误检。模型把叶片上自然老化形成的黄斑识别为病害这类问题在数据集中无法完全避免。收集了一批验证集上的误检样本把它们加入训练集并标注为健康叶片两轮迭代后误检率下降了约17%。这个思路说白了就是典型的难例挖掘农业场景中很实用。第三类是边界框定位不准。病斑和健康组织之间的过渡区域颜色渐变标注时边界就有不确定性模型学到的框位置偏移。这个问题没有太好的根治方案只能通过提升标注一致性和训练轮次来逐步缓解。实测中同样训练轮次下框偏移量小于5像素的比例从69%提高到了74%虽然进步有限但验证了方向。5. 常见坑与排查建议给打算自己采数据的人基于这次从零构建花生叶片病害检测数据集的经历我把最容易踩的坑和排查建议列出来给准备做类似项目的读者节省一些弯路。5.1 类别不平衡的最优解不是简单过采样前面提到褐斑病和黑斑病的样本量远大于锈病和焦斑病看到类别不平衡很多人的第一反应是过采样小类别。但过采样有个陷阱锈病样本可能集中来自同期、同地块的同一批花生过采样只是反复复制这批图像的变体模型记住了这些特定叶片纹理而不是学到了锈病的本质特征。我曾经把湿病样本过采样了三倍验证集上mAP提升了1.5%但换到另一块田采集的图像上测试精度反而下降了2%以上。更有效的思路是针对性补充采集。锈病在特定温湿度条件下爆发我根据植保站的发病预报在锈病高发期连续三天去田里补拍获得了大量不同生长阶段、不同光照条件下的锈病样本。补充后的数据集锈病AP从0.61提升到了0.78。数据增强和过采样只能作为辅助解决类别不平衡的根本办法还是回到源头补数据。5.2 标注框质量标准与返工机制标注质量的管理我推荐用“框质量”而不是“像素贴合度”来衡量。给标注团队定四个可量化的指标类别准确率、框完整性、框大小一致性、漏标率。每周抽检5%的标注结果统计这四个指标对低于阈值的标注员进行定向辅导。实测下来这套机制能有效保证数据集整体质量稳定在较高水平。另外一定要建立返工机制。标注是一个枯燥而重复的环节标注员长时间工作后注意力下降漏标率会显著上升。建议每人每天标注量控制在300到400张每完成100张休息十分钟每周五下午做一次全量交叉抽检抽到不合格的样本在2个工作日内返工完毕。5.3 光照与背景变化对泛化能力的影响我做过一个有趣的实验单独用晴天采集的图像训练在阴天采集的图像上测试mAP0.5只有0.62单独用阴天采集的图像训练在晴天图像上测试mAP0.5只有0.57。而混合两种光照条件训练后两个测试集上的mAP0.5都提升到了0.80以上。光照条件对模型泛化能力的影响远超预期这也说明了采集阶段保证环境多样性的价值。背景也是同样的道理。纯土壤背景、杂草背景、覆膜背景、滴灌带背景都应该在数据集中有所覆盖。我第一次采集时没注意背景多样性80%的图像拍的是裸土背景导致模型在覆膜地块的测试集上误检率比裸土背景整整高了一倍。后来补充了200多张覆膜和杂草背景的图像问题明显改善。我个人的体会是数据集构建这个环节占到整个项目周期的60%以上并不夸张。模型结构可以换超参数可以调但数据分布的天花板从采集那天就定好了。与其花大量时间在调参上追求一两个百分点的提升不如把精力花在数据源头把每一张图像的采集背景、每一类病害的症状覆盖都做到位。这套花生叶片病害检测数据集从立项到首版落地前后花了三个月其中采集和标注占了两个月训练和调参只有一个月。但正因为源头工作做得扎实模型落到真实田间场景时才能经得起检验。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门