1. 项目概述
最近在做一个挺有意思的项目——用MATLAB实现基于卷积神经网络(CNN)的垃圾分类系统。这个项目特别适合刚接触深度学习和图像处理的朋友练手,因为垃圾分类本身是个很实用的场景,而且MATLAB的GUI界面让整个系统看起来更直观。
我最初做这个项目的动机很简单:现在很多小区都在推行垃圾分类,但说实话要记住所有垃圾的分类规则真的挺难的。如果能用手机拍张照就自动识别垃圾类别,那该多方便。于是我就用MATLAB搭建了这么一个系统,从数据收集到模型训练,再到最后的GUI界面实现,完整走了一遍流程。
这个项目最核心的部分就是用CNN来识别垃圾图片。CNN在图像识别领域表现一直很出色,特别是对图像特征的自动提取能力。我选用了经典的LeNet-5网络结构,并根据垃圾分类任务的特点做了些调整。整个系统在测试集上能达到92%左右的准确率,对于日常使用来说已经足够了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据准备与预处理
2.1 数据集构建
做图像识别项目,数据永远是第一位的。我收集了大约5000张垃圾图片,覆盖了常见的四大类:可回收物、厨余垃圾、有害垃圾和其他垃圾。数据来源主要有两个:
- 公开数据集:TrashNet和Garbage Classification Dataset
- 自己拍摄的图片:用手机拍摄日常生活中常见的垃圾物品
这里有个小技巧:拍摄时要考虑不同角度、光照条件和背景,这样模型才能学到更鲁棒的特征。比如同一个矿泉水瓶,我可能会拍它在桌上、垃圾桶里、手持状态等不同场景下的照片。
2.2 数据预处理
原始图片不能直接喂给CNN,需要先做预处理。我在MATLAB中主要做了以下处理:
- 尺寸统一化:将所有图片resize到227×227像素,这是AlexNet的标准输入尺寸
- 数据增强:通过旋转(±15度)、水平翻转、亮度调整(±20%)等方式扩充数据集
- 归一化:将像素值从0-255缩放到0-1之间,加速模型收敛
matlab复制% 数据增强示例代码
augmenter = imageDataAugmenter(...
'RandRotation',[-15 15],...
'RandXReflection',true,...
'RandYReflection',false,...
'RandXScale',[0.8 1.2],...
'RandYScale',[0.8 1.2]);
注意:数据增强要在训练集上做,测试集必须保持原始状态,否则会高估模型性能。
3. CNN模型设计与实现
3.1 网络架构选择
我对比了几种经典的CNN架构,最终选择了改进版的AlexNet。主要考虑是:
- AlexNet在ImageNet上表现优异,且MATLAB有现成的实现
- 我们的垃圾分类任务比ImageNet简单,可以适当减少网络深度
- 修改最后的全连接层,适配我们的4分类任务
最终的模型结构如下表所示:
| 层类型 | 参数设置 | 输出尺寸 | 说明 |
|---|---|---|---|
| 输入层 | 227×227×3 | 227×227×3 | RGB图像输入 |
| 卷积层1 | 96个11×11滤波器,步长4 | 55×55×96 | ReLU激活 |
| 池化层1 | 3×3最大池化,步长2 | 27×27×96 | - |
| 卷积层2 | 256个5×5滤波器,填充2 | 27×27×256 | ReLU激活 |
| 池化层2 | 3×3最大池化,步长2 | 13×13×256 | - |
| 卷积层3 | 384个3×3滤波器,填充1 | 13×13×384 | ReLU激活 |
| 卷积层4 | 384个3×3滤波器,填充1 | 13×13×384 | ReLU激活 |
| 卷积层5 | 256个3×3滤波器,填充1 | 13×13×256 | ReLU激活 |
| 池化层3 | 3×3最大池化,步长2 | 6×6×256 | - |
| 全连接层1 | 4096个神经元 | 1×1×4096 | ReLU激活 |
| 全连接层2 | 4096个神经元 | 1×1×4096 | ReLU激活 |
| 输出层 | 4个神经元 | 1×1×4 | Softmax激活 |
3.2 模型训练
训练过程在MATLAB中通过Deep Learning Toolbox实现。关键训练参数如下:
- 优化器:带动量的SGD
- 初始学习率:0.001
- 批量大小:32
- 最大epoch数:30
- 验证频率:每100次迭代
matlab复制options = trainingOptions('sgdm', ...
'InitialLearnRate',0.001, ...
'MaxEpochs',30, ...
'MiniBatchSize',32, ...
'ValidationData',augimdsValidation, ...
'ValidationFrequency',100, ...
'Verbose',false, ...
'Plots','training-progress');
net = trainNetwork(augimdsTrain,layers,options);
训练过程中,我观察到验证准确率在第25个epoch左右达到平稳,最终在测试集上的准确率为92.3%。混淆矩阵显示模型在"有害垃圾"类别上表现稍差,主要是因为这类样本数量相对较少。
4. MATLAB GUI界面实现
4.1 GUI设计思路
为了让非技术人员也能方便使用这个分类系统,我用MATLAB的App Designer创建了一个图形用户界面。主要功能包括:
- 图片上传:支持拖放或文件选择
- 实时分类:点击按钮即可进行分类
- 结果显示:直观展示分类结果和置信度
- 历史记录:保存最近的分类记录
界面布局采用了经典的"左侧控制面板+右侧显示区域"的设计,确保操作逻辑清晰。
4.2 关键代码实现
GUI的核心是连接前端界面和后端CNN模型。主要实现了以下几个回调函数:
- 图片选择回调:处理用户上传的图片
- 分类按钮回调:调用训练好的模型进行分类
- 结果显示回调:更新界面显示分类结果
matlab复制% 分类按钮回调函数示例
function ClassifyButtonPushed(app, event)
% 预处理用户上传的图片
img = imread(app.ImagePath);
img = imresize(img, [227 227]);
% 调用训练好的模型进行分类
[label, score] = classify(app.trainedNet, img);
% 更新界面显示
app.ResultLabel.Text = char(label);
app.ConfidenceLabel.Text = num2str(max(score)*100, '%.1f%%');
% 显示图片和分类结果
imshow(img, 'Parent', app.ImageAxes);
title(app.ImageAxes, ['分类结果: ' char(label)]);
end
4.3 界面美化技巧
为了让GUI更专业,我加入了一些美化元素:
- 使用MATLAB的uistyle函数自定义按钮样式
- 添加了分类结果的动画效果
- 实现了响应式布局,适应不同窗口大小
- 加入了简单的主题颜色配置
这些细节看似不重要,但能显著提升用户体验。特别是在展示给非技术人员看时,一个专业的界面能增加可信度。
5. 系统优化与部署
5.1 模型优化技巧
在项目后期,我尝试了几种优化方法提升模型性能:
- 类别平衡:对样本少的类别进行过采样
- 学习率调度:使用piecewise learning rate schedule
- 模型微调:冻结前几层,只训练后面的全连接层
- 测试时增强(TTA):对测试图片做多种变换后取平均结果
其中效果最明显的是类别平衡和模型微调,将有害垃圾类别的识别率从78%提升到了86%。
5.2 部署注意事项
将MATLAB代码部署到其他机器时,需要注意:
- 确保目标机器安装了相同版本的MATLAB和Deep Learning Toolbox
- 如果使用GPU加速,需要配置CUDA和cuDNN
- 可以将模型导出为ONNX格式,方便其他框架调用
- 对于独立应用,可以考虑使用MATLAB Compiler打包成exe
提示:在部署前务必测试不同环境下的兼容性,特别是当GUI依赖某些特定工具箱时。
6. 常见问题与解决方案
在实际开发过程中,我遇到了不少坑,这里分享几个典型问题及解决方法:
-
内存不足错误
- 现象:训练大模型时MATLAB崩溃
- 解决:减小批量大小,使用'MiniBatchSize'参数;或者使用imageDatastore的'ReadSize'属性分批读取
-
过拟合问题
- 现象:训练准确率高但验证准确率低
- 解决:增加数据增强幅度;添加Dropout层;使用L2正则化
-
GUI响应缓慢
- 现象:分类操作导致界面卡顿
- 解决:将耗时操作放在后台线程,使用MATLAB的parfor或backgroundPool
-
类别不平衡
- 现象:模型偏向多数类
- 解决:使用'WeightedRandomSampler'或对少数类过采样
-
模型部署兼容性问题
- 现象:在其他电脑上无法运行
- 解决:使用'matlabruntime'打包所有依赖;或者将模型导出为ONNX格式
7. 项目扩展方向
这个基础项目还有很大的改进空间,以下是我想到的几个扩展方向:
- 多模态输入:除了图片,还可以加入文本描述(如产品标签)辅助分类
- 实时视频处理:用摄像头实时识别垃圾桶中的物品
- 移动端部署:将模型移植到手机APP,方便随时使用
- 增量学习:让模型能够持续学习用户反馈的新样本
- 细粒度分类:在四大类基础上进一步细分,如塑料瓶、玻璃瓶等
如果时间允许,我最想实现的是实时视频处理功能。想象一下,只要把手机对准垃圾桶,就能实时显示每个物品的分类建议,那该多酷!技术上可以用MATLAB的Webcam支持和Computer Vision Toolbox实现。
