一、选题背景:为什么选择“深度学习+垃圾分类”?
随着城市化进程加速,我国城市生活垃圾年产量已突破2亿吨,“垃圾围城”成为制约城市可持续发展的关键问题。而源头垃圾分类是破解这一难题的核心——据统计,规范的垃圾分类可使垃圾处理效率提升40%,处理成本降低30%,同时减少塑料、有害垃圾对土壤和水源的污染。
传统垃圾分类依赖人工分拣,存在效率低、误差大、人力成本高的问题;而基于计算机视觉的自动化分类技术,能通过图像识别快速判断垃圾类别,为智能垃圾桶、垃圾分拣机器人等设备提供核心算法支撑。
在技术选型上,深度学习(尤其是卷积神经网络CNN)在图像分类任务中表现出远超传统机器学习(如SVM、逻辑回归)的精度,且已在医疗影像、人脸识别等领域验证了可行性。因此,本毕业设计聚焦“基于深度学习的生活垃圾分类识别”,旨在设计一套兼顾高精度与低算力需求的算法,为实际场景落地提供参考。
二、核心技术栈:从理论到工具的选型逻辑
2.1 理论基础:为什么选这些模型?
- 卷积神经网络(CNN):图像分类的核心模型,通过“卷积层提取特征+池化层降维+全连接层分类”的结构,能自动学习垃圾图像的纹理、形状特征,避免人工设计特征的局限性;
- 经典网络参考:对比AlexNet(深度较深、算力需求高)和GoogleNet(Inception模块降维),最终选择“简化版全连接神经网络+图像预处理降维”方案——在保证精度的同时,降低对硬件的要求,普通PC即可完成训练;
- 评估指标:采用准确率(Accuracy) 作为核心指标(公式:),同时参考精确率(P)和召回率(R),确保模型在“厨余垃圾”和“可回收垃圾”两类场景中均稳定表现。
2.2 开发工具:轻量化且易上手
考虑到本科阶段的硬件资源和开发经验,选择“低门槛、高兼容性”的工具链:
| 类别 | 工具/框架 | 选择理由 |
|---|---|---|
| 编程语言 | Python 3.6 | 机器学习生态最完善,拥有Pillow、NumPy、TensorFlow等丰富库支持; |
| 深度学习框架 | TensorFlow 1.15.0 | 1.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步处理:
- 格式转换:将RGB图像转为L模式(灰度图),减少通道数(从3通道降至1通道),降低算力消耗;
- 尺寸压缩:统一缩放到128×128像素,避免因图像大小不一致导致的训练误差;
- 数据归一化:将像素值(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.01 | Adam(自适应学习率) |
| 训练轮次(epochs) | 50-300 | 200轮(200轮后精度收敛) |
| 训练集比例 | 7:3-9:1 | 8:2(20%数据为测试集) |
3.4 第四步:模型训练——代码实现与过程监控
3.4.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
- 模型构建与训练:
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 实际预测案例
以“矿泉水瓶”(可回收垃圾)为例,预测流程如下:
- 加载待预测图像,预处理为128×128灰度图;
- 输入模型,通过Softmax层输出类别概率;
- 判定规则:概率>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 研究成果
- 实现了“低算力+高精度”的平衡:在普通PC上完成训练,准确率达93%以上,满足工业落地基本需求;
- 提出“图像压缩(128×128)”预处理方案,相比原始图像(如512×512),训练时间缩短60%,同时保证特征不丢失。
3.6.2 不足与改进
- 数据集局限性:仅包含“厨余”和“可回收”两类垃圾,未覆盖有害垃圾、其他垃圾,后续需扩展数据集;
- 模型泛化能力:对“变形垃圾”(如揉皱的纸张)、“混合垃圾”(如带食物残渣的塑料盒)识别精度较低,可引入CNN(如MobileNet)提升特征提取能力;
- 落地场景缺失:未结合硬件设备(如智能垃圾桶),后续可开发API接口,将模型集成到嵌入式设备中。
四、毕业设计心得:从“理论”到“实践”的3点感悟
- 数据预处理是关键:初期因未做灰度转换,直接用RGB图像训练,准确率仅75%;优化预处理后,精度提升18%——深刻体会到“数据决定模型上限,预处理决定是否能达到上限”;
- 参数调试需耐心:隐藏层层数从2层增至4层时,精度提升10%;但增至5层后,精度反而下降(过拟合),说明“并非模型越复杂越好,需匹配数据规模”;
- 文档与代码规范很重要:前期因代码注释不全、数据路径混乱,导致后期复现困难;后来通过“分模块命名+详细注释”,大幅提升开发效率,也方便答辩时展示逻辑。
五、附录:关键代码与参考资料
5.1 核心代码文件
- 附录1:图像压缩代码(Pillow实现128×128灰度转换);
- 附录2:数据集分割代码(随机打乱+比例划分);
- 附录3:模型训练代码(TensorFlow Sequential);
- 附录4:预测代码(Softmax概率输出+类别判定)。