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

Jetson Orin Nano 新手避坑:从零部署YoloV5,我踩过的那些环境配置的坑

Jetson Orin Nano 实战避坑指南:YOLOv5部署全流程解析

第一次拿到Jetson Orin Nano开发板时,我天真地以为按照官方文档就能轻松完成YOLOv5的部署。然而现实给了我当头一棒——从系统烧录到环境配置,几乎每一步都暗藏玄机。本文将分享我在这个过程中踩过的坑和总结的解决方案,希望能帮助后来者少走弯路。

1. 系统烧录:那些官方文档没告诉你的细节

Jetson Orin Nano与传统开发板最大的不同在于其采用了NVMe固态硬盘而非SD卡存储方案。这意味着常规的SD卡烧录方式不再适用。

关键准备工具

  • 一台运行Ubuntu 18.04的主机(实测20.04及以上版本会出现兼容性问题)
  • 至少50GB可用磁盘空间
  • USB Type-C数据线(建议使用原厂配件)

烧录过程中最易出错的环节是USB设备识别。当执行以下命令时:

sudo ./tools/kernel_flash/l4t_initrd_flash.sh --external-device nvme0n1p1 \ -c tools/kernel_flash/flash_l4t_external.xml -p "-c bootloader/t186ref/cfg/flash_t234_qspi.xml" \ --showlogs --network usb0 jetson-orin-nano-devkit internal

常见问题排查表

现象可能原因解决方案
找不到APX设备虚拟机USB控制器配置错误在VMware设置中将USB兼容性改为3.0
烧录中途卡住主机USB端口供电不足更换到主板原生USB接口
出现"Permission denied"udev规则未配置执行sudo usermod -aG plugdev $USER

重要提示:烧录过程中会先后出现两次设备连接提示,必须及时在虚拟机界面选择"连接到虚拟机",否则会导致烧录失败。

2. CUDA环境配置:版本匹配的玄学

JetPack 5.1.1默认安装的是CUDA 11.4,但PyTorch的版本兼容性却是个大坑。经过多次测试,我总结出以下稳定组合:

推荐软件栈

  • CUDA 11.4
  • cuDNN 8.6.0
  • TensorRT 8.5.2
  • PyTorch 1.14.0
  • Torchvision 0.15.1

配置环境变量时,务必检查~/.bashrc中的路径是否正确:

export CUDA_HOME=/usr/local/cuda-11.4 export LD_LIBRARY_PATH=/usr/local/cuda-11.4/lib64:$LD_LIBRARY_PATH export PATH=/usr/local/cuda-11.4/bin:$PATH

验证安装时,如果nvcc -V显示正确但PyTorch无法调用CUDA,很可能是gcc版本冲突。解决方法:

sudo apt install gcc-8 g++-8 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 8 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 8

3. PyTorch与Torchvision的定制安装

官方提供的PyTorch wheel包往往不是最优解。我推荐从源码构建:

# 安装编译依赖 sudo apt-get -y install autoconf bc build-essential libopenblas-dev libblas-dev libjpeg-dev zlib1g-dev # 下载特定版本 wget https://nvidia.box.com/shared/static/ssf2v7pf5i245fk4i0q926hy4imzs2ph.whl -O torch-1.14.0-cp38-cp38-linux_aarch64.whl pip3 install torch-1.14.0-cp38-cp38-linux_aarch64.whl # Torchvision编译安装 git clone -b v0.15.1 https://github.com/pytorch/vision.git cd vision python3 setup.py install --user

验证安装时,如果遇到GLIBCXX_3.4.29找不到的错误,需要手动升级libstdc++6:

sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt-get update sudo apt-get install libstdc++6

4. OpenCV与GStreamer的恩怨情仇

CSI摄像头必须通过GStreamer管道才能正常工作,但pip安装的opencv-python默认不包含GStreamer支持。解决方案是手动编译:

关键编译选项

cmake -D WITH_GSTREAMER=ON \ -D WITH_CUDA=ON \ -D CUDA_ARCH_BIN=8.7 \ -D CUDA_ARCH_PTX=8.7 \ -D OPENCV_ENABLE_NONFREE=ON \ -D BUILD_opencv_python3=ON \ ..

编译过程中常见内存不足问题,可以通过创建交换分区解决:

sudo fallocate -l 8G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile

经验之谈:编译完成后务必检查cv2.getBuildInformation()的输出,确认GStreamer显示为YES。如果还是NO,很可能是缺少gstreamer1.0-plugins-base开发包。

5. YOLOv5与DeepStream的集成之道

单纯使用原生YOLOv5无法直接调用CSI摄像头,需要通过DeepStream桥接。推荐使用marcoslucianops的DeepStream-Yolo项目:

git clone https://github.com/marcoslucianops/DeepStream-Yolo.git cd DeepStream-Yolo/utils python3 gen_wts_yoloV5.py -w yolov5n.pt

配置文件关键参数

[primary-gie] enable=1 custom-network-config=yolov5n.cfg model-file=yolov5n.wts batch-size=1

当遇到模型加载失败时,检查以下几点:

  1. 确保.wts文件路径正确
  2. 检查TensorRT版本是否匹配
  3. 验证CUDA计算能力设置(Orin Nano是8.7)

6. 性能优化:榨干Orin Nano的每一分算力

显存配置: 修改/etc/systemd/nvzramconfig.sh,将:

mem=$((("${totalmem}"/2/"${NRDEVICES}")*1024))

改为:

mem=$((("${totalmem}"*2/"${NRDEVICES}")*1024))

电源管理模式

sudo nvpmodel -m 0 # 最大性能模式 sudo jetson_clocks # 解锁所有CPU核心

实测性能对比

模型原始FPS优化后FPS提升幅度
YOLOv5n284250%
YOLOv5s152460%

7. 摄像头配置的隐藏关卡

CSI摄像头的分辨率设置是个暗坑。通过v4l2-utils检查可用分辨率:

v4l2-ctl --list-formats-ext --device=0

推荐配置

[source0] type=5 # CSI camera-width=1280 camera-height=720 camera-fps-n=30 camera-csi-sensor-id=0

当图像出现绿色条纹时,通常是像素格式不匹配导致的,需要在DeepStream配置文件中添加:

video/x-raw, format=NV12

部署过程中最耗时的往往是环境配置环节。建议在完成基础环境搭建后立即创建系统镜像备份:

sudo apt install clonezilla sudo systemback-sustart

经过三天的不懈努力,当YOLOv5终于在我的Jetson Orin Nano上流畅运行,并准确识别出摄像头前的物体时,那种成就感难以言表。记住,每个错误提示都是通往成功的路标,耐心排查终会柳暗花明。

http://www.gsyq.cn/news/1418570.html

相关文章:

  • Keil C51汇编中A14错误解析与解决方案
  • Unity2021升级踩坑记:手把手教你用.androidlib文件夹解决Android资源打包报错
  • 别再傻傻等Unity Logo了!手把手教你用SplashScreen.Stop实现启动屏自定义(附避坑指南)
  • 从Warmup看栈溢出:用GDB+Pedal动态调试BUUCTF CSAW 2016题目
  • 别再手动折腾了!用Composer+PHPStudy一键搞定Imagick扩展(附常见报错解决)
  • 板厂指定用CAM350 V10?别慌!用V14.6中转一下,完美解决Allegro SPB17.4槽孔导入报错
  • Tableau筛选器太乱?教你一招,只显示“全部”和常用选项(保姆级教程)
  • Cadence Allegro出Gerber后,CAM350报错槽孔文件丢失?一个工具版本差异引发的‘血案’与排查实录
  • 从一次线上金额对账Bug说起:手把手教你用BigDecimal重构Java浮点数计算
  • 贝叶斯网络:AI处理不确定性的概率推理利器
  • 避坑指南:Docker Buildx多平台构建推送私有仓库时,如何搞定HTTP证书和network.host权限问题
  • 版图设计工程师的日常:除了画图,DRC/LVS验证和与前端‘吵架’才是重头戏
  • Arm TPIU-M与通用TPIU核心差异及选型指南
  • OrCAD建库避坑指南:从新手到高手必须知道的5个细节(以STM32为例)
  • 深入浅出:基于STM32F4 HAL库的串级PID位置控制详解(附代码与波形分析)
  • STM32F4开发板跑通Modbus TCP主从通信的全套实操资料(含LabVIEW上位机+freeModbus移植工程+调试视频)
  • 告别Cloud Compare!用Qt+PCL从零搭建自己的点云处理软件(附完整源码与避坑指南)
  • 从Neo4j数据到炫酷可视化:手把手教你用Neovis.js和D3.js打造可交互的Web图表
  • TensorFlow 2.10.1 GPU安装避坑指南:CUDA/cuDNN版本选择与Anaconda环境隔离技巧
  • 告别CUDA黑盒:手把手教你用PTX指令直接调用Tensor Core(附HGEMM实战代码)
  • STM32F103C8T6+DHT11温湿度采集:CubeMX配置与HAL库驱动避坑全记录
  • 别再乱上电了!手把手教你搞定RFSoC Gen3的电源时序与Tile重启(附寄存器操作详解)
  • 保姆级教程:在CentOS 7上给MinIO配置自定义域名,告别IP访问(附Nginx代理配置)
  • C51开发中XBYTE与XWORD宏的差异与应用
  • Foresight研究报告【20260009】
  • Windows 10资源管理器CPU占用100%?别急着重装,试试这个‘干净启动’排查法
  • 从‘防御式编程’到‘契约式设计’:用C#的Debug.Assert和Trace.Assert守护你的代码边界
  • 备战蓝桥杯国赛【Day 20】
  • WPF MVVM框架选型笔记:为什么我最终选择了Stylet而不是Prism或MVVM Light?
  • VisionPro 9.0避坑指南:CogFixtureTool空间坐标系设置的那些“坑”与最佳实践