用Jetson Nano和YOLOv5s打造低成本智能监控系统实战指南

当我在工作室第一次用Jetson Nano跑通YOLOv5s实时检测时,那种兴奋感至今难忘——一块信用卡大小的开发板,竟能流畅处理1080p视频流并实时标记出画面中的行人、车辆。这让我意识到,边缘AI设备的潜力远超我们想象。本文将分享如何从零构建这样一个系统,重点解决模型转换、性能优化和系统集成三大核心问题。

1. 硬件准备与环境配置

Jetson Nano开发板有4GB和2GB两个版本,建议选择4GB型号以获得更好的多任务处理能力。实测显示,4GB版本在运行TensorRT加速的YOLOv5s时,显存占用能控制在3.2GB以内,留有足够余量处理其他任务。

必备配件清单:

  • 官方电源适配器(5V/4A)
  • 32GB以上UHS-I microSD卡
  • 支持H.264编码的USB摄像头(如Logitech C920)
  • 散热套件(带风扇的散热外壳)

配置环境时最容易踩坑的是JetPack版本选择。经过多次测试,我强烈推荐使用JetPack 4.6.1而非最新版,因为其CUDA 10.2和cuDNN 8.2.1的组合对YOLOv5s的兼容性最好。安装完成后,第一件事就是调整交换空间:

sudo sed -i 's/mem = $(("${totalmem}"/2/"${NRDEVICES}")*1024)/mem = $(("${totalmem}"*2/"${NRDEVICES}")*1024)/g' /etc/systemd/nvzramconfig.sh
sudo reboot

这个修改将交换分区从默认的2GB提升到7.7GB,能有效避免编译大型项目时的内存不足问题。记得用 free -h 命令验证修改是否生效。

2. YOLOv5s模型优化实战

直接从官方仓库克隆的YOLOv5s模型(.pt格式)在Nano上运行效率并不理想,实测FPS只有8-10帧。要实现25FPS的目标,必须经过TensorRT优化。这里分享几个关键优化步骤:

模型转换对比表:

转换阶段 文件格式 推理速度(FPS) 精度(mAP) 适用场景
原始模型 .pt 8-10 0.856 训练调试
ONNX .onnx 12-15 0.851 跨平台部署
TensorRT .engine 22-28 0.848 边缘设备

转换过程需要先生成.wts中间文件:

python3 gen_wts.py -w yolov5n.pt -o yolov5n.wts

接着用TensorRTx项目编译生成.engine文件。这里有个隐藏技巧:在CMakeLists.txt中添加 -DCMAKE_CUDA_ARCHITECTURES=53 可以针对Nano的Maxwell架构优化编译:

cd tensorrtx/yolov5
mkdir build && cd build
cmake -DCMAKE_CUDA_ARCHITECTURES=53 ..
make -j4
sudo ./yolov5 -s ../yolov5n.wts yolov5n.engine n

3. 摄像头集成与性能调优

USB摄像头的选择直接影响系统稳定性。测试发现,支持MJPEG格式的摄像头比YUV节省约30%的CPU开销。在OpenCV中这样初始化摄像头:

cv::VideoCapture cap;
cap.open(0, cv::CAP_V4L2);
cap.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M','J','P','G'));
cap.set(cv::CAP_PROP_FRAME_WIDTH, 1280);
cap.set(cv::CAP_PROP_FRAME_HEIGHT, 720);

要实现25FPS稳定输出,需要调整三个关键参数:

  1. 将检测置信度阈值从0.5降到0.3(在yolov5.cpp中修改CONF_THRESH)
  2. 使用FP16精度模式(在CMake时添加 -DUSE_FP16=ON
  3. 限制检测区域ROI(对640x480画面只检测中央400x400区域)

经过这些优化后,系统资源占用情况如下:

CPU利用率: 65%-75%
GPU利用率: 85%-95%
内存占用: 2.8GB/3.9GB
温度: 52-58℃

4. 系统封装与自启动服务

要让设备真正实用化,需要解决两个问题:开机自启动和异常恢复。我采用systemd服务管理,创建 /etc/systemd/system/yolov5.service 文件:

[Unit]
Description=YOLOv5 Detection Service
After=network.target

[Service]
ExecStart=/home/nano/yolov5/start_detection.sh
Restart=always
User=nano

[Install]
WantedBy=multi-user.target

配套的启动脚本 start_detection.sh 包含健康检查逻辑:

#!/bin/bash
while true; do
    fps=$(./detect --engine yolov5n.engine | grep FPS | awk '{print $2}')
    if [ -z "$fps" ] || [ "$fps" -lt 15 ]; then
        pkill detect
        sleep 2
    fi
    sleep 5
done

这套方案在连续72小时压力测试中保持稳定,没有出现内存泄漏或进程挂起。最后分享一个实用技巧:用 nvpmodel -m 0 将Nano设置为最大性能模式,再配合 jetson_clocks 锁定最高频率,可以再提升10%的推理速度。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐