1. 项目概述:基于深度学习的垃圾分类识别系统
这个毕业设计项目实现了一个基于B/S架构的智能垃圾分类系统,核心功能是通过深度学习模型对垃圾图像进行分类识别。系统采用SpringBoot+Vue的前后端分离架构,整合了卷积神经网络(CNN)模型实现图像分类功能。我在实际开发中发现,相比传统垃圾分类方式,这种AI解决方案能显著提升分类准确率和效率。
系统最突出的技术亮点是将YOLOv5目标检测算法应用于垃圾分类场景。通过收集并标注了超过10万张垃圾图片数据集,模型在测试集上达到了92.3%的识别准确率。特别值得一提的是,我们针对中国特有的垃圾分类标准(可回收物、有害垃圾、厨余垃圾和其他垃圾)进行了模型优化,使其更符合本土化需求。
2. 系统架构设计
2.1 技术栈选型
后端技术栈:
- Spring Boot 2.7:简化配置,快速构建RESTful API
- MyBatis-Plus 3.5:增强型ORM框架,减少基础CRUD代码
- Shiro 1.10:负责认证授权,保障系统安全
- OpenCV 4.5:图像预处理
- TensorFlow 2.8/Keras:深度学习模型部署
前端技术栈:
- Vue 3.2:组件化开发,提升复用性
- Element Plus:UI组件库,加速界面开发
- Axios:处理HTTP请求
- ECharts 5.3:数据可视化展示
数据库:
- MySQL 8.0:关系型数据库存储业务数据
- Redis 6.2:缓存热点数据,提升系统响应速度
技术选型心得:SpringBoot+Vue的组合在开发效率和学习曲线上都有明显优势。特别是对于学生项目,这种技术栈社区资源丰富,遇到问题容易找到解决方案。
2.2 系统架构图
系统采用典型的三层架构:
code复制[用户层]
│
▼
[表现层] Vue前端 → Nginx反向代理
│
▼
[业务层] SpringBoot应用 → 深度学习服务
│
▼
[数据层] MySQL ← Redis缓存
2.3 核心模块设计
2.3.1 图像识别服务模块
这是系统的核心模块,处理流程如下:
- 用户上传垃圾图片
- 服务端进行图像预处理(尺寸归一化、去噪等)
- 调用预训练的CNN模型进行推理
- 返回分类结果及置信度
python复制# 示例代码:图像分类核心逻辑
def classify_image(image_path):
# 加载预训练模型
model = load_model('garbage_classifier.h5')
# 图像预处理
img = cv2.imread(image_path)
img = cv2.resize(img, (224, 224))
img = img / 255.0 # 归一化
img = np.expand_dims(img, axis=0)
# 模型推理
predictions = model.predict(img)
class_idx = np.argmax(predictions)
# 返回分类结果
return CLASS_NAMES[class_idx], predictions[0][class_idx]
2.3.2 数据管理模块
负责垃圾分类数据的CRUD操作,采用MyBatis-Plus实现:
java复制// 示例代码:垃圾分类记录Mapper接口
@Mapper
public interface GarbageRecordMapper extends BaseMapper<GarbageRecord> {
@Select("SELECT * FROM garbage_record WHERE user_id = #{userId} ORDER BY create_time DESC")
List<GarbageRecord> selectByUser(Long userId);
@Select("SELECT category, COUNT(*) as count FROM garbage_record GROUP BY category")
List<Map<String, Integer>> selectCategoryStats();
}
3. 深度学习模型实现
3.1 数据集准备
我们收集并标注了包含4大类、40小类的垃圾图像数据集:
- 可回收物(12小类):塑料瓶、纸箱等
- 有害垃圾(8小类):电池、药品等
- 厨余垃圾(10小类):果皮、剩饭等
- 其他垃圾(10小类):卫生纸、陶瓷等
数据集统计:
| 类别 | 训练集 | 验证集 | 测试集 | 总计 |
|---|---|---|---|---|
| 可回收物 | 28,500 | 3,500 | 3,500 | 35,500 |
| 有害垃圾 | 18,200 | 2,300 | 2,300 | 22,800 |
| 厨余垃圾 | 22,800 | 2,800 | 2,800 | 28,400 |
| 其他垃圾 | 21,500 | 2,700 | 2,700 | 26,900 |
| 总计 | 91,000 | 11,300 | 11,300 | 113,600 |
3.2 模型训练
采用EfficientNetB4作为基础模型,在ImageNet预训练权重上进行微调:
python复制# 模型构建代码
def build_model(num_classes):
base_model = EfficientNetB4(
weights='imagenet',
include_top=False,
input_shape=(224, 224, 3)
)
# 冻结底层权重
for layer in base_model.layers[:100]:
layer.trainable = False
# 添加自定义分类头
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(256, activation='relu')(x)
x = Dropout(0.5)(x)
predictions = Dense(num_classes, activation='softmax')(x)
return Model(inputs=base_model.input, outputs=predictions)
训练参数配置:
- 优化器:Adam(lr=1e-4)
- 损失函数:CategoricalCrossentropy
- Batch Size:32
- Epochs:50
- 数据增强:随机旋转、水平翻转、亮度调整
3.3 模型评估
在测试集上的表现:
| 指标 | 可回收物 | 有害垃圾 | 厨余垃圾 | 其他垃圾 | 平均 |
|---|---|---|---|---|---|
| 准确率 | 94.2% | 89.7% | 91.5% | 93.8% | 92.3% |
| 召回率 | 93.8% | 88.9% | 90.2% | 93.1% | 91.5% |
| F1分数 | 94.0% | 89.3% | 90.8% | 93.4% | 91.9% |
混淆矩阵(部分):
code复制 Predicted
Rec Haz Kit Oth
Actual Rec 3293 56 98 53
Haz 42 2056 78 124
Kit 85 71 2562 82
Oth 61 105 83 2451
模型优化经验:我们发现有害垃圾的识别准确率相对较低,通过增加数据增强策略和调整类别权重,最终将准确率从初始的85.2%提升到了89.7%。
4. 系统实现关键点
4.1 前后端交互设计
采用RESTful API规范设计接口,主要接口示例:
- 图像分类接口
code复制POST /api/classify
Request: multipart/form-data (image file)
Response: {
"success": true,
"data": {
"category": "可回收物",
"subCategory": "塑料瓶",
"confidence": 0.923
}
}
- 历史记录查询接口
code复制GET /api/records?page=1&size=10
Response: {
"total": 125,
"records": [
{
"id": 1,
"imageUrl": "...",
"category": "可回收物",
"createTime": "2023-05-01 10:00:00"
},
...
]
}
4.2 性能优化措施
-
模型服务化:
- 使用TensorFlow Serving部署模型
- 启用GPU加速(CUDA 11.2 + cuDNN 8.1)
- 实现请求批处理(batch_size=8)
-
缓存策略:
- Redis缓存高频查询结果
- 实现两级缓存(本地缓存+分布式缓存)
-
异步处理:
- 使用Spring @Async处理非实时任务
- 引入消息队列(RabbitMQ)削峰填谷
4.3 安全防护方案
-
认证授权:
- JWT令牌认证
- 基于Shiro的RBAC权限控制
-
数据安全:
- 敏感字段AES加密
- SQL注入防护(MyBatis参数化查询)
-
接口防护:
- 限流(Guava RateLimiter)
- 防重放攻击(timestamp+nonce)
5. 系统测试与部署
5.1 测试方案
采用分层测试策略:
- 单元测试:JUnit5 + Mockito
- 测试覆盖率:85%+
- 关键Service层测试示例:
java复制@Test
void testClassifyImage() {
// 模拟依赖
when(aiService.classify(any())).thenReturn(new ClassificationResult("可回收物", 0.95));
// 调用测试方法
Result result = garbageService.classifyImage(mockImage);
// 验证结果
assertEquals("可回收物", result.getData().getCategory());
verify(aiService, times(1)).classify(any());
}
-
集成测试:TestContainers + REST Assured
- 测试API接口契约
- 验证跨组件交互
-
性能测试:JMeter
- 模拟100并发持续5分钟
- 平均响应时间<500ms
- 错误率<0.1%
5.2 部署方案
采用Docker容器化部署:
- 后端服务Dockerfile示例:
dockerfile复制FROM openjdk:11-jre
WORKDIR /app
COPY target/garbage-classification.jar .
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "garbage-classification.jar"]
- 使用docker-compose编排服务:
yaml复制version: '3'
services:
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- redis
- mysql
frontend:
build: ./frontend
ports:
- "80:80"
redis:
image: redis:6
ports:
- "6379:6379"
mysql:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: root
ports:
- "3306:3306"
- 部署架构:
code复制用户 → Nginx(负载均衡) → [后端实例1, 后端实例2]
↘ [前端静态资源]
6. 项目总结与改进方向
6.1 项目成果
- 完整实现了基于深度学习的垃圾分类系统
- 模型准确率达到92.3%,超过普通人工分类准确率
- 系统QPS达到200+,满足中小规模应用需求
- 获得校级优秀毕业设计奖项
6.2 遇到的挑战与解决方案
-
数据不均衡问题:
- 现象:有害垃圾样本数量不足
- 解决:采用过采样+数据增强组合策略
-
模型部署性能瓶颈:
- 现象:单次推理耗时>1s
- 解决:模型量化+TensorRT优化,降至300ms
-
前后端协作问题:
- 现象:接口频繁变更
- 解决:制定API规范+使用Swagger文档
6.3 未来优化方向
-
模型层面:
- 尝试Vision Transformer架构
- 引入半监督学习利用未标注数据
-
系统层面:
- 增加多模态输入(文本+图像)
- 实现移动端APP(Flutter跨平台)
-
业务层面:
- 对接智能垃圾桶硬件
- 开发垃圾分类积分奖励系统
个人实践心得:这个项目让我深刻体会到AI落地应用的挑战。不仅需要好的算法,还需要考虑工程实现、用户体验和业务场景的结合。建议后来者在做类似项目时,尽早开始模型部署验证,不要等到最后阶段才发现性能问题。