在边缘计算和嵌入式AI领域,NVIDIA Jetson Orin Nano以其强大的AI算力和相对友好的价格受到了广泛关注。本文将详细介绍如何在Jetson Orin Nano上搭建YOLOv11物体识别环境,并分享实际部署过程中遇到的问题及解决方案。

📋 环境概述

本教程适用于以下环境:

  • 硬件平台: Jetson Orin Nano 8GB
  • 系统版本: JetPack 6.0 / JetPack 5.x
  • 深度学习框架: PyTorch + ONNX Runtime
  • 目标模型: YOLOv11

🔧 基础环境准备

1. 远程连接工具安装

为了方便开发调试,首先安装NoMachine远程桌面工具:

1
2
3
4
5
# 下载并安装NoMachine
sudo dpkg -i nomachine_8.16.1_1_arm64.deb

# 如果遇到依赖问题,使用以下命令修复
sudo apt-get install -f

2. 系统性能优化配置

Jetson设备默认运行在节能模式,为了获得最佳性能,需要开启最大功率模式:

1
2
3
4
5
6
7
8
9
10
11
# 启用最大功率模式(Mode 0为最高性能模式)
sudo nvpmodel -m 0

# 启用最大时钟频率
sudo jetson_clocks

# 安装系统监控工具
sudo pip install jetson-stats

# 查看系统状态(类似htop的GPU版本)
jtop

💡 小贴士: jtop 工具可以实时监控GPU、CPU使用率、温度和功耗,是调试性能问题的利器。

🔥 JetPack 6.0 环境配置(推荐)

JetPack 6.0是最新版本,对YOLOv11的支持更加完善。

1. 深度学习框架安装

1
2
3
4
5
6
7
8
9
10
11
# 安装适配Jetson的PyTorch 2.5.0
pip install https://github.com/ultralytics/assets/releases/download/v0.0.0/torch-2.5.0a0+872d972e41.nv24.08-cp310-cp310-linux_aarch64.whl

# 安装对应的torchvision 0.20
pip install https://github.com/ultralytics/assets/releases/download/v0.0.0/torchvision-0.20.0a0+afc54f7-cp310-cp310-linux_aarch64.whl

# 安装GPU加速的ONNX Runtime 1.20.0
pip install https://github.com/ultralytics/assets/releases/download/v0.0.0/onnxruntime_gpu-1.20.0-cp310-cp310-linux_aarch64.whl

# 安装Ultralytics YOLO框架
pip install ultralytics[export]

2. OpenCV CUDA版本安装

OpenCV的CUDA支持对于视频处理性能至关重要:

1
2
# 运行Jetson专用的OpenCV安装脚本
bash install_opencv_for_jetson.sh

3. Anaconda环境配置

建议使用Anaconda管理Python环境,避免依赖冲突:

1
2
3
4
5
6
7
8
9
10
11
12
# 下载ARM64版本的Anaconda
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2024.10-1-Linux-aarch64.sh

# 安装Anaconda
bash Anaconda3-2024.10-1-Linux-aarch64.sh

# 初始化conda
conda init

# 创建专用虚拟环境
conda create -n yolo11 python=3.10
conda activate yolo11

4. 环境变量配置

编辑系统环境变量,确保CUDA和相关库能够正确加载:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vim ~/.bashrc

# 添加以下环境变量
export PATH=$PATH:/home/nvidia/anaconda3/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64
export PATH=$PATH:/usr/local/cuda/bin
export CUDA_HOME=/usr/local/cuda
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
export PYTHONPATH=/usr/local/lib/python3.8/site-packages/:$PYTHONPATH
export LD_LIBRARY_PATH=/home/nvidia/monitor/lib:$LD_LIBRARY_PATH
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus

# 应用配置
source ~/.bashrc

🔧 JetPack 5.x 环境配置(兼容旧版本)

如果你使用的是JetPack 5.x版本,可以参考以下配置流程:

1. 系统优化和Swap分区

由于内存限制,建议创建Swap分区来避免编译时内存不足:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 创建交换分区目录
sudo mkdir -p /var/cache/swap/

# 创建4GB的交换文件(bs=64M * count=64 = 4GB)
sudo dd if=/dev/zero of=/var/cache/swap/swap0 bs=64M count=64

# 设置文件权限(仅root可读写)
sudo chmod 0600 /var/cache/swap/swap0

# 格式化为swap文件系统
sudo mkswap /var/cache/swap/swap0

# 激活swap文件
sudo swapon /var/cache/swap/swap0

# 验证swap状态
sudo swapon -s

# 如需删除swap分区:
# sudo swapoff /var/cache/swap/swap0
# sudo rm /var/cache/swap/swap0

2. 包管理器配置

配置国内镜像源,加快下载速度:

1
2
3
4
5
# 设置pip国内镜像源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

# 临时使用镜像源安装包的方法
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple package_name

3. OpenCV安装(重要)

1
2
# ⚠️ 注意:必须在安装Anaconda之前安装OpenCV,否则会有动态链接库冲突
bash install_opencv_for_jetson.sh

4. cuDNN配置

JetPack 5.x需要手动配置cuDNN动态链接库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 安装依赖库
sudo apt-get install libfreeimage3 libfreeimage-dev

# 复制cuDNN头文件到CUDA目录
cd /usr/include && sudo cp cudnn* /usr/local/cuda/include

# 复制cuDNN库文件到CUDA目录
cd /usr/lib/aarch64-linux-gnu && sudo cp libcudnn* /usr/local/cuda/lib64

# 修改文件权限
sudo chmod 777 /usr/local/cuda/include/cudnn.h
sudo chmod 777 /usr/local/cuda/lib64/libcudnn*

# 重新创建软链接(版本号根据实际情况调整)
cd /usr/local/cuda/lib64
sudo ln -sf libcudnn.so.8.6.0 libcudnn.so.8
sudo ln -sf libcudnn_ops_train.so.8.6.0 libcudnn_ops_train.so.8
sudo ln -sf libcudnn_ops_infer.so.8.6.0 libcudnn_ops_infer.so.8
sudo ln -sf libcudnn_adv_train.so.8.6.0 libcudnn_adv_train.so.8
sudo ln -sf libcudnn_adv_infer.so.8.6.0 libcudnn_adv_infer.so.8
sudo ln -sf libcudnn_cnn_train.so.8.6.0 libcudnn_cnn_train.so.8
sudo ln -sf libcudnn_cnn_infer.so.8.6.0 libcudnn_cnn_infer.so.8

# 更新动态链接库缓存
sudo ldconfig

5. cuDNN测试

验证cuDNN安装是否成功:

1
2
3
4
5
6
7
8
9
10
# 复制测试样例
sudo cp -r /usr/src/cudnn_samples_v8/ ~/
cd ~/cudnn_samples_v8/mnistCUDNN

# 修改权限并编译测试
sudo chmod 777 ~/cudnn_samples_v8
sudo make clean && sudo make

# 运行测试(成功会显示Test passed!)
./mnistCUDNN

6. Anaconda和PyTorch环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 安装Anaconda
bash Anaconda3-2024.10-1-Linux-aarch64.sh
conda init

# 创建Python 3.8环境(JetPack 5.x主要支持3.8)
conda create -n yolo11 python=3.8
conda activate yolo11

# 安装系统依赖
sudo apt-get install libjpeg-dev zlib1g-dev libpython3-dev libopenblas-dev \
libavcodec-dev libavformat-dev libswscale-dev

# 安装PyTorch 2.1.0(JetPack 5.x适配版本)
pip install torch-2.1.0a0+41361538.nv23.06-cp38-cp38-linux_aarch64.whl

# 从源码编译torchvision 0.16.1
git clone --branch v0.16.1 https://github.com/pytorch/vision torchvision
cd torchvision
export BUILD_VERSION=0.16.1
python3 setup.py install --user
cd ../

# 安装其他必要的包
pip install numpy requests 'pillow<7'

7. ONNX Runtime GPU版本

1
2
3
4
5
# 安装适配的ONNX Runtime GPU版本
pip install onnxruntime_gpu-1.18.0-cp38-cp38-linux_aarch64.whl

# 安装UI和图像处理库
pip install pyside6 opencv-python

🛠️ 常见问题解决方案

1. CUDA_HOME环境变量问题

1
2
3
4
5
6
7
8
# 如果遇到CUDA_HOME路径错误
vi ~/.bashrc

# 确保CUDA_HOME设置为:
export CUDA_HOME=/usr/local/cuda # 不要使用 $CUDA_HOME:/usr/local/cuda

# 保存并重新加载
source ~/.bashrc

2. 动态链接库冲突问题

libffi.so版本冲突

1
2
3
4
5
6
7
# 备份原文件
cd /home/nvidia/anaconda3/envs/yolo11/lib
cp libffi.so.7 libffi_bak.so.7

# 创建正确的软链接
sudo ln -sf /usr/lib/aarch64-linux-gnu/libffi.so.7.1.0 libffi.so.7
sudo ldconfig

libstdc++版本冲突

1
2
3
4
5
6
7
8
9
10
# 检查系统支持的GLIBCXX版本
strings /usr/lib/aarch64-linux-gnu/libstdc++.so.6 | grep GLIBCXX

# 替换为兼容版本
sudo cp /home/nvidia/anaconda3/envs/yolo11/lib/libstdc++.so.6.0.29 /usr/lib/aarch64-linux-gnu/
sudo rm /usr/lib/aarch64-linux-gnu/libstdc++.so.6
sudo ln -s /usr/lib/aarch64-linux-gnu/libstdc++.so.6.0.29 /usr/lib/aarch64-linux-gnu/libstdc++.so.6

# 验证链接状态
ll /usr/lib/aarch64-linux-gnu/libstd*

3. 脚本格式问题

1
2
# 处理Windows格式的脚本文件(去除\r字符)
sed -i 's/\r$//' script_name.sh

🚀 验证安装结果

完成所有安装后,可以通过以下Python代码验证环境:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import torch
import torchvision
import cv2
import onnxruntime as ort
from ultralytics import YOLO

# 检查CUDA可用性
print(f"PyTorch版本: {torch.__version__}")
print(f"CUDA可用: {torch.cuda.is_available()}")
print(f"CUDA设备数量: {torch.cuda.device_count()}")
print(f"当前CUDA设备: {torch.cuda.current_device()}")

# 检查OpenCV CUDA支持
print(f"OpenCV版本: {cv2.__version__}")
print(f"OpenCV CUDA支持: {cv2.cuda.getCudaEnabledDeviceCount() > 0}")

# 检查ONNX Runtime GPU支持
providers = ort.get_available_providers()
print(f"ONNX Runtime可用提供商: {providers}")
print(f"支持CUDA: {'CUDAExecutionProvider' in providers}")

# 加载YOLO模型测试
model = YOLO('yolo11n.pt')
print("YOLOv11模型加载成功!")

📊 性能优化建议

  1. 模型量化: 使用INT8量化可以显著提升推理速度
  2. TensorRT优化: 将模型转换为TensorRT格式获得最佳性能
  3. 批处理: 合理设置batch size,平衡延迟和吞吐量
  4. 内存管理: 及时释放不用的模型和数据,避免OOM

🎯 总结

本文详细介绍了在Jetson Orin Nano上部署YOLOv11的完整流程,涵盖了JetPack 6.0和5.x两个版本的配置方法。通过本教程,你应该能够:

  • ✅ 正确配置Jetson开发环境
  • ✅ 安装适配的深度学习框架
  • ✅ 解决常见的依赖和链接问题
  • ✅ 验证环境配置的正确性

在实际部署过程中,建议根据具体的应用场景选择合适的模型大小和优化策略。