1. Ubuntu环境下人流量分析系统搭建实录
上周帮连锁便利店客户部署了一套基于Ubuntu的人流量统计系统,从摄像头接入到数据分析全流程跑通只用了3天。这套方案最大的优势是硬件成本不到商业系统的1/5,而且完全避开了Windows系统的版权问题。今天就把具体实现过程拆解给大家,包含我踩过的所有坑和优化技巧。
1.1 核心组件选型
系统架构采用经典的"摄像头+边缘计算+云端存储"模式:
- 硬件层:普通USB摄像头(推荐罗技C920,实测夜间效果优于国产型号)
- 分析层:OpenCV 4.5 + YOLOv4-tiny模型(在Jetson Nano上能跑25fps)
- 存储层:SQLite本地缓存 + 定时同步到MySQL主库
- 可视化:Grafana + 自研Python看板
特别注意:Ubuntu 22.04默认的Python 3.10与某些AI框架存在兼容性问题,建议新建conda环境使用Python 3.8
1.2 关键性能优化点
在Jetson Nano开发板上测试时,原始模型处理速度只有8fps,通过以下调整提升到25fps:
- 启用TensorRT加速(需手动编译OpenCV with CUDA支持)
cmake -D WITH_CUDA=ON -D CUDA_ARCH_BIN="5.3" ..- 将视频解码改为硬件加速
cap = cv2.VideoCapture(0, cv2.CAP_V4L2)- 限制检测区域ROI(减少30%运算量)
2. 详细部署流程
2.1 基础环境配置
先解决Ubuntu特有的依赖问题:
# 必须安装的依赖项 sudo apt install libgtk2.0-dev pkg-config libavcodec-dev libswscale-dev # 解决中文路径问题 export LANG=en_US.UTF-82.2 人流检测核心代码
使用背景差分法+卡尔曼滤波实现:
class PeopleCounter: def __init__(self): self.bg_subtractor = cv2.createBackgroundSubtractorMOG2( history=500, varThreshold=16, detectShadows=False) def process_frame(self, frame): fg_mask = self.bg_subtractor.apply(frame) # 形态学处理省略... contours, _ = cv2.findContours(fg_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) return len([c for c in contours if cv2.contourArea(c) > 500])2.3 数据持久化方案
采用双写策略保证数据可靠性:
- 本地SQLite缓存最近1小时数据
- 每5分钟批量同步到云端MySQL
- 断网时自动重试机制(指数退避算法)
3. 踩坑记录与解决方案
3.1 摄像头兼容性问题
测试过的摄像头中:
- 罗技C920:即插即用,支持MJPG格式
- 某国产摄像头:需要手动设置分辨率
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)3.2 时区导致的统计偏差
发现凌晨时段数据异常,原因是:
- Ubuntu默认UTC时间
- 数据库按本地时间存储
解决方法:
sudo timedatectl set-timezone Asia/Shanghai3.3 内存泄漏排查
连续运行3天后进程崩溃,通过valgrind检测发现:
- OpenCV的VideoCapture未正确释放
- 解决方法:增加析构函数
def __del__(self): self.cap.release()4. 性能优化进阶技巧
4.1 多进程架构设计
采用生产者-消费者模式提升吞吐量:
from multiprocessing import Queue, Process def detector(input_q, output_q): while True: frame = input_q.get() result = process_frame(frame) output_q.put(result) # 启动4个worker进程 for i in range(4): Process(target=detector, args=(input_q, output_q)).start()4.2 模型量化加速
将YOLOv4-tiny从FP32转为INT8:
./darknet detector train cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights -quantized 1量化后模型大小减少60%,推理速度提升35%
4.3 温度控制策略
Jetson Nano长时间运行会过热降频:
- 加装散热风扇(必须)
- 设置温度阈值
sudo /usr/bin/jetson_clocks --fan这套系统在10家门店部署后,客户反馈准确率能达到商业系统的90%水平,而硬件成本仅需800元/店。最关键的收获是:Ubuntu在边缘计算场景下的稳定性远超预期,连续运行60天无需重启。