新闻详情

新闻详情

首页 / 资讯中心 / 详情

真实废弃物九分类数据集实战:从4800张图到可训练管线

发布时间:2026/9/28 2:15:46来源:尧图网络
真实废弃物九分类数据集实战:从4800张图到可训练管线
简介本资源为面向计算机视觉初学者与图像分类实践者的真实废弃物图像分类数据集覆盖纸板、食品有机物、玻璃、金属、杂项垃圾、纸张、塑料、纺织品垃圾和植被共9个类别适合用于分类网络训练、迁移学习验证及垃圾分类相关课程设计。数据已完成预处理可直接作为分类网络输入并已划分训练集与测试集各类别图片分目录存放便于快速构建实验流程。压缩包共约2000个文件以1998张jpg图像为主另含1个json标注文件与1个Python可视化脚本整体约155.99MB运行show脚本即可直观查看样本分布与图像内容。目前已有65人学习下载配套内容还涉及图像分类与分割网络改进思路可帮助读者在真实场景数据上完成模型训练、效果对比与调参排错积累从数据读取到结果可视化的完整实践经验。1. 真实废弃物九分类数据集从 4800 张图到能跑通的训练管线手里拿到一份标注好的废弃物图像分类数据集第一反应往往不是兴奋而是先确认三件事类别定义清不清楚、划分有没有泄漏、预处理到底做到哪一步。这份数据集给的是约 4800 张生活中真实拍摄的废弃物图片分 9 类——纸板、食品有机物、玻璃、金属、杂项垃圾、纸张、塑料、纺织品垃圾和植被训练集与测试集已经按同一类别分目录存放还附带一个可视化脚本。它解决的是「我不想从零爬图、清洗、标注只想把精力放在模型结构和调参上」这个诉求适合做图像分类课程设计、毕业项目、分类网络改进对比或者拿它当 backbone 预训练的小规模验证集。文件名像 Vegetation_110.jpg、Vegetation_109.jpg 这种说明每张图带类别前缀肉眼就能对上标签省掉一轮核对成本。2. 数据集结构与标签体系先看清 9 类怎么分、json 里存了什么2.1 目录组织与类别映射这份资源的核心不是图片本身而是「图片 划分 标签」三件套是否自洽。常见做法是根目录下放 train 和 test 两个文件夹每个文件夹里再按类别名建子目录图片直接躺在对应类别目录下。这种结构对 PyTorch 的 ImageFolder 和 TensorFlow 的 image_dataset_from_directory 都是开箱即用不需要自己写解析逻辑。类别一共 9 个中文和英文的对应关系建议在代码里显式写死别依赖目录名自动推断否则换台机器、换个解压工具中文目录名编码一变就翻车。我一般会建一个 class_names 列表顺序固定后面混淆矩阵、分类报告都按这个顺序来。import os import json # 固定类别顺序避免依赖目录遍历顺序 class_names [ cardboard, # 纸板 food_organic, # 食品有机物 glass, # 玻璃 metal, # 金属 misc_trash, # 杂项垃圾 paper, # 纸张 plastic, # 塑料 textile, # 纺织品垃圾 vegetation, # 植被 ] data_root ./waste_dataset for split in [train, test]: split_dir os.path.join(data_root, split) print(f--- {split} ---) for cls in class_names: cls_dir os.path.join(split_dir, cls) if os.path.isdir(cls_dir): n len([f for f in os.listdir(cls_dir) if f.lower().endswith((.jpg, .jpeg, .png))]) print(f{cls:15s}: {n}) else: print(f{cls:15s}: 目录缺失)这段代码做的是逐类计数逻辑很直白遍历 train/test 下每个类别目录统计图片扩展名匹配的文件数。参数上唯一要注意的是扩展名集合有些数据集混了 .JPG 大写后缀用 lower() 统一处理。跑完如果某一类数量明显偏少比如个位数先别急着训练大概率是解压不完整或者类别目录名和 class_names 对不上。json 文件里通常存的是类别索引到类别名的映射以及可能的划分清单。建议先把它读出来打印一遍确认索引顺序和你代码里的 class_names 一致。索引错位是分类任务里最隐蔽的坑之一训练 loss 正常下降但验证准确率永远上不去因为标签全错位了。2.2 可视化脚本怎么用、看什么资源里带了 show 脚本这类脚本一般做两件事随机抽样展示每个类别的图片或者把整个 batch 拼成网格。它的价值不在于好看而在于让你在训练前用眼睛过一遍数据质量——有没有标错的、有没有几乎全黑的、有没有同一张图重复出现在 train 和 test 里。import os import random import matplotlib.pyplot as plt from PIL import Image def show_samples(data_root, class_names, splittrain, n_per_class4): fig, axes plt.subplots(len(class_names), n_per_class, figsize(n_per_class * 2.5, len(class_names) * 2.5)) for i, cls in enumerate(class_names): cls_dir os.path.join(data_root, split, cls) if not os.path.isdir(cls_dir): continue imgs [f for f in os.listdir(cls_dir) if f.lower().endswith((.jpg, .jpeg, .png))] picked random.sample(imgs, min(n_per_class, len(imgs))) for j in range(n_per_class): ax axes[i][j] ax.axis(off) if j len(picked): img Image.open(os.path.join(cls_dir, picked[j])) ax.imshow(img) ax.set_title(cls, fontsize8) plt.tight_layout() plt.show() show_samples(./waste_dataset, class_names, splittrain, n_per_class4)逻辑是按类别逐行铺图每类随机抽 n_per_class 张。random.sample 保证不重复抽样min() 防止某类图片不足时报错。看的时候重点盯三样类别边界模糊的纸张和纸板、塑料和杂项垃圾最容易混、背景干扰大的、以及明显不属于该类却被标进去的。这一步花十分钟后面能省几小时排查。提示如果 show 脚本依赖的库没装全先 pip install matplotlib pillow别直接改脚本逻辑。3. 把数据喂进分类网络预处理、增强与 DataLoader 参数怎么定3.1 预处理对齐别让「已预处理」变成想当然摘要里说数据经过预处理、可直接作为分类网络输入这句话要拆开理解。常见做法是图片已经统一到某个尺寸比如 224×224 或 256×256但归一化用的均值和方差未必和你选的预训练权重匹配。如果你用 ImageNet 预训练 backbone就该用 ImageNet 的 mean[0.485,0.456,0.406]、std[0.229,0.224,0.225]如果数据本身已经做过零均值化再套一层反而把分布搞乱。我的习惯是先抽一张图打印它的像素范围判断到底有没有归一化过。import numpy as np from PIL import Image img Image.open(./waste_dataset/train/plastic/Plastic_12.jpg).convert(RGB) arr np.array(img) print(shape:, arr.shape) print(min/max:, arr.min(), arr.max()) print(mean/std per channel:, arr.mean(axis(0, 1)), arr.std(axis(0, 1)))如果 min/max 在 0~255 之间说明还是原始像素需要自己做归一化如果已经在 0~1 或接近零均值就按实际情况调整 transform。参数上shape 还能告诉你图片是否已经 resize 过——如果全是统一尺寸说明预处理做了缩放你只需要补归一化和增强。3.2 训练/验证 transform 与增强策略废弃物图像的特点是类内差异大同一个塑料瓶捏扁的和没捏扁的、干净的和脏的视觉差异可能比塑料和玻璃之间还大。所以增强不能太保守但也不能上那些会改变类别语义的操作比如大角度旋转对方向敏感的类别就不合适。from torchvision import transforms train_tf transforms.Compose([ transforms.Resize((256, 256)), transforms.RandomResizedCrop(224, scale(0.7, 1.0)), transforms.RandomHorizontalFlip(p0.5), transforms.ColorJitter(brightness0.2, contrast0.2, saturation0.2), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]), ]) val_tf transforms.Compose([ transforms.Resize((256, 256)), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]), ])逐项说参数RandomResizedCrop 的 scale(0.7,1.0) 表示随机裁原图 70%~100% 的区域再缩放模拟拍摄距离变化水平翻转对废弃物类别安全因为左右镜像不改变类别ColorJitter 三个系数控制在 0.2是为了模拟不同光照和相机白平衡再大就可能把浅色塑料和纸张的色差抹掉。验证集只做 resize centercrop保证评估可复现。3.3 DataLoader 与类别不均衡处理约 4800 张分 9 类平均每类 500 多张但真实数据集很少完全均衡。先统计每类数量再决定要不要加权采样。from torch.utils.data import DataLoader from torchvision.datasets import ImageFolder train_ds ImageFolder(./waste_dataset/train, transformtrain_tf) val_ds ImageFolder(./waste_dataset/test, transformval_tf) # 统计训练集类别分布 from collections import Counter targets [s[1] for s in train_ds.samples] cnt Counter(targets) print(类别分布:, {train_ds.classes[k]: v for k, v in sorted(cnt.items())}) train_loader DataLoader(train_ds, batch_size32, shuffleTrue, num_workers4, pin_memoryTrue) val_loader DataLoader(val_ds, batch_size32, shuffleFalse, num_workers4, pin_memoryTrue)ImageFolder 会自动按目录名排序生成 classes所以务必确认它的顺序和你的 class_names 一致不一致就手动传 class_to_idx 或训练后重映射。batch_size32 在 224 分辨率下对 8G 显存比较稳显存紧就降到 16 并配合梯度累积。num_workers 在 Windows 上如果报错就设 0这是老问题了。如果某类样本数不到最多的 1/3建议用 WeightedRandomSampler 做加权采样比直接复制图片干净。4. 训练与评估从 baseline 到混淆矩阵把 9 类问题定位清楚4.1 一个能跑通的 baseline 训练循环别一上来就上 Transformer 或改结构先用 ResNet18 或 EfficientNet-B0 跑一个 baseline确认数据管线没问题。baseline 准确率就是你的下限参照。import torch import torch.nn as nn from torchvision import models device torch.device(cuda if torch.cuda.is_available() else cpu) model models.resnet18(weightsmodels.ResNet18_Weights.IMAGENET1K_V1) model.fc nn.Linear(model.fc.in_features, 9) # 9 类 model model.to(device) criterion nn.CrossEntropyLoss() optimizer torch.optim.AdamW(model.parameters(), lr3e-4, weight_decay1e-4) scheduler torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max20) for epoch in range(20): model.train() for imgs, labels in train_loader: imgs, labels imgs.to(device), labels.to(device) optimizer.zero_grad() loss criterion(model(imgs), labels) loss.backward() optimizer.step() scheduler.step() print(fepoch {epoch1} done)关键参数lr3e-4 配 AdamW 是微调预训练模型的常用起点weight_decay1e-4 抑制过拟合CosineAnnealingLR 让学习率平滑衰减T_max 设成总 epoch 数。如果 loss 前几个 epoch 不降先查标签错位和归一化而不是急着调 lr。4.2 混淆矩阵与分类报告定位到底哪两类在混准确率是个笼统指标9 类任务里真正有价值的是混淆矩阵。纸张和纸板、塑料和杂项垃圾这两组是最容易互相误判的。from sklearn.metrics import confusion_matrix, classification_report import numpy as np model.eval() all_preds, all_labels [], [] with torch.no_grad(): for imgs, labels in val_loader: imgs imgs.to(device) preds model(imgs).argmax(dim1).cpu().numpy() all_preds.extend(preds) all_labels.extend(labels.numpy()) print(classification_report(all_labels, all_preds, target_namestrain_ds.classes, digits4)) cm confusion_matrix(all_labels, all_preds) print(cm)classification_report 给出每类的 precision/recall/f1混淆矩阵则直接暴露「A 被预测成 B」的次数。如果纸张和纸板互相误判严重说明模型没学到材质和纹理差异可以考虑加更强的颜色增强或换更高分辨率输入如果杂项垃圾 recall 特别低多半是这一类本身定义就杂样本之间缺乏共性属于数据集层面的问题调模型收益有限。注意评估时一定要用 test 集别拿 train 集算指标自欺欺人。如果 test 准确率远低于 train先怀疑划分泄漏——同一张图或高度相似的连拍图同时出现在两边。5. 避坑与排查这份数据集最容易翻车的五个地方5.1 现象训练 loss 正常降验证准确率卡在 11% 左右原因9 类随机猜的准确率就是约 11%说明模型没学到任何东西。最常见的是标签索引错位——ImageFolder 按目录名字母序生成索引和你代码里的 class_names 顺序不一致导致标签和预测对不上。解决训练前打印 train_ds.class_to_idx和你的 class_names 逐项核对。不一致就显式构造 ImageFolder 的 class_to_idx 参数或者在算指标前做一次索引重映射。5.2 现象某一类 recall 接近 0其他类都正常原因这一类样本数太少或者图片格式损坏导致加载时被跳过。也有可能是该类目录名有隐藏字符比如末尾空格ImageFolder 识别成了一个独立类别。解决逐类计数确认没有异常小的类用 PIL 批量打开一遍捕获异常文件检查目录名是否有多余空格或不可见字符。5.3 现象Windows 上 num_workers0 直接报错或卡死原因Windows 下多进程 DataLoader 需要 ifname main 保护且对某些环境兼容性差。解决把 num_workers 设为 0 先跑通确认管线无误后再尝试 2 或 4。训练脚本入口加 main 保护。5.4 现象验证集准确率虚高换一批图就崩原因train 和 test 里存在重复图或高度相似图模型记住了而不是学会了。解决对 train 和 test 做一次感知哈希去重或者至少用文件名和图片尺寸粗筛。发现重复就重新划分别心疼。5.5 现象显存够但训练速度异常慢原因图片没被缓存每个 epoch 都在反复解码大图或者 num_workers 设太小GPU 一直在等数据。解决确认图片是否已 resize 到合理尺寸224~256 足够必要时预先把所有图转成统一尺寸的 lmdb 或 npy 缓存num_workers 调到 CPU 核数的 1/2 左右pin_memoryTrue。6. 进阶技巧用分层采样和 TTA 把 9 类准确率再抬一截baseline 跑通之后想再往上抬点准确率不一定非要换大模型。两个成本低、见效稳的技巧值得试分层划分验证集和测试时增强TTA。先说分层采样。如果 test 集本身类别不均衡单次评估的波动会很大今天 82% 明天 79%你根本分不清是模型变了还是评估噪声。用 StratifiedKFold 从 train 里切出一份分层验证集保证每类比例一致评估才稳定。from sklearn.model_selection import StratifiedKFold import numpy as np targets np.array([s[1] for s in train_ds.samples]) skf StratifiedKFold(n_splits5, shuffleTrue, random_state42) for fold, (tr_idx, va_idx) in enumerate(skf.split(np.zeros(len(targets)), targets)): print(ffold {fold}: train {len(tr_idx)}, val {len(va_idx)}) # 用 Subset 构造 train/val 子集再包 DataLoader逻辑是用标签做分层每折里各类比例和整体一致。random_state 固定保证可复现。实际训练时取 5 折平均指标比单次划分可信得多。再说 TTA。推理时对同一张图做几次轻微变换原图、水平翻转、小尺寸缩放把 softmax 概率平均后再取 argmax。对废弃物这种类内差异大的数据TTA 通常能带来 1~3 个点的提升代价只是推理时间翻几倍。def predict_tta(model, img_pil, tf_list, device): model.eval() probs [] with torch.no_grad(): for tf in tf_list: x tf(img_pil).unsqueeze(0).to(device) p torch.softmax(model(x), dim1).cpu().numpy()[0] probs.append(p) return np.mean(probs, axis0).argmax() # tf_list 里放 val_tf、水平翻转版、轻微缩放版参数上TTA 的变换要和训练增强同分布别用训练时没见过的强变换否则概率平均反而引入噪声。我一般只用原图 水平翻转两种性价比最高。最后说个习惯。这份数据集类别边界天然模糊纸张和纸板、塑料和杂项垃圾的混淆很难完全消除。与其死磕准确率不如把混淆矩阵里误判最多的那几对单独拎出来看看是不是标注本身就有歧义。从那以后我每次拿到分类数据集都强制先跑一遍逐类计数加混淆矩阵再决定要不要动模型——数据层面的问题模型再深也救不回来。希望这份拆解帮到你把 4800 张图真正跑成能写进项目里的结果。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

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

较早相关资讯

最新相关资讯

手腕骨折检测:YOLOv8引入注意力机制的完整实战指南 2026/9/28 3:05:52

手腕骨折检测:YOLOv8引入注意力机制的完整实战指南

简介:面向医学影像分析与计算机视觉开发者,这是一套基于Pytorch与YOLOv8、融合注意力机制的手腕骨折检测实战项目。在传统YOLOv8基础上引入注意力模块,使模型能聚焦腕部关键区域,提升骨折特征识别精度与效率,适用于辅助…

阅读更多 →
深度强化学习股票交易策略:从MDP设计到回测避坑指南 2026/9/28 3:05:52

深度强化学习股票交易策略:从MDP设计到回测避坑指南

简介:一套基于深度强化学习的自动化股票交易策略设计源码,面向量化研究者、金融分析师和具备Python基础的开发者,解决人工交易受情绪影响、难以适应市场动态变化的问题。项目用PPO、A2C、DDPG三种Actor-Critic算法训练交易代理,覆…

阅读更多 →
YOLOv8结合注意力机制的手腕骨折检测与部署实战 2026/9/28 3:05:45

YOLOv8结合注意力机制的手腕骨折检测与部署实战

简介:一份面向医学影像分析与计算机视觉开发者/学习者的手腕骨折检测实战资源,基于 Pytorch 与 YOLOv8,并引入注意力机制强化模型对骨折区域的关注,适用于快速搭建检测算法、开展医学图像识别实验或作为毕业设计参考。资源共 158 …

阅读更多 →
Operit 记忆空间 Profile 文档体系全解析:从全局 `user.md` 到“一空间一文档“的存储、迁移、运行时注入与独立配置 UI 2026/9/28 3:05:45

Operit 记忆空间 Profile 文档体系全解析:从全局 `user.md` 到“一空间一文档“的存储、迁移、运行时注入与独立配置 UI

AI Agent人工智能大模型AI 应用工具调用本地部署MCP ClientsAgent 记忆 【免费下载链接】Operit The most powerful AI agent and AI chat software on Android/Operit是一款Android上能力最为强大、发展最久的AI Agent 项目地址: https://gitcode.com/gh_mirrors/o…

阅读更多 →
better-sqlite3 贡献指南:从 C++ 原生插件到发布流程的完整协作规范 2026/9/28 3:05:45

better-sqlite3 贡献指南:从 C++ 原生插件到发布流程的完整协作规范

数据库嵌入式数据库 【免费下载链接】better-sqlite3 The fastest and simplest library for SQLite3 in Node.js. 项目地址: https://gitcode.com/gh_mirrors/be/better-sqlite3 点击查看 免费下载 本篇技术指南围绕 better-sqlite3 的官方贡献文档(do…

阅读更多 →
YOLO车辆检测数据集处理:从解压到训练的全流程指南 2026/9/28 3:05:45

YOLO车辆检测数据集处理:从解压到训练的全流程指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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