当前位置: 首页 > 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.jsqmd.com/news/907265/

相关文章:

  • Keil C51汇编中A14错误解析与解决方案
  • 技术美术进阶:三方向映射纹理的“坑”与优化技巧(从UE4到Unity的避坑指南)
  • 别再死记硬背了!用Python实战模拟四种循环(简单/嵌套/连锁/非结构)的测试用例设计
  • 跟AI说话这件事,芯片工程师可能一直做错了
  • 别再手动折腾了!用Composer+PHPStudy一键搞定Imagick扩展(附常见报错解决)
  • 别再傻傻等Unity Logo了!手把手教你用SplashScreen.Stop实现启动屏自定义(附避坑指南)
  • 从Warmup看栈溢出:用GDB+Pedal动态调试BUUCTF CSAW 2016题目
  • 板厂指定用CAM350 V10?别慌!用V14.6中转一下,完美解决Allegro SPB17.4槽孔导入报错
  • Altium Designer实战:用xSignals搞定DDR内存的Fly-By等长布线(附详细步骤)
  • 火爆分享Taotoken在个人项目中的多模型灵活调用实践
  • Tableau筛选器太乱?教你一招,只显示“全部”和常用选项(保姆级教程)
  • 告别HAL库默认初始化:手写STM32 RTC驱动实现串口终端时间设置与掉电记忆
  • QT开发避坑指南:隐藏标题栏后窗口拖不动?手把手教你重写鼠标事件
  • 毕业设计用K8s智能调度器:基于DQN的Go语言插件化实现
  • Cadence Allegro出Gerber后,CAM350报错槽孔文件丢失?一个工具版本差异引发的‘血案’与排查实录
  • Cadence Virtuoso实战:手把手教你完成一个完整的BG带隙基准电压源版图(从原理图到GDSII)
  • 从彩票赔率到保险定价:手把手教你用‘数学期望’做日常决策分析
  • 贝叶斯网络:AI处理不确定性的概率推理利器
  • Oracle数据清洗实战:用正则表达式搞定脏数据,附赠常用SQL模板
  • 从一次线上金额对账Bug说起:手把手教你用BigDecimal重构Java浮点数计算
  • 避坑指南:Docker Buildx多平台构建推送私有仓库时,如何搞定HTTP证书和network.host权限问题
  • 版图设计工程师的日常:除了画图,DRC/LVS验证和与前端‘吵架’才是重头戏
  • Yolov8全系列模型C#推理性能优化:TensorRT vs. OpenVINO C# API对比实测
  • 16.Hermes缺的,可能就是这个Workspace
  • 深入浅出:基于STM32F4 HAL库的串级PID位置控制详解(附代码与波形分析)
  • OrCAD建库避坑指南:从新手到高手必须知道的5个细节(以STM32为例)
  • Arm TPIU-M与通用TPIU核心差异及选型指南
  • 笔记本 WiFi 图标消失,无法连接 WiFi ?试试这些方法
  • 模型压缩避坑指南:用通道剪枝给YOLOv5/YOLOv8瘦身时,这3个细节千万别忽略
  • FreeRTOS移植避坑指南:当官方不提供ARM9(如S3C2440)的Portable文件夹时,我们该怎么办?