Jetson Nano上YOLOv5实时检测避坑指南:从CUDA配置到TensorRT加速
当你在Jetson Nano上部署YOLOv5时,可能会遇到各种意想不到的问题。本文将带你避开这些"坑",从CUDA配置到TensorRT加速,一步步实现高效的实时目标检测。
1. 环境准备:避开基础配置的陷阱
Jetson Nano虽然小巧,但其NVIDIA Maxwell架构GPU和四核ARM Cortex-A57处理器使其成为边缘计算的理想选择。但在开始前,有几个关键点需要注意:
JetPack版本选择:推荐使用JetPack 4.6.1,它包含了CUDA 10.2、cuDNN 8.2和TensorRT 8.0,这些都是YOLOv5运行的基础。安装时确保选择"完整安装"选项。
系统优化:默认配置下,Jetson Nano的交换空间(swap)只有2GB,这对于YOLOv5来说远远不够。通过以下命令可以扩展交换空间:
sudo sed -i 's/mem = $(("${totalmem}"/2/"${NRDEVICES}")*1024)/mem = $(("${totalmem}"*2/"${NRDEVICES}")*1024)/g' /etc/systemd/nvzramconfig.sh sudo reboot注意:修改后需要重启才能生效,使用
free -h命令验证交换空间是否已增加到约7.7GB。
电源模式设置:Jetson Nano有两种电源模式:
模式 最大CPU频率 GPU频率 功耗 5W 1.2GHz 640MHz 5W 10W 1.9GHz 921MHz 10W 对于YOLOv5实时检测,建议使用10W模式以获得更好性能:
sudo nvpmodel -m 0 sudo jetson_clocks2. CUDA和PyTorch安装:解决兼容性问题
2.1 CUDA环境配置
虽然JetPack已经安装了CUDA,但环境变量需要正确设置。编辑~/.bashrc文件:
export CUDA_HOME=/usr/local/cuda-10.2 export LD_LIBRARY_PATH=/usr/local/cuda-10.2/lib64:$LD_LIBRARY_PATH export PATH=/usr/local/cuda-10.2/bin:$PATH保存后执行source ~/.bashrc使配置生效。验证安装:
nvcc --version常见问题:
- nvcc命令未找到:通常是因为环境变量未正确设置,检查CUDA_HOME路径是否正确。
- 版本不匹配:确保CUDA版本与PyTorch版本兼容。
2.2 PyTorch安装避坑指南
Jetson Nano需要安装ARM架构的PyTorch版本。以下是常见问题及解决方案:
下载正确的whl文件:
- 官方推荐:
torch-1.8.0-cp36-cp36m-linux_aarch64.whl - 下载地址:NVIDIA官方提供的链接(注意需要科学上网)
- 官方推荐:
依赖安装:
sudo apt-get update sudo apt-get install python3-pip libopenblas-base libopenmpi-dev换源加速: 创建
~/.pip/pip.conf文件,内容如下(推荐使用阿里源):[global] index-url=http://mirrors.aliyun.com/pypi/simple/ [install] trusted-host=mirrors.aliyun.com安装PyTorch:
pip3 install numpy torch-1.8.0-cp36-cp36m-linux_aarch64.whl验证安装:
import torch print(torch.__version__) # 应输出1.8.0 print(torch.cuda.is_available()) # 应输出True
常见错误:"Illegal instruction (core dumped)"通常是由于ARM架构不兼容导致,确保下载的是aarch64版本。
3. YOLOv5环境搭建:从源码到推理
3.1 克隆和安装YOLOv5
git clone https://github.com/ultralytics/yolov5 cd yolov5 pip3 install -r requirements.txt常见问题及解决方案:
matplotlib安装失败:
- 单独下载对应的whl文件安装
- 或者使用
sudo apt-get install python3-matplotlib
OpenCV相关问题:
- 如果遇到"ImportError: libGL.so.1"错误,执行:
sudo apt-get install libgl1-mesa-glx
- 如果遇到"ImportError: libGL.so.1"错误,执行:
测试YOLOv5:
python3 detect.py --weights yolov5n.pt --img 640 --source 0 # 摄像头测试
3.2 模型选择与优化
YOLOv5提供了多种预训练模型,在Jetson Nano上推荐使用:
| 模型 | 参数量 | 推理速度(FPS) | 准确率(mAP) |
|---|---|---|---|
| YOLOv5n | 1.9M | ~25 | 28.0 |
| YOLOv5s | 7.2M | ~15 | 37.4 |
| YOLOv5m | 21.2M | ~8 | 45.4 |
对于实时检测,YOLOv5n是最佳选择。可以通过以下方式进一步优化:
- 减小输入尺寸:将默认的640x640降低到320x320
- 使用半精度(FP16):减少内存占用并提高速度
- 批处理大小设为1:适应Jetson Nano的内存限制
4. TensorRT加速:实现25+FPS的关键
4.1 TensorRT基本流程
下载tensorrtx:
git clone https://github.com/wang-xinyu/tensorrtx.git生成.wts文件:
cp tensorrtx/yolov5/gen_wts.py yolov5/ cd yolov5 python3 gen_wts.py -w yolov5n.pt -o yolov5n.wts编译和转换:
cd ~/tensorrtx/yolov5 mkdir build cd build cmake .. make sudo ./yolov5 -s yolov5n.wts yolov5n.engine n
4.2 常见编译错误解决
CMake错误:
- 确保安装了所有依赖:
sudo apt-get install build-essential cmake
- 确保安装了所有依赖:
CUDA相关错误:
- 检查CUDA路径是否正确
- 确保环境变量已设置
内存不足:
- 增加交换空间(如第一部分所述)
- 关闭不必要的程序释放内存
4.3 摄像头实时检测实现
修改yolov5.cpp以支持USB摄像头:
cv::VideoCapture capture(0); // 参数0表示使用第一个摄像头 if (!capture.isOpened()) { std::cout << "无法打开摄像头" << std::endl; return -1; }编译并运行:
make -j4 # 使用4个核心编译 sudo ./yolov5 -d yolov5n.engine ../samples/ # 测试图片 sudo ./yolov5 -v yolov5n.engine # 使用摄像头4.4 性能优化技巧
FP16模式: 在
yolov5.cpp中取消注释#define USE_FP16以启用半精度推理。置信度阈值调整: 修改
CONF_THRESH值(默认0.25)以平衡准确率和速度。NMS阈值调整: 修改
NMS_THRESH值(默认0.4)以控制重叠检测框的合并程度。显示优化: 添加FPS计数器:
auto start = std::chrono::system_clock::now(); // 推理代码 auto end = std::chrono::system_clock::now(); int fps = 1000.0 / std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
通过这些优化,在Jetson Nano上可以实现25+FPS的YOLOv5实时目标检测,满足大多数边缘计算场景的需求。