本科毕业设计复盘:基于深度学习的生活垃圾分类识别算法研究全流程

50 阅读9分钟

一、选题背景:为什么选择“深度学习+垃圾分类”?

随着城市化进程加速,我国城市生活垃圾年产量已突破2亿吨,“垃圾围城”成为制约城市可持续发展的关键问题。而源头垃圾分类是破解这一难题的核心——据统计,规范的垃圾分类可使垃圾处理效率提升40%,处理成本降低30%,同时减少塑料、有害垃圾对土壤和水源的污染。

传统垃圾分类依赖人工分拣,存在效率低、误差大、人力成本高的问题;而基于计算机视觉的自动化分类技术,能通过图像识别快速判断垃圾类别,为智能垃圾桶、垃圾分拣机器人等设备提供核心算法支撑。

在技术选型上,深度学习(尤其是卷积神经网络CNN)在图像分类任务中表现出远超传统机器学习(如SVM、逻辑回归)的精度,且已在医疗影像、人脸识别等领域验证了可行性。因此,本毕业设计聚焦“基于深度学习的生活垃圾分类识别”,旨在设计一套兼顾高精度低算力需求的算法,为实际场景落地提供参考。

二、核心技术栈:从理论到工具的选型逻辑

2.1 理论基础:为什么选这些模型?

  • 卷积神经网络(CNN):图像分类的核心模型,通过“卷积层提取特征+池化层降维+全连接层分类”的结构,能自动学习垃圾图像的纹理、形状特征,避免人工设计特征的局限性;
  • 经典网络参考:对比AlexNet(深度较深、算力需求高)和GoogleNet(Inception模块降维),最终选择“简化版全连接神经网络+图像预处理降维”方案——在保证精度的同时,降低对硬件的要求,普通PC即可完成训练;
  • 评估指标:采用准确率(Accuracy) 作为核心指标(公式:Accuracy=TP+TNTP+TN+FP+FNAccuracy=\frac{TP+TN}{TP+TN+FP+FN}),同时参考精确率(P)和召回率(R),确保模型在“厨余垃圾”和“可回收垃圾”两类场景中均稳定表现。

2.2 开发工具:轻量化且易上手

考虑到本科阶段的硬件资源和开发经验,选择“低门槛、高兼容性”的工具链:

类别工具/框架选择理由
编程语言Python 3.6机器学习生态最完善,拥有Pillow、NumPy、TensorFlow等丰富库支持;
深度学习框架TensorFlow 1.15.01.X版本文档丰富、社区支持成熟,避免2.X版本的兼容性问题,适合新手开发;
图像处理Pillow轻量级图像库,支持格式转换、尺寸压缩等预处理操作,API简单易调用;
开发环境Jupyter Notebook支持“代码块+结果实时显示”,方便调试和分步验证,适合算法迭代;
硬件Intel Core i9 + 16G内存无需GPU加速(通过图像降维优化算力需求),普通PC即可完成2万条数据的训练;

三、毕业设计全流程:从需求到落地的6个关键步骤

3.1 第一步:文献调研与国内外现状分析

在确定研究方向后,首先梳理国内外研究进展,明确自身研究的定位:

  • 国外:德国(押金制回收空瓶)、日本(智能垃圾桶)等国家已实现垃圾分类的规模化落地,且多结合自动化设备;
  • 国内:政策推动下,北京、上海等城市已强制推行垃圾分类,但技术层面仍以“传统机器学习+小数据集”为主,存在精度不足(多在85%以下)、泛化能力弱的问题;
  • 创新点:现有研究多依赖大规模数据集和高算力GPU,而本设计通过“图像压缩(128×128像素)+简化网络结构”,在普通PC上实现93%以上的分类精度,兼顾“实用性”与“落地性”。

3.2 第二步:数据收集与预处理——算法的“基石”

3.2.1 数据集选择

采用公开的生活垃圾分类数据集(来源:CSDN开源项目),包含两类核心垃圾:

  • 厨余垃圾:12567条(如剩菜、果皮);
  • 可回收垃圾:9999条(如塑料瓶、纸张);
    所有数据均为JPG格式,原始尺寸大于128×128像素,满足后续压缩需求。

3.2.2 图像预处理流程

原始图像存在尺寸不一、色彩通道冗余(RGB)的问题,需通过3步处理:

  1. 格式转换:将RGB图像转为L模式(灰度图),减少通道数(从3通道降至1通道),降低算力消耗;
  2. 尺寸压缩:统一缩放到128×128像素,避免因图像大小不一致导致的训练误差;
  3. 数据归一化:将像素值(0-255)除以255,映射到0-1区间,加速模型收敛。

预处理效果对比:左侧为原始RGB图像(尺寸不一、色彩丰富),右侧为处理后的灰度图(128×128,特征更聚焦),既保留了垃圾的关键形状特征,又大幅降低了数据维度。

3.3 第三步:算法设计——核心网络结构

3.3.1 网络架构设计

考虑到算力限制,未采用复杂的CNN模型(如ResNet、YOLO),而是设计“全连接神经网络+图像特征扁平化”的方案,结构如下:

  • 输入层:128×128的灰度图像,经Flatten层转为16384维向量;
  • 隐藏层:4层全连接层,节点数依次为1000→500→256→128(逐层降维,避免过拟合),激活函数均采用ReLU(解决梯度消失问题);
  • 输出层:2个节点,分别对应“厨余垃圾(0)”和“可回收垃圾(1)”,采用SparseCategoricalCrossentropy损失函数(适合整数标签分类)。

3.3.2 关键参数调试

通过控制变量法测试不同参数对精度的影响,最终确定最优配置:

参数测试范围最优选择
隐藏层层数2-6层4层
学习率(optimizer)0.001-0.01Adam(自适应学习率)
训练轮次(epochs)50-300200轮(200轮后精度收敛)
训练集比例7:3-9:18:2(20%数据为测试集)

3.4 第四步:模型训练——代码实现与过程监控

3.4.1 核心代码片段

  1. 数据集分割(按8:2比例划分训练集/测试集):
import numpy as np
def splitTrainAndTest(data1, data2, ratio):
    indices = np.random.permutation(len(data1))  # 随机打乱索引
    testSize = int(len(data1)*ratio)
    test_indices = indices[:testSize]
    train_indices = indices[testSize:]
    return data1[train_indices], data2[train_indices], data1[test_indices], data2[test_indices]

# 调用函数分割数据
Xtrain, Ytrain, Xtest, Ytest = splitTrainAndTest(X, Y, 0.2)
train_images = Xtrain / 255  # 归一化
train_labels = Ytrain
  1. 模型构建与训练
from tensorflow import keras
# 构建网络
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(128, 128)),
    keras.layers.Dense(1000, activation='relu'),
    keras.layers.Dense(500, activation='relu'),
    keras.layers.Dense(256, activation='relu'),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(2)
])

# 编译模型
model.compile(optimizer='adam',
              loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

# 训练模型
history = model.fit(train_images, train_labels, epochs=200, validation_data=(Xtest/255, Ytest))

3.4.2 训练过程监控

  • 精度变化:训练初期(1-50轮)准确率快速上升至85%,50-200轮缓慢收敛至93.22%;
  • 过拟合控制:通过“逐层降维+足够数据集(2万条)”,避免过拟合——测试集精度(92.8%)与训练集精度(93.22%)差距小于1%,模型泛化能力良好。

3.5 第五步:模型测试与预测——验证算法实用性

3.5.1 测试结果分析

用测试集(约4500条数据)验证模型性能,核心指标如下:

  • 总体准确率:93.22%;
  • 厨余垃圾识别准确率:94.5%(假阳性率低,避免将厨余垃圾误判为可回收);
  • 可回收垃圾识别准确率:91.8%(主要误差源于“透明塑料瓶”与“玻璃制品”的特征相似性)。

3.5.2 实际预测案例

以“矿泉水瓶”(可回收垃圾)为例,预测流程如下:

  1. 加载待预测图像,预处理为128×128灰度图;
  2. 输入模型,通过Softmax层输出类别概率;
  3. 判定规则:概率>0.5为可回收垃圾,否则为厨余垃圾。

核心代码:

# 构建概率预测模型
probability_model = keras.Sequential([model, keras.layers.Softmax()])

# 预处理待预测图像
def preprocess_image(img_path):
    from PIL import Image
    im = Image.open(img_path).convert("L").resize((128, 128))
    return np.array(im) / 255

# 预测
Xnew = preprocess_image("mineral_water_bottle.jpg")
predictions = probability_model.predict(Xnew.reshape(1, 128, 128))
prob_kitchen, prob_recycle = predictions[0]

if prob_recycle > 0.5:
    print(f"预测结果:可回收垃圾(概率:{prob_recycle:.2f})")
else:
    print(f"预测结果:厨余垃圾(概率:{prob_kitchen:.2f})")

预测结果:输出“可回收垃圾(概率:0.97)”,与实际类别一致。

3.6 第六步:总结与展望——反思不足与改进方向

3.6.1 研究成果

  1. 实现了“低算力+高精度”的平衡:在普通PC上完成训练,准确率达93%以上,满足工业落地基本需求;
  2. 提出“图像压缩(128×128)”预处理方案,相比原始图像(如512×512),训练时间缩短60%,同时保证特征不丢失。

3.6.2 不足与改进

  1. 数据集局限性:仅包含“厨余”和“可回收”两类垃圾,未覆盖有害垃圾、其他垃圾,后续需扩展数据集;
  2. 模型泛化能力:对“变形垃圾”(如揉皱的纸张)、“混合垃圾”(如带食物残渣的塑料盒)识别精度较低,可引入CNN(如MobileNet)提升特征提取能力;
  3. 落地场景缺失:未结合硬件设备(如智能垃圾桶),后续可开发API接口,将模型集成到嵌入式设备中。

四、毕业设计心得:从“理论”到“实践”的3点感悟

  1. 数据预处理是关键:初期因未做灰度转换,直接用RGB图像训练,准确率仅75%;优化预处理后,精度提升18%——深刻体会到“数据决定模型上限,预处理决定是否能达到上限”;
  2. 参数调试需耐心:隐藏层层数从2层增至4层时,精度提升10%;但增至5层后,精度反而下降(过拟合),说明“并非模型越复杂越好,需匹配数据规模”;
  3. 文档与代码规范很重要:前期因代码注释不全、数据路径混乱,导致后期复现困难;后来通过“分模块命名+详细注释”,大幅提升开发效率,也方便答辩时展示逻辑。

五、附录:关键代码与参考资料

5.1 核心代码文件

  • 附录1:图像压缩代码(Pillow实现128×128灰度转换);
  • 附录2:数据集分割代码(随机打乱+比例划分);
  • 附录3:模型训练代码(TensorFlow Sequential);
  • 附录4:预测代码(Softmax概率输出+类别判定)。