YOLO系列模型部署(一)Jetson Xavier NX 部署YOLOv8-Detect
一、系统配置
1.1 Jetpack下载
官方链接:JetPack Archive | NVIDIA Developer

本文安装的版本为5.1.2,点击下载

1.2 系统烧录(SD卡烧录)
所需硬件:SD卡(64G以上)、读卡器、Jetson Xavier NX开发板
软件工具:下载最新版balenaEtcher(老版可能无法识别),本文下载windows版
(官方下载地址:balenaEtcher - Flash OS images to SD cards & USB drives)

具体流程
① 格式化SD卡,如果检测不到SD卡可参考以下链接:
【Jetson-Nano】SD卡重新格式化_nano系统sd格式化-CSDN博客
②打开下载好的balenaEtcher,从本地进行烧录,烧录完成后将SD卡插入Jetson中

1.3 安装nomachine对开发板进行远程控制
在windows端分别下载win版本与arm版本的nomachine,将arm版本的下载后使用U盘拽过去
(注:在使用时必须在同一wifi下)
下载链接:Download Free Remote Desktop Access - NoMachine
安装方法参考:Jetson Orin(Ubuntu20.04)安装NoMachine和Jtop_ubuntu20.04 nomachine-CSDN博客

1.4 安装Jtop
对系统进行换源:(如果下载不了可换源)参考:ubuntu 20.04 设置国内镜像源(阿里源、清华源)_ubuntu 20.04 镜像源-CSDN博客
执行如下命令:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python3-pip
sudo pip3 install -U jetson-stats
最终输入sudo jtop即可查看系统信息
1.5 安装miniconda并配置torch与torchvision
主要用于导出.onnx权重文件
1.5.1 安装miniconda
1下载miniconda
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py39_24.9.2-0-Linux-aarch64.sh
2.安装下载好的文件
bash Miniconda3-py39_24.9.2-0-Linux-aarch64.sh
3.按照提示一步一步安装
①确认安装 ②一些声明 ③指定文件路径
④选择是否更改shell文件,我选择no

④配置conda的环境变量

⑤关闭窗口重新进入,前面显示base即进入conda环境
![]()
⑥不想每次进入都激活conda环境则设置
输入:conda config --set auto_activate_base false
⑦进入conda环境 conda activate
退出conda环境 :conda deactivate
![]()
1.5.2 配置GPU版的torch与torchversion
1.5.2.1 在环境变量中添加CUDA
①输入 vim ~/.bashrc
②点击键盘中的 i 进入编辑模式
③根据自己的cuda版本信息在文件末尾处添加环境变量
export PATH=/usr/local/cuda-11.4/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
export CUDA_HOME=/usr/local/cuda-11.4
④按下键盘上esc按键,输入:wq! 保存退出
1.5.2.2 配置GPU版的torch与torchvision
参考链接:NVIDIA JETSON XAVIER NX (四)安装Pytorch和torchvision_jetson xavier nx安装pytorch-CSDN博客
1.5.2.2.1配置基础环境
# 先把能更新的都更新了
sudo apt-get update
sudo apt-get upgrade
# 装上我们需要的环境包
# 最好使用pip3,不然出错了不好排查
sudo apt-get install python3-pip libopenblas-base libopenmpi-dev
pip3 install Cython
sudo apt-get install libjpeg-dev zlib1g-dev libpython3-dev libavcodec-dev libavformat-dev libswscale-dev
1.5.2.2.2 yolov8是8.0.238 -对应的torch、torchvision、python版本
纯净版下载链接:GitHub - ultralytics/ultralytics at v8.0.238
由于torch与torchvision向下兼容的特性,选取torch=2.0.0版本与torchvision为0.15(必须对应)
torch=2.0.0所对应的python版本为3.8
torch的下载链接为:PyTorch for Jetson - Jetson & Embedded Systems / Announcements - NVIDIA Developer Forums
torchvision的下载链接为:
PyTorch for Jetson - Jetson & Embedded Systems / Announcements - NVIDIA Developer Forums
github下载历史版本的位置如下图所示:

1.5.2.2.3 创建conda
conda activate
conda create --name yolov8 python=3.8 -y
conda activate yolov8
1.5.2.2.4 进入存放torch与torchvision文件夹目录下
输入ls 显示下载的安装包

输入以下指令安装
pip3 install torch-2.0.0+nv23.05-cp38-cp38-linux_aarch64.whl
cd vision-0.15.0-rc1/torchvision/
export BUILD_VERSION=0.15.0
python3 setup.py install 程序报错:ImportError: libopenblas.so.0: cannot open shared object file: No such file or directory
解决方法:
import torch报错ImportError: libopenblas.so.0: cannot open shared object file: No such file or directo-CSDN博客
wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/pool/universe/o/openblas/libopenblas-dev_0.3.8+ds-1ubuntu0.20.04.1_arm64.deb
sudo dpkg -i libopenblas-dev_0.3.8+ds-1ubuntu0.20.04.1_arm64.deb
sudo apt clean
sudo apt update
sudo apt install -f
python3 setup.py install
1.5.2.2.5 检查torch-GPU版本是否安装成功
import torch
# 检查 PyTorch 版本
print(torch.__version__)
# 检查 CUDA 是否可用
print(torch.cuda.is_available()) # 期望输出 True
# 检查当前 GPU 设备数量
print(torch.cuda.device_count()) # 输出可用的 GPU 数量
# 检查当前 GPU 名称
print(torch.cuda.get_device_name(0)) # 例如输出 'NVIDIA GeForce RTX 3090'
1.5.2.2.6检查torchvision是否安装成功
import torch
import torchvision
print("Torch version:", torch.__version__)
print("Torchvision version:", torchvision.__version__)
print("Is CUDA available:", torch.cuda.is_available())
不报错即安装成功
程序报错:

解决办法:pip3 install numpy
1.6 配置YOLOv8环境
纯净版下载链接:GitHub - ultralytics/ultralytics at v8.0.238
1.6.1 配置yolov8基础环境
①进入下载好的ultralytics-8.0.238文件中
cd ultralytics-8.0.238
②输入:pip3 install -e .
1.7 windows安装vscode远程连接jetson开发板
参考:Vscode连接Ubuntu!看这一篇就够了!_vscode ubuntu-CSDN博客
①vscode官网下载安装在windows中
②安装Remote - SHH插件

③配置连接的用户名和IP地址

④配置用户名和ip地址


⑤点击连接 → 箭头进行连接

⑥一直连接不上:

解决方法:
①因为我的shh是可以使用的,因此我直接添加配置文件路径,无效

②由于我这边一直显示配置 VScode Server, 因此我试了下可否手动配置

在win端:命令啊行输入:code --version获取版本号

在jetson端输入:
mkdir -p ~/.vscode-server/bin/f4a68c1d1943f2a3e3c17e67e7aeb6d04c340d5f
cd ~/.vscode-server/bin/f4a68c1d1943f2a3e3c17e67e7aeb6d04c340d5f
wget https://update.code.visualstudio.com/commit:<commit-id>/server-linux-x64/stable
tar -xzf vscode-server-aarch64.tar.gz --strip-components=1
~/.vscode-server/bin/258e40fedc6cb8edf399a463ce3a9d32e7e1f6f3/bin/code-server --help
输出信息证明安装成功,但还是无效
1.8 Jetson本地安装vscode
①下载链接:update.code.visualstudio.com/1.6.0/linux-deb-arm64/stable(https://update.code.visualstudio.com/{version}/linux-deb-arm64/stable)
想下载其他版本直接将正确的版本号替换{version}部分就能下载
下载说明:1.70以上的版本在Jetson ubuntu 20.04中无法打开,建议先卸载之前安装的vscode,经测试下载 code_1.65.2-1646922911_arm64.deb,比较正常!
如何卸载:依次输入命令
sudo apt remove code
sudo apt purge code
sudo apt autoremove
sudo apt clean
sudo dpkg --remove code
②通过dpkg安装命令:进入到所下载到的目录,打开终端输入:sudo dpkg -i deb文件名
在终端输入code 即可打开vscode
③安装python插件

④点击右下角的环境,选择我们刚刚配置好的环境:

⑤编写一个程序测试脚本,检测环境是否正确训练yolov8

⑥点击![]()
程序会自动下载权重
程序报错:

解决方法:
sudo apt-get update
sudo apt-get install curl -y
还是不行,网络问题世界手动下载,地址:https://ultralytics.com/assets/coco8.zip

⑦执行推理脚本

输出:
二、模型部署
具体流程为:配置yolov8环境、导出ONNX文件、导出.trt文件推理
参考:
2.1 下载TensorRT-Alpha源码(基本设置)
cd tensorrt-alpha-main/cmake
vim common.cmake
将文件中的第20行的tensorrt路径更换成自己开发板中的路径,一般默认路径为:/usr/src/tensorrt
路径设置如下:
set(TensorRT_ROOT /usr/src/tensorrt)

2.2yolov8环境配置
2.3下载TensorRT-Alpha源码
2.4 pt-onnx-trt
2.4.1环境配置
①安装ONNX
pip3 install onnx==1.12.0
pip install onnxsim==0.4.33
程序报错:

解决方法:
sudo apt update
sudo apt install -y cmake
sudo apt update
sudo apt install -y cmake build-essential python3-dev
pip install --upgrade pip setuptools wheel
还是报错:

重新安装高版本的cmake:
sudo apt remove cmake
cd ~
wget https://github.com/Kitware/CMake/releases/download/v3.25.2/cmake-3.25.2.tar.gz
tar -zxvf cmake-3.25.2.tar.gz
cd cmake-3.25.2
sudo apt update
sudo apt install libssl-dev
./bootstrap
make -j$(nproc)
sudo make install
cmake --version
②下载onnxruntime-GPU
参考:Jetson系列安装onnxruntime-gpu_jetson onnxruntime-CSDN博客

根据我的JetPack版本选择对应的onnxruntime 1.18.0
③进入所在目录
激活conda环境:conda activate yolov8
④输入安装指令进行安装
pip3 install onnxruntime_gpu-1.8.0-cp36-cp36m-linux_aarch64.whl
⑤安装是否安装成功
依次输入:
python
import onnxruntime
程序报错
ImportError: /lib/aarch64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /home/ljj/miniconda3/envs/yolov8/lib/python3.8/site-packages/onnxruntime/capi/onnxruntime_pybind11_state.so)

解决方法:
(当前窗口生效)
export LD_PRELOAD=$CONDA_PREFIX/lib/libstdc++.so.6
(永久生效)
echo "export LD_PRELOAD=\$CONDA_PREFIX/lib/libstdc++.so.6" >> $CONDA_PREFIX/etc/conda/activate.d/env_vars.sh
再次运行:

2.4.2 导出.onnx文件
yolo export model=best.pt format=onnx opset=12 dynamic=True simplify=True int8=True
# opset=12 默认值
# dynamic=True 导出维度为dynamic,也就是不确定状态,如不需要,可设为False
# simplify=True 简化模型,建议设为True,开发板性能有限,简化模型很有必要,且能避免后续一些报错发生
# int8=True INT8量化模型,根据需要开启

直接将.pt文件改为.onnx文件即可运行
2.4.3 生成.trt文件
#将上一步导出的onnx文件放在刚才在开发板上git的tensorrt-alpha/data/yolov8文件夹下
cd /tensorrt-alpha/data/yolov8
修改自己的onnx名称
/usr/src/tensorrt/bin/trtexec --onnx=best.onnx --saveEngine=best.trt --minShapes=images:1x3x640x640 --optShapes=images:4x3x640x640 --maxShapes=images:8x3x640x640
最终得到.trt文件
2.5 生成可执行文件
2.5.1 源码修改(如果是训练的自己的数据集则进行如下修改)
$ cd tensorrt-alpha/yolov8
$ vim app_yolov8.cpp
#修改第6行的类别名,改成自己训练集的类别名,例如:
initParameters.class_names = utils::dataSets::mask2;
#修改第8行的类别数,改成自己训练集的类别数,例如:
initParameters.num_class = 2;
#修改用到的头文件及函数
$ cd tensorrt-alpha/untils
$ vim untils.h
#修改untils.h文件中的第37行,换成自己的类别,如:
const std::vector<std::string> mask2 = {"non-mask", "mask"};
#在untils.h文件的第80行之后,添加自己的类别颜色,如:
const std::vector<cv::Scalar> color2{
cv::Scalar(148, 80, 189),cv::Scalar(105, 52, 238)
};
#修改untils.cpp文件
$ vim untils.cpp
#修改untils.cpp文件中的show函数,在第144行后添加自己类别对应的代码,如:
if (classNames.size() == 2) // mask2
{
color = Colors::color2[box.label];
}
#修改untils.cpp文件中的save函数,在第198行后添加自己类别对应的代码,如:
if (classNames.size() == 2) // mask2
{
color = Colors::color2[box.label];
}
2.5.2 编译生成可执行文件
$ cd tensorrt-alpha/yolov8
$ mkdir build
$ cd build
$ cmake ..
$ make -j10
在进行make -j10时程序会报错
/usr/bin/ld: libyolov8.so: undefined reference to `sample::splitToStringVec(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char)'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/app_yolov8.dir/build.make:161:app_yolov8] 错误 1
make[1]: *** [CMakeFiles/Makefile2:78:CMakeFiles/app_yolov8.dir/all] 错误 2
make: *** [Makefile:84:all] 错误 2
这是由于tensorrt版本过高导致,tensorrt8.4版本可能不会出现以上错误。
我板子上使用的是tensorrt8.5.2,这个版本tensorrt下的sampleOptions.cpp文件中未定义splitToStringVec函数会出现以上错误。所以需要进行以下修改sampleUtils.h
cd /usr/src/tensorrt/samples/common
sudo vim sampleUtils.h
在第77行可以看到关于splitToStringVec函数的一个声明,但并未定义,所以将它注释掉,如下所示:
// std::vector<std::string> splitToStringVec(std::string const& option, char separator);
之后保存退出(Esc + shift: + wq),打开sampleOptions.cpp文件,将splitToStringVec函数的定义添加在这
$ sudo vim sampleOptions.cpp
#在文件的38行,也就是namespace中添加如下代码
std::vector<std::string> splitToStringVec(const std::string& option, char separator)
{
std::vector<std::string> options;
for (size_t start = 0; start < option.length();)
{
size_t separatorIndex = option.find(separator, start);
if (separatorIndex == std::string::npos)
{
separatorIndex = option.length();
}
options.emplace_back(option.substr(start, separatorIndex - start));
start = separatorIndex + 1;
}
return options;
}
之后保存退出,在tensorrt-alpha/yolov8/build文件下再一次执行make -j10命令,即可编译成功
$ ./app_yolov8 --model=../../data/yolov8/best.trt --size=640 --batch_size=1 --img=../../data/bus.jpg --show
$ ./app_yolov8 --model=../../data/yolov8/best.trt --size=640 --batch_size=1 --video=../../data/people.mp4 --show --savePath=../
原文链接:https://blog.csdn.net/ayxc_ve/article/details/134174176
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)