新闻详情

新闻详情

首页 / 资讯中心 / 详情

花卉识别数据集与训练代码:64类32000张图,37种模型一键切换

发布时间:2026/10/2 8:41:26来源:尧图网络
花卉识别数据集与训练代码:64类32000张图,37种模型一键切换
简介这份资源面向深度学习图像分类的入门与进阶学习者提供一套可直接上手的花卉识别完整方案解决从数据获取到模型训练的全流程问题。数据集中包含64种花卉、共32000张224×224彩色图像按4:1划分为25600张训练集与6400张测试集全部为手机实地采集非网络爬虫图类别均衡且贴近真实拍摄场景。配套训练代码针对图像分类任务设计实现了resnet、vgg、inception、mobilenet、densenet、efficientnet、squeezenet等37种主流模型可自由切换骨干网络进行对比实验。压缩包共2000个文件以1919张jpg图像为主体辅以39个txt说明、20个py训练脚本及22个pyc缓存文件整体约194.92MB目录结构清晰便于按类别检索。目前已有1646人学习下载适合希望快速复现分类基线、验证模型效果或开展迁移学习实验的读者参考使用。1. 花卉识别数据集与训练代码64 类 32000 张图能直接跑出什么手机拍的花和网络爬虫图混在一起训模型是花卉识别翻车率最高的场景之一。这份资源恰好绕开了这个坑64 种花卉、32000 张 224×224 彩色图像全部手机实地采集训练集 25600 张、测试集 6400 张按 8:2 切好。配套代码实现了 37 种主流图像分类网络resnet、vgg、inception、mobilenet、densenet、efficientnet、squeezenet 七个系列全覆盖换模型只改一个字符串。适合两类人想入门深度学习图像分类但缺干净数据的新手以及需要快速对比 backbone 效果、不想自己洗数据的从业者。下面按「数据长什么样 → 怎么跑起来 → 怎么换模型调参 → 坑在哪 → 怎么验证」的顺序拆开讲。2. 数据集结构与训练代码的目录约定先对齐路径再谈训练2.1 文件名编码规则与类别映射先看项目正文里那串文件名017-001-03549.jpg、024-001-03397.jpg、035-001-02985.jpg。这不是随机命名常见做法是「类别 ID - 采集批次 - 序号」三段式。017代表第 17 类花卉001是采集批次03549是批次内序号。这种命名方式的好处是类别信息直接编码在文件名里不需要额外的 label 文件写个正则就能生成标注。import os import re from collections import defaultdict # 按文件名前缀解析类别适配 类别ID-批次-序号.jpg 格式 def build_label_map(img_dir): pattern re.compile(r^(\d)-(\d)-(\d)\.jpg$) label_map defaultdict(list) for fname in os.listdir(img_dir): m pattern.match(fname) if m: cls_id int(m.group(1)) # 第一段是类别 ID label_map[cls_id].append(fname) return label_map label_map build_label_map(./flowers/train) print(f类别数: {len(label_map)}) print(f总图片数: {sum(len(v) for v in label_map.values())}) # 预期输出: 类别数 64, 总图片数 25600这段代码的逻辑很直白用正则把文件名拆成三段第一段转成整数当类别标签后面两段只做唯一性保证。参数上唯一需要注意的是正则里的\d要跟实际文件名段数对齐如果拿到手的文件名是017_001_03549.jpg这种下划线分隔把-换成_即可。跑完这步你会得到 64 个类别、25600 张训练图的统计跟摘要里的数字对得上说明数据完整。2.2 训练/测试目录的两种组织方式图像分类数据集在磁盘上通常有两种摆法这份资源大概率是第一种组织方式目录结构适用场景按类别分文件夹train/017/xxx.jpgImageFolder 直接读最省事按文件名编码train/017-001-03549.jpg需要自定义 Dataset 解析文件名如果是第一种PyTorch 的ImageFolder一行就能加载如果是第二种就得像上面那样自己写 Dataset。我一般会先跑一段探测代码确认到底是哪种避免后面 DataLoader 报「Found 0 files」这种低级错误。import os def detect_layout(root): subdirs [d for d in os.listdir(root) if os.path.isdir(os.path.join(root, d))] files [f for f in os.listdir(root) if f.endswith(.jpg)] if len(subdirs) 10 and len(files) 0: return folder_per_class # 按类别分文件夹 elif len(files) 100: return filename_encoded # 文件名编码类别 return unknown print(detect_layout(./flowers/train))判断依据是子目录数量和根目录下 jpg 文件数量的对比。64 个类别的话子目录数会接近 64如果是文件名编码根目录下会直接躺着上万张图。这一步花 10 秒能省掉后面半小时的调试。2.3 训练代码的模型注册机制37 种模型能自由切换背后一定有个模型注册表。常见做法是用字典把模型名映射到构造函数或者用装饰器注册。不管哪种你只需要知道改哪个字段能换模型。典型入口长这样# 伪代码示意实际字段名以资源内代码为准 MODEL_ZOO { resnet18: build_resnet18, resnet50: build_resnet50, vgg16: build_vgg16, mobilenet_v2: build_mobilenet_v2, efficientnet_b0: build_efficientnet_b0, # ... 共 37 种 } parser.add_argument(--model, typestr, defaultresnet50, choiceslist(MODEL_ZOO.keys()))参数说明--model控制 backbonechoices限制了合法值传错会直接报错而不是静默失败这点比很多野代码强。--num_classes要设成 64--img_size保持 224--batch_size看显存8GB 卡上 resnet50 大概能跑 3264。这些参数在资源内的训练脚本里应该都有默认值先按默认跑通再调。3. 从零跑通一次训练环境、命令与日志解读3.1 环境依赖与版本对齐深度学习项目最玄学的问题就是版本不兼容。这份代码涉及 torch、torchvision、timm如果用了预训练权重库、numpy、Pillow 这几个核心包。我一般会先建虚拟环境再装避免污染系统 Python。conda create -n flower_cls python3.9 -y conda activate flower_cls # 按 CUDA 版本装 torch下面以 CUDA 11.8 为例 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install numpy pillow tqdm tensorboard scikit-learn参数说明python3.9是兼容性最好的版本3.10 有时会遇到某些包没轮子。cu118要跟你nvidia-smi显示的 CUDA 版本匹配不匹配会装成 CPU 版训练速度差几十倍。装完跑一句python -c import torch; print(torch.cuda.is_available())输出True才算对。3.2 启动训练与关键参数假设资源内主训练脚本叫train.py典型启动命令python train.py \ --data_root ./flowers \ --model resnet50 \ --num_classes 64 \ --img_size 224 \ --batch_size 32 \ --epochs 50 \ --lr 0.001 \ --weight_decay 1e-4 \ --pretrained \ --output_dir ./runs/resnet50_exp1逐个说--pretrained决定是否加载 ImageNet 预训练权重花卉识别这种中等规模数据强烈建议开收敛快且精度高。--lr 0.001是 Adam 的常用值如果换 SGD 要降到 0.01 并加 momentum。--epochs 50对 25600 张图、resnet50 来说大概能收敛mobilenet 这种轻量模型可以加到 80。--output_dir分开存方便对比不同 backbone。3.3 训练日志里该盯哪几个数跑起来之后终端会刷 loss 和 acc但真正要盯的是这四个train_loss持续下降是正常震荡说明 lr 偏大或 batch 太小val_acc第 5 个 epoch 还没超过 60% 就要查数据加载对不对lr如果用了 cosine 或 step 调度看它有没有按预期衰减gpu_mem接近显存上限时降 batch_size别等 OOM 崩掉# 用 tensorboard 看曲线比盯终端直观 tensorboard --logdir ./runs --port 6006如果 val_acc 卡在 1/64 附近约 1.5%基本可以断定标签没对上回去查 2.1 的类别解析。如果 train_loss 不降先确认--pretrained有没有生效再检查 lr 是不是被设成了 0。4. 换模型与调参37 种 backbone 怎么选、怎么改4.1 七个系列的选型逻辑37 种模型不是让你全试一遍而是按场景挑。我把七个系列的核心差异列成表系列代表模型参数量适用场景224 输入下的精度倾向resnetresnet18/5011M/25M通用首选稳高vggvgg16138M精度够但慢显存杀手中高inceptioninception_v327M多尺度特征适合花朵高mobilenetmobilenet_v2/v33.4M/5.4M端侧部署速度快中densenetdensenet1218M特征复用强小数据友好高efficientnetefficientnet_b05.3M精度/参数量比最优高squeezenetsqueezenet1_01.2M极致轻量精度妥协中低花卉识别的特点是类间差异小比如不同品种的玫瑰、类内差异大同一朵花不同角度所以多尺度特征和强特征复用更吃香。我的经验是先跑 resnet50 和 efficientnet_b0 各一轮做 baseline再根据部署需求决定要不要换 mobilenet。4.2 换模型时最容易漏改的三处换 backbone 不是改个字符串就完事有三处经常被忽略# 1. 分类头输入维度要跟 backbone 输出对齐 # resnet 系列输出 2048mobilenet 输出 1280写死会报错 num_features model.classifier.in_features # 动态获取 model.classifier nn.Linear(num_features, 64) # 2. 输入尺寸归一化参数不同 # ImageNet 均值方差对大多数预训练模型通用但 inception 要求 299 transform transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), # inception 要改成 299 transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]), ]) # 3. 学习率要跟着模型大小调 # 大模型用小 lr小模型可以大一点 lr_map {resnet50: 1e-3, mobilenet_v2: 3e-3, vgg16: 5e-4}第一处是维度对齐动态获取in_features最保险。第二处是输入尺寸inception 系列默认 299×299硬塞 224 会掉点。第三处是 lr大模型参数量大lr 大了容易震荡。4.3 冻结与微调的策略如果数据量不大或者想快速验证可以先冻结 backbone 只训分类头几个 epoch 后再解冻全量微调# 阶段一冻结 backbone for param in model.parameters(): param.requires_grad False for param in model.classifier.parameters(): param.requires_grad True # 训 5 个 epochlr 可以设大点 1e-2 # 阶段二解冻全量 for param in model.parameters(): param.requires_grad True # 换小 lr 1e-4 继续训这种两阶段策略在花卉这种中等规模数据上通常比直接全量微调快 20%30% 达到相同精度。参数上阶段一的 lr 可以大胆用 1e-2因为只训分类头阶段二必须降到 1e-4 量级否则预训练权重会被冲掉。5. 避坑与排查训练不收敛、精度虚高、显存爆炸的五个现场5.1 现象val_acc 一直卡在 1.5% 不动原因标签映射错了所有图被当成同一类或者类别 ID 解析时把017当成了字符串导致排序错乱。解决跑 2.1 的统计代码确认len(label_map) 64且每个类别的图片数大致均衡25600/64 400 张左右。如果某个类别只有几十张说明文件名解析漏了。5.2 现象train_acc 99% 但 val_acc 只有 40%原因训练集和测试集有重叠或者测试集被污染。这份资源是官方切好的 25600/6400但如果你自己重新划分时用了随机切分且没固定种子可能把同一张图的不同增强版本分到了两边。解决检查训练集和测试集的文件名有没有交集用集合运算一秒确认。train_files set(os.listdir(./flowers/train)) test_files set(os.listdir(./flowers/test)) overlap train_files test_files print(f重叠文件数: {len(overlap)}) # 必须是 05.3 现象跑到第 3 个 epoch 突然 OOM原因显存碎片累积或者某个 batch 的图片尺寸异常大。虽然数据集标称 224×224但手机采集图可能有少数没 resize 干净。解决在 Dataset 的__getitem__里强制 resize并加一句尺寸断言。def __getitem__(self, idx): img Image.open(self.paths[idx]).convert(RGB) img img.resize((224, 224)) # 强制统一尺寸 assert img.size (224, 224) # ... 后续 transform5.4 现象换 mobilenet 后精度掉 10 个点原因mobilenet 的深度可分离卷积对 lr 更敏感沿用 resnet 的 lr 会欠拟合。解决把 lr 提到 3e-3并把 warmup 加上前 3 个 epoch 线性升温。5.5 现象tensorboard 曲线正常但最终测试精度对不上原因训练时用的是 val_acc最终报告用的是 test_acc两者如果差太多说明验证集和测试集分布不一致。解决确认资源里的 6400 张测试集是独立采集的不要拿验证集当测试集报数。我一般会在训练结束后单独跑一遍evaluate.py用测试集出最终数字。6. 验证与进阶用混淆矩阵和 TTA 把精度再压榨 2 个点训练跑完拿到模型只是开始真正判断这份资源好不好用得看它在 64 类上的细粒度表现。花卉识别里最容易混的是同属不同种的花比如各种月季和玫瑰整体 acc 高不代表每个类都好。我习惯先出一张混淆矩阵找出最差的 5 个类再针对性处理。import torch import numpy as np from sklearn.metrics import confusion_matrix, classification_report import seaborn as sns import matplotlib.pyplot as plt model.eval() all_preds, all_labels [], [] with torch.no_grad(): for imgs, labels in test_loader: imgs imgs.cuda() outputs model(imgs) preds outputs.argmax(dim1).cpu().numpy() all_preds.extend(preds) all_labels.extend(labels.numpy()) cm confusion_matrix(all_labels, all_preds) print(classification_report(all_labels, all_preds, digits4)) # 画出最差的 10 个类 per_class_acc cm.diagonal() / cm.sum(axis1) worst np.argsort(per_class_acc)[:10] print(最差类别:, worst, 对应精度:, per_class_acc[worst])这段代码的逻辑是先跑完整个测试集收集预测结果再用 sklearn 出分类报告和混淆矩阵。classification_report里的f1-score比单纯看 acc 更有参考价值因为 64 类如果某类样本少acc 会被大类带偏。参数上digits4保留四位小数方便对比不同模型的细微差异。找到弱类之后有两个不用重训就能提点的技巧。第一个是 TTA测试时增强对同一张图做水平翻转、多尺度裁剪把多次预测平均def tta_predict(model, img, n_crops5): model.eval() preds [] with torch.no_grad(): # 原图 preds.append(torch.softmax(model(img.unsqueeze(0).cuda()), dim1)) # 水平翻转 preds.append(torch.softmax(model(torch.flip(img, [2]).unsqueeze(0).cuda()), dim1)) # 多尺度 for scale in [0.9, 1.1]: h, w img.shape[1:] resized torch.nn.functional.interpolate( img.unsqueeze(0), size(int(h*scale), int(w*scale)), modebilinear, align_cornersFalse) resized torch.nn.functional.interpolate( resized, size(h, w), modebilinear, align_cornersFalse) preds.append(torch.softmax(model(resized.cuda()), dim1)) return torch.stack(preds).mean(dim0)TTA 在花卉这种对翻转和尺度敏感的任务上通常能涨 12 个点代价是推理时间翻几倍适合离线评估不适合实时服务。第二个技巧是类别权重平衡如果混淆矩阵显示某几个类互相混得厉害可以在 loss 里给这些类加权# 根据混淆矩阵给难分类别更高权重 class_weights torch.ones(64).cuda() for cls in worst: class_weights[cls] 2.0 # 难类权重翻倍 criterion nn.CrossEntropyLoss(weightclass_weights)这两个技巧叠加在 resnet50 baseline 上一般能把 top-1 acc 从 85% 左右推到 88%90%。但要注意别过拟合测试集调完权重后最好再留一份从未看过的数据做最终验证。从那以后我每次拿到新数据集都强制先跑一遍类别统计和训练/测试重叠检查再开始训模型。这两个检查加起来不到 5 分钟但能挡掉后面几小时的无效训练。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

金融企业AI文档审核:从合同比对到信息提取的落地实践 2026/10/2 9:19:45

金融企业AI文档审核:从合同比对到信息提取的落地实践

1. 为什么金融企业需要AI文档审核大部分银行、券商、保险公司的合规部门,至今还靠人力干着一件极其枯燥的事:一审合同、二审表单、三录数据。部门几十个人,每天对着几百份合同和表单做交叉核对,眼睛看花不算,漏检和错检…

阅读更多 →
Codex插件精选:10个提升开发效率的必备工具 2026/10/2 9:19:32

Codex插件精选:10个提升开发效率的必备工具

1. 为什么我最终只留下了这 10 个 Codex 插件1.1 从“装了一堆”到“只留十个”的筛选逻辑刚接触 Codex 那阵子,我跟很多人一样,看到插件市场里琳琅满目的东西就手痒,恨不得把首页推荐的全都点一遍安装。结果呢?IDE 启动慢得像老牛…

阅读更多 →
基于2200张YOLO数据集的疼痛识别模型训练与部署实战 2026/10/2 9:19:32

基于2200张YOLO数据集的疼痛识别模型训练与部署实战

疼痛识别这件事,说穿了就是把"人脸上那些说不清道不明的难受"翻译成机器能读懂的位置坐标。我最早接触这个方向是在做术后监护的辅助工具,当时护士站的同事抱怨说,病人疼不疼全靠经验和问询,夜里巡房根本看不过来。后来…

阅读更多 →
基于YOLO的手机检测实战:2800张数据集微调与部署全流程 2026/10/2 9:19:32

基于YOLO的手机检测实战:2800张数据集微调与部署全流程

1. 手机检测数据集的项目背景与核心价值 1.1 为什么手机检测是一个被低估的刚需场景 做目标检测这行的朋友都有一个共识:通用数据集好找,垂直场景的数据集难求。COCO、VOC这些经典数据集里确实有手机这个类别,但你去翻一翻就会发现&#xff…

阅读更多 →
Paperclip:本地AI工作流胶合层,React+Node.js直连Claude与OpenClaw 2026/10/2 9:19:25

Paperclip:本地AI工作流胶合层,React+Node.js直连Claude与OpenClaw

1. 项目概述:Paperclip 是什么,它解决的到底是什么问题? Paperclip 这个名字乍一听容易让人联想到办公用品——回形针。但放在当前技术语境下,尤其结合你提供的热搜词组合(Node.js、React、OpenClaw、Claude&#xff0…

阅读更多 →
Android垂钓服务App开发实战:地图、天气与社区模块全解析 2026/10/2 9:19:18

Android垂钓服务App开发实战:地图、天气与社区模块全解析

前年我完成毕业设计时,选的就是“基于Android的垂钓服务App设计与实现”这个题目。题目前面的“12299”是学校毕设选题系统的编号,跟技术本身没多大关系,可以忽略。当时答辩前不少同学都跑来问我:钓鱼也能做成App?能实…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉