1. 项目概述:当垃圾桶遇上计算机视觉
去年参与某智慧社区项目时,我第一次亲眼目睹了居民站在四色垃圾桶前手足无措的场景。这种"分类焦虑"催生了这个智能垃圾分类系统——通过200万像素摄像头捕捉垃圾图像,经MobileNetV3轻量化模型实时识别后,由STM32控制对应垃圾桶盖自动开启。整套系统识别准确率在测试环境中达到92.3%,单次识别耗时仅47ms,部署成本控制在800元/台以内。
这个开源项目包含完整的YOLOv5训练代码、Qt开发的上位机系统、STM32固件以及3D打印的机械结构设计文件。特别适合两类开发者:需要快速搭建原型机的物联网工程师,以及想要理解工业级图像识别落地的AI学习者。在垃圾房昏暗光照和物品重叠的现实场景中,我们通过数据增强和注意力机制提升鲁棒性的经验尤其值得参考。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心设计思路与技术选型
2.1 为什么选择两阶段识别架构
早期我们尝试过端到端的YOLOv5直接输出分类结果,但在实际测试中发现两个致命问题:一是塑料袋遮挡导致特征提取不全,二是同类垃圾不同形态(如压扁的易拉罐vs完整易拉罐)被误判为不同类别。最终方案采用:
-
目标检测阶段:YOLOv5s6模型定位垃圾物体
- 输入分辨率640x640
- 使用FocalLoss解决类别不平衡(厨艺垃圾占比60%+)
- 添加CBAM注意力模块提升小目标检测能力
-
分类阶段:裁剪后的ROI区域送入EfficientNet-B0
- 四分类输出(可回收/有害/厨余/其他)
- 使用Label Smoothing缓解过拟合
- 特征融合层加入HSV色彩空间信息
这种设计在RK3588开发板上的综合识别速度达到23FPS,比单阶段方案准确率提升14.2%。关键技巧在于两阶段模型共享主干网络的前三层卷积,既节省计算量又保持特征一致性。
2.2 硬件部署的性价比平衡
经过三轮硬件选型测试,我们最终确定的BOM清单如下:
| 组件 | 型号 | 单价 | 备注 |
|---|---|---|---|
| 主控 | STM32F407 | ¥58 | 带硬件浮点运算 |
| 摄像头 | OV2640 | ¥32 | 200万像素 |
| AI加速 | K210 | ¥89 | 替代方案RKNN |
| 电机 | SG90舵机x4 | ¥36 | 1.8kg·cm扭矩 |
| 结构件 | 3D打印 | ¥25 | PETG材料 |
特别说明几个踩坑点:
- 树莓派4B虽然开发方便,但连续工作72小时后出现内存泄漏
- ESP32-CAM的图像传输延迟波动大(200-800ms)
- 舵机需要额外添加PD控制算法防止盖子抖动
3. 数据工程的关键实践
3.1 构建具有现实干扰的数据集
我们在6个社区垃圾站采集了12,000张原始图像,包含以下现实干扰因素:
- 雨天反光的水渍
- 半透明塑料袋包裹
- 重叠堆放的物品
- 黄昏时段的低光照
数据增强策略特别强化了这些场景:
python复制albumentations.Compose([
RandomShadow(shadow_roi=(0, 0.5, 1, 1), p=0.3),
GlassBlur(sigma=0.7, max_delta=2, p=0.2),
RandomRain(drop_length=20, p=0.1),
HueSaturationValue(hue_shift_limit=10, sat_shift_limit=15, val_shift_limit=10)
])
3.2 解决类别不平衡的采样技巧
初始数据集中四类样本比例为62:15:18:5,我们采用三种方法组合:
- 过采样:对稀有类别使用旋转、镜像等几何变换
- 困难样本挖掘:重点关注被误判的边界案例
- 损失函数加权:γ=2的Focal Loss参数设置
最终在验证集上各类别的F1-score均达到0.85+,特别是最难识别的有害垃圾(电池、药品等)召回率达到89.2%。
4. 系统集成与性能优化
4.1 多线程处理流水线设计
为提高实时性,系统采用生产者-消费者模式:
cpp复制// 图像采集线程
void capture_thread() {
while(1) {
Mat frame = camera.read();
queue.push(frame); // 环形缓冲区
}
}
// AI推理线程
void infer_thread() {
while(1) {
Mat img = queue.pop();
auto results = model.predict(img);
mqtt_publish(results); // 发布到消息队列
}
}
关键参数调优:
- 图像缓冲区大小设为3(内存占用与延迟的平衡点)
- 使用TensorRT加速后推理耗时从83ms降至47ms
- 开启STM32的硬件CRC校验确保通信可靠性
4.2 断电恢复机制的实现
考虑到垃圾房可能突然断电,我们设计了三级保护:
- 硬件层面:超级电容维持3秒供电完成紧急日志写入
- 软件层面:每5分钟将状态快照保存到FRAM
- 云端层面:通过MQTT心跳包检测离线状态
恢复流程:
mermaid复制[违规内容已移除]
5. 部署中的典型问题排查
5.1 光照条件导致的识别漂移
在某地下车库部署时遇到识别率骤降问题,通过以下步骤解决:
- 采集环境样本发现色温偏差达2800K
- 在摄像头前加装6500K色温补偿片
- 模型微调时添加色温增强数据:
python复制def color_temp_aug(img, temp): import cv2 inv_temp = 1/temp img = cv2.cvtColor(img, cv2.COLOR_BGR2LAB) img[:,:,0] = np.clip(img[:,:,0]*inv_temp, 0, 255) return cv2.cvtColor(img, cv2.COLOR_LAB2BGR)
5.2 机械结构常见故障处理
收集到的现场故障统计表:
| 故障现象 | 根本原因 | 解决方案 |
|---|---|---|
| 桶盖开合不到位 | 舵机扭矩不足 | 更换为MG996R型号 |
| 异物卡住 | 硬币掉入缝隙 | 增加2mm孔径的过滤网 |
| 齿轮打滑 | 长期使用磨损 | 涂抹二硫化钼润滑脂 |
建议每三个月进行:
- 导轨清洁(使用WD-40)
- 皮带张力检测(用张力计保持4N)
- 限位开关校准(用塞规调整0.5mm间隙)
6. 项目扩展方向
当前系统已实现通过微信小程序查询分类记录,下一步计划:
- 集成称重模块统计各类垃圾产量
- 添加RFID识别特定品类(如药品包装)
- 利用LSTM分析投放高峰时段
在模型层面,我们正在试验知识蒸馏方案,将双模型压缩为单个Nanodet模型,预计可使RK3588上的推理速度提升到35FPS。最近发现将HSV色彩直方图作为辅助特征输入,能有效提升透明塑料瓶的识别准确率。
