
简介本资源是面向农业智能检测与计算机视觉初学者的桑叶虫害图像分类数据集聚焦病害识别这一典型工业级应用场景适用于深度学习模型训练、课程设计及科研验证。数据集共约6000张高质量图像已按三类标签Potential Leaf Rust、Potential leaf spot、Disease Free leaves完成精细标注并划分训练集与测试集每类图像独立存放便于直接加载配套提供1个JSON标注文件、1个可视化脚本.py及主流格式图像1655张PNG 343张JPG整体压缩包为7z格式大小377.02MB含2000个文件结构清晰、开箱即用。目前已有88人学习下载资源作者同步维护多个CV实战项目与网络改进方案可结合其博客中图像分类优化实践深入理解模型调优路径。桑叶虫害图像分类数据集【已标注约6,000张数据】做农业AI的朋友应该都有体会真正卡脖子的往往不是模型而是数据。尤其是桑叶虫害这种垂直领域公开数据集少得可怜想找个能直接用的更是难上加难。我自己在做一个桑蚕植保项目的时候光是凑数据就折腾了大半个月最后靠着一批标注好的桑叶虫害图像才把模型跑起来——就是这次要聊的这份数据集约6000张已经标注完毕直接拿来训练图像分类模型不用再花时间洗数据、做标注。这份数据集解决的是一个很具体的问题给定一张桑叶照片模型要判断叶片上属于哪一类虫害。它覆盖了桑蚕种植中最常见的几种虫害类型每张图都是真实的田间拍摄或人工采集不是从网上随便扒的示意图。对做农业图像识别、植物病虫害检测、以及想入门图像分类但不想自己标注数据的新手来说这份数据都是个不错的起点。接下来我从数据集的行业背景、标注方案、训练实操到避坑经验完整拆一遍。1. 桑叶虫害图像分类的背景与数据价值1.1 桑蚕产业中的虫害识别痛点先聊点行业背景。桑蚕养殖在我国有几千年的历史但到今天桑园管理很大程度上还是靠人工巡检。虫害一旦爆发桑叶减产直接影响蚕茧产量而蚕农往往只能在叶片已经被啃得千疮百孔之后才反应过来。问题的核心在于桑树虫害种类多、发生周期快、早期症状不明显基层植保人员数量又严重不足根本做不到每天下田逐棵检查。图像分类模型恰好能在这里帮上忙。手机拍一张桑叶照片模型立刻告诉你这是桑螟还是桑毛虫或者只是机械损伤蚕农就能精准用药不用盲目大面积喷洒。这也是农业AI落地最常见的第一站——识别先行后续再扩展检测和防治建议。但做识别的第一步就是得有数据而且是有标注、覆盖多种虫害、贴近真实田间环境的数据。1.2 为什么说这份数据集的“已标注”价值最大很多公开数据集的问题不在数量而在标注质量。我见过一些所谓的农业数据集标签是有了但有的标注错得离谱有的同一类虫害在图像中的位置、角度、光照差异极大模型训练出来换个场景就废了。真正能用的是一个标签一致性高、图像多样性充分的数据集。这份桑叶虫害数据集约6000张单看数量不算多但如果标注严谨、覆盖场景广配合迁移学习足够训练出能用的模型了。对个人开发者或小团队来说与其去爬几千张无标注的图片再自己花几周标注不如用一份认真整理的已标注数据起步。6000张的规模也刚好合适太少容易过拟合、说明不了问题太多对GPU显存和训练时间的要求又会劝退不少新手。提示拿到任何数据集第一步建议先抽样查看图像与标签是否匹配并统计各类别的样本数量确认没有严重失衡和错标。数据质量检查永远是训练前最值得花时间做的事。2. 这样一份数据集是如何构建的类别设计与采集思路2.1 类别构成与虫害特征识别要点桑树上的害虫不少但如果要做一套实用的分类数据集必须先抓住主要的几类。一类典型的数据集设计通常会将桑螟、桑毛虫、桑白蚧、桑蓟马、桑天牛和健康叶片纳入常规分类这也是桑园里发生频率较高、对生产影响较大的对象。类别典型特征高发季节对桑叶的影响桑螟幼虫绿色或黄绿色喜卷叶为害夏秋季卷叶、食叶严重时整株叶片被吃光桑毛虫幼虫体表具毒毛常群集取食春秋季啃食叶肉仅留叶脉俗称“白叶”桑白蚧若虫固定在枝条和叶背呈白色介壳全年扩散刺吸汁液叶片失绿变黄桑蓟马体型极小喜潜伏在嫩芽嫩叶中春夏旱季叶片出现银灰色斑点卷曲畸形桑天牛成虫啃食树皮幼虫蛀食枝干夏季枝条枯死破坏树势健康叶片叶色鲜绿无斑点、无虫体——正常读者拿到数据集后如果类别设计与此不完全一致建议先对照自带的类别说明文件和标签表理解每类图像的特征尤其是易混淆类别比如桑蓟马为害后的叶片与桑白蚧早期症状就很接近这对后续调参和结果分析很有帮助。2.2 图像采集的条件与筛选标准这份数据集的图像来源基本可以断定是田间接拍和人工补拍结合。真正有价值的农业图像数据通常要满足几个要求。第一是光照多样性晴天、阴天、逆光、树荫下的叶片颜色差异极大模型必须见得多才能在这些条件下都保持稳定。第二是背景复杂度纯白背景的虫害图在实验室里好看但到了田间根本不可用背景里带着泥土、其他植物叶片、枯枝杂物反而对模型有正向帮助。第三是拍摄距离和角度既要有近景特写虫体和危害特征清晰可见也应有带叶片的整体图让模型学习从不同尺度识别虫害。筛选标准同样关键。模糊图、严重过曝图、与目标虫害无关的图都会被剔除。这听起来像废话但实际操作中非常费时。为了保证数据质量标注人员通常还会统一约定“一张图只标主要虫害”的原则——如果一张叶片上有两种虫害按危害更重的那类归类不做多标签先把单标签分类做扎实。2.3 标注方案与数据格式分类数据集的标注没有目标检测那么复杂通常是整理成按类别分文件夹的结构或是每张图配一个包含类别ID的记录文件。这份数据集的常见组织方式如下mulberry_pest_dataset/ ├── train/ │ ├── mulberry_silkworm/ │ │ ├── 0001.jpg │ │ ├── 0002.jpg │ │ └── ... │ ├── mulberry_looper/ │ ├── mulberry_scale/ │ ├── mulberry_thrips/ │ ├── mulberry_borer/ │ └── healthy/ ├── val/ │ ├── mulberry_silkworm/ │ ├── ... └── test/ ├── ...这种按文件夹组织的格式配合PyTorch的torchvision.datasets.ImageFolder可以直接读取几行代码就能把数据加载起来。如果想用其他格式比如CSV记录路径标签转换也非常方便。对大多数用PyTorch、TensorFlow的开发者来说这种组织方式是最省事的。提示分类数据集不必拘泥于固定的文件夹顺序。只要你清楚标签的含义用ImageFolder自动生成索引还是手动拆分CSV都可以在训练时无缝切换。3. 从零上手用这份数据集训练图像分类模型3.1 环境准备与依赖安装这部分按常见实践来操作。我默认你有一台带NVIDIA GPU的主机显存在6GB以上就够用。如果只有CPU也能跑起来只是训练时间会明显变长。核心依赖是Python、PyTorch、torchvision、OpenCV和tqdm。conda create -n mulberry python3.10 -y conda activate mulberry pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install opencv-python tqdm scikit-learn matplotlib版本不需要刻意追求最新PyTorch 2.x的任何一个稳定版本都可以。建议把数据集放在./data/mulberry_pest_dataset路径下训练脚本放在独立的src目录里保持工程结构清晰。3.2 数据加载与训练集划分首先把数据集加载进来并统计各类别数量。这一段几乎是每次训练前必写的代码。import torch from torchvision import datasets, transforms from collections import Counter data_root ./data/mulberry_pest_dataset train_root f{data_root}/train val_root f{data_root}/val # 统计类别数量 class_names sorted(os.listdir(train_root)) train_counts Counter() for c in class_names: path os.path.join(train_root, c) train_counts[c] len(os.listdir(path)) print(类别, class_names) print(各类别训练样本数, dict(train_counts))跑完之后你会得到各类样本的分布。这份数据集约6000张如果按7:2:1划分训练集大约4200张验证集1200张测试集600张。这里有一点需要特别提醒如果数据集中各类别样本数不均衡在划分时要保证每个文件夹内的类别比例一致最好使用分层划分避免验证集里某一类样本过少而导致评估结果失真。3.3 用ResNet18训练一个基线模型对分类任务来说迁移学习是效率最高的方案。ImageNet预训练的ResNet18理论算力要求低、泛化能力不错特别适合6000张这种中小规模数据集。我先加载一个预训练模型替换最后一层全连接层适配6类。import torch.nn as nn from torchvision import models model models.resnet18(weightsmodels.ResNet18_Weights.DEFAULT) num_ftrs model.fc.in_features model.fc nn.Linear(num_ftrs, 6) model model.cuda()数据增强这一步不能省。农业图像在真实场景中的变化非常大如果不做数据增强模型很容易把背景或光照当成判别特征。我常用的增强组合是随机裁剪加随机水平翻转再加上轻度颜色抖动。train_transform transforms.Compose([ transforms.RandomResizedCrop(224, scale(0.7, 1.0)), transforms.RandomHorizontalFlip(), transforms.RandomRotation(15), transforms.ColorJitter(brightness0.2, contrast0.2, saturation0.2), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) val_transform transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ])训练参数方面我用批量大小32、初始学习率0.001的Adam优化器训练30轮通过验证集准确率选择最优模型并采用余弦退火调度器逐渐降低学习率。下面是训练主循环的简洁版本供你参考。criterion nn.CrossEntropyLoss() optimizer torch.optim.Adam(model.parameters(), lr0.001) scheduler torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max30) best_acc 0.0 for epoch in range(30): model.train() running_loss 0.0 for inputs, labels in train_loader: inputs, labels inputs.cuda(), labels.cuda() optimizer.zero_grad() outputs model(inputs) loss criterion(outputs, labels) loss.backward() optimizer.step() running_loss loss.item() scheduler.step() model.eval() correct 0 total 0 with torch.no_grad(): for inputs, labels in val_loader: inputs, labels inputs.cuda(), labels.cuda() outputs model(inputs) _, predicted torch.max(outputs, 1) total labels.size(0) correct (predicted labels).sum().item() val_acc 100.0 * correct / total print(fEpoch {epoch1}/30, Loss: {running_loss/len(train_loader):.4f}, Val Acc: {val_acc:.2f}%) if val_acc best_acc: best_acc val_acc torch.save(model.state_dict(), best_model.pth)实测下来ResNet18在这类数据集上经过30轮训练验证集准确率通常能稳定在90%以上。如果你的数据包含更多易混淆类别可能要适当增加训练轮数或者换用ResNet50、EfficientNet等更强的主干网络。3.4 评估指标与结果分析准确率是基础指标但对农业分类任务来说只看整体准确率远远不够。农业生产中“漏报”的代价往往大于“误报”——把桑螟误判为桑天牛蚕农最多是药打错了但把桑螟误判为健康叶片可能导致整片桑园爆发虫害。所以我评估模型时除了整体准确率还会看混淆矩阵和每一类的精确率、召回率、F1分数。from sklearn.metrics import classification_report, confusion_matrix, ConfusionMatrixDisplay with torch.no_grad(): all_preds [] all_labels [] for inputs, labels in test_loader: inputs inputs.cuda() outputs model(inputs) _, preds torch.max(outputs, 1) all_preds.extend(preds.cpu().numpy()) all_labels.extend(labels.numpy()) print(classification_report(all_labels, all_preds, target_namesclass_names)) ConfusionMatrixDisplay.from_predictions(all_labels, all_preds, display_labelsclass_names) plt.show()以我的经验看最容易混淆的是桑蓟马和桑白蚧。这两种害虫造成的叶片症状在视觉上确实接近一不留神就会互相误判。这时候别急着换模型可以回看数据增强是否足够或者给这两个类别增加更多训练样本。对这类实际问题混淆矩阵能精准指出模型的能力边界。提示训练时留意验证集损失是否持续大于训练集损失。如果两者差距过大说明过拟合了可以考虑加大数据增强强度或引入Dropout。如果两者都在高位下不去那就是模型容量不足或数据本身噪声太大。4. 进一步调优把模型精度从“能用”提升到“好用”4.1 迁移学习的两种微调策略前面用的ResNet18直接全量微调是一种策略但不是所有场景都最优。如果数据集和ImageNet的域差距大可以只训练新加的全连接层冻结backbone这样可以大幅降低训练成本。如果数据量不大但和预训练图像域差距不小比如病虫害早期症状很细微、颜色单一我建议采用“分阶段解冻”的策略。具体操作就是先用冻结backbone的方式训练10轮全连接层让分类器先收敛然后解冻所有层将学习率调低到原来的十分之一比如0.0001再继续训练10轮。这种两阶段微调的好处是前期不容易破坏预训练提取到的通用特征后期又能针对桑叶图像的独特纹理做自适应。我在多个农业数据集上测过比一步到位全量微调稳定提升1~3个百分点。4.2 数据增强的组合拳农业图像的增强策略比通用图像更讲究。最基础的三件套是随机裁剪、水平翻转、轻度旋转。但病虫害的特征往往集中在很小的区域比如桑蓟马造成的斑点单纯的几何增强不够还得加上颜色扰动来模拟不同光照条件。下面是一套在病虫害识别上用过很多次、效果不错的增强组合。train_transform transforms.Compose([ transforms.RandomResizedCrop(224, scale(0.6, 1.0), ratio(0.75, 1.33)), transforms.RandomHorizontalFlip(p0.5), transforms.RandomVerticalFlip(p0.3), transforms.RandomRotation(30), transforms.ColorJitter(brightness0.3, contrast0.3, saturation0.3, hue0.05), transforms.RandomAffine(degrees0, translate(0.1, 0.1)), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ])这里有两点需要注意。第一RandomVerticalFlip不是所有数据都适合如果虫害本身有明显的上下方向性比如某种幼虫总是头部朝上翻转过猛反而会增加学习难度。第二对农业图像来说CutMix和MixUp这类混合增强也很有效它们能让模型学会在背景复杂时仍关注目标特征。不过这类增强的强度要调小混合比例alpha取0.2左右否则会让精细的虫害纹理变得模糊。4.3 类别不平衡的应对手段如果你的这份数据集出现了明显的类别不均比如健康叶片有2000张而桑蓟马只有500张那么仅用CrossEntropyLoss就会让模型严重偏向于样本量大的类。这种情况下最简单的做法是计算权重让少样本类在损失函数中的贡献更大。from sklearn.utils.class_weight import compute_class_weight import numpy as np # 假设train_labels是所有训练样本的标签数组 weights compute_class_weight(balanced, classesnp.unique(train_labels), ytrain_labels) class_weights torch.tensor(weights, dtypetorch.float32).cuda() criterion nn.CrossEntropyLoss(weightclass_weights)如果加权交叉熵还不够可以考虑Focal Loss它能进一步压低那些已经分类正确的样本的损失让模型把注意力放在难分样本上。不过Focal Loss的gamma参数需要根据数据调整一般从1.0开始试太大会导致训练不稳定。注意加了类别权重后验证集准确率可能会先下降但这不代表模型变差了。一定要看每一类的召回率特别是少数类的召回率是否提升。准确率下降、少样本类召回率提升往往是模型更实用的信号。4.4 模型部署与边缘设备上的优化思路训练出好模型只完成了一半真正落地还需要考虑部署。桑叶虫害识别的应用场景多半是田间手持设备或摄像头算力有限对推理速度有要求。一种常见的做法是把训练好的PyTorch模型导出成ONNX再用TensorRT或者ONNX Runtime推理。dummy_input torch.randn(1, 3, 224, 224).cuda() torch.onnx.export( model, dummy_input, mulberry_pest.onnx, input_names[input], output_names[output], opset_version11, dynamic_axes{input: {0: batch_size}, output: {0: batch_size}} )导出之前最好先把模型置为eval模式再尝试用半精度推理。在支持FP16的GPU或边缘设备上推理速度往往能提升30%以上而精度损失几乎可以忽略。如果设备不支持PyTorch也可以把模型量化成INT8格式部署到嵌入式平台代价是1~2个百分点的精度损失但换来速度的大幅提升对田间实时识别场景完全值得。提示导出的ONNX模型建议用onnxruntime自带工具做一遍正确性校验拿一张训练时的图片对拍输入输出。很多模型导出的坑比如动态shape问题、缩放差异都是到了部署阶段才暴露出来的。5. 数据使用常见问题与避坑实录5.1 标注出现了“脏数据”怎么办经历过亲自标注的人都知道再怎么仔细几万张图里总会有一些错标、漏标的样本。你拿到数据集后如果训练时发现某些样本反复预测错误且错误方式离谱比如把健康的叶子判为桑螟先别急着怀疑模型很有可能是标注本身就错了。我常用的排查方法是用模型对训练集做一次前向推理把与标签不一致的图片全部导出人工模糊浏览一遍。一批6000张的数据集花20分钟就能把可疑图过一遍。发现错标就修正或删掉这个流程能带来肉眼可见的提升。我在另一个植物病害数据集上试过清理60多张错标图后验证集准确率直接提高了1.8个百分点。5.2 模型在真实田测时效果不如验证集这是从我实际经历来看最常见也最让人头疼的问题验证集准确率95%一拿出去到田里拍照就跌到80%以下。做农业AI这个“域差异”问题几乎不可避免。实验室或受控环境下拍摄的图像背景干净、光照均匀而田间图像背景杂乱、光照时强时弱、叶片有泥土甚至有水珠遮挡。应对思路有两个方向。一个方向是从数据入手如果条件允许尽量在实际部署环境下补充几十到上百张图片用很小的学习率做一次增量训练把模型的域适配能力拉上来。另一个方向是从增强入手在训练时加入更激进的背景扰动比如随机擦除Random Erasing强迫模型不能依赖背景特征。两个方案叠加效果最好。5.3 6,000张数据到底够不够被问得最多的问题就是“数据少不少”。我的基本判断是做单标签图像分类60本文还有配套的精品资源点击获取