Jetson nano下 Yolov8 C++ Tensorrt模型加速部署

1,960 阅读2分钟

环境

  • Jetpack 4.6.1 -> Ubuntu 18.04
  • cuda 10.2
  • cudnn 8.2.1
  • TensorRT 8.2.1
  • OpenCV 4.1.1
  • Cmake 3.10.2

步骤

  1. 自定义训练/预训练模型
  2. pt -> onnx -> engine
  3. cmake编译

推理

1、 拉取代码、下载预训练模型

git clone https://github.com/triple-Mu/YOLOv8-TensorRT.git

预训练模型,可以github下载:github.com/ultralytics…

2、 pt -> onnx

这一步需要Python环境的PC端即可,一些依赖根据他的提示安装即可。

# Export yolov8s.pt to yolov8s.onnx
python3 export-det.py --weights yolov8s.pt --sim

3、 onnx -> engine

这一步在Jetson环境中

# 一般Jetson的TensorRT在/usr/src/tensorrt中,若有变化请自己修改。
/usr/src/tensorrt/bin/trtexec --onnx=yolov8s.onnx --saveEngine=yolov8s.engine

4、 推理

# 在main.cpp中,请根据需要做个性化修改# build 根目录为项目所在根目录
export root=${PWD}
cd csrc/jetson/detect
mkdir build && cd build
cmake ..
make 
# 可以把可执行文件yolov8转移至项目根目录
# mv yolov8 {root} && cd {root}
mv yolov8 ${root}
cd ${root}

# 推理
# infer image
./yolov8 yolov8s.engine data/bus.jpg
# infer images
./yolov8 yolov8s.engine data
# infer video
./yolov8 yolov8s.engine data/test.mp4  # the video path

踩坑

  • 这是本文第一次将算法部署到Jetson上,虽然整体看上去简单,但因为aarch64与x64系统的差异,其实在很多地方踩了很多坑。
  • 最主要的原因其实就是,aarch64很多依赖都需要自己编译,本人之前是在服务器上一个一个依赖编译跑通了一个基于C++的yolov8,可惜那个的onnx模型有点问题,Jetson上的trtexec转换时报错,报错原因是:Jetson上的TensorRT不支持INT32类型。
  • 现在思考应该是下载的onnx模型本身问题,这个还得需要后续深入研究一下。
# 这是一个vscode比对的命令,可以比对一下Jetson和PC代码的差异
code . -d ./csrc/detect/end2end/xxx ./csrc/jetson/detect/xxx
# 可以重点观察CMakeLists.txt、yolov8.hpp、main.cpp

总结

这个项目还是挺简单的,github上写的很全,有问题的也可以看看Issues,基本上都有回复。