1. 项目概述
这个基于YOLO的景区垃圾识别实时检测平台,是我最近完成的一个很有意思的计算机视觉项目。它通过将YOLO目标检测算法与Flask Web框架结合,实现了对景区环境中各类垃圾的实时识别和可视化展示。整套系统采用前后端分离架构,前端使用HTML/CSS/JS构建交互界面,后端通过Flask+SocketIO实现实时数据传输。
在实际测试中,系统在1080p视频流上能达到25FPS的检测速度,准确识别塑料瓶、纸屑、烟头等常见垃圾类型。特别值得一提的是,我们针对景区场景优化了YOLO模型,使其对小目标垃圾的检测效果提升了约15%。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构解析
2.1 整体架构设计
系统采用典型的B/S架构:
code复制客户端浏览器 ←WebSocket→ Flask服务器 ←Python接口→ YOLO检测模型
这种架构的优势在于:
- 用户无需安装任何软件,通过浏览器即可访问
- WebSocket实现低延迟的视频流传输
- 前后端完全解耦,便于独立开发和部署
2.2 核心技术选型
YOLO模型选择:
我们测试了YOLOv5、YOLOv8等多个版本,最终选择YOLOv5s作为基础模型。原因如下:
- 模型大小仅14MB,适合实时推理
- 在COCO数据集上mAP达到37.4,精度足够
- 社区支持完善,部署文档丰富
Web框架选型:
Flask相比Django更适合这个项目,因为:
- 轻量级,启动快
- 与SocketIO集成简单
- 适合快速开发原型系统
3. 核心实现细节
3.1 YOLO模型优化
针对景区垃圾检测的特殊需求,我们做了以下优化:
- 数据增强:
python复制# 训练时的数据增强配置
augment: True
hsv_h: 0.015 # 色调增强
hsv_s: 0.7 # 饱和度增强
hsv_v: 0.4 # 明度增强
flipud: 0.5 # 上下翻转概率
fliplr: 0.5 # 左右翻转概率
-
锚框优化:
使用k-means算法在自定义数据集上重新计算锚框尺寸,使模型更适应小目标检测。 -
损失函数改进:
引入Focal Loss解决正负样本不平衡问题,对小目标检测效果提升明显。
3.2 实时视频流处理
视频处理流程的关键代码:
python复制def gen_frames():
cap = cv2.VideoCapture(0)
while True:
success, frame = cap.read()
if not success:
break
else:
# YOLO检测
results = model(frame)
# 绘制检测框
annotated_frame = results.render()[0]
# 转换为JPEG格式
ret, buffer = cv2.imencode('.jpg', annotated_frame)
frame = buffer.tobytes()
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
3.3 WebSocket实时通信
使用SocketIO实现前后端实时通信的核心逻辑:
python复制@socketio.on('connect')
def handle_connect():
print('Client connected')
@socketio.on('disconnect')
def handle_disconnect():
print('Client disconnected')
@socketio.on('video_feed')
def handle_video_feed(data):
# 处理视频流数据
emit('frame_update', processed_frame)
4. 前端界面实现
4.1 主要功能模块
- 实时视频显示区:
html复制<div class="video-container">
<img id="videoFeed" src="{{ url_for('video_feed') }}">
</div>
- 检测结果统计面板:
javascript复制function updateStats(data) {
document.getElementById('plastic-count').innerText = data.plastic;
document.getElementById('paper-count').innerText = data.paper;
// 其他类别更新...
}
- 历史记录查询:
使用Chart.js实现检测结果的可视化展示。
4.2 关键CSS样式
css复制.video-container {
position: relative;
width: 800px;
height: 600px;
margin: 0 auto;
border: 2px solid #4CAF50;
border-radius: 8px;
overflow: hidden;
}
.detection-box {
position: absolute;
border: 2px solid #FF5722;
background-color: rgba(255, 87, 34, 0.2);
}
5. 系统部署方案
5.1 开发环境部署
- 安装依赖:
bash复制pip install -r requirements.txt
# requirements.txt内容
flask==2.0.1
flask-socketio==5.1.1
opencv-python==4.5.3.56
torch==1.9.0
- 启动服务:
bash复制python app.py
5.2 生产环境部署
推荐使用Gunicorn+Nginx部署:
bash复制gunicorn -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker -w 4 -b :5000 app:app
Nginx配置要点:
code复制location / {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
6. 性能优化技巧
6.1 模型推理加速
- TensorRT加速:
python复制model = torch.hub.load('ultralytics/yolov5', 'custom', path='best.engine')
- 半精度推理:
python复制model.half() # 转换为半精度
- 批处理优化:
python复制# 同时处理多帧
results = model([frame1, frame2, frame3])
6.2 Web端优化
- 视频流压缩:
python复制# 调整视频质量参数
ret, buffer = cv2.imencode('.jpg', frame, [int(cv2.IMWRITE_JPEG_QUALITY), 70])
- 智能降帧策略:
当检测到客户端网络状况不佳时,自动降低帧率。
7. 常见问题解决
7.1 模型相关问题
问题1:小目标检测效果差
- 解决方案:增加更多小目标样本,调整锚框尺寸
问题2:误检率高
- 解决方案:增加困难负样本,调整NMS阈值
7.2 Web端相关问题
问题1:视频流延迟高
- 检查网络带宽
- 降低视频分辨率
- 启用WebSocket压缩
问题2:内存泄漏
- 定期重启Flask服务
- 使用内存分析工具定位问题
8. 项目扩展方向
-
多摄像头支持:
实现景区多个监控点的统一管理。 -
垃圾分类统计:
按日/周/月统计各类垃圾出现频率。 -
移动端适配:
开发响应式界面,支持手机端查看。 -
智能告警系统:
当检测到大量垃圾时,自动通知保洁人员。
这个项目从构思到实现大约花了2个月时间,期间最大的收获是学会了如何将深度学习模型与实际业务系统相结合。特别是在模型优化和实时性保证方面,积累了不少实战经验。如果读者有兴趣复现这个项目,建议先从基础的YOLO模型调试开始,逐步加入Web功能模块。
