用树莓派4B和YOLOv5s打造一个24小时监控小站:完整配置与优化心得

张开发
2026/5/20 6:27:12 15 分钟阅读
用树莓派4B和YOLOv5s打造一个24小时监控小站:完整配置与优化心得
树莓派4BYOLOv5s构建智能监控系统的实战指南在智能家居和物联网应用蓬勃发展的今天如何将先进的计算机视觉技术部署到边缘设备成为了许多开发者和创客关注的焦点。树莓派凭借其低廉的价格、出色的能效比和丰富的扩展接口成为了边缘计算的首选平台之一。而YOLOv5作为当前最流行的实时目标检测算法之一其轻量级版本YOLOv5s特别适合在资源受限的设备上运行。本文将详细介绍如何将这两者结合打造一个24小时运行的智能监控系统从硬件选型到软件优化分享一整套经过实战检验的解决方案。1. 硬件准备与环境配置1.1 树莓派4B的硬件选型与初始化树莓派4B有多个内存版本2GB/4GB/8GB对于运行YOLOv5s而言4GB版本是最佳性价比选择。8GB版本虽然内存更大但对于这个应用场景提升有限而2GB版本在长时间运行时可能会遇到内存瓶颈。必备配件清单树莓派4B主板推荐4GB内存版本官方树莓派摄像头模块或兼容的USB摄像头至少16GB的Class 10 microSD卡5V/3A的Type-C电源适配器散热套件金属外壳散热片可选PoE HAT如需通过网线供电安装官方Raspberry Pi OS Lite64位系统后建议进行以下基础配置# 启用摄像头接口 sudo raspi-config nonint do_camera 0 # 分配GPU内存建议至少128MB sudo raspi-config nonint do_memory_split 128 # 启用SSH远程访问 sudo raspi-config nonint do_ssh 0 # 设置静态IP可选 echo -e interface eth0\nstatic ip_address192.168.1.100/24\nstatic routers192.168.1.1\nstatic domain_name_servers192.168.1.1 | sudo tee -a /etc/dhcpcd.conf1.2 Python环境与关键依赖安装虽然树莓派自带Python3但为了获得最佳性能建议使用miniconda创建独立环境# 下载并安装miniconda wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh bash Miniconda3-latest-Linux-aarch64.sh # 创建专用环境 conda create -n yolov5 python3.8 conda activate yolov5 # 安装系统级依赖 sudo apt-get install -y libopenblas-dev libblas-dev m4 cmake cython libatlas-base-dev2. YOLOv5s的部署与优化2.1 模型选择与安装YOLOv5有多个版本s/m/l/x其中s版本最适合树莓派# 克隆YOLOv5仓库推荐6.0版本 git clone -b v6.0 https://github.com/ultralytics/yolov5.git cd yolov5 # 修改requirements.txt避免自动安装大尺寸依赖 sed -i s/^opencv-python/#opencv-python/ requirements.txt sed -i s/^torch/#torch/ requirements.txt sed -i s/^torchvision/#torchvision/ requirements.txt # 安装精简版依赖 pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/2.2 PyTorch的定制化安装树莓派ARM架构需要特殊版本的PyTorch。以下是经过验证的组合# 下载预编译的PyTorch wheel文件 wget https://github.com/Qengineering/PyTorch-Raspberry-Pi-OS-64bit/raw/main/torch-1.10.0-cp38-cp38-linux_aarch64.whl wget https://github.com/Qengineering/PyTorch-Raspberry-Pi-OS-64bit/raw/main/torchvision-0.11.1-cp38-cp38-linux_aarch64.whl # 安装时排除不必要的依赖 pip install torch-1.10.0-cp38-cp38-linux_aarch64.whl --no-deps pip install torchvision-0.11.1-cp38-cp38-linux_aarch64.whl --no-deps # 验证安装 python -c import torch; print(torch.__version__)3. 性能优化技巧3.1 模型量化与加速在树莓派上运行YOLOv5s时可以采用以下优化策略1. 模型动态量化import torch model torch.hub.load(ultralytics/yolov5, yolov5s) model torch.quantization.quantize_dynamic( model, {torch.nn.Linear}, dtypetorch.qint8 ) torch.save(model.state_dict(), yolov5s_quantized.pt)2. OpenCV的硬件加速import cv2 # 使用V4L2后端并开启硬件加速 cap cv2.VideoCapture(0, apiPreferencecv2.CAP_V4L2) cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(M, J, P, G))优化前后性能对比优化措施推理速度(FPS)内存占用(MB)CPU温度(℃)原始模型2.178072量化模型3.842065量化硬件加速5.3410583.2 温度控制与稳定性保障树莓派长时间运行需要考虑散热问题# 安装温度监控工具 sudo apt-get install lm-sensors # 配置温度监控脚本 cat EOF ~/monitor_temp.sh #!/bin/bash while true; do temp$(vcgencmd measure_temp | cut -d -f2) if [ \$(echo \$temp 70 | bc) -eq 1 ]; then echo 温度过高: \$temp | mail -s 树莓派过热警告 youremail.com /usr/bin/python3 /home/pi/yolov5/detect.py --pause fi sleep 300 done EOF # 添加开机自启 (crontab -l 2/dev/null; echo reboot /bin/bash /home/pi/monitor_temp.sh ) | crontab -4. 实际应用场景实现4.1 包裹检测系统实现针对门口包裹检测场景可以定制检测逻辑from yolov5 import detect import cv2 import time class PackageMonitor: def __init__(self): self.model detect.load_model(yolov5s_quantized.pt) self.last_package_time 0 def detect_package(self, frame): results self.model(frame) detections results.pandas().xyxy[0] packages detections[(detections[name]package) | (detections[name]box)] if len(packages) 0: self.last_package_time time.time() cv2.putText(frame, Package Detected!, (50,50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2) # 触发通知逻辑 self.send_notification() return frame def send_notification(self): # 实现邮件或MQTT通知 pass # 使用示例 monitor PackageMonitor() cap cv2.VideoCapture(0) while True: ret, frame cap.read() if not ret: break output monitor.detect_package(frame) cv2.imshow(Monitoring, output) if cv2.waitKey(1) ord(q): break4.2 系统服务化与自启动创建systemd服务实现开机自启# /etc/systemd/system/yolo_monitor.service [Unit] DescriptionYOLOv5 Monitoring Service Afternetwork.target [Service] Userpi WorkingDirectory/home/pi/yolov5 ExecStart/home/pi/miniconda3/envs/yolov5/bin/python /home/pi/yolov5/monitor.py Restartalways EnvironmentDISPLAY:0 [Install] WantedBymulti-user.target启用服务sudo systemctl daemon-reload sudo systemctl enable yolo_monitor.service sudo systemctl start yolo_monitor.service5. 进阶技巧与问题排查5.1 常见问题解决方案摄像头无法识别# 检查摄像头模块 vcgencmd get_camera # 应返回supported1 detected1 ls /dev/video* # 应显示video0设备 # 如果检测不到尝试加载驱动 sudo modprobe bcm2835-v4l2 echo bcm2835-v4l2 | sudo tee -a /etc/modules内存不足处理# 创建交换文件 sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile echo /swapfile none swap sw 0 0 | sudo tee -a /etc/fstab5.2 能效优化配置CPU调频策略# 查看当前频率 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor # 设置为节能模式适合24/7运行 echo powersave | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor # 限制最大频率避免过热 echo 1200000 | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freqGPU内存动态调整脚本import subprocess import psutil def adjust_gpu_memory(): mem psutil.virtual_memory() if mem.available 100*1024*1024: # 100MB可用内存 subprocess.run([sudo, raspi-config, nonint, do_memory_split, 64]) else: subprocess.run([sudo, raspi-config, nonint, do_memory_split, 128])

更多文章