三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

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

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上流畅运行,并准确识别出摄像头前的物体时,那种成就感难以言表。记住,每个错误提示都是通往成功的路标,耐心排查终会柳暗花明。

← 返回列表