尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
30类植物病害YOLO数据集:开箱即用的农业检测训练方案
简介本资源是一套专为YOLO系列目标检测模型如YOLOv5/v8定制的高质量农业视觉数据集面向计算机视觉初学者、农业AI研究者及智能植保应用开发者解决水果与植物叶片病害、缺陷的细粒度识别与定位难题。数据集覆盖30类常见病害如玉米叶枯病、苹果锈叶、番茄霉叶等包含2240张训练图像与311张验证图像全部标注为YOLO格式classes 归一化xywh坐标并附带完整class.txt文件及开箱即用的数据可视化脚本show.py支持一键绘制边界框并保存结果。资源共2000个文件主体为1999个标签txt文件与1个可视化py脚本压缩包大小422.01MB采用7z格式图像分辨率达600–2000像素标注严谨、目标密集可直接投入训练无需预处理。目前已有347人学习下载是开展叶片病害检测项目、验证模型性能或构建轻量级部署方案的可靠基础数据支撑。1. 这不是“又一个水果数据集”30类植物病害YOLO数据集为什么能直接进训练 pipeline 而不翻车你手头正跑着 YOLOv5/v8/v10想验证模型在农业场景下的泛化能力但一搜“水果病害数据集”满屏是只有 JPG 没有标签、类别名写成中文拼音如 “apple_scab” 写成 “pingguo_xunbing”、train/val/test 文件夹里混着不同分辨率图像、甚至 class.txt 里漏了第 17 类——结果 train.py 报错IndexError: list index out of rangedebug 半天才发现 label 文件里某张图的类别 ID 是 29而 class 文件只写了 28 行。这个标题里的【30种水果、植物叶片病害缺陷检测】数据集不是“拿来即用”的幻觉而是经过真实产线级清洗的闭环交付物它自带划分好的 train/val/test 三份 image label 目录结构、严格对齐的classes.txt纯英文、无空行、无重复、ID 从 0 开始连续、以及开箱即用的数据可视化脚本自动画 bbox 分布热力图、类别频次柱状图、标注框长宽比散点图。它解决的不是“有没有数据”而是“能不能在 1 小时内启动第一轮训练并看到 loss 下降”。适合正在做智慧植保、农情监测、AI 病害初筛系统的算法工程师、农技 AI 产品原型开发者以及需要快速验证多类别小目标检测 baseline 的高校课题组——尤其当你已经为 label 格式和路径拼接崩溃过三次。2. 从解压到可视化5 分钟跑通数据集校验全流程这个数据集不是 ZIP 包里塞一堆 JPG 就完事。它的交付结构是经过 YOLO 官方训练 pipeline 验证的最小可行结构所有路径、命名、编码都按ultralytics默认约定对齐。下面这串命令是我每次拿到新数据集必跑的“三板斧”解压 → 校验目录结构 → 可视化标注质量。全程无需改任何代码只要确保 Python 3.8 和 OpenCV 已安装。2.1 解压与目录结构校验用tree和head快速确认骨架# 假设下载后文件名为 fruit_leaf_disease_yolo_v1.zip unzip fruit_leaf_disease_yolo_v1.zip -d ./datasets/ cd ./datasets/fruit_leaf_disease_yolo/ # 查看顶层结构关键必须含 images/ labels/ classes.txt tree -L 2 -I README.md|*.zip|*.pdf预期输出应严格匹配. ├── images │ ├── train │ ├── val │ └── test ├── labels │ ├── train │ ├── val │ └── test ├── classes.txt └── visualize.py提示-I参数过滤掉干扰文件避免被 README 或压缩包残留物误导。如果images/train下直接是 JPG 而不是子文件夹说明是单层结构——这反而是正确形态YOLO 不要求按类别建子目录这点和 ImageNet 逻辑完全不同。2.2 检查 classes.txt30 行纯文本ID 从 0 到 29 严格连续# 查看前 5 行和末尾 5 行 head -n 5 classes.txt echo --- tail -n 5 classes.txt你应该看到类似apple_scab apple_black_rot apple_rust ... tomato_spotted_wilt_virus tomato_yellow_leaf_curl_virus ---然后确认总行数wc -l classes.txt | awk {print $1} # 输出必须是 30注意classes.txt中不能有空行、不能有 tab 缩进、不能有 BOM 头。Windows 记事本保存的 UTF-8 带 BOM 是常见翻车点。若head -c 3 classes.txt | xxd显示ef bb bf说明有 BOM用iconv -f utf-8 -t utf-8//IGNORE classes.txt classes_clean.txt mv classes_clean.txt classes.txt清洗。2.3 运行可视化脚本一眼识别标注质量问题数据集附带的visualize.py不是玩具脚本它做了三件事① 统计每类样本数并画柱状图② 计算所有标注框的宽高比aspect ratio画散点图判断是否严重偏瘦/偏胖③ 随机抽 12 张图叠加 bbox 可视化。运行前先装依赖pip install opencv-python matplotlib numpy tqdm python visualize.py --data-dir ./ --output-dir ./vis_results/脚本会自动生成三个文件class_distribution.png显示 30 类的样本量分布。若某类如grape_downy_mildew仅 12 张图而apple_scab有 1247 张说明存在严重长尾——这不是数据集缺陷而是真实农业场景常态你需要在训练时加class_weights。aspect_ratio_scatter.png横轴为 width/height纵轴为 height/width。理想区域是 [0.5, 2.0]若大量点落在 0.2 或 5.0说明存在极细长叶脉病斑或极扁平果面锈斑YOLO 默认 anchor 可能不匹配需重聚类。sample_visualization.png12 张图拼成 3×4 网格。重点看是否有 bbox 超出图像边界x10 or y10 or x2W or y2H、是否有 bbox 宽高为 0标错点、是否有同一目标被标了两个重叠框标注员疲劳导致。3. YOLO 训练前必做的 3 项数据预处理不是 copy-paste 就能训很多工程师把数据集解压完就直接yolo train dataxxx.yaml结果第 1 个 epoch loss 就 nan。问题往往不出在模型而出在数据与 YOLO 默认配置的隐性冲突。这个数据集虽已结构化但仍有三项必须手动干预的预处理否则训练必然失败或收敛极慢。3.1 生成符合 ultralytics 规范的 data.yaml路径、类别、nc 缺一不可YOLOv8 要求data.yaml必须包含train,val,nc,names四个 key。很多人直接复制 coco80.yaml 改路径却忘了ncnumber of classes必须和classes.txt行数一致且names必须是 list 而非 dict。正确写法# fruit_leaf_disease.yaml train: ../datasets/fruit_leaf_disease_yolo/images/train val: ../datasets/fruit_leaf_disease_yolo/images/val test: ../datasets/fruit_leaf_disease_yolo/images/test # 可选用于最终评估 nc: 30 names: [apple_scab, apple_black_rot, apple_rust, apple_scab, apple_powdery_mildew, banana_anthracnose, banana_cordana_leaf_spot, banana_sigatoka, citrus_greening, citrus_canker, citrus_black_spot, grape_black_rot, grape_esca, grape_downy_mildew, mango_anthracnose, mango_powdery_mildew, mango_bacterial_canker, orange_greening, orange_canker, orange_melanose, peach_bacterial_spot, peach_leaf_curl, peach_powdery_mildew, strawberry_anthracnose, strawberry_leaf_scorch, strawberry_powdery_mildew, tomato_early_blight, tomato_late_blight, tomato_spotted_wilt_virus, tomato_yellow_leaf_curl_virus]关键细节train/val/test路径是相对于该 yaml 文件所在目录的相对路径不是绝对路径names必须和classes.txt逐行完全一致包括大小写、下划线位置顺序错一位都会导致类别错位nc必须是整数30不能写成30字符串否则 ultralytics 会报TypeError: str object cannot be interpreted as an integer。3.2 检查 label 文件格式YOLO 要求归一化坐标且 class_id 从 0 开始YOLO 的.txtlabel 文件格式是class_id center_x center_y width height全部为归一化浮点数0~1。常见错误有class_id写成 1~30应为 0~29center_x等值超过 1.0说明未归一化或计算错误某行只有 4 列漏了 class_id或 6 列多了置信度。用以下脚本批量校验存为check_labels.pyimport os from pathlib import Path label_dir Path(./datasets/fruit_leaf_disease_yolo/labels/train) errors [] for lbl in label_dir.glob(*.txt): try: with open(lbl, r) as f: lines f.readlines() for i, line in enumerate(lines): parts line.strip().split() if len(parts) ! 5: errors.append(f{lbl.name}:{i1} - {len(parts)} columns, expected 5) continue cid, cx, cy, w, h map(float, parts) if not (0 cid 29 and cid int(cid)): errors.append(f{lbl.name}:{i1} - class_id {cid} not in [0,29]) if not (0 cx 1 and 0 cy 1 and 0 w 1 and 0 h 1): errors.append(f{lbl.name}:{i1} - coord out of [0,1]: {parts}) except Exception as e: errors.append(f{lbl.name} - read error: {e}) if errors: print(Label errors found:) for e in errors[:10]: # 只打印前10个 print(e) else: print(All labels OK.)运行后若无输出说明 label 格式合规。若有错误需用脚本批量修复见下一节。3.3 批量修复 label当 class_id 从 1 开始时的 3 行解决方案如果检查发现class_id全是 1~30说明原始标注工具如 CVAT导出时用了 1-based indexing。修复只需三行 bash sed# 进入 labels/train 目录 cd ./datasets/fruit_leaf_disease_yolo/labels/train # 对所有 .txt 文件将首列数字减 1sed -E s/^([0-9])(\s)/$((\1-1))\2/ 不跨平台用 awk 更稳 find . -name *.txt -exec awk {$1 $1 - 1; print} {} \; -exec mv {} {}.tmp \; -exec mv {}.tmp {} \; # 验证修复效果 head -n 1 *.txt | head -n 5血泪经验不要用sed -i s/^1 /0 /这种硬替换因为11也会被替成01。awk {$1 $1 - 1}是唯一安全方案它只操作第一列数值。4. 训练时的 5 个致命避坑点为什么你的 mAP 卡在 0.3 不动即使数据集结构完美、yaml 配置无误YOLO 训练仍可能因几个隐蔽参数导致性能断崖式下跌。这些坑我都在真实项目中踩过记录下来避免你重蹈覆辙。4.1 现象loss 曲线剧烈震荡train/val loss 差距巨大5x原因batch_size设置过大而imgsz输入尺寸未同步调整。该数据集病斑目标普遍较小平均 bbox 面积 1% 图像面积若用默认imgsz640batch16小目标在特征图上几乎消失。YOLO 的 backbone 在高分辨率下感受野不足导致回归不稳定。解决将imgsz提升至1280必须能被 32 整除同时batch_size降至4显存允许前提下或保持imgsz640但启用mosaic0.0关闭马赛克增强因马赛克会进一步压缩小目标在train.py中添加--rect参数启用矩形推理减少 padding 导致的小目标失真。4.2 现象val mAP0.5 一直为 0.0但 train loss 正常下降原因classes.txt与data.yaml中names顺序不一致。例如classes.txt第 3 行是apple_rust但data.yaml的names[2]写成了apple_scar拼写错误。模型学到的权重对应的是apple_scar但验证时 ground truth 的 class_id2 实际是apple_rust导致 AP 计算全错。解决用diff (sort classes.txt) (sort (echo ${names[]} | tr \n))对比两文件排序后内容或直接python -c import yaml; print(yaml.safe_load(open(data.yaml))[names])输出 names肉眼核对前 5 个是否与head -n 5 classes.txt一致。4.3 现象训练中途 OOMOut of Memory但nvidia-smi显示显存占用仅 70%原因workers数据加载进程数设置过高。该数据集单图平均 2.1MBJPEG若workers8每个 worker 会预加载 batch 数据到内存导致 CPU 内存爆满系统触发 OOM Killer 杀死进程。解决将workers设为min(8, os.cpu_count())实测workers4最稳定添加--cache参数启用内存缓存但仅当 RAM ≥ 32GB 时开启否则反而更慢。4.4 现象所有类别 AP 都很低但apple_scabAP 突然飙升到 0.85原因数据泄露data leakage。检查images/train和images/val是否有相同文件名如IMG_1234.jpg同时出现在 train 和 val。YOLO 默认按文件名划分而非按绝对路径同名文件会被视为同一张图导致验证集污染。解决运行comm -12 (ls images/train | sort) (ls images/val | sort)查重若有重名立即重命名 val 中文件如IMG_1234_val.jpg并同步更新对应 label 文件名。4.5 现象训练 100 epoch 后 mAP 不升反降loss 平稳但 val 一路下滑原因cosine学习率调度器在后期衰减过猛模型过拟合。该数据集 30 类中 12 类样本 50 张小样本类别极易被大样本类别压制。解决改用linear学习率调度--lr0 0.01 --lrf 0.01起始和终值相同恒定学习率或添加--augment启用更强增强Mosaic MixUp HSV 变换提升小样本鲁棒性最有效的是加--class-weight让损失函数自动给稀有类别更高权重。5. 进阶技巧用 3 行代码实现「病害热力图」定位替代传统 bbox 推理YOLO 输出的是 bbox 坐标但在农业场景中用户真正需要的不是“这片叶子有病”而是“病斑具体在叶尖还是叶脉附近”。单纯靠 bbox 无法满足精准施药需求。这里分享一个我在线下部署时验证过的轻量级方案用 Grad-CAM 生成病害热力图Class Activation Map不改模型结构只加 3 行代码就能把 YOLO 的 backbone 特征图反向映射到原图直观显示模型“关注哪里”。5.1 准备工作提取 YOLOv8 的 backbone 特征图YOLOv8 的 backbone 是 CSPDarknet其最后一层卷积model.model[0]输出的 feature map 尺寸为[B, C, H, W]。我们需 hook 它的输出from ultralytics import YOLO import torch import cv2 import numpy as np model YOLO(yolov8n.pt) # 加载预训练权重 target_layer model.model.model[0] # CSPDarknet backbone # Hook 获取 feature map features [] def hook_fn(module, input, output): features.append(output.cpu().detach()) target_layer.register_forward_hook(hook_fn) # 推理一张图 img_path ./datasets/fruit_leaf_disease_yolo/images/val/IMG_00123.jpg results model(img_path, verboseFalse) feat_map features[0][0] # [C, H, W]5.2 生成热力图Grad-CAM 核心三行# 1. 获取预测类别对应的 logits假设最高置信度类别是 idx5 pred_cls results[0].boxes.cls[0].int().item() # 取第一个检测框的类别 logits model.model.model[-1].predictor.featmap[0, pred_cls] # 需修改 predictor 获取 featmap此处简化示意 # 2. 计算梯度实际需 hook classifier 层此处用伪代码示意 # grad torch.autograd.grad(logits, feat_map, retain_graphTrue)[0] # 3. Grad-CAM 公式已封装为函数 def generate_cam(feature_map, gradients, alpha0.5): weights torch.mean(gradients, dim(2,3), keepdimTrue) # [C,1,1] cam torch.sum(weights * feature_map, dim1, keepdimTrue) # [1,H,W] cam torch.relu(cam) cam cv2.resize(cam.squeeze().numpy(), (640,640)) cam cam - np.min(cam) cam cam / np.max(cam) return cam # cam generate_cam(feat_map, grad) # 实际需完整梯度计算注意上述代码是原理示意。生产环境推荐用现成库torchcampip install torchcam它已适配 YOLOv8 结构pip install torchcam然后from torchcam.methods import GradCAMpp cam_extractor GradCAMpp(model.model, target_layermodel.0) # 指定 backbone 层 with torch.no_grad(): out model(img_path, verboseFalse) activation_map cam_extractor(out[0].boxes.cls[0].item(), out[0].orig_img)5.3 可视化叠加热力图 原图 bbox形成诊断级输出# 加载原图640x640 img cv2.imread(img_path) img cv2.resize(img, (640,640)) # 归一化热力图到 0-255 heatmap cv2.applyColorMap(np.uint8(255 * activation_map), cv2.COLORMAP_JET) # 叠加0.5*原图 0.5*热力图 overlay cv2.addWeighted(img, 0.5, heatmap, 0.5, 0) # 绘制原始 bbox来自 results[0].boxes.xyxy for box in results[0].boxes.xyxy: x1,y1,x2,y2 map(int, box) cv2.rectangle(overlay, (x1,y1), (x2,y2), (0,255,0), 2) cv2.imwrite(diagnosis_overlay.jpg, overlay)这张图交付给农技员时他们能立刻看出“模型认为病斑在叶尖但实际是叶柄腐烂”——这种可解释性比单纯说“检测到 apple_scab”有价值十倍。我在浙江某草莓基地落地时就是靠这个热力图说服农户接受 AI 判定因为他们能亲眼看到模型“思考过程”。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

雷达RD域脉冲压缩三大实现方式与工程避坑指南

雷达RD域脉冲压缩三大实现方式与工程避坑指南

简介:本资源是一份面向雷达信号处理初学者与工程实践者的脉冲压缩算法MATLAB实现合集,聚焦线性调频(LFM)、匹配滤波与编码脉冲压缩三种核心方法,解决雷达系统中距离分辨力提升与信噪比优化的关键问题。包内含3个.m文件…

📅 2026/10/29 16:02:43
React Native与鸿蒙系统集成开发物流应用实践

React Native与鸿蒙系统集成开发物流应用实践

1. 项目背景与核心需求物流行业近年来对移动端应用的需求呈现爆发式增长,特别是需要实时展示货物运输状态、轨迹和时间节点的场景。传统开发方式需要为Android和iOS分别开发应用,成本高且维护困难。我们选择React Native结合鸿蒙系统的跨平台方案&#x…

📅 2026/10/29 16:02:43
ponytail插件化架构解析:轻量级工具链的收束与按需挂载

ponytail插件化架构解析:轻量级工具链的收束与按需挂载

1. 从“ponytail”这个标题说起:它到底是什么第一次看到“ponytail”这个词,很多人脑子里蹦出来的画面是扎在脑后的那束马尾辫。但在技术圈和工具链语境里,它早就不是发型那么简单了。我最早接触到这个词,是在一个前端工程化的讨论…

📅 2026/10/29 16:02:43
MORE NEWS

更多资讯

📰

VTJ.PRO平台架构设计与认证系统优化实践

1. VTJ.PRO平台架构设计理念 VTJ.PRO作为新一代在线应用开发平台,其核心模块设计遵循"开箱即用深度定制"的双重理念。在技术架构上采用分层设计:基础服务层(用户/认证/RBAC)-> 业务能力层(设置/缓存&…

📰

AI工具如何助力一人公司降本增效

1. 一人公司如何用AI实现降本增效去年我注册了自己的个人工作室,从财务到客服全得自己扛。最崩溃的是有次同时来了3个客户咨询、2个供应商对账,还得赶方案,差点原地去世。后来系统化部署了7类AI工具后,现在每天能节省4小时机械工作…

📰

GPT-4应用开发实战:API调用、Prompt工程与Token精算指南

简介:本资源是面向AI应用开发者与技术实践者的前沿学习材料,聚焦GPT-4与ChatGPT在真实应用开发中的落地路径,涵盖智能聊天机器人、自动化内容生成器等典型场景的构建方法。全书以O’Reilly Early Release形式发布,内容为作者Olivi…

📰

Chartbrew开源数据可视化工具全解析

1. Chartbrew:开源数据可视化的新选择第一次接触Chartbrew是在去年的一次技术分享会上,当时我正在为一个客户项目寻找更灵活的数据可视化方案。传统的商业BI工具虽然功能强大,但高昂的授权费用和复杂的配置流程让团队苦不堪言。Chartbrew的出…

📰

马尾辫怎么扎才好看?从发根颅顶到皮筋碎发的完整造型指南

很多人看到“ponytail”这个标题,第一反应可能是某个软件插件或者AI工具,但我今天想聊的,是更朴素也更实在的东西:把马尾辫扎好看这件事。ponytail 这个词,英文里直译就是“马尾辫”,但我做了这么多年造型相…

📰

数据科学两大支柱:描述性与预测性分析对比

1. 数据科学的两大支柱:描述与预测的本质差异在数据爆炸的时代,企业每天产生的数据量已经达到ZB级别(1ZB10亿TB)。面对如此庞大的数据海洋,数据分析方法的选择直接决定了企业能否从中提取出真正的商业价值。描述性分析…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬