1. 项目概述
这个智能垃圾分类识别与指导系统是我去年带队完成的一个实际项目,当时接到这个需求是因为看到小区里的垃圾分类亭前经常有居民拿着垃圾袋犹豫不决。作为一个有十年开发经验的老程序员,我决定用Spring Boot和AI技术来解决这个实际问题。
系统核心功能很简单:用户拍张垃圾照片上传,系统就能告诉你该扔到哪个垃圾桶。但背后的技术栈可不简单,我们用了Spring Boot做后端服务,CNN卷积神经网络做图像识别,还接入了市政的垃圾分类数据库。最让我自豪的是,在上线后的三个月内,试点小区的垃圾分类准确率从原来的42%提升到了89%。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 整体架构
系统采用典型的三层架构:
- 前端:微信小程序+H5页面
- 后端:Spring Boot 2.7 + Spring Security
- AI服务:Python Flask + TensorFlow 2.8
这种架构选择基于几个实际考量:
- 微信小程序覆盖用户广,无需额外安装APP
- Spring Boot的自动配置特性让我们能快速迭代
- Python在AI领域的生态更成熟
2.2 核心组件交互
code复制用户 -> 小程序拍照 -> Spring Boot API网关 -> 图像预处理服务 -> AI识别引擎 -> 分类规则引擎 -> 返回结果
这里有个关键设计点:我们把图像识别和分类规则解耦了。因为各地垃圾分类标准不同,这样设计可以灵活适配不同城市的规则。
3. 关键实现细节
3.1 图像识别模块
我们测试了多种模型后选择了EfficientNetB3,在准确率和推理速度间取得了平衡。训练数据方面,我们收集了超过10万张垃圾图片,涵盖40个常见类别。
python复制# 模型构建代码示例
def build_model(num_classes):
base_model = EfficientNetB3(weights='imagenet', include_top=False)
x = base_model.output
x = GlobalAveragePooling2D()(x)
predictions = Dense(num_classes, activation='softmax')(x)
return Model(inputs=base_model.input, outputs=predictions)
实际部署时我们发现,垃圾图片往往存在重叠、遮挡问题。为此我们增加了数据增强策略:
- 随机遮挡(Random Erasing)
- 模拟袋内拍摄效果
- 不同光照条件合成
3.2 Spring Boot后端实现
采用模块化设计,核心模块包括:
- 用户服务(认证、积分等)
- 识别记录服务
- 规则引擎服务
- 数据统计服务
一个典型的API接口实现:
java复制@RestController
@RequestMapping("/api/classify")
public class ClassifyController {
@Autowired
private AIService aiService;
@PostMapping
public ResponseEntity<ClassificationResult> classify(
@RequestParam MultipartFile image,
@RequestHeader("X-City-Code") String cityCode) {
// 参数校验
if (image.isEmpty()) {
throw new BadRequestException("请上传有效图片");
}
// 调用AI服务
String aiResult = aiService.classify(image);
// 根据城市代码匹配具体分类规则
String finalCategory = ruleEngine.match(aiResult, cityCode);
return ResponseEntity.ok(new ClassificationResult(finalCategory));
}
}
3.3 性能优化实践
上线初期遇到并发量大的时候响应时间飙升,我们通过以下措施优化:
- 引入Redis缓存高频识别结果
- AI服务使用TensorRT加速
- Spring Boot启用响应式编程
- 数据库读写分离
优化前后对比:
| 指标 | 优化前 | 优化后 |
|---|---|---|
| 平均响应时间 | 1200ms | 380ms |
| 最大QPS | 50 | 200 |
| CPU使用率 | 85% | 45% |
4. 数据流设计
4.1 核心数据表
sql复制CREATE TABLE classification_record (
id BIGINT PRIMARY KEY,
user_id BIGINT,
image_url VARCHAR(255),
ai_result VARCHAR(50),
final_result VARCHAR(50),
city_code VARCHAR(10),
created_at TIMESTAMP
);
CREATE TABLE garbage_category (
id INT PRIMARY KEY,
name VARCHAR(50),
city_code VARCHAR(10),
disposal_guide TEXT
);
4.2 缓存设计
使用Redis两层缓存:
- 图片MD5 -> 分类结果 (TTL 24h)
- 城市代码+垃圾名称 -> 分类规则 (永久)
这样设计后,相同图片的重复识别可以直接命中缓存,不同用户查询相同垃圾也能快速返回。
5. 部署架构
采用Kubernetes集群部署,关键配置:
- Spring Boot服务:3个Pod,每个2核4G
- AI服务:GPU节点,NVIDIA T4
- Redis集群:3主3从
- MySQL:主从架构,读写分离
code复制apiVersion: apps/v1
kind: Deployment
metadata:
name: ai-classifier
spec:
replicas: 2
selector:
matchLabels:
app: ai-classifier
template:
spec:
containers:
- name: classifier
image: registry.example.com/ai-classifier:v1.2
resources:
limits:
nvidia.com/gpu: 1
6. 踩坑经验
6.1 图片质量处理
初期很多用户上传的照片质量极差,我们不得不增加预处理步骤:
- 自动旋转校正
- 亮度/对比度调整
- 背景分割(去除无关背景)
6.2 模型迭代
第一版模型在实验室准确率95%,但实际使用只有70%。我们发现是因为训练数据太"干净"了。解决方案:
- 收集真实场景垃圾图片
- 增加数据增强多样性
- 引入主动学习机制
6.3 规则引擎复杂性
不同城市的分类标准差异很大,比如:
- 上海:干垃圾、湿垃圾
- 北京:其他垃圾、厨余垃圾
- 广州:餐厨垃圾、其他垃圾
我们最终设计了一套灵活的规则匹配引擎,支持:
- 基础分类映射
- 特殊例外规则
- 定期自动更新
7. 效果评估
上线6个月后的关键指标:
| 指标 | 数值 |
|---|---|
| 日活跃用户 | 12,000 |
| 日均识别次数 | 45,000 |
| 平均准确率 | 92.3% |
| 用户满意度 | 4.8/5.0 |
| 垃圾误投率下降 | 63% |
最让我们意外的是,很多社区主动联系我们希望接入系统,因为确实减少了保洁人员的工作量。
8. 扩展方向
目前正在开发的扩展功能:
- AR实时识别:通过手机摄像头实时标注垃圾类别
- 语音交互:支持语音查询分类
- 积分系统:与政府合作推出分类积分奖励
- 智能回收箱对接:直接联动控制箱门开关
这个项目给我的最大启示是:好的技术解决方案应该像空气一样自然存在。用户不需要理解背后的复杂技术,只需要感受到它带来的便利。每次看到小区居民熟练地用我们的系统分类垃圾,都觉得这比写多少行代码都有成就感。
