Jetson Nano上YOLOv5实时检测避坑指南:从CUDA配置到TensorRT加速,保姆级排错
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频率功耗5W1.2GHz640MHz5W10W1.9GHz921MHz10W对于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-urlhttp://mirrors.aliyun.com/pypi/simple/ [install] trusted-hostmirrors.aliyun.com安装PyTorchpip3 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 克隆和安装YOLOv5git clone https://github.com/ultralytics/yolov5 cd yolov5 pip3 install -r requirements.txt常见问题及解决方案matplotlib安装失败单独下载对应的whl文件安装或者使用sudo apt-get install python3-matplotlibOpenCV相关问题如果遇到ImportError: libGL.so.1错误执行sudo apt-get install libgl1-mesa-glx测试YOLOv5python3 detect.py --weights yolov5n.pt --img 640 --source 0 # 摄像头测试3.2 模型选择与优化YOLOv5提供了多种预训练模型在Jetson Nano上推荐使用模型参数量推理速度(FPS)准确率(mAP)YOLOv5n1.9M~2528.0YOLOv5s7.2M~1537.4YOLOv5m21.2M~845.4对于实时检测YOLOv5n是最佳选择。可以通过以下方式进一步优化减小输入尺寸将默认的640x640降低到320x320使用半精度(FP16)减少内存占用并提高速度批处理大小设为1适应Jetson Nano的内存限制4. TensorRT加速实现25FPS的关键4.1 TensorRT基本流程下载tensorrtxgit 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 n4.2 常见编译错误解决CMake错误确保安装了所有依赖sudo apt-get install build-essential cmakeCUDA相关错误检查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_caststd::chrono::milliseconds(end - start).count();通过这些优化在Jetson Nano上可以实现25FPS的YOLOv5实时目标检测满足大多数边缘计算场景的需求。