资讯动态

215种蘑菇图像识别数据集:从PyTorch到YOLOv5分类实践

发布时间:2026/10/18 22:49:58 来源:尧图企业网站定制
简介一套面向图像分类任务的大型蘑菇识别数据集覆盖215个真实蘑菇类别类别清单以JSON字典文件形式提供便于程序读取名称或映射编号。数据已按训练集和测试集划分训练集包含2500张图片测试集包含600张图片图片均为JPG格式存放在data目录下的两个子目录中省去自行爬取和整理样本的环节。该压缩包采用7z格式总大小152.96MB共2000个文件除1998张图像外还包括1个类别字典JSON文件和1个Python可视化脚本运行脚本可直观预览各类别样例方便检查数据质量。此数据集可直接用于YOLOv5分类方案或常见CNN分类模型的训练与评估也适合作为深度学习课程项目、图像识别竞赛练习或蘑菇种类识别研究的基准数据。目前已有139人学习下载对需要真实图像分类数据的开发者而言是一份结构清晰、方便直接使用的实用资源。1. 215种蘑菇图像识别数据集先弄清楚谁是训练集、谁是测试集做图像分类时最讨厌的事情不是模型调参而是拿到一份数据集后得花半天时间重新整理目录。这份大型215种蘑菇类别图像识别数据集打开就是分好的data/train和data/test两个文件夹每个类别一个子目录图片直接待在对应的类文件夹里还附带类别字典 json 文件省掉了我最烦的“先读标注文件、再写脚本搬图”的环节。数据集规模不夸张训练集 2500 张测试集 600 张适合用来验证分类网络的流程也适合作为蘑菇识别的入门数据。它既能直接喂给 PyTorch 的ImageFolder也能改造成 YOLOv5 的 classification 模式。如果你正在找一份结构清晰、能快速跑通分类项目的图像数据集这份资源值得打开看一眼如果你打算拿它练手下面的目录组织、读取方式、训练接法和踩坑记录应该能帮你少走几趟弯路。2. 目录结构与类别字典文件夹就是标注json 就是标签映射2.1 data 目录为什么按文件夹分而不是用单文件标注很多公开图像分类数据集采用的是“一张图片对应一行标注文字”的格式比如图片名Tab类别ID。这种格式在训练前你需要额外写解析脚本把标注文件转成网络能读的结构。这份蘑菇数据集选择的是另一种更朴素的组织方式data/train/蘑菇类别名/图片文件data/test/蘑菇类别名/图片文件。类别名直接作为文件夹名图片按类别归位这样ImageFolder这类数据加载器能直接扫描目录生成标签完全不用中间转换。这种组织方式最大的好处是“人能一眼看懂”。比如你看到data/train/bay_bolete/13.jpg就知道这是 train 集里 bay_bolete 这个类别下的第 13 张图。对分类任务来说文件夹名就是标签目录层级就是标注结构减少了标注文件与图像文件不匹配的隐患。缺点也有如果类别名里有大小写混写或拼写不一致后续加载时容易出问题。所以我拿到手第一件事就是先看目录树确认类别是否统一。2.2 读类别字典 json把类名转成训练用的数字索引分类网络通常不直接用字符串类名而是把类别映射成整数索引。这份资源里的 json 文件就是干这个的。我一般用下面的代码把它读出来同时生成一个idx - 类名的反查字典方便后续做混淆矩阵时打印真实名称。import json # 假设类别字典文件叫 class_dict.json与 data 目录同级 with open(class_dict.json, r, encodingutf-8) as f: class_dict json.load(f) # 打印类别总数和前五个类别确认字典格式 print(类别总数:, len(class_dict)) names list(class_dict.keys()) print(前五个类别:, names[:5]) # 构建 id - name 的映射用于预测结果可视化 id_to_name {v: k for k, v in class_dict.items()} print(索引 0 对应:, id_to_name[0])大多数情况下这个 dict 是类名字符串 - 数字ID的格式所以len(class_dict)应该等于 215。如果打印出来发现某些类名带空格、带下划线前缀就需要在训练前清洗一下。注意不同发布者可能把 json 存成{类名: id}或{id: 类名}读出来后必须先确认class_dict.keys()是字符串还是整数。这个判断决定你后续是直接用ImageFolder让类名按字母排序还是用自定义 Dataset 强制按照 json 的映射顺序。2.3 训练集与测试集的规模、类覆盖与缺失风险从摘要看训练集 2500 张、测试集 600 张215 个类别。简单做除法会发现平均每个类别训练约 11.6 张、测试约 2.8 张。这个数量对于“验证分类流程”没问题但对于训练一个高精度的蘑菇识别模型样本明显偏少尤其是测试集部分类别可能只有 1 张或没有测试图。这会导致最终准确率指标波动很大。我建议拿到数据后先跑一个统计脚本看看每个类别在训练和测试中到底有多少张确认有没有「某个类训练有、测试没有」或者反过来。这一步很容易被忽略但直接影响结果。import os from collections import Counter train_root data/train test_root data/test def count_images(root): counter Counter() for cls_name in os.listdir(root): cls_path os.path.join(root, cls_name) if os.path.isdir(cls_path): counter[cls_name] len([f for f in os.listdir(cls_path) if f.lower().endswith((.jpg, .jpeg, .png))]) return counter train_counts count_images(train_root) test_counts count_images(test_root) # 找出训练和测试数量差异较大的类别 all_classes set(train_counts) | set(test_counts) missing_test [c for c in all_classes if c not in test_counts] print(训练中缺失的类别:, train_counts.get(missing_class, 无)) print(测试中缺失的类别数:, len(missing_test)) print(训练集平均每类张数: {:.1f}.format(sum(train_counts.values()) / max(len(train_counts), 1))) print(测试集平均每类张数: {:.1f}.format(sum(test_counts.values()) / max(len(test_counts), 1)))这个脚本的价值在于把“平均数字”还原成“分布”。比如平均 11.6 张看起来还行但很可能有几个类有 50 张而另外几十个类只有 3 张。如果你用ImageFolder直接加载batch size一打乱某些类别一个 batch 里可能反复出现影响收敛。所以先统计、后训练是拿到任何数据集后的第一步。3. 把蘑菇数据集接到分类流程从 PyTorch 到 YOLOv5 的两种接法3.1 PyTorch ImageFolder 加载三行代码跑通数据流这份数据集的目录格式天然适配 PyTorch 的torchvision.datasets.ImageFolder。只要给定根目录它会自动把子目录名作为类别把图片按类归档。这里有一个关键点ImageFolder的类别顺序是按文件夹名字母排序的不一定是 json 里的 ID 顺序。如果你想让类别索引和 json 保持一致就得在建 Dataset 后手动修改dataset.class_to_idx。from torchvision import datasets, transforms import json # 读取 json用类名到 ID 的映射覆盖 ImageFolder 的默认字母序 with open(class_dict.json, r, encodingutf-8) as f: class_dict json.load(f) # {bay_bolete: 0, brown_birch_bolete: 1, ...} data_transform transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) train_dataset datasets.ImageFolder(rootdata/train, transformdata_transform) # 覆盖类别映射确保与训练脚本中的 num_classes 索引一致 train_dataset.class_to_idx class_dict train_dataset.classes list(class_dict.keys()) print(加载类别数:, len(train_dataset.classes))这里修改class_to_idx只是改字典实际读取样本时ImageFolder内部会根据class_to_idx给每张图打标签所以顺序必须和训练时一致。如果类名有大小写不一致比如 json 里是Bay_Bolete文件夹是bay_bolete就会 KeyError。所以我一般先做一次目录名与 json 键名的交集比对再让脚本往下走。3.2 改造为 YOLOv5 分类模式的目录结构与 yaml 配置YOLOv5 不仅支持目标检测也支持classify任务。它要求的分类数据目录结构是train_folder/类别名/图片和test_folder/类别名/图片正好和这份蘑菇数据集一样。所以你可以直接把它放到 YOLOv5 项目里写一个简单的 data yaml# mushroom_cls.yaml path: . # 数据集根目录相对于调用 train.py 的位置 train: data/train val: data/test # 类别名列表顺序必须与训练输出一致 names: 0: bay_bolete 1: brown_birch_bolete 2: deathcap 3: ...使用 YOLOv5 训练分类时命令通常是python classify/train.py --model resnet50 --data mushroom_cls.yaml --epochs 50 --img 224 --batch 32这里的--model可以换成resnet18、mobilenet_v3_small等YOLOv5 的分类脚本会从torchvision拉模型结构。注意--data后面的 yaml 里names必须和 json 里的类名一一对上而且顺序不能错。YOLOv5 的分类训练不会自动读你的 json它只看 yaml 里的 names。如果 names 顺序和文件夹扫描顺序不一致模型训练时的标签就全乱了。我自己会写一个脚本用 json 生成 yaml 的 names 段避免手工复制出错。3.3 样本均衡对 2500 张训练集做类别权重计算既然每个类别平均只有 11.6 张CrossEntropyLoss默认权重会让样本量大的类别主导梯度。常见的做法是给 loss 传入类别权重权重和类别样本数成反比。在 PyTorch 里可以直接从train_dataset.targets计算import torch from collections import Counter # 统计每个类别的样本数量 targets train_dataset.targets # ImageFolder 自动生成的标签列表 class_counts Counter(targets) total_samples sum(class_counts.values()) # 权重总样本数 / (类别数 * 该类别样本数)平滑处理 num_classes len(train_dataset.classes) class_weights torch.tensor( [total_samples / (num_classes * class_counts[i]) for i in range(num_classes)], dtypetorch.float32 ) criterion torch.nn.CrossEntropyLoss(weightclass_weights) print(类别权重前 5 个:, class_weights[:5])这个权重会让样本少的类别在 loss 中获得更高占比但注意不要设置极端值。我看到过有人把权重算成1/样本数结果某个只有 1 张图的类 loss 权重比其他类高百倍模型直接把这个类学崩。所以用总样本数 / (类别数 * 该类别样本数)这种归一化方式会更稳。如果你后续发现某个类别准确率特别低还可以单独给这个类别加权重相当于手动调重点。4. 可视化脚本使用与样本检查训练前先看图的四个理由4.1 show 脚本怎么运行以及脚本在做什么资源里附带了一个show脚本通常是.py文件用来把数据集的随机样本拼接画到一张画布上方便肉眼检查。我一般直接在数据集根目录运行python show.py --data_path data --num_samples 20 --output preview.jpg如果脚本本身没有命令行参数就打开源码看下它读的是哪个变量改完路径后直接运行。这类脚本的核心逻辑无非是先从每个类别随机抽几张图再用matplotlib或cv2拼接成网格。它的作用是让你在没有启动训练的情况下先对数据长什么样有个直观认知。我做过的几次蘑菇分类实验里可视化脚本救了我不少次。比如有一次我看到 grid 里混进了一张“看似蘑菇实则是树叶”的图片说明数据集中有错误标注。如果不提前看模型会把树叶也当成一个潜在类别测试时遇到类似背景就容易误判。所以别跳过这一步。4.2 可视化检查的三个重点模糊图、错误标注、类间相似看可视化图时重点看三类问题模糊与超小目标蘑菇图片里经常有含混的背景虚化某些图主体只有几个像素。这类图会让模型学到背景纹理而不是蘑菇特征。建议在训练前把分辨率过小比如最长边小于 100px的图挑出来考虑删除或用高分辨率版本替换。标签不匹配文件夹叫deathcap但图里明显不是毒鹅膏。这种错误在公开数据集中并不罕见。发现后最好移到unlabeled目录别让它污染训练集。类间相似比如bay_bolete和brown_birch_bolete外观接近不仔细看很难分。这说明这个任务本身的难度不在“特征提取”而在“细粒度区分”。如果测试集里这两种类恰好比例不均衡准确率数字高低就差很多。可视化脚本只能帮你“看到”判断还要自己做。我的习惯是每次看完都写一个文本备注哪几个类容易混、哪些图需要剔除、哪些类样本数太少需要额外采集。这个备注就是数据质量报告比训练曲线还重要。4.3 从可视化结果反推数据质量报告可视化之后可以顺手做一个统计表列出每个类在训练/测试中的图片数、是否有损坏文件、是否有非 RGB 图。这一步不需要复杂工具用PIL遍历就行from PIL import Image import os bad_images [] for root, dirs, files in os.walk(data): for name in files: if not name.lower().endswith((.jpg, .jpeg, .png)): continue path os.path.join(root, name) try: img Image.open(path) img.verify() # 验证文件是否完整 if img.mode not in (RGB, RGBA): bad_images.append((path, mode img.mode)) except Exception as e: bad_images.append((path, str(e))) print(损坏或异常图片数量:, len(bad_images)) for item in bad_images[:10]: print(item)img.verify()会检查文件头是否损坏但不解码完整像素它速度快适合全量扫描。发现异常图后我一般直接删除这些文件或者把它们移到单独的corrupted目录避免加载时报错中断训练。5. 蘑菇分类踩坑与排查五个真实翻车场景5.1 现象训练 loss 不降原因类别字典与实际文件夹名大小写不一致第一次用这份数据集训练时我直接跑 PyTorch 的ImageFolder结果 loss 在 5.3 附近徘徊死活不降。查了半天发现 json 文件里类名是Bay_Bolete大写 B而文件夹名是bay_bolete全小写。ImageFolder扫描文件夹后生成了自己的class_to_idx我把 json 传进去想把索引覆盖掉但因为大小写不一致实际样本标签还是按文件夹名来的导致 json 映射和 tensor 标签错位。解决把 json 中的所有类名转成小写再和文件夹名统一或者直接让 json 作为唯一标准批量重命名文件夹。从那以后我拿到数据先执行os.listdir与 json keys 的集合比对强制统一。5.2 现象加载数据集报错文件不存在原因路径分隔符在 Windows/Linux 差异在 Windows 上拆分测试集时用\拼接路径存到 txt 里换到 Linux 服务器训练时\被当成非法字符ImageFolder直接抛 FileNotFoundError。现象是报错的图片路径看起来完全正常但就是找不到文件。解决所有路径拼接都用os.path.join生成存储路径列表时用/或pathlib.Path避免硬编码分隔符。另外给ImageFolder传入路径前先print(os.path.exists(path))验证一下。后来我干脆规定凡是写路径相关代码一律用pathlibpip 装的库、自己写的脚本都遵守。5.3 现象YOLOv5 训练时报 num_classes 不匹配原因混用了检测配置文件有同学直接用 YOLOv5 的yolov5s.yaml来训练分类运行时模型输出 80 类而数据集有 215 类维度直接报错。这是把目标检测配置和分类配置搞混了。YOLOv5 的classify/train.py不需要读模型 yaml 的nc而是根据--data里的names长度动态构建分类器头。解决分类任务直接用classify/train.py不要套用检测的模型 yaml。如果你想换骨干网络写--model resnet18或者--model efficientnet_b0由torchvision提供分类头。检查模型结构时打印model.fc.in_features和model.fc.out_features确保输出是 215。5.4 现象show 脚本输出空白图原因图片格式或色彩模式异常运行 show 脚本时Grid 图里有一块块纯灰或纯黑区域。用PIL单独打开图片发现没有报错但显示是空白。原因是某些图片是 CMYK 色彩模式的 JPGmatplotlib的imshow直接渲染会失败或者渲染成四通道映射错误。解决在读取阶段统一转换色彩空间。使用Image.open(path).convert(RGB)后再存成数组。对于所有原始图片我建议先做一次批量转换把所有非 RGB 图转成 RGB。这份蘑菇数据里虽然数量不多但一旦碰到就是训练时“黑匣子”问题——loss 波动但看不出来是哪张图搞鬼。5.5 现象模型收敛但测试准确率低原因类别不均衡和背景过拟合训练完成后测试集准确率只有 52%但训练集准确率 99%。排除过拟合后我发现测试集中有几个主要类别占了 40% 的样本而这些类别的图片有大量相似的森林背景。模型把背景纹理当作判别特征导致真实环境下的蘑菇图片识别失败。解决可视化测试集后发现部分图片背景过于单一比如 90% 是苔藓、90% 是落叶。我在训练时加了随机裁剪、色彩抖动和灰度增强让模型更多关注蘑菇本体。第二个做法是重新划分数据集如果资源里某个类测试样本特别多我把它按 8:2 再切一次让验证集更均衡。别迷信“测试集准确率”要按类别看混淆矩阵。6. 验证与进阶用混淆矩阵找“易混蘑菇对”并为下一次迭代做准备6.1 从训练日志提取混淆矩阵的具体做法训练完成后分类任务最值得看的不是准确率曲线而是混淆矩阵。PyTorch 里可以自己写一个评估循环把所有测试集图片过一遍收集真实标签和预测标签然后用sklearn画矩阵import torch import numpy as np from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay model.eval() all_preds [] all_labels [] with torch.no_grad(): for images, labels in test_loader: images images.to(device) outputs model(images) _, preds torch.max(outputs, 1) all_preds.extend(preds.cpu().numpy()) all_labels.extend(labels.numpy()) cm confusion_matrix(all_labels, all_preds) print(混淆矩阵尺寸:, cm.shape) # 215x215 # 找出错误最多的类别对 np.fill_diagonal(cm, 0) err_pairs np.argwhere(cm 0) err_pairs_sorted sorted(err_pairs, keylambda p: -cm[p[0], p[1]]) for (true_idx, pred_idx) in err_pairs_sorted[:5]: true_name id_to_name[true_idx] pred_name id_to_name[pred_idx] print(真实:%s 误判为:%s 数量:%d % (true_name, pred_name, cm[true_idx, pred_idx]))这个脚本会告诉你最容易混淆的是哪几个类。在我跑这个蘑菇数据集时混淆最多的往往是两种外观接近的牛肝菌比如bay_bolete和brown_birch_bolete颜色和形状几乎一样只有菌柄纹理有细微差别。如果你发现混淆对恰好也是测试样本最少的那些类就要考虑补充数据而不是疯狂调模型。6.2 针对易混类别做定向数据增强常规增强是对所有图片做同样的裁剪、翻转、色彩扰动。如果已知A类和B类容易混我会为这两个类单独构造一个采样器在训练时按一定概率把它们的增强强度加大。具体做法是在自定义 Dataset 里根据class_to_idx判断样本属于哪个类如果是易混类就额外执行RandomResizedCrop和ColorJitter的强版本。这段逻辑不复杂但效果比全局增强更直接模型被迫去关注菌盖纹理、菌褶走向等细粒度特征而不是整体颜色。当然增强不能过度否则本来就不多的样本被扭曲得失去真实性反而掉点。建议先跑一次无增强实验记录基线再加定向增强对比。6.3 我现在的数据检查习惯拿到任何图像分类数据集我现在都会强制走一遍这条流程先统计每个类的样本数量并核对 json 映射再用 show 脚本或自写脚本生成拼接图肉眼扫一遍模糊图与错误标注然后跑一个全量文件完整性检查把所有非 RGB、损坏、超大尺寸压缩异常的图片挑出来最后把易混淆类记到备忘里等第一轮训练结束后对照混淆矩阵验证。这个习惯来自几次血泪教训——最初我以为图像分类只要模型够强就能忽略数据瑕疵结果在蘑菇这种细粒度任务上被数据狠狠教育了。尤其是这个数据集的训练集只有 2500 张平均每个类 11 张图任何一张脏数据都可能让某个类整体跑偏。做完上面四步再进训练循环后续调参才不至于被数据噪声干扰。希望这份数据集和这套检查流程能帮到你尽早定位到你自己的易混蘑菇对和样本坑位。本文还有配套的精品资源点击获取

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

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

免费获取报价 →
↑