资讯动态

YOLO11cls实战:农作物病虫害分类数据集从解压到模型评估

发布时间:2026/10/5 2:49:31 来源:尧图企业网站定制
简介面向农作物病虫害检测与图像分类开发者这份资源完整汇总了1000张真实农田场景下的高质量农作物叶片图像覆盖腰果、木薯、玉米、番茄四大类作物的22种常见病虫害与健康状态类别包括腰果炭疽病、木薯细菌性枯萎病、玉米草地贪夜蛾、番茄叶霉病等。所有图片按类别分文件夹整理目录结构清晰无需额外转换即可直接用于YOLO11cls等图像分类模型的训练与验证。资源包为单个PDF文件5.63MB内含数据集基本情况介绍、类别说明及百度网盘下载方式便于快速获取完整数据。同时附赠YOLO11cls一键训练脚本和博主训练结果日志可帮助初学者快速搭建训练流程并参考调参效果。目前已有63人学习适合需要实际项目数据支撑或补充通用分类数据集场景的算法工程师与学生。1. 拿到农作物病虫害分类数据集先看清这 1000 张图能干什么做检测项目时最烦的不是模型调参而是数据标注。农作物病虫害这个方向尤其明显叶片上的病斑、虫害、缺素症状长得像标注错一张训练出来的模型就会把炭疽病当成健康叶。这份农作物病虫害分类数据集正好解决这个痛点1000 张真实场景图按类别文件夹整理好腰果、木薯、玉米、番茄四种作物的 22 个类别直接可用配套 YOLO11cls 一键训练脚本不用自己写数据加载逻辑解压就能开训。对正在做农业视觉项目、或者想给通用分类任务补点真实场景数据的工程师来说这份资源最大的价值不是图多而是类别覆盖了常见经济作物的高发病害且标注形式是「文件夹即标签」和 YOLO 分类任务的 ImageFolder 格式完美对齐。下文我把数据集的类别构成、目录结构、训练脚本的参数含义和几个容易翻车的细节拆开讲。2. 数据集的真实构成22 个类别、文件夹标注与适用边界2.1 类别分布四种作物覆盖的真实现场病害进入训练前必须先搞清楚数据里有什么。这份数据集包含 Cashew腰果、Cassava木薯、Maize玉米、Tomato番茄四类作物每个作物下分健康类别和具体病害类别共 22 类。腰果部分有 Cashew anthracnose炭疽病、Cashew gumosis流胶病、Cashew healthy健康、Cashew leaf miner潜叶蝇、Cashew red rust红锈病木薯部分有 Cassava bacterial blight细菌性疫病、Cassava brown spot褐斑病、Cassava green mite绿螨、Cassava healthy健康、Cassava mosaic花叶病玉米部分有 Maize fall armyworm草地贪夜蛾、Maize grasshoper蝗虫、Maize healthy健康、Maize leaf beetle叶甲、Maize leaf blight叶枯病、Maize leaf spot叶斑病、Maize streak virus条纹病毒番茄部分有 Tomato healthy健康、Tomato leaf blight叶枯病、Tomato leaf curl卷叶病、Tomato septoria leaf spot斑枯病、Tomato verticulium wilt黄萎病。从类别设计可以看出它并不是把所有病害混在一起做一个多标签任务而是按「作物-病害」拆成独立类别。这种做法的好处是直接对应生产场景里的实际诉求农户拍照上传系统判断是哪种作物的哪种病。坏处是类别间存在相似性较高的组合比如玉米叶斑病和玉米叶枯病在视觉上差异可能很小训练时如果图片质量参差模型容易混淆这两类。我在做数据检查时一般会先按类别统计图片数量确认是否有类别严重缺失或样本数极不平衡的情况。2.2 目录结构文件夹区分类别意味着什么标注说明里写得很清楚采用文件夹来区分不同的目标类别。翻译成工程语言就是标准的 ImageFolder 结构YOLO 分类模式直接读取就能用。解压后目录结构大致是这样的dataset/ ├── train/ │ ├── Cashew anthracnose/ │ │ ├── img_001.jpg │ │ └── ... │ ├── Cashew gumosis/ │ ├── Cashew healthy/ │ ├── ... │ └── Tomato verticulium wilt/ └── val/ ├── Cashew anthracnose/ └── ...train 和 val 目录下每个子文件夹名就是类别名文件夹内的图片就是该类别的样本。YOLO 的 cls 任务在训练时会自动扫描子文件夹名生成类别映射不需要额外写标签文件这点比目标检测的 txt 标注省事很多。注意类别名里带空格比如 Cashew anthracnose脚本会自动处理但如果后续要转成其他框架格式最好先做一次类别名清洗把空格替换成下划线避免某些工具在解析路径时把空格当作分隔符。2.3 适用场景与边界检测项目和通用分类补充怎么选摘要里提到两个用途农作物病虫害检测项目以及作为通用分类数据集场景数据的补充。第一个用途很直接——如果你做的是检测任务可以先用这个分类数据集跑通流程验证算法有效性再用检测标注数据微调第二个用途是给通用视觉模型做领域自适应比如你本来用 ImageNet 预训练想让模型对农业场景更敏感可以把这份数据作为 fine-tune 的一部分。但要清楚边界1000 张图对 22 个类别来说平均每类约 45 张属于小样本范畴直接训练大规模模型容易过拟合更合理的做法是用预训练权重初始化在这份数据上微调。另外真实场景图意味着拍摄角度、光照、背景复杂度变化大模型在单一环境下可能表现不错跨地块泛化就需要更多数据兜底。3. YOLO11cls 一键训练脚本从解压到跑通的关键配置3.1 脚本定位封装了哪些步骤这份资源附赠的 YOLO11cls 一键训练脚本核心价值在于把「数据集路径解析 → 模型初始化 → 训练超参设置 → 日志输出」这几步封装成一个文件。习惯用 ultralytics 库的工程师应该能猜到脚本内部大概率是调用了 YOLO11n-cls.pt 或类似预训练权重然后执行 model.train()。我拿到这类脚本后第一件事不是直接跑而是先看三个地方数据集路径怎么传、类别数是否自动识别、训练轮数和批次大小写没写死。一个常见的一键训练脚本框架如下from ultralytics import YOLO def main(): model YOLO(yolo11n-cls.pt) model.train( data./dataset, epochs100, imgsz224, batch32, lr00.01, device0, project./runs, namecrop_disease_cls ) if __name__ __main__: main()这段代码的逻辑是加载 YOLO11 分类预训练模型指定数据集根目录为 ./dataset训练 100 轮输入图片尺寸 224批次大小 32初始学习率 0.01在 0 号 GPU 上训练结果输出到 ./runs 目录下的 crop_disease_cls 文件夹。这里有几个参数直接影响训练效果epochs 如果数据量小且已经用了预训练权重100 轮通常足够imgsz 对分类任务来说 224 是基线如果原始图片分辨率高且病害特征细小可以提到 320但显存占用会上升batch 大小要结合显存调整显存吃紧时就降到 16。3.2 数据路径与类别映射最容易踩的坑脚本里的 data 参数传的是数据集根目录YOLO 分类模式要求根目录下必须有 train 和 val 两个子目录且每个子目录下按类别分文件夹。如果直接把下载的压缩包解压后路径带中文或空格Linux 下影响不大Windows 下要小心。运行脚本后注意观察控制台输出的类别映射表YOLO 会自动按文件夹名字母顺序分配类别 ID比如 Cashew anthracnose 是 0Cashew gumosis 是 1如果你自己的标签顺序和你预期的不同后续做混淆矩阵分析时记得按这个映射关系对齐。脚本参数里还有一个常被忽略的点pretrained参数。YOLO11cls 默认会用 ImageNet 预训练权重做迁移学习这在小数据集上几乎是必须的。如果脚本里写的是pretrainedFalse从零开始训练 1000 张图效果大概率很不理想。我一般会确认权重文件存在不存在时会自动下载但有些内网环境需要手动把 .pt 文件放到指定目录省得脚本卡在下载那一步。3.3 训练结果日志参考博主日志看哪些指标资源里提到附赠博主训练结果日志供参考。日志里最有价值的不是最终准确率而是训练过程中的 loss 曲线和验证集 top1 准确率变化。分类任务的核心观察点是训练损失是否持续下降、验证损失是否在某个 epoch 后开始回升过拟合信号、top1 准确率是否达到平台期。如果日志里显示验证准确率在 90% 以上说明在这 1000 张图上模型已经学到了有效特征。但注意这是针对该数据集的参考值不代表在你自己的测试集上也能复现因为测试集来源和拍摄条件可能完全不同。4. 数据准备与训练流程从文件夹到模型产物的完整操作4.1 数据检查先看再训别让脏数据浪费算力拿到数据集后我强制自己做一遍三件事类别数量核对、图片可解码性检查、分辨率分布统计。类别数量核对很简单遍历 train 目录下子文件夹数量是否等于预期类别数可解码性检查是用 OpenCV 或 PIL 逐张读取图片如果某张图损坏会导致训练中断分辨率分布统计是为了判断是否需要统一缩放如果图片尺寸差异过大YOLO 的 imgsz 参数会自动 resize但严重拉伸会损失信息。from PIL import Image import os data_root ./dataset/train for cls_name in os.listdir(data_root): cls_path os.path.join(data_root, cls_name) if not os.path.isdir(cls_path): continue img_files os.listdir(cls_path) print(f{cls_name}: {len(img_files)} images) for img_name in img_files[:5]: img Image.open(os.path.join(cls_path, img_name)) print(f {img_name}: {img.size})这段脚本遍历每个类别文件夹输出图片数量和前五张的尺寸用于快速判断有没有类别文件夹为空、图片损坏或尺寸异常。PIL 的Image.open在读取损坏图片时会抛异常可以直接暴露问题文件。实际使用中建议把遍历范围放大到全量图片虽然耗时多一些但能避免训练中途报错。4.2 训练执行命令行参数与常见配置组合确认数据没问题后执行训练。假设脚本文件名为 train_cls.py命令行运行方式python train_cls.py --data ./dataset --epochs 150 --batch 32 --imgsz 224 --device 0如果脚本里没有预留命令行参数接口直接修改脚本里的 main 函数即可。训练启动后ultralytics 会输出每个 epoch 的 loss 和准确率同时生成 confusion_matrix.png 和 results.csv 到 runs 目录。这里我习惯把 batch 设成 16 而不是 32因为真实场景图片含复杂背景大 batch 会让 BN 层的统计量估计更平滑但如果不同类别间的图片风格差异大小 batch 反而更能保持梯度多样性。根据经验1000 张图 150 轮在单卡 3090 上大约 10 到 15 分钟如果跑得异常快或异常慢要检查是不是数据读取瓶颈。4.3 产物验证不只是看准确率要看混淆矩阵训练结束后验证集上的准确率只是一个汇总指标真正有用的是混淆矩阵。YOLO 分类训练会输出混淆矩阵图重点关注哪些类别互相混淆。农作物病害场景里玉米叶斑病和玉米叶枯病、番茄叶枯病和番茄斑枯病这类视觉相似的组合是混淆高发区。如果发现某个类别的召回率明显低可能是该类图片数量太少或者图片本身拍摄角度导致特征不明显。此时可以在训练脚本里给该类加权或者收集更多该类别的图片补充数据。5. 常见问题排查训练分类模型时最容易翻车的五个点5.1 数据集路径错误报错找不到 train 目录现象是训练脚本启动后立即报Dataset not found或类似路径错误。原因通常是 data 参数指向的路径不对或者数据集没有按照 train/val 两层结构摆放。解决方法是先在命令行里用ls检查路径层级确认 dataset 根目录下直接是 train 和 val 文件夹而不是再套一层外层目录。另外如果数据集是从压缩包解压的要注意解压后是否产生了嵌套文件夹比如 dataset/dataset/train 这种。5.2 图片损坏导致训练中断现象是训练跑到某个 epoch 突然抛Image file is truncated或解码失败。原因是数据集里个别图片文件本身损坏或者下载过程中文件不完整。解决方法是训练前跑一遍图片完整性检查脚本把损坏图片直接剔除或替换。我一般会做一次全量扫描把无法解码的图片移到一个单独的 broken 目录里既不污染数据集也能后续补样本。5.3 类别名带空格导致后续工具解析异常现象是训练本身没问题但导出模型或转 ONNX 时类别名里的空格导致标签文件解析出错或者部署时类别名字符串被截断。原因是文件夹名带空格虽然 YOLO 能处理但其他框架不一定兼容。解决方法是进入数据集目录把类别名中的空格批量替换成下划线for d in */; do mv $d ${d// /_} done在 Linux 下执行这段命令可以把所有子文件夹名中的空格替换成下划线。注意如果数据集已经训练过替换后需要重新生成类别映射原来的训练记录作废。5.4 训练 loss 下降缓慢或直接不收敛现象是跑了十几轮 loss 几乎没有变化准确率停留在随机水平。原因可能有两个方面一是初始学习率设置不合理二是预训练权重加载失败。解决方法是先确认日志里是否输出了using pretrained weights类似的信息如果没有检查 .pt 文件是否存在学习率方面可以把 lr0 从 0.01 调低到 0.001或者加一个 warmup 阶段。分类任务在预训练权重的基础上微调学习率过高会导致特征被破坏。5.5 验证准确率还行但实际场景检测效果差现象是训练日志显示验证集 top1 准确率 95%但到了实地拍摄的图片上表现大跌。原因是验证集和训练集来自同一分布可能存在相似的光照、背景或拍摄设备模型的泛化能力被高估。解决方法是把一份独立的测试图片单独留出这份图片最好是不同地块、不同时间拍摄的。如果手头没有这样的数据退而求其次是做五折交叉验证观察各个折的准确率波动波动大说明模型不稳定。做农业分类项目这个坑躲不开验证集准确率只是个安慰指标。6. 用 sklearn 做模型评估识别病害分类的短板类别拿到训练产物后推荐做一次独立的评估而不只是依赖训练日志。单独写一个评估脚本加载训练好的 best.pt对验证集做推理再用 scikit-learn 输出 classification_report可以精准定位每个类别的 precision、recall、f1-score。from ultralytics import YOLO from sklearn.metrics import classification_report import os model YOLO(./runs/crop_disease_cls/weights/best.pt) val_root ./dataset/val y_true [] y_pred [] class_names sorted(os.listdir(val_root)) for cls_name in class_names: cls_dir os.path.join(val_root, cls_name) for img_name in os.listdir(cls_dir): img_path os.path.join(cls_dir, img_name) results model.predict(img_path) pred results[0].probs.top1 y_true.append(class_names.index(cls_name)) y_pred.append(pred) print(classification_report(y_true, y_pred, target_namesclass_names))这段代码的作用是加载最优权重遍历验证集所有图片做预测然后生成每个类别的 precision、recall 和 f1-score。model.predict(img_path)返回的probs.top1是预测类别索引与 class_names 的排序对应。建议特别注意几个易混类别的 recall如果某个病害类的 recall 低于其他类说明模型容易把它预测成别的东西。真遇到这种情况不要盲目加训练轮数先去看混淆矩阵具体和哪个类混淆再去针对性补数据或做类别加权。从那以后我每次拿分类数据集先强制走一遍数据完整性检查、类别映射核对、评估脚本输出这三步再做任何训练调整。这份 22 类数据集的坑基本都在数据层面脚本封装得省事但数据质量把关还得自己来。希望帮到你。本文还有配套的精品资源点击获取

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

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

免费获取报价 →
↑