在边缘计算设备上部署目标检测模型一直是计算机视觉领域的热门话题。Jetson Nano作为NVIDIA推出的低成本AI开发板,凭借其4核ARM Cortex-A57 CPU和128核Maxwell架构GPU,成为运行YOLOv7这类先进目标检测模型的理想平台。本文将详细记录我在Jetson Nano上部署YOLOv7的完整过程,包括环境配置、模型转换、性能优化等关键环节。
Jetson Nano开发板(建议使用4GB内存版本)
至少32GB的microSD卡(推荐使用UHS-1及以上速度等级)
5V/4A电源适配器(确保稳定供电)
USB摄像头或CSI摄像头(用于实时检测演示)
首先需要为Jetson Nano刷写最新的JetPack系统镜像。截至2023年,推荐使用JetPack 4.6.1版本,它包含:
注意:JetPack 5.x系列目前对YOLOv7的支持尚不完善,建议暂时使用4.6.1版本
bash复制sudo apt-get update
sudo apt-get install -y python3-pip python3-dev libopenblas-base libopenmpi-dev
pip3 install --upgrade pip
由于Jetson Nano使用ARM架构,需要安装专门编译的PyTorch版本:
bash复制wget https://nvidia.box.com/shared/static/p57jwntv436lfrd78inwl7iml6p13fzh.whl -O torch-1.10.0-cp36-cp36m-linux_aarch64.whl
pip3 install torch-1.10.0-cp36-cp36m-linux_aarch64.whl
bash复制pip3 install numpy==1.19.4 opencv-python==4.5.4.60 matplotlib tqdm pycocotools scipy
bash复制git clone https://github.com/WongKinYiu/yolov7.git
cd yolov7
bash复制wget https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-tiny.pt
提示:在Jetson Nano上建议使用yolov7-tiny版本,它在保持较好精度的同时大幅减少计算量
为了在Jetson Nano上获得最佳性能,需要将PyTorch模型转换为TensorRT格式:
bash复制python3 export.py --weights yolov7-tiny.pt --grid --end2end --simplify --topk-all 100 --iou-thres 0.65 --conf-thres 0.35 --img-size 640 640
转换完成后会生成yolov7-tiny.onnx文件,接着使用TensorRT进行进一步优化:
bash复制/usr/src/tensorrt/bin/trtexec --onnx=yolov7-tiny.onnx --saveEngine=yolov7-tiny.trt --fp16
bash复制sudo nvpmodel -m 0 # 设置为最大性能模式
sudo jetson_clocks # 锁定最高频率
修改detect.py脚本,添加以下优化:
python复制import torch
from torch2trt import TRTModule
model_trt = TRTModule()
model_trt.load_state_dict(torch.load('yolov7-tiny.trt'))
# 使用TensorRT优化后的模型进行推理
with torch.no_grad():
pred = model_trt(img)
由于Jetson Nano内存有限,需要特别注意:
bash复制sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
使用640x640输入分辨率测试yolov7-tiny模型:
| 指标 | 数值 |
|---|---|
| 推理时间 | 45ms |
| FPS | 22 |
| 内存占用 | 1.8GB |
| GPU利用率 | 85% |
症状:加载TRT模型时出现段错误
解决方案:
bash复制sudo rm -rf ~/.nv
sudo apt-get install --reinstall libnvinfer*
可能原因:
检查方法:
bash复制tegrastats # 监控系统状态
对于CSI摄像头,需要使用GStreamer管道:
python复制def gstreamer_pipeline(
capture_width=1280,
capture_height=720,
display_width=1280,
display_height=720,
framerate=30,
flip_method=0,
):
return (
"nvarguscamerasrc ! "
"video/x-raw(memory:NVMM), "
f"width=(int){capture_width}, height=(int){capture_height}, "
f"format=(string)NV12, framerate=(fraction){framerate}/1 ! "
f"nvvidconv flip-method={flip_method} ! "
f"video/x-raw, width=(int){display_width}, height=(int){display_height}, format=(string)BGRx ! "
"videoconvert ! "
"video/x-raw, format=(string)BGR ! appsink"
)
基于YOLOv7在Jetson Nano上的部署,可以开发多种边缘AI应用:
实际部署时还需要考虑: