尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

163类中草药数据集实战:基于PyTorch的图像分类训练与调优

163类中草药数据集实战:基于PyTorch的图像分类训练与调优 简介面向中草药AI识别研究者和开发者这份压缩包提供了Chinese-Medicine-163数据集的配套说明与可运行源码。数据集涵盖163种中药材图片总量超过25万张并已划分为训练集与测试集适用于中草药图像分类、识别等深度学习任务。资源以说明文档和可运行项目的形式帮助读者快速理解数据集的构成、来源与使用方式。压缩包仅6KB共3个文件包含一个inscode文件、一个HTML说明页及gitignore配置便于查看说明与运行相关代码。目前已有237人学习下载特别适合用于模型训练与评估的入门实践也可作为课程设计或毕业设计的参考。结合推荐的深度学习分类识别文章读者能获得从数据准备到模型调优的完整路径。1. 为什么需要一份中草药数据集1.1 垂直领域数据集长期缺失做图像分类的人应该都有体会想验证模型效果网上随便找猫狗、花朵、CIFAR都能跑但一落到实际业务场景数据立刻变成最大的瓶颈。中草药识别尤其明显——药材种类繁多学名和俗名混杂同一味药在不同加工阶段、不同拍摄角度下外观差异极大。我在接触几个中医信息化项目时发现很多团队宁可雇人手工录入药材信息也不愿意做自动识别核心原因就是找不到带标注的高质量数据。即便个别商业平台提供了识别接口背后的训练数据也不公开想做二次开发非常被动。这类数据稀缺背后还有一个现实问题中医药领域的图像数据需要专业人员参与标注不能靠众包随便打标。一个标注人员如果不熟悉药材形态很容易把黄芪和甘草的切片搞混。所以市面上即使有一些散落的中草药图片也大多不成体系、类别覆盖少、标注噪声高根本达不到训练一个可用分类模型的要求。这也是为什么当我看到一份163个类别的中草药数据集时会愿意花时间把它完整跑一遍。1.2 这份数据集解决了什么问题这份数据集的价值不在于类别数量本身而在于它把识别问题和可落地验证之间的沟填上了一部分。163个类别覆盖了常见中药材品种数据组织方式是标准的按目录分类训练集和验证集划分清晰配套源码覆盖了从数据加载、模型训练到评估推理的完整链路。我用它完整跑了一次实验全过程不需要自己爬图、不用手工整理标签、更不用从零搭训练框架节省的时间非常可观。对于正在做毕业设计、课程项目或者想锻炼自定义数据集训练能力的开发者来说这是一个很友好的起点。下面先看数据集的基础信息项目说明类别数量163种中草药标注形式按目录分类附标签映射文件图片格式JPG彩色图片训练/验证划分约8:2配套代码训练、评估、单图推理脚本适用算法CNN分类模型可扩展至检测框架2. 数据集到底长什么样目录与标签解析2.1 整体目录结构与类别划分数据集解压后目录结构很直观herb_dataset/ ├── train/ │ ├── 甘草/ │ │ ├── 001.jpg │ │ ├── 002.jpg │ │ └── ... │ ├── 黄芪/ │ ├── 当归/ │ ├── 板蓝根/ │ └── ... ├── val/ │ ├── 甘草/ │ └── ... ├── labels.txt ├── train.py ├── evaluate.py └── inference.py每个类别一个独立文件夹文件夹名就是药材中文名。这种结构对PyTorch的ImageFolder和TensorFlow的flow_from_directory都非常友好不需要写额外的自定义Dataset来解析数据。我抽看了部分图片发现这里的163类并不全是植物药材还包括一些矿物类、动物类药材类别跨度比较大。同时部分根茎类药材和切片类药材在外观上非常接近比如某些晒干后的根茎与切片形状相似度高这类类间相似问题对模型的特征提取能力要求更高也是后面调优时需要重点关注的方向。2.2 标签文件与中文编码注意事项labels.txt是训练和推理阶段都要用到的关键文件每一行对应一个类别行号就是类别索引。常见格式如下0 甘草 1 黄芪 2 当归这里有一个特别容易踩坑的地方中文文件名和中文标签在Windows环境下的编码问题。Python在Linux下处理中文路径通常没问题但在Windows下如果文件编码不是UTF-8读取目录时可能会出现UnicodeDecodeError。我建议拿到数据集后第一时间把所有路径改用pathlib处理同时确认labels.txt是UTF-8编码。如果确实遇到乱码最省事的办法是把文件夹名统一改成英文或拼音推理阶段再单独做一层中文名映射。2.3 数据分布与拍摄条件分析我做了个统计每个类别的样本数量并不完全一致。样本量多的类别有几百张少的只有几十张整体属于典型的长尾分布。训练时如果不加处理少数类很容易被模型忽略。拍摄条件方面这份数据不是单一的白底标准件拍摄而是混合了不同背景、不同光照条件下的照片有室内光、有自然光甚至还有部分是带包装的药材照片。这一点对模型落地反而有利——真实场景下的输入不会规规矩矩地站在白板前面。但同时也带来一个隐患如果验证集恰好都是某种拍摄条件下的图片测试分数可能会虚高。我建议自己额外抽一批野样本做最终评估比如从网上搜几十张真实拍摄的中草药图片验证模型在非训练分布数据上的表现这样得出的结论才更可信。3. 可运行源码的完整跑通过程3.1 环境安装与版本选择这部分我是在Linux服务器上跑的有GPU显存12GB。Windows下也能跑通但建议提前装好显卡驱动和CUDA环境否则只能用CPU硬扛163类的训练速度会非常慢。推荐的软件环境如下Python 3.9PyTorch 1.12torchvision 0.13numpy、matplotlib、scikit-learn建议用conda新建独立环境避免污染系统Pythonconda create -n herb python3.9 conda activate herb pip install torch1.12.1 torchvision0.13.1 numpy matplotlib scikit-learn3.2 训练脚本核心逻辑与启动方式train.py的主流程可以拆成五步读取labels.txt建立类别映射、用ImageFolder加载训练集和验证集、定义预处理流程、构建模型、迭代训练并保存最优权重。预处理部分默认包含Resize、RandomCrop、RandomHorizontalFlip、ToTensor和Normalize。模型默认是ResNet18也可以切换到ResNet50或更深的网络。训练时使用的损失函数是交叉熵优化器是Adam。执行训练的命令示例python train.py \ --data ./herb_dataset \ --epochs 50 \ --batch-size 32 \ --lr 0.001 \ --model resnet18我实测时把batch-size调到了64显存占用约8GB训练速度有明显提升。学习率我配合了StepLR策略每20轮衰减为原来的十分之一最终收敛效果更稳定。3.3 评估与推理从权重文件到预测结果训练结束后会生成best_model.pth这是在验证集上表现最好的权重文件。evaluate.py加载该权重后在验证集上计算Top-1和Top-5准确率inference.py则用于单张图片预测。单张图片推理的命令格式python inference.py \ --image test.jpg \ --weights best_model.pth \ --labels labels.txt \ --model resnet18输出结果类似预测结果甘草置信度0.92我还顺手改了一个批处理版本可以一次性识别整个文件夹里的图片把结果写入CSV文件方便后续做统计分析。这个改动工作量不大但实用性提升明显尤其是在验证几十张野样本的时候不用一张一张敲命令。4. 训练实测与踩坑记录4.1 类别不均衡少数类准确率惨不忍睹这个问题是我在第一次训练时发现的。虽然整体数据结构完整但部分类别样本量只有几十张直接训练的结果是多数类准确率很高少数类几乎被模型忽略Top-1准确率被严重拉低。最直接的处理方式是类别加权在损失函数里给少数类更高的权重from sklearn.utils.class_weight import compute_class_weight class_weights compute_class_weight( class_weightbalanced, classesnp.unique(train_labels), ytrain_labels ) weights torch.tensor(class_weights, dtypetorch.float32).to(device) criterion nn.CrossEntropyLoss(weightweights)加了类别权重之后容易混淆的小类别准确率提升非常明显。如果你不想改训练代码也可以用数据增强把少数类复制扩充但我的实测感受是类别加权更省事效果也更可控。4.2 过拟合训练集99%验证集不忍直视163个类别的情况下如果某些类别只有三五十张图模型非常容易记住训练样本而不是学会泛化。最典型的表现是训练集准确率很快就接近100%验证集准确率却卡在某个上不去的水平。我的处理手段有三个第一开启早停逻辑连续5个epoch验证集准确率没有提升就停止训练避免后期过拟合加剧。第二在数据增强里加入随机旋转、颜色抖动、随机裁剪扩大训练样本的有效分布空间。第三把模型保存策略改成只在验证集准确率刷新时保存防止把过拟合状态下的权重留到最后。这套组合拳打下来训练集和验证集的准确率差距从二十多个百分点缩小到了个位数。4.3 中文路径和编码问题这是我最开始踩的一个坑。在Windows下运行ImageFolder读取中文目录名时偶尔会出现编码错误导致数据加载直接中断。后来我把代码里的路径读取全部改成了pathlib.Path同时确保labels.txt以UTF-8无BOM格式保存问题就消失了。还有一个小细节如果推理阶段的中文类别名来自不同操作系统可能会出现字符编码不一致导致的匹配失败。我的建议是在项目里统一用英文标识作为内部类别名中文名只做最后的展示映射这样能省掉一大半编码相关的麻烦。5. 基于数据集还能做什么扩展5.1 从分类任务扩展到目标检测如果你需要的不只是判断图片里是什么药材而是要在柜台上同时框出多味药材的位置那这份数据集的图片完全可以作为检测任务的基础素材。流程是先用LabelImg或Roboflow手工标注目标框导出成VOC格式再转换成YOLO格式用YOLOv5或YOLOv8训练检测模型。分类数据集转检测数据集最耗时的是标注环节不是模型训练。如果觉得从零标注工作量大可以先挑十来个最容易混淆的类别做小规模检测验证跑通流程后再逐步扩展。我实测过YOLO系列在中药柜场景下能取得不错的效果前提是目标框标注别太随意边界框要把药材主体完整框住。5.2 细粒度识别与质量分级中草药识别里更进阶的方向是同一种药、不同产地等级怎么分。这个需求在中药材交易中非常常见但公开数据几乎没有。你可以用这份163类数据集做基础预训练再单独收集同一个品种下不同产地、不同等级的图片做迁移学习。由于模型已经在这份数据上学到了大量药材纹理、颜色、形态特征迁移到新任务后收敛速度会快很多。实际操作时把最后一层全连接替换成新的分类头冻结前面的backbone先训练几个epoch再解冻整体微调效果通常比直接全部重新训练要好。我自己在类似的细粒度任务上试过这种预训练微调的方式数据量只需要从头训练的几分之一就能达到可用水平。5.3 多标签分类与以图搜药如果一张图片里同时出现多种药材单标签分类就不够用了。改造方式不复杂把最后一层的输出从softmax改成sigmoid损失函数换成BCE Loss标签改成多热编码。这样做的好处是模型可以同时输出多个可能类别更贴近真实场景。另外把最后一层改成Embedding输出配合向量检索库还能做成以图搜药的检索系统。用户拍一张药材照片系统返回相似度最高的几种药材及其用途说明这在科普、教育、药店辅助识别场景下都有实际价值。我个人跑完整套流程后最大的感受是一个垂直领域的数据集加一份能跑的源码带来的价值远比想象中大。中草药识别看似小众但背后的细粒度图像分类、类间混淆处理、数据增强策略和很多真实业务场景遇到的问题是一致的。建议拿到这份数据集的读者别只满足于把训练脚本跑通花点时间分析一下哪些类别容易混淆、哪些类别样本不足然后针对性地优化这个过程学到的东西比结果本身值钱得多。最后再分享一个小技巧训练前把每个类别的样本量统计出来打印成表格你就能对模型应该在哪些类别上重点加强有清晰的判断这一张统计表可以帮你省下大量试错时间。本文还有配套的精品资源点击获取
返回列表