1. Jetson Nano与YOLOv5s的完美组合Jetson Nano作为一款轻量级AI边缘计算设备搭载了128核NVIDIA Maxwell GPU和四核ARM Cortex-A57 CPU虽然体积小巧但性能不俗。而YOLOv5s则是YOLO系列中最轻量级的模型参数量仅7.2M非常适合在资源有限的边缘设备上运行。这对组合在目标检测领域堪称黄金搭档既能满足实时性要求又不会对硬件造成过大负担。我实测过多种目标检测模型在Jetson Nano上的表现YOLOv5s在精度和速度之间取得了很好的平衡。相比其他版本YOLOv5s的推理速度要快上不少这对于需要25FPS实时检测的场景来说至关重要。不过原生PyTorch模型直接运行的效率还不够理想这就需要TensorRT出场了。TensorRT是NVIDIA专门为深度学习推理设计的加速引擎它能对模型进行优化包括层融合、精度校准、内核自动调优等技术。经过TensorRT优化后的YOLOv5s在Jetson Nano上的推理速度可以从原来的10FPS提升到25FPS以上这个提升幅度相当可观。2. 环境配置全攻略2.1 JetPack系统准备首先需要确保Jetson Nano刷写了合适的JetPack系统镜像。我推荐使用JetPack 4.6版本它包含了CUDA 10.2、cuDNN 8.2和TensorRT 7.1等关键组件这些都是运行YOLOv5s所必需的。刷写系统镜像后第一件事就是扩容交换空间sudo gedit /etc/systemd/nvzramconfig.sh找到mem $((${totalmem}/2/${NRDEVICES})*1024)这一行将其修改为mem $((${totalmem}*2/${NRDEVICES})*1024)保存后重启设备使用free -h命令检查交换空间是否已经增大到7.7GB左右。这个步骤很重要因为后续的编译过程需要大量内存默认的交换空间大小可能会导致编译失败。2.2 CUDA环境配置接下来配置CUDA环境变量编辑~/.bashrc文件sudo gedit ~/.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 -V验证CUDA是否配置成功如果看到版本号输出说明配置正确。3. PyTorch与YOLOv5环境搭建3.1 PyTorch安装由于Jetson Nano是ARM架构不能直接使用pip安装PyTorch需要下载预编译的wheel文件。我推荐使用PyTorch 1.8.0版本这个版本与JetPack 4.6的兼容性最好。先安装必要的依赖sudo apt-get update sudo apt-get upgrade sudo apt-get dist-upgrade sudo apt-get install python3-pip libopenblas-base libopenmpi-dev然后配置pip国内源加速下载创建~/.pip/pip.conf文件并添加以下内容以阿里源为例[global] index-urlhttp://mirrors.aliyun.com/pypi/simple/ [install] trusted-hostmirrors.aliyun.com安装PyTorch和依赖pip3 install Cython numpy pip3 install torch-1.8.0-cp36-cp36m-linux_aarch64.whl3.2 YOLOv5环境配置克隆YOLOv5仓库并安装依赖git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip3 install -r requirements.txt这里可能会遇到matplotlib安装失败的问题可以单独下载对应的wheel文件安装。安装完成后可以运行测试命令验证是否安装成功python3 detect.py --source data/images/bus.jpg --weights yolov5n.pt --img 640如果出现Illegal instruction (core dumped)错误需要在~/.bashrc中添加export OPENBLAS_CORETYPEARMV8然后执行source ~/.bashrc使其生效。4. TensorRT加速实战4.1 模型转换与优化首先克隆tensorrtx仓库git clone https://github.com/wang-xinyu/tensorrtx.git将tensorrtx/yolov5/gen_wts.py复制到YOLOv5目录下生成.wts权重文件python3 gen_wts.py -w yolov5n.pt -o yolov5n.wts接下来编译TensorRT引擎cd ~/tensorrtx/yolov5/ mkdir build cd build cmake .. make -j4 sudo ./yolov5 -s yolov5n.wts yolov5n.engine n这个过程可能会比较耗时建议耐心等待。生成的.engine文件就是优化后的模型可以直接用于推理。4.2 实时摄像头推理为了使用USB摄像头进行实时推理需要修改yolov5.cpp文件。主要修改两个地方修改342行附近的视频捕获代码将视频文件路径改为0表示使用摄像头cv::VideoCapture capture(0);可以调整CONF_THRESH参数来改变检测的灵敏度默认0.25对于大多数场景已经足够。修改后重新编译make -j4运行推理程序sudo ./yolov5 -v yolov5n.engine如果出现Failed to load module canberra-gtk-module错误可以安装缺失的模块sudo apt-get install libcanberra-gtk-module5. 性能优化技巧5.1 模型精度选择TensorRT支持FP32、FP16和INT8三种精度模式。在yolov5.cpp中可以通过修改以下定义来切换精度#define USE_FP32 // 使用FP32精度 // #define USE_FP16 // 使用FP16精度 // #define USE_INT8 // 使用INT8精度FP16精度可以在几乎不损失精度的情况下将推理速度提升1.5-2倍是性价比很高的选择。INT8精度需要额外的校准过程但能进一步提升速度不过可能会对检测精度有轻微影响。5.2 图像预处理优化在实时推理中图像预处理往往成为性能瓶颈。可以通过以下方式优化减少不必要的图像格式转换使用GPU加速的图像处理如使用CUDA实现的resize和normalize合理设置输入分辨率不是越大越好在yolov5.cpp中预处理部分可以进一步优化比如将BGR2RGB和归一化操作合并为一个CUDA核函数。5.3 多线程处理虽然Python有GIL限制但仍然可以通过多进程方式实现并行处理。可以将图像采集和推理放在不同的进程中通过共享内存或队列传递数据。这样可以避免因图像采集等待而导致的帧率下降。6. 常见问题解决6.1 模型转换失败如果在生成.engine文件时失败首先检查确认使用的TensorRT版本与JetPack版本匹配检查.wts文件是否生成正确尝试减少make的并行编译线程数如改为make -j26.2 推理速度不达标如果无法达到25FPS的目标可以尝试降低输入图像分辨率如从640x640降到480x480使用更轻量级的模型如YOLOv5n启用FP16或INT8量化检查CPU占用率关闭不必要的后台进程6.3 内存不足问题Jetson Nano的4GB内存是主要限制可以通过增加交换空间如前面所述使用更小的batch size在yolov5.cpp中修改BATCH_SIZE减少同时运行的程序7. 实际应用建议经过TensorRT加速的YOLOv5s在Jetson Nano上可以实现稳定的25FPS实时检测这已经能满足大多数应用场景的需求。我在智能门禁、工业质检等多个项目中都采用过这个方案效果非常不错。对于需要更高精度的场景可以考虑使用YOLOv5m但需要接受帧率下降的事实。另外如果检测小目标效果不佳可以尝试修改模型的anchor设置或者增加输入分辨率。最后提醒一点Jetson Nano的散热很重要长时间高负载运行可能会导致降频。建议加装散热风扇或散热片确保设备能够持续稳定工作。