当前位置: 首页 > news >正文

Jetson Nano部署YOLOv5s:从环境搭建到TensorRT加速实现25FPS实时推理

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-url=http://mirrors.aliyun.com/pypi/simple/ [install] trusted-host=mirrors.aliyun.com

安装PyTorch和依赖:

pip3 install Cython numpy pip3 install torch-1.8.0-cp36-cp36m-linux_aarch64.whl

3.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_CORETYPE=ARMV8

然后执行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文件。主要修改两个地方:

  1. 修改342行附近的视频捕获代码,将视频文件路径改为0表示使用摄像头:
cv::VideoCapture capture(0);
  1. 可以调整CONF_THRESH参数来改变检测的灵敏度,默认0.25对于大多数场景已经足够。

修改后重新编译:

make -j4

运行推理程序:

sudo ./yolov5 -v yolov5n.engine

如果出现"Failed to load module 'canberra-gtk-module'"错误,可以安装缺失的模块:

sudo apt-get install libcanberra-gtk-module

5. 性能优化技巧

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 图像预处理优化

在实时推理中,图像预处理往往成为性能瓶颈。可以通过以下方式优化:

  1. 减少不必要的图像格式转换
  2. 使用GPU加速的图像处理(如使用CUDA实现的resize和normalize)
  3. 合理设置输入分辨率,不是越大越好

在yolov5.cpp中,预处理部分可以进一步优化,比如将BGR2RGB和归一化操作合并为一个CUDA核函数。

5.3 多线程处理

虽然Python有GIL限制,但仍然可以通过多进程方式实现并行处理。可以将图像采集和推理放在不同的进程中,通过共享内存或队列传递数据。这样可以避免因图像采集等待而导致的帧率下降。

6. 常见问题解决

6.1 模型转换失败

如果在生成.engine文件时失败,首先检查:

  1. 确认使用的TensorRT版本与JetPack版本匹配
  2. 检查.wts文件是否生成正确
  3. 尝试减少make的并行编译线程数(如改为make -j2)

6.2 推理速度不达标

如果无法达到25FPS的目标,可以尝试:

  1. 降低输入图像分辨率(如从640x640降到480x480)
  2. 使用更轻量级的模型(如YOLOv5n)
  3. 启用FP16或INT8量化
  4. 检查CPU占用率,关闭不必要的后台进程

6.3 内存不足问题

Jetson Nano的4GB内存是主要限制,可以通过:

  1. 增加交换空间(如前面所述)
  2. 使用更小的batch size(在yolov5.cpp中修改BATCH_SIZE)
  3. 减少同时运行的程序

7. 实际应用建议

经过TensorRT加速的YOLOv5s在Jetson Nano上可以实现稳定的25FPS实时检测,这已经能满足大多数应用场景的需求。我在智能门禁、工业质检等多个项目中都采用过这个方案,效果非常不错。

对于需要更高精度的场景,可以考虑使用YOLOv5m,但需要接受帧率下降的事实。另外,如果检测小目标效果不佳,可以尝试修改模型的anchor设置或者增加输入分辨率。

最后提醒一点,Jetson Nano的散热很重要,长时间高负载运行可能会导致降频。建议加装散热风扇或散热片,确保设备能够持续稳定工作。

http://www.jsqmd.com/news/1095493/

相关文章:

  • 从并行到串行:丰田AVC-LAN音频总线如何重塑车载音频系统架构
  • 从零到一:在VSCode中高效搭建与配置uni-app多端开发环境
  • 华为OD机试2025C卷-哈夫曼树[100分](Java_Python3_C++_C语言_JsNode_Go)实现100%通过率
  • 科学分析:相关性!=因果性
  • 如何在5分钟内使用Python自动化工具轻松抢到B站会员购门票
  • 7000元嵌入式冰箱推荐:海尔麦浪9系值得买吗
  • 基于奇异谱分析(SSA)的GRACE数据连续化重建:从理论到实践
  • QGIS批量坡度计算:Z因子原理与实战避坑指南
  • 亲测!2026年6月合肥蜀山区白领殷勤婚介怎么样
  • AI Coding 时代,如何系统化沉淀你自己的 Skill 体系
  • 从钓鱼邮件到勒索病毒解密:Phobos变种应急响应实战
  • 江科大-GPIO
  • 5分钟搞定Office安装:开源自动化工具的终极指南
  • 代理GEO优化需要配备技术人员吗
  • Android 逆向实战:ApkTool 解包与重打包全流程解析
  • Vite开发服务器路径遍历漏洞CVE-2025-31125深度剖析与安全实践
  • AI时序预测:中金重新评估黄金牛市——Transformer模型
  • 华为OD机试2025C卷-切割字符串[100分](Java_Python3_C++_C语言_JsNode_Go)实现100%通过率
  • SVG文件上传安全:从XSS攻击原理到纵深防御实战
  • 群论入门:从对称到结构的直观探索
  • ARK Survival Evolved《方舟生存进化》 集群服务器搭建教程:多地图联通与角色传送配置
  • Excel 中使用 Python 完全指南:从启用到实战
  • 【共创季稿事节】鸿蒙 ArkTS 布局进阶:layoutWeight 在嵌套布局中的传递与叠加
  • Web安全入门:任意文件读取漏洞原理、挖掘与防御实战指南
  • 从零到一:基于STM32的TT编码器电机PID速度环实战解析
  • 异构嵌入式系统性能优化与图神经网络调度实践
  • 从模板库到稳定运行:深入解析CODESYS组件依赖与函数调用实战
  • 麒麟V10 SP1/SP2/SP3版本演进与核心组件对比解析
  • FastQC实战:从Per Base Sequence Content警告看RNA-seq文库构建的“先天”偏差
  • ADAMS实战:基于PID的偏心连杆机构恒速控制与抗干扰分析