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++推理的工程,直接将该工程下载下来编译执行即可:

工程下载的地址为:GitHub - FeiYull/TensorRT-Alpha: 🔥🔥🔥TensorRT for YOLOv8、YOLOv8-Pose、YOLOv8-Seg、YOLOv8-Cls、YOLOv7、YOLOv6、YOLOv5、YOLONAS......🚀🚀🚀CUDA IS ALL YOU NEED.🍎🍎🍎

下载下的工程包,对以下文件中的内容先进行修改:

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/958630.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【前端】Hexo 建站指南

文章目录 前言生成站点本地测试部署云端参考 前言 更好的阅读体验:https://blog.dwj601.cn/FrontEnd/Hexo/build-your-own-website-with-hexo/ 笔记记多了,想要分享给同学们一起交流进步,该怎么办?想要搭建一个属于自己的知识库…

LetsWave脑电数据简单时频分析及画图matlab(二)

在笔记(一)中的文档链接,有很详细的介绍时频分析。这里简单描述,letswave7中有两种方法,一种是STFT(短时傅里叶变换)和CWT(连续小波变换)。(一)中…

【二叉树的深搜】二叉树剪枝

文章目录 814. 二叉树剪枝解题思路:深度优先遍历 后序遍历另一种写法 814. 二叉树剪枝 814. 二叉树剪枝 ​ 给你二叉树的根结点 root ,此外树的每个结点的值要么是 0 ,要么是 1 。 ​ 返回移除了所有不包含 1 的子树的原二叉树。 ​ 节点…

快速搭建深度学习环境(Linux:miniconda+pytorch+jupyter notebook)

本文基于服务器端环境展开,使用的虚拟终端为Xshell。 miniconda miniconda是Anaconda的轻量版,仅包含Conda和Python,如果只做深度学习,可使用miniconda。 [注]:Anaconda、Conda与Miniconda Conda:创建和管…

01-硬件入门学习/嵌入式教程-CH340C使用教程

前言 CH340C广泛应用于DIY项目和嵌入式开发中,用于USB数据转换和串口通信。本文将详细介绍CH340C的基本功能、引脚接线及使用方法。 CH340C简介 CH340C是一款USB转TTL电平转换器,可以将电脑的USB数据转换成串口数据,方便与单片机&#xff…

PID 控制算法(二):C 语言实现与应用

在本文中,我们将用 C 语言实现一个简单的 PID 控制器,并通过一个示例来演示如何使用 PID 控制算法来调整系统的状态(如温度、速度等)。同时,我们也会解释每个控制参数如何影响系统的表现。 什么是 PID 控制器&#xf…

C语言数组详解:从基础到进阶的全面解析

在C语言中,数组是一种基本的数据结构,用于存储多个相同类型的数据。数组的引入使得C语言能够高效地存储和操作大量数据。在任何一个C语言程序中,数组都发挥着极其重要的作用。无论是在算法实现、数据存储、还是在复杂程序的设计中&#xff0c…

vulfocus/fastjson-cnvd_2017_02833复现

漏洞概述 Fastjson 是阿里巴巴开发的一个高性能的 Java 库,用于将 Java 对象转换成 JSON 格式(序列化),以及将 JSON 字符串转换回 Java 对象(反序列化)。 fastjson在解析json的过程中,支持使用type字段来指…

【unity游戏开发之InputSystem——05】PlayerInput组件的介绍(基于unity6开发介绍)

文章目录 前言一、认识PlayerInput1、PlayerInput是什么?2、主要工作原理:3、好处:二、添加PlayerInput组件三、PlayerInput参数相关1、Actions:行为2、Default Scheme:默认启用哪个控制方案3、Auto-Switch:自动切换控制方案4、Default Map:默认行为映射方案5、Ui Input…

Android GLSurfaceView 覆盖其它控件问题 (RK平台)

平台 涉及主控: RK3566 Android: 11/13 问题 在使用GLSurfaceView播放视频的过程中, 增加了一个播放控制面板, 覆盖在视频上方. 默认隐藏setVisibility(View.INVISIBLE);点击屏幕再显示出来. 然而, 在RK3566上这个简单的功能却无法正常工作. 通过缩小视频窗口可以看到, 实际…

【2024 - 年终总结】叶子增长,期待花开

写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言论博客创作保持2024的记录清单博客科研开源工作生活 总结与展望互动致谢参考 前言…

TangoFlux 本地部署实用教程:开启无限音频创意脑洞

一、介绍 TangoFlux是通过流匹配和 Clap-Ranked 首选项优化,实现超快速、忠实的文本到音频生成的模型。 本模型由 Stability AI 提供支持🚀 TangoFlux 可以在单个 A40 GPU 上在 ~3 秒内生成长达 34.1kHz 的立体声音频。 二、部署 安装方式非常简单 1…

ThreeJS示例教程200+【目录】

Three.js 是一个强大的 JavaScript 库,旨在简化在网页上创建和展示3D图形的过程。它基于 WebGL 技术,但提供了比直接使用 WebGL 更易于使用的API,使得开发者无需深入了解 WebGL 的复杂细节就能创建出高质量的3D内容。 由于目前内容还不多,下面的内容暂时做一个占位。 文章目…

AIGC的企业级解决方案架构及成本效益分析

AIGC的企业级解决方案架构及成本效益分析 一,企业级解决方案架构 AIGC(人工智能生成内容)的企业级解决方案架构是一个多层次、多维度的复杂系统,旨在帮助企业实现智能化转型和业务创新。以下是总结的企业级AIGC解决方案架构的主要组成部分: 1. 技术架构 企业级AIGC解决方…

Blazo-Blazor Web App项目结构

让我们还是从创建项目开始,来一起了解下Blazor Web App的项目情况 创建项目 呈现方式 这里我们可以看到需要选择项目的呈现方式,有以上四种呈现方式 ● WebAssembly ● Server ● Auto(Server and WebAssembly) ● None 纯静态界面静态SSR呈现方式 WebAs…

我谈概率论与数理统计的知识体系

学习概率统计二十多年后,在廖老师的指导下,厘清了各章之间的关系。本来就是一条线两个分支,脉络很清晰。 分支一:从随机现象到样本空间到随机事件再到概率。 从随机事件到随机变量:为了进行定量的数学处理&#xff0…

检查w-form-select 组件是否正确透传了 visible-change 事件

文章目录 1. 下拉框的组件2. 点击下拉框时的逻辑(1)handleVisibleChange 方法(2)getIdentifies 方法 3. 选择关联识别点时的逻辑(1)onRelatedChange 方法 4. 相关 UI 更新5. 总结 在这段代码中,…

校验收货地址是否超出配送范围实战3(day09)

优化用户下单功能,加入校验逻辑,如果用户的收货地址距离商家门店超出配送范围(配送范围为5公里内),则下单失败。 提示: ​ 1. 基于百度地图开放平台实现(https://lbsyun.baidu.com/&#xff09…

Linux应用编程(五)USB应用开发-libusb库

一、基础知识 1. USB接口是什么? USB接口(Universal Serial Bus)是一种通用串行总线,广泛使用的接口标准,主要用于连接计算机与外围设备(如键盘、鼠标、打印机、存储设备等)之间的数据传输和电…

【优选算法】7----三数之和

来了来了,他来了,又是学习算法的一天~ 今天的嘉宾是中等难度的算法题----三数之和! ------------------------------------------begin------------------------------------ 题目解析: 哇趣!又是给了一个数组&#…