1、系统环境:
Jetpack5.1.2、CUDA11.4、Cudnn8.6.0、Tensorrt8.5.2、OpenCV4.5
2、TensorRT-Alpha模型下载:
3、TensorRT-Alpha模型部署:(yolov8为例)
设置TensorRT根目录(安装目录)路径:
git clone https://github.com/FeiYull/tensorrt-alpha cd tensorrt-alpha/cmake vim common.cmake。 # 把common.cmake文件第20行中的TensorRT_ROOT修改成您的TensorRT安装目录。例如改成如下: # set(TensorRT_ROOT /home/feiyull/TensorRT-8.4.2.4)
其中Jetson板子中的tensorrt默认路径为/usr/src/tensorrt
4、Yolov8 C++模型部署(参考官网):
a、转为onnx模型
step1 # install yolov8
conda create -n yolov8 python==3.8 -y # for Linux
step2 #
conda activate yolov8
pip install ultralytics==8.0.5
pip install onnx==1.12.0
pip install onnx-simplifier==0.4.8
step3 #切换到ultralytics包目录
cd home/nvidia/miniforge-pypy3/envs/yolov8/lib/python3.8/site-packages/ultralytics
step4 # download offical weights(".pt" file)
https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8s.pt
step5 #创建转换脚本:yolo.py 具体内容如下:
from ultralytics import YOLO
# Load the YOLOv8 model
model = YOLO('yolov8s.pt')
# Export the model to ONNX format
model.export(format='onnx') # creates 'yolov8s.onnx'
# Load the exported ONNX model
onnx_model = YOLO('yolov8s.onnx')
# Run inference
results = onnx_model('https://ultralytics.com/images/bus.jpg')
# ultralytics包使用参考链接 https://docs.ultralytics.com/zh/integrations/onnx/#common-usage-of-onnx
step6 #执行脚本 在当前目录下获得onnx文件
python3 yolo.py
# 或者直接下载onnx模型,https://share.weiyun.com/3T3mZKBm
b、使用tensorrt转换onnx文件为trt文件
#将上一步导出的onnx文件放在刚才在开发板上git的tensorrt-alpha/data/yolov8文件夹下
$ cd /tensorrt-alpha/data/yolov8
#声明使用到的tensorrt路径
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/src/tensorrt
$ /usr/src/tensorrt/bin/trtexec --onnx=yolov8s.onnx --saveEngine=yolov8s.trt --minShapes=images:1x3x640x640 --optShapes=images:2x3x640x640 --maxShapes=images:4x3x640x64
5、cmake
$ cd tensorrt-alpha/yolov8
$ mkdir build
$ cd build
$ cmake ..
$ make -j10
这是由于tensorrt版本过高导致,tensorrt8.4版本可能不会出现以上错误。
我板子上使用的是tensorrt8.5.2,这个版本tensorrt下的sampleOptions.cpp文件中未定义splitToStringVec函数会出现以上错误。所以需要进行以下修改
首先进入到/usr/src/tensorrt/samples/common文件夹下,打开终端,执行如下命令
$ sudo vim sampleUtils.h
Esc + i 插入
Esc + shift + wq 保存退出
在第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;
}
之后保存退出,再一次编译,就成功啦。
6、Run
## 640
# infer image
./app_yolov8 --model=../../data/yolov8/yolov8s.trt --size=640 --batch_size=1 --img=../../data/6406407.jpg --show --savePath=../
# infer video
./app_yolov8 --model=../../data/yolov8/yolov8s.trt --size=640 --batch_size=2 --video=../../data/people.mp4 --show
# infer camera
./app_yolov8 --model=../../data/yolov8/yolov8s.trt --size=640 --batch_size=2 --cam_id=0 --show