linux 下tensorrt的yolov8的前向推理(c++ 版本)的实现
一、环境搭建
cuda 11.4
ubuntu 20.04
opencv-4.5.2
1.1 配置tensorrt
根据本机的硬件配置及cuda的版本,选择TensorRT-8.6.1.6的版本,下载网址为:
TensorRT SDK | NVIDIA Developer
根据官网的说明,下载对应的压缩包即可。解压后,需要将tensorrt的路径添加为环境变量
vim ~/.bashrc
在末尾添加:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xxx/TensorRT-8.6.1.6/lib
退出后执行
source ~/.bashrc
1.2 编译opencv
选择的opencv的版本为opencv-4.5.2,下载源码的地址为:GitHub - opencv/opencv: Open Source Computer Vision Library
根据自己选择的版本,下载对应的源码包即可。
安装源码编译相应的第三方依赖:
sudo apt install -y g ++
sudo apt install -y cmake
sudo apt install -y make
sudo apt install -y wget
sudo apt install -y unzip
sudo apt-get install build-essential libgtk2.0-dev libgtk-3-devlibavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev
编译及安装:
cd opencv
mkdir build
cd build
cmake ..
make
sudo make install
环境配置:
sudo gedit /etc/profile.d/pkgconfig.sh
可能为空文件,在文件中加入
export PKG_CONFIG_PATH =/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
保存并退出,source激活
source /etc/profile
验证是否成功
// 查看版本,有输出 4.5.2 就成功
pkg-config --modversion opencv4
// 查看库
pkg-config --libs opencv4配置动态库环境
sudo gedit /etc/ld.so.conf.d/opencv4.conf
文件末尾加上
/usr/local/lib
使配置生效
sudo ldconfig
二、模型转换
2.1 下载yolov8的模型并转换成onnx模型
# 🔥 yolov8 offical repo: https://github.com/ultralytics/ultralytics
# 🔥 yolov8 quickstart: https://docs.ultralytics.com/quickstart/
# 🚀TensorRT-Alpha will be updated synchronously as soon as possible!
# install yolov8
conda create -n yolov8 python==3.8 -y # for Linux
# conda create -n yolov8 python=3.9 -y # for Windows10
conda activate yolov8
pip install ultralytics==8.0.5
pip install onnx==1.12.0
# download offical weights(".pt" file)
https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8n.pt
https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8s.pt
https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8m.pt
https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8l.pt
https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8x.pt
https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8x6.pt
export onnx:
# 640
yolo mode=export model=yolov8n.pt format=onnx dynamic=True opset=12 #simplify=True
yolo mode=export model=yolov8s.pt format=onnx dynamic=True opset=12 #simplify=True
yolo mode=export model=yolov8m.pt format=onnx dynamic=True opset=12 #simplify=True
yolo mode=export model=yolov8l.pt format=onnx dynamic=True opset=12 #simplify=True
yolo mode=export model=yolov8x.pt format=onnx dynamic=True opset=12 #simplify=True
# 1280
yolo mode=export model=yolov8x6.pt format=onnx dynamic=True opset=12 #simplify=True
2.2 将onnx 转换成trt 模型
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/feiyull/TensorRT-8.4.2.4/lib
# 640
../../../../TensorRT-8.4.2.4/bin/trtexec --onnx=yolov8n.onnx --saveEngine=yolov8n.trt --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:2x3x640x640 --maxShapes=images:4x3x640x640
../../../../TensorRT-8.4.2.4/bin/trtexec --onnx=yolov8s.onnx --saveEngine=yolov8s.trt --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:2x3x640x640 --maxShapes=images:4x3x640x640
../../../../TensorRT-8.4.2.4/bin/trtexec --onnx=yolov8m.onnx --saveEngine=yolov8m.trt --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:2x3x640x640 --maxShapes=images:4x3x640x640
../../../../TensorRT-8.4.2.4/bin/trtexec --onnx=yolov8l.onnx --saveEngine=yolov8l.trt --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:2x3x640x640 --maxShapes=images:4x3x640x640
../../../../TensorRT-8.4.2.4/bin/trtexec --onnx=yolov8x.onnx --saveEngine=yolov8x.trt --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:2x3x640x640 --maxShapes=images:4x3x640x640
# 1280
../../../../TensorRT-8.4.2.4/bin/trtexec --onnx=yolov8x6.onnx --saveEngine=yolov8x6.trt --buildOnly --minShapes=images:1x3x1280x1280 --optShapes=images:2x3x1280x1280 --maxShapes=images:4x3x1280x1280
执行过程中,会提示 --buildOnly不识别,将命令中的该参数删除即可。转换成功会在当前目录下程程一个.trt的文件,则为转换成功的文件。
三、基于cmake的c++编译
网上有直接可以使用的tensorrt的c++推理的工程,直接将该工程下载下来编译执行即可:
下载下的工程包,对以下文件中的内容先进行修改:
3.1 修改../tensorrt-alpha/cmake/中的common.cmake文件
需要将该文件中tensorrt的路径做更改,修改为自己机器上tensorrt的位置
3.2 修改../tensorrt-alpha/yolov8/CMakeLists.txt
由于目前使用的tensorrt的版本,和该工程的作者使用的版本不一致且高于作者的,所以需要将该文件下一个地方的屏蔽放开,否则编译会出现错误
3.3 编译
cd ../tensorrt-alpha/yolov8/
mkdir build
cd build
cmake ..
make
编译成功后会如下图所示:
3.4 运行测试
## 640
# infer image
./app_yolov8 --model=../../data/yolov8/yolov8n.trt --size=640 --batch_size=1 --img=../../data/6406407.jpg --show --savePath=../
# infer video
./app_yolov8 --model=../../data/yolov8/yolov8n.trt --size=640 --batch_size=2 --video=../../data/people.mp4 --show
# infer camera
./app_yolov8 --model=../../data/yolov8/yolov8n.trt --size=640 --batch_size=2 --cam_id=0 --show
## 1280
# infer camera
./app_yolov8 --model=../../data/yolov8/yolov8x6.trt --size=1280 --batch_size=2 --cam_id=0 --show
运行后的结果如图所示:
备注: 运行推理的过程中,会出现以下的一个ERROR,但是对结果没有任何的影响,所以可以将该问题忽略。
四、另一个工程的c++编译
工程的链接:GitHub - triple-Mu/YOLOv8-TensorRT: YOLOv8 using TensorRT accelerate !
推理的原理:pt--》onnx--》engine 备注:转换必须按照该工程的模型转换方法转换,否则会导致推理失败。
4.1 将 pt转换成onnx
python3 export-det.py \
--weights yolov8s.pt \
--iou-thres 0.65 \
--conf-thres 0.25 \
--topk 100 \
--opset 11 \
--sim \
--input-shape 1 3 640 640 \
--device cuda:0
4.2 将onnx转换成engine
python3 build.py \
--weights yolov8s.onnx \
--iou-thres 0.65 \
--conf-thres 0.25 \
--topk 100 \
--fp16 \
--device cuda:0
或者:
/usr/src/tensorrt/bin/trtexec \
--onnx=yolov8s.onnx \
--saveEngine=yolov8s.engine \
--fp16
4.3 编译及运行
cd ../YOLOv8-TensorRT/csrc/detect/end2end/
修改文件:../YOLOv8-TensorRT/csrc/detect/end2end/cmake/FindTensorRT.cmake
这里更换为自己tensorrt安装的目录
屏蔽87行的内容,不屏蔽编译的时候一直有错,什么原因不知道。
编译:
mkdir build
cd build
cmake ..
make
编译成功后如下图所示
运行:
# 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
原文地址:https://blog.csdn.net/YOULANSHENGMENG/article/details/145282634
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!