☰
12类垃圾分类图像数据集实战:从数据预处理到模型调优全流程解析
2026/10/16 11:02:52 网站建设 项目流程

简介:这是一份专为计算机视觉初学者与垃圾分类算法开发者设计的图像分类数据集,聚焦生活场景下的12类常见垃圾细粒度识别任务,可直接用于PyTorch ImageFolder加载、YOLOv5分类训练或模型微调等实践。资源共2000个文件,含1998张JPG格式标注图像(按train/test分目录组织,训练集12415张、验证集3100张),1个JSON类别字典文件(明确映射衣服、塑料、废纸等12类标签),以及1个开箱即用的可视化Python脚本——支持随机采样4图展示并自动保存结果,无需修改参数即可运行。压缩包大小231.04MB,采用7z格式,目录结构规范,符合标准分类数据集组织范式,省去数据清洗与路径重构环节。目前已有1366人学习下载,适合课程实验、Kaggle风格入门项目及环保AI应用原型开发。

1. 项目概述与核心价值

最近在整理一个挺有意思的数据集项目,是关于12种生活垃圾分类的图像数据。这个项目源自我之前参与的一个社区环保智能化的尝试,当时想做一个能帮助居民进行垃圾分类的小程序,核心就是需要一个足够“接地气”的图像识别模型。市面上公开的数据集要么类别太少,要么场景太单一(比如全是瓶瓶罐罐的摆拍),很难直接用到实际生活中。于是,我就自己动手,收集、清洗、标注了这套包含12个常见生活垃圾类别,并且已经划分好训练集和验证集的数据集。

这套数据集的核心价值,在于它瞄准了图像分类技术落地的一个非常具体的场景——城市生活垃圾分类。对于刚入门计算机视觉的朋友来说,MNIST、CIFAR-10这类经典数据集固然好,但练完手总想做个“有用”的东西。垃圾分类识别就是一个绝佳的练手兼实用的项目。它不像人脸识别或自动驾驶对精度和实时性要求那么严苛,但又比识别猫狗复杂一些,涉及细粒度分类(比如区分不同类型的塑料瓶和玻璃瓶),非常锻炼从数据准备到模型训练、调优的全流程能力。

数据集包含了纸类、塑料、玻璃、金属、厨余垃圾等12个核心类别,图像来源于真实的社区垃圾桶、投放点以及居民拍摄,背景复杂,光照条件多变,有的物品还有挤压、破损的情况,这比实验室里精心摆放的图片更贴近实际应用环境。我已经按大约8:2的比例做好了训练集和验证集的划分,解压即用,省去了大家最头疼的数据整理和划分时间。无论你是想用传统的ResNet、VGG练手,还是想尝试最新的Swin Transformer、ConvNeXt,甚至是部署到移动端的轻量级网络如MobileNet、ShuffleNet,这个数据集都能提供一个不错的基准。

2. 数据集深度解析:构成、特点与挑战

2.1 12类垃圾的界定与数据构成

首先明确一下这12个类别具体是什么。它们是根据我国常见的垃圾分类标准归纳的,但为了模型学习的可行性,进行了一些合并与细化:

  1. 可回收物-纸类:报纸、书本、纸箱、牛奶盒等。难点在于皱褶、沾湿的纸类形态变化大。
  2. 可回收物-塑料:矿泉水瓶、洗发水瓶、塑料餐盒、塑料袋。这是细粒度分类的重点,需要区分透明瓶、有色瓶、硬质塑料和软质薄膜。
  3. 可回收物-玻璃:酒瓶、调料瓶、碎玻璃。要特别注意安全,数据集中碎玻璃图像都做了显著标记,同时模型需学会识别瓶身上的标签和残留液体带来的干扰。
  4. 可回收物-金属:易拉罐、罐头盒、金属厨具。反光是主要干扰项,不同锈蚀程度也是特征之一。
  5. 厨余垃圾:剩菜剩饭、果皮、茶叶渣、骨头。这类图像视觉上最“不友好”,多为混合物,且形态黏稠,是分类难点。
  6. 有害垃圾-电池:包括纽扣电池、充电电池等。这类数据相对较少,但至关重要。
  7. 有害垃圾-灯管:节能灯管、荧光灯管。需要注意其长条形的形态与玻璃瓶的区别。
  8. 有害垃圾-药品:药瓶、板装药。要处理标签文字识别与内容物不可见的矛盾。
  9. 有害垃圾-化学品:油漆桶、杀虫剂罐。标识和颜色是关键特征。
  10. 其他垃圾-纺织品:旧衣服、毛巾、床单。纹理和折叠方式是识别关键。
  11. 其他垃圾-陶瓷碎片:碗碟碎片。与玻璃碎片和骨头在颜色、纹理上需要仔细区分。
  12. 其他垃圾-复合污染品:沾有油污的纸盒、装有残留物的塑料袋等。这是实际场景中最常见也最难判定的类别,是测试模型泛化能力的“试金石”。

数据集总量约15,000张图像,训练集约12,000张,验证集约3,000张。每类图像数量在1000-1500张左右,我们通过数据增强(如旋转、裁剪、颜色抖动)在一定程度上平衡了类别,但像“电池”、“化学品”这类样本天然较少的类别,其数量仍显著少于“塑料”、“纸类”。这恰恰模拟了现实数据的不均衡性,考验模型处理长尾分布的能力。

2.2 数据集的独特特点与隐含挑战

这个数据集有几个区别于标准实验室数据集的特点,这些特点既是其价值所在,也是训练时需要特别注意的挑战:

特点一:真实场景下的复杂背景。图像中的垃圾并非置于纯色背景板上,而是出现在小区垃圾桶、垃圾站地面、居民家中垃圾桶等复杂环境中。背景中可能出现其他类别的垃圾(作为干扰项)、植物、瓷砖纹理等。这就要求模型学习的是垃圾物体本身的特征,而非简单地记忆“背景是灰色就是金属”。

特点二:多变的拍摄条件和物体状态。照片由不同手机在不同时间、不同光照(室内灯光、室外阳光、夜晚昏暗光)下拍摄。垃圾本身的状态也千差万别:空瓶、满瓶、压扁的瓶子、撕掉标签的瓶子、破碎的玻璃、捆扎的纸箱。这种多样性迫使模型去学习更鲁棒的特征。

特点三:细粒度与相似类别的混淆。这是技术上的核心挑战。例如:

  • 透明塑料瓶 vs 玻璃瓶:在图像中,两者都可能呈现透明、反光的特性。关键区别可能在于瓶盖形状、标签材质(塑料膜标签 vs 纸质标签)、瓶身折射感(玻璃通常更“硬”)。
  • 污损的纸类 vs 复合污染品:一张被油浸透的披萨盒,是该归为“纸类”还是“复合污染品”?这需要模型理解“污染程度”这个抽象概念。
  • 小骨头(厨余) vs 陶瓷碎片:颜色和形状可能非常相似,需要从纹理(骨头的多孔性、陶瓷的光滑断面)和边缘特征进行区分。

特点四:标注的“主观性”边界。尽管有分类标准,但个别图像的标注仍存在模糊地带。例如,一个“铝箔封口的酸奶杯”(塑料杯体+铝箔),我们统一归为“塑料”,因为主体材质是塑料。但在实际训练中,模型可能会被铝箔的高反光特征干扰。我们在标注时尽量遵循“主体材质原则”和“常见认知原则”,并在标注文档中说明了这些边缘案例的处理方式。

注意:使用本数据集前,务必阅读附带的README或标注说明文件。里面详细记录了每个类别的定义、包含与不包含的物品举例,以及那些“模糊样本”的标注逻辑。理解标注规则是正确解读模型评估结果的前提。

3. 数据预处理与增强实战策略

拿到原始图像数据,直接扔进模型训练,效果通常不会好。一套精心设计的数据预处理(Preprocessing)和数据增强(Data Augmentation)流程,是提升模型泛化能力、防止过拟合的关键步骤。下面结合这个垃圾分类数据集的特点,分享我的实战策略。

3.1 预处理流程:为模型准备“标准餐”

预处理的目标是将千差万别的原始图像,转换成格式统一、数值范围适合模型输入的张量(Tensor)。我的标准流程如下:

  1. 统一尺寸(Resize):原始图像分辨率从几百到几千像素不等。我统一缩放到256x256像素。为什么是256?这是一个经验值,在计算效率和保留信息间取得平衡。对于更复杂的模型或需要更高精度,可以尝试224x224(经典尺寸)或384x384。
  2. 中心裁剪(Center Crop):缩放后,再从中裁剪出224x224的区域作为最终输入。这能确保输入尺寸绝对一致,并去除了边缘可能无关紧要的信息。对于本数据集,垃圾主体通常位于图像中央,所以中心裁剪是合理的。
    # 示例:使用PIL和torchvision from PIL import Image import torchvision.transforms as transforms transform = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), ])
  3. 归一化(Normalization):将图像像素值从[0, 255]转换到[0, 1],再使用ImageNet数据集的均值和标准差进行标准化。这是至关重要的一步。因为大多数预训练模型(如PyTorch Torchvision提供的)都是在ImageNet上训练的,其权重适应了这种数据分布。即使你从头训练,归一化也能加速模型收敛。
    • mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225]是ImageNet的统计值。它让数据分布接近均值为0,标准差为1的正态分布。

3.2 数据增强:制造“困难样本”提升鲁棒性

数据增强是在训练过程中,实时对图像进行随机变换,生成新的训练样本,从而扩大数据集、增加多样性的技术。对于这个垃圾分类数据集,我主要采用以下增强方法:

  1. 随机水平翻转(Random Horizontal Flip):这是最常用且几乎无害的增强。垃圾图像水平翻转后,其类别不会改变。概率一般设为0.5。
  2. 随机旋转(Random Rotation):小幅度的旋转(如±15度)是安全的,可以模拟拍摄角度的微小变化。但大角度旋转可能导致图像出现黑边,需要填充,有时会引入干扰。
  3. 颜色抖动(Color Jitter):轻微调整图像的亮度、对比度、饱和度和色调。这能有效模拟不同手机摄像头、不同光照条件(如白炽灯偏黄、日光灯偏蓝)下的成像差异。参数设置要保守,避免颜色失真导致语义变化(比如绿色的瓶子变成灰色)。
    transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1)
  4. 随机裁剪(Random Resized Crop):这是比中心裁剪更强的增强。它随机裁剪图像的一部分,然后缩放到目标尺寸。这迫使模型学习不依赖于物体在图像中绝对位置的局部特征。对于本数据集,它能帮助模型应对垃圾只占图像一部分的情况。
    transforms.RandomResizedCrop(224, scale=(0.8, 1.0))
  5. 谨慎使用的增强:
    • 高斯噪声(Gaussian Noise):可以模拟低光照下的图像噪点,但添加过多会破坏有用特征。
    • 随机遮挡(Random Erasing / Cutout):随机遮挡图像一小块区域,让模型不依赖于局部特征。对于垃圾分类,如果关键特征(如瓶盖形状)被遮挡,可能适得其反。建议小概率使用或遮挡面积很小。

我的增强组合策略:在训练集上,我会使用一个较强的增强组合(包含翻转、旋转、颜色抖动、随机裁剪)。在验证集上,只使用预处理流程(Resize + Center Crop + Normalize),不进行任何随机增强,以确保评估的稳定性和可比性。

实操心得:数据增强不是越多越好。一开始建议使用一个标准组合(如RandomResizedCrop + RandomFlip + ColorJitter)。观察训练过程,如果模型在训练集上准确率上升很快但在验证集上停滞不前(过拟合),可以适当增强力度(如增加旋转幅度、添加轻微噪声)。如果模型在训练集上都学得很慢,可能增强太强破坏了特征,需要调弱。

4. 模型选择、训练与调优全流程

有了高质量的数据和预处理流程,接下来就是选择模型、训练和调优。这里我以PyTorch为例,分享一个从入门到进阶的完整流程。

4.1 模型选型:从快速验证到精益求精

对于这个12分类任务,不建议从零开始训练一个大型模型,费时费力效果差。迁移学习(Transfer Learning)是首选。

  1. 快速原型(首选):ResNet34或MobileNetV3。ResNet34结构经典,在ImageNet上表现稳健,预训练权重容易获得,是快速验证想法和流程的“瑞士军刀”。MobileNetV3则更轻量,速度快,如果你考虑后续部署到手机或边缘设备,可以从它开始。
  2. 追求精度:ResNet50、EfficientNet-B2/B3或Swin Transformer Tiny。ResNet50比34更深,特征提取能力更强。EfficientNet系列在精度和效率上平衡得很好。Swin Transformer是视觉Transformer的代表,在多个任务上表现出色,但需要更多计算资源。
  3. 轻量化部署:MobileNetV2/V3、ShuffleNetV2。这些模型专为移动端设计,参数量少,计算量低。在精度可接受的前提下,它们是实际应用的理想选择。

如何选择?我的建议是:先用ResNet34跑通整个训练-验证-评估流程。确保你的代码管道没问题,数据加载正确,损失在下降。然后再尝试更复杂的模型,进行对比。

4.2 训练代码框架与关键参数设置

下面是一个基于PyTorch和Torchvision的核心训练循环框架,并附上关键参数的解释:

import torch import torch.nn as nn import torch.optim as optim from torchvision import models, transforms from torch.utils.data import DataLoader # 假设你已经定义好了自己的数据集类 MyDataset # 1. 设备选择 device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') # 2. 数据加载 train_transform = transforms.Compose([...]) # 你的增强组合 val_transform = transforms.Compose([...]) # 仅预处理 train_dataset = MyDataset(..., transform=train_transform) val_dataset = MyDataset(..., transform=val_transform) train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=4) val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False, num_workers=2) # 3. 模型初始化(以ResNet34为例,采用迁移学习) model = models.resnet34(pretrained=True) # 加载在ImageNet上预训练的权重 num_ftrs = model.fc.in_features # 获取全连接层输入特征数 model.fc = nn.Linear(num_ftrs, 12) # 替换最后的全连接层,输出12类 model = model.to(device) # 4. 损失函数与优化器 criterion = nn.CrossEntropyLoss() # 多分类任务标准损失函数 # 优化器:区分特征提取层和新的分类头,给予不同的学习率 optimizer = optim.Adam([ {'params': model.layer4.parameters(), 'lr': 1e-4}, # 深层特征层,小学习率微调 {'params': model.fc.parameters(), 'lr': 1e-3} # 新加的分类层,较大学习率快速学习 ], weight_decay=1e-4) # 权重衰减,防止过拟合 # 5. 学习率调度器 scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.1) # 每10个epoch学习率乘以0.1 # 6. 训练循环 num_epochs = 30 for epoch in range(num_epochs): model.train() running_loss = 0.0 for images, labels in train_loader: images, labels = images.to(device), labels.to(device) optimizer.zero_grad() outputs = model(images) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() * images.size(0) epoch_loss = running_loss / len(train_dataset) scheduler.step() # 每个epoch后在验证集上评估...

关键参数解读:

  • Batch Size:一般设为32或64。太小不稳定,太大可能内存不够。如果出现CUDA内存不足错误,首先尝试减小Batch Size。
  • 初始学习率(LR):这是最重要的超参数之一。对于迁移学习,新分类层可以用稍大的LR(如1e-3),预训练层用较小的LR(如1e-4, 1e-5)进行微调(Fine-tuning)。
  • 优化器:Adam是目前最常用的默认选择,它对学习率不那么敏感。SGD+Momentum在调优好的情况下可能达到更高精度,但需要更多调参。
  • 学习率调度(Scheduler):StepLR(分段衰减)简单有效。当验证集准确率 plateau(停滞)时,衰减学习率有助于模型收敛到更优点。ReduceLROnPlateau(当指标停止改善时衰减)是更动态的策略。
  • Epoch数:不是固定的。需要观察训练损失和验证准确率。通常训练到验证准确率不再明显上升(甚至开始下降,即过拟合)时停止。早期可以用30-50个epoch。

4.3 模型评估与性能分析

训练不是只看最后的准确率。在训练过程中和训练结束后,要进行系统分析:

  1. 绘制学习曲线:将每个epoch的训练损失(Loss)和验证损失、训练准确率和验证准确率画出来。这是诊断模型状态最直观的工具。
    • 理想情况:训练和验证损失同步下降,准确率同步上升,最后趋于平稳。
    • 过拟合:训练损失持续下降,训练准确率很高,但验证损失在某个点后开始上升,验证准确率停滞或下降。解决方案:加强数据增强、添加Dropout层、增大权重衰减、早停(Early Stopping)。
    • 欠拟合:训练损失和验证损失都下降得很慢,准确率很低。解决方案:可能模型容量不足(换更深的模型)、学习率太低、数据增强太强破坏了特征。
  2. 混淆矩阵(Confusion Matrix):训练结束后,在验证集上计算混淆矩阵。它能清晰显示模型具体在哪些类别上容易混淆。比如,你可能发现“玻璃瓶”和“透明塑料瓶”的混淆特别严重,这就是下一步需要针对性改进的方向(例如收集更多困难样本、设计针对性的数据增强、尝试能捕捉细微差别的网络结构)。
  3. 关键指标:除了整体准确率(Accuracy),对于类别不均衡的数据集,要关注宏平均F1分数(Macro-F1)。它平等对待每个类别,能更好地反映模型在少数类上的性能。

5. 常见问题、避坑指南与效果优化

在实际操作中,你会遇到各种各样的问题。这里我总结了一些典型问题及其排查思路,希望能帮你少走弯路。

5.1 训练过程中的典型问题排查

问题现象可能原因排查与解决思路
Loss为NaN或突然变得巨大1. 学习率过高。
2. 数据中有损坏的图像或标签错误。
3. 梯度爆炸。
1.立即降低学习率(如降到1e-5)。
2. 检查数据加载流程,确保图像能正常解码,标签在有效范围内(0-11)。
3. 使用梯度裁剪(torch.nn.utils.clip_grad_norm_)。
训练Loss下降很慢,准确率几乎不变1. 学习率过低。
2. 模型权重未正确更新(如冻结了不该冻结的层)。
3. 数据预处理/增强出错,导致输入异常。
1. 逐步提高学习率尝试。
2. 打印模型参数,检查是否所有需要训练层的requires_grad都为True。
3. 可视化几个经过预处理后的batch,看图像是否正常。
验证准确率远低于训练准确率过拟合。模型记住了训练集噪声,而非一般规律。1.增强数据增强(增加随机遮挡、更强的颜色抖动等)。
2.添加正则化:增大权重衰减、在全连接层后增加Dropout层。
3.早停(Early Stopping):当验证集损失连续几个epoch不降反升时停止训练。
4. 如果数据集不大,考虑使用更小的模型(如ResNet18)。
某个特定类别(如“电池”)准确率极低类别不平衡或样本特征难学。1.数据层面:对该类进行过采样(复制)或使用更高级的采样策略(如Class-balanced Sampling)。
2.损失函数层面:使用带权重的交叉熵损失(nn.CrossEntropyLoss(weight=class_weights)),给少数类更高的权重。
3.针对性收集:专门收集更多该类别在不同场景下的困难样本。

5.2 提升模型效果的进阶技巧

当你的基础模型跑通后,可以尝试以下方法进一步提升性能:

  1. 测试时增强(Test Time Augmentation, TTA):这不是训练技巧,而是推理技巧。对验证集/测试集的同一张图像,进行多种增强(如水平翻转、多尺度裁剪),将多个预测结果进行平均(或投票),作为最终预测。这能稳定提升精度(通常0.5%-2%),但会增加推理时间。
  2. 模型集成(Ensemble):训练多个不同结构(如ResNet50, EfficientNet-B3, Swin-T)或不同随机种子下的模型,将它们对同一输入的预测概率进行平均。这是比赛和追求极致精度时的“大杀器”,但代价是计算和存储成本倍增。
  3. 关注困难样本:分析混淆矩阵,找出那些被模型持续分错的样本。把这些样本拿出来,人工分析原因。是因为拍摄模糊?背景干扰?还是类别定义本身就模糊?针对这些“硬骨头”,你可以:
    • 收集更多类似样本加入训练集。
    • 设计针对性的数据增强(例如,对于易混淆的“玻璃”和“塑料”,可以增加模拟反光、折射的增强)。
    • 考虑引入额外的信息,如果项目允许,可以结合文本信息(如垃圾上的文字)进行多模态学习。
  4. 更精细的模型调优:
    • 差分学习率:对模型的不同层设置不同的学习率。通常,靠近输入的底层学习率最小(它们提取通用特征),靠近输出的高层学习率最大。这可以通过优化器的参数组实现,如上文代码示例。
    • 自动化超参数搜索:使用如Optuna、Ray Tune等工具,对学习率、Batch Size、权重衰减等超参数进行系统搜索,找到最优组合。

5.3 关于验证集使用的特别提醒

这个数据集已经划分好了训练集和验证集。请严格遵守这个划分,不要为了增加训练数据而把验证集也用于训练。验证集的唯一作用是在训练过程中无偏地评估模型性能,指导超参数调整和早停。

如果你需要进行多次实验对比,或者进行k折交叉验证以更稳健地评估模型,建议在训练集内部再进行划分。例如,将原始训练集分成5份,轮流用4份训练,1份作为“开发验证集”进行调参,最后再用官方提供的固定验证集做最终测试。这样可以避免信息泄露,确保你对模型性能的估计是可靠的。

最后,模型训练是一个需要耐心和反复实验的过程。不要期望第一次就能得到完美结果。从简单的配置开始,建立基线(Baseline),然后通过系统的实验和分析,一步步迭代优化。这个12分类的垃圾分类数据集,正是一个让你实践这个完整流程的绝佳沙场。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询