
简介面向水稻叶病虫害图像分类项目这份资源提供真实场景下的高质量叶片图片数据及配套训练示例。数据集包含细菌性叶枯病、褐斑病、健康叶片、叶瘟病、叶鞘腐病、窄褐斑病、穗颈瘟、稻飞虱、纹枯病、钨黄病毒病共10个类别约5000张图片已按分类文件夹整理完毕标注质量高无需额外转换即可直接用于YOLOCLS等图像分类算法训练也可作为通用分类数据集场景数据的补充。资源包整体为1个PDF文档压缩包大小仅2.46MB文档内附数据集基本情况、类别缩略图预览及百度网盘完整数据获取方式。截至目前已有114人学习浏览。除数据集说明外资源还附赠YOLO11cls一键训练脚本和博主训练结果日志可快速复现完整训练流程文件夹结构清晰便于自行划分训练集与验证集适合算法学习者、毕业设计以及农业视觉项目的实际落地参考。1. 从 5000 张水稻叶图到可下线的分类模型水稻叶病虫害分类这类任务数据质量比模型结构更决定最终精度而这个数据集最值钱的地方恰好就在最后一级目录上——文件夹即标签。整套资源把最琐碎的整理环节替你做完了再配上附带的 YOLO11cls 一键训练脚本从拿到图片到产出混淆矩阵路径被压缩到一条命令的长度。类别覆盖了细菌性叶枯病、褐斑病、叶瘟病、稻飞虱、钨黄病毒病等 10 个真实田间场景类别适合正在做农业视觉项目、需要快速跑通分类基线的开发者也适合想把 ImageFolder 式数据组织方式彻底弄明白的人。对经验多一些的从业者来说真正值得钻的其实是 YOLO11cls 的隐式标签生成逻辑、训练日志判读和易混类别的后处理而不是图像本身。2. 数据集组织方式与 YOLO11cls 的隐式标签机制2.1 十类真实病害真正的难点在类间相似这个数据集包含了 10 个类别bacterial_leaf_blight细菌性叶枯病、brown_spot褐斑病、healthy健康叶片、leaf_blast叶瘟病、leaf_scald叶鞘腐病、narrow_brown_spot窄褐斑病、neck_blast穗颈瘟、rice_hispa稻飞虱、sheath_blight纹枯病、tungro钨黄病毒病。一眼扫过去三对类别容易混brown_spot 与 narrow_brown_spot 的区别主要在病斑直径和密度leaf_blast 与 neck_blast 是稻瘟病在叶片和穗颈两个部位的不同表现leaf_scald 与 sheath_blight 都呈现不规则云纹状斑块。这些类间相似性决定了 5000 张图这个量级下模型必须依赖细粒度纹理特征而不是整体形状所以数据增强策略和输入分辨率会比想象中更影响结果。真正适合这个数据集的用途是两类水稻病虫害分类项目本身的落地以及作为通用分类数据集在农业场景方向的补充。健康叶片的加入意义在于让分类器具备拒识基础否则模型会把所有叶片都强行归为某种病这在田间部署时很致命。2.2 文件夹结构如何变成 YOLO11cls 的标签YOLO11cls 用的是 ImageFolder 式目录约定整个数据集根目录下必须分成 train 和 val 两个子集每个子集内部按类别各建一个文件夹文件夹名就是类别名。这套资源已经按这个结构整理好了拿到后直接指向 data 参数即可。rice_disease_dataset/ ├── train/ │ ├── bacterial_leaf_blight/ │ ├── brown_spot/ │ ├── healthy/ │ ├── leaf_blast/ │ ├── leaf_scald/ │ ├── narrow_brown_spot/ │ ├── neck_blast/ │ ├── rice_hispa/ │ ├── sheath_blight/ │ └── tungro/ └── val/ ├── bacterial_leaf_blight/ ├── brown_spot/ ├── healthy/ ├── leaf_blast/ ├── leaf_scald/ ├── narrow_brown_spot/ ├── neck_blast/ ├── rice_hispa/ ├── sheath_blight/ └── tungro/这里有一个关键机制容易被忽略YOLO11cls 不像检测任务那样读取data.yaml里的names列表也不生成独立的classes.txt而是在数据加载阶段扫描子目录名按首次出现的顺序隐式生成标签映射。默认情况下这个顺序相当于按文件夹名字典序排列bacterial_leaf_blight 是第 0 类brown_spot 是第 1 类依此类推。也就是说标签的数值含义完全由目录结构决定这既是它省事的地方也是隐患所在。如果后续手动增删了某个类别文件夹之前训练出来的模型权重对应的类别顺序就会整体错位部署时必须重新生成映射关系。提示换机器跑这套数据时务必确认 train 和 val 下的子文件夹名称一一对应名称不一致会导致标签错位训练时不会报错但精度曲线会非常难看。2.3 组装数据目录时容易被忽略的细节首先是类别均衡问题。真实采集的叶片数据往往某些类别天然多、某些类别少如果原样丢给训练脚本模型会对样本量大的类别过拟合小类别准确率被压得很低。常见的做法是统计每个类别的图片数量对少于 300 张的类别做轻度增强复制旋转 90 度、水平翻转、亮度抖动对明显偏多的类别做随机采样削减。其次是同源图片泄露同一个叶片的不同角度拍摄如果同时落在 train 和 val验证精度会虚高训练日志看起来很好下到田间就露馅。稳妥的办法是拍摄时按叶片个体归档划分数据集时按叶片个体而不是按图片随机切分。这套数据集如果已经按场景拍摄批次归档完了切分时优先保证同一个批次不跨集合。最后是文件名规范YOLO11cls 对中文路径和空格支持并不稳定建议统一改成class_序号.jpg的结构避免 Windows 和 Linux 两套环境下路径解析行为不一致。3. YOLO11cls 分类头原理与一键训练脚本拆解3.1 分类头到底改了什么YOLO11cls 的算法主体沿用了 YOLO11 的 CSPDarknet 骨干架构但与检测版本不同的是分类版本的 Neck 和 Head 被替换成了一个全局池化加全连接层的轻量分类头。输入图像经过骨干网络提取多层次特征后C3k2 模块输出的特征图会被压到 1x1 空间尺寸再送入全连接层映射到类别数。损失函数用的是交叉熵训练指标默认同时记录 top1 accuracy 和 top5 accuracy。这个设计意味着两件事第一骨干网络的质量直接决定分类精度YOLO11s、YOLO11m、YOLO11l 三档之间的差异在细粒度病害分类上会比通用图像分类更明显因为窄褐斑病和褐斑病之间的区分依赖的是高层语义特征对微小纹理差别的敏感性第二输入分辨率对分类任务的影响下限比检测任务更敏感。YOLO11cls 默认imgsz224但水稻病斑很多是直径几个像素到几十像素的小斑点直接缩到 224 会丢失关键纹理所以我一般建议从 256 起步数据量充足时直接上 320。代价是训练时间大约增加一半但 top1 往往能涨 2 到 4 个点。3.2 一键训练脚本逐段拆解资源附带的训练脚本核心逻辑并不复杂我按 YOLO11 官方接口重写了一份等价的方便逐段说明参数含义from ultralytics import YOLO if __name__ __main__: # 加载带 ImageNet 预训练权重的分类模型 model YOLO(yolo11s-cls.pt) # 训练阶段数据目录指向数据集根目录内部自动识别 train/val results model.train( data./datasets/rice_disease, # 数据集根目录必须含 train/ 和 val/ epochs100, # 训练轮数看日志再决定是否延长 imgsz256, # 输入分辨率细粒度分类建议 256 起 batch32, # 单卡 batch size显存不够降到 16 lr00.01, # 初始学习率配合 cos 衰减 optimizerSGD, # 显存小、数据量中等时 SGD 更稳 cos_lrTrue, # 余弦退火后期收敛更平滑 device0, # 单卡训练多卡改为 0,1 workers8, # 数据加载线程数 cacheram, # 数据量 5000 张时直接缓存到内存 patience20, # 验证集连续 20 轮不涨就早停 projectruns/classify, # 输出根目录 namerice_cls_exp1, # 本次实验名称 )这段脚本的意图很清楚先用 ImageNet 预训练权重做初始化再用自有数据微调。其中patience20在数据类别不均衡时容易被误触发如果前 20 轮验证精度持续震荡早停会把训练掐断在模型还没收敛的位置实操时我一般先设成 50 观察第一个完整的余弦周期或者干脆关掉早停。cacheram对这个数据规模几乎是必选项5000 张图解码后的张量放进内存能让每个 epoch 的训练时间缩短一半以上。注意yolo11s-cls.pt是从官方权重仓库自动下载的预训练模型第一次运行需要联网。如果目标设备完全离线需要在有网环境先手动下载好放到脚本同目录下再改路径指向本地文件。3.3 超参数与数据规模的匹配关系样本量约 5000 张、类别数 10 个这个规模处于中等偏小的区间超参数设置有几个明确的原则。下表是这组配置的调整参照参数资源脚本默认调整方向适用场景epochs10060~80样本均衡、预训练效果好时提前收敛imgsz256320病斑纹理细密、且显存有余量batch3216单卡 8GB 显存以下或使用 YOLO11m 以上骨干optimizerSGDAdamW数据噪声大、SGD 收敛不稳时尝试lr00.010.001使用 AdamW 时必须同步下调augmentation默认开启关闭部分增强类别极度不均衡时减少对少样本类别的扰动这组对照背后是计算资源与分类难度的权衡。数据量只有几千张时过大的数据增强会把病斑纹理破坏掉尤其是旋转和透视变换会导致窄褐斑病与褐斑病的边界更加模糊但完全不增强模型又学不到光照变化下的鲁棒性。常见做法是保留 HSV 扰动和轻微翻转关闭大幅度的旋转和透视。YOLO11cls 内部的数据增强策略可以在训练脚本里通过augmentTrue整体控制但如果需要细粒度干预就得在数据集加载环节自行处理了。4. 跑通训练执行流程、收敛判读与日志分析4.1 训练启动前的最后检查拿到数据集文件和训练脚本后不要直接开跑。先检查三件事确认数据目录下已经没有多余的隐藏文件夹和额外文件YOLO11cls 扫描子目录时会把它们当成类别确认 train 与 val 的子目录名称完全一致否则验证集标签映射错位确认显卡驱动与 PyTorch 版本匹配YOLO11 需要 PyTorch 1.8 以上我踩过的坑是 CUDA 11.7 的机器装上了只支持 CUDA 12 的预编译包导致训练时只能 CPU 推理。这三项全部确认后才执行训练指令python train_cls.py训练启动后终端会输出每一轮的 loss、top1 accuracy、top5 accuracy 和学习率。第一条日志出来后扫一眼如果 top1 accuracy 在 0.1 附近徘徊而 top5 也在 0.5 以下说明标签映射出了问题立刻停掉训练检查目录结构。正常状态下第一个 epoch 结束就能看到 top1 明显高于随机水平10 类问题随机基线是 10%预训练权重迁移过来的模型通常第一轮就能到 40% 以上。4.2 训练日志里藏着什么训练结束后所有输出都落在runs/classify/rice_cls_exp1/目录下。里面有weights/best.pt和weights/last.pt前者是验证集精度最高的权重后者是最后一轮权重。还有results.csv记录了每一轮的完整指标变化我一般用一段 Python 脚本快速画图import pandas as pd import matplotlib.pyplot as plt # 读取训练过程指标 df pd.read_csv(runs/classify/rice_cls_exp1/results.csv) # 只保留关键列绘制验证集 top1 精度曲线 plt.plot(df[epoch], df[metrics/accuracy_top1], labelval top1) plt.plot(df[epoch], df[metrics/accuracy_top5], labelval top5) plt.xlabel(epoch) plt.ylabel(accuracy) plt.legend() plt.savefig(train_curve.png, dpi150)这段代码通过 pandas 读取每一轮的指标用 matplotlib 把验证集 top1 和 top5 画成曲线用来判断模型是收敛、过拟合还是欠拟合。判断逻辑是三段式的top1 曲线持续上升且 val loss 同步下降说明训练正常top1 上升但 val loss 后期反弹说明过拟合应回退 epoch 数或增强数据top1 在某个平台期长期不动说明学习率太低或者模型容量不足应调大 lr0 或换更大的骨干。还有一个容易被忽略的文件是confusion_matrix.png。每轮结束 Ultralytics 都会基于验证集生成混淆矩阵图它比 top1 数字更能说明问题。如果 brown_spot 和 narrow_brown_spot 之间存在大片互相错分的区域说明模型对病斑尺寸的建模还不够优先方案是提高imgsz而不是盲目增加训练轮数。4.3 训练结果日志中的精度参考资源附带了一份参考训练日志实际跑出来的 top1 精度会因随机种子、GPU 型号和 PyTorch 版本略有浮动。有一点需要提前说清楚参考日志展示的验证精度是在该数据集的 val 划分上得到的如果自己重新切分了数据精度会有几个点的波动这不代表脚本有问题。判断脚本是否跑对的依据是训练曲线的形态而不是某一轮的绝对数字。如果自己训练出来的 top1 明显低于参考日志优先检查两个方向确认训练集和验证集的类别均衡情况是否一致val 中若有某类只有几张图该类的准确率会剧烈跳动确认数据增强是否破坏了小病斑的纹理特征可以在训练脚本里临时关闭翻转和旋转增强对比一轮 top1 的变化幅度。分类任务的数据增强对细粒度识别的影响往往在大规模通用数据集上不大但在千级样本的专业领域数据集上会被显著放大。5. 模型验证与部署单图预测和更可靠的精度评估5.1 用 predict 跑真实场景验证训练完成后怎么证明模型不是只在验证集上好看我的通行做法是拿田间真实拍摄、不参与训练的单张图片直接跑推理观察 Top-5 概率输出yolo classify predict modelruns/classify/rice_cls_exp1/weights/best.pt \ source./test_field_images/ imgsz256预测结果会在每个图片上标注 Top-1 类别和置信度并生成runs/classify/predict/目录。输出的 txt 文件里记录了所有类别的置信度分布。这里有个判断技巧如果正确的类别排在 Top-2 且置信度与 Top-1 差别小于 0.1说明模型已经学到了该病斑的特征只是和易混类别之间的边界还差一点可以通过集成或阈值调整解决如果正确类别排到 Top-3 以后说明该类别在训练数据中的代表性不足需要补充样本而不是调参数。from ultralytics import YOLO # 加载训练好的最佳权重 model YOLO(runs/classify/rice_cls_exp1/weights/best.pt) # 遍历验证集图片输出每张图 top5 置信度 results model.predict(source./datasets/rice_disease/val/, imgsz256) for r in results: print(r.path) print(r.probs.top5conf) # top5 置信度 print(r.probs.top1) # top1 类别索引这段代码用 YOLO 的 predict 接口批量跑完整个验证目录。probs.top5conf返回前五个类别的概率值probs.top1返回排名第一的类别索引。类别索引对应关系就是第 2 章提到的隐式映射要和文件夹字典序核对一致否则部署时会把叶瘟病当成穗颈瘟。5.2 围绕易混类别做一个更实用的验证最后一个值得动手的技巧针对易混类别单独构建二分类验证。具体做法是从训练集里筛出 brown_spot 和 narrow_brown_spot 两个类别的图片各 200 张用 best.pt 推理统计这两类互相错分的比率写成 log 文件。本质是在细粒度层面量化分类边界比整体混淆矩阵更接近实际部署环境因为田间真正让你头疼的永远是这两三类相似的病害。遇到错分率超过 10% 的情况我不建议急着加数据先检查错误样本找共性如果大量错误集中在某一类形态比如褐斑病早期病斑还很小就被拍下来说明训练集中缺少对应形态的样本针对性补拍比盲目加水管用得多。所有验证通过后把模型导出为 ONNX 格式做进一步部署导出命令为yolo export modelbest.pt formatonnx imgsz256TensorRT 部署时再把 ONNX 转成 engine 文件。整个流程走完这个模型才算真正从数据集变成了可下线的分类能力。本文还有配套的精品资源点击获取