linux 下tensorrt的yolov8的前向推理(c++ 版本)的实现

news2025/1/24 5:01:56

一、环境搭建

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

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VUE elTree 无子级 隐藏展开图标

这4个并没有下级节点,即它并不是叶子节点,就不需求展示前面的三角展开图标! 查阅官方文档如下描述,支持bool和函数回调处理,这里咱们选择更灵活的函数回调实现。 给el-tree结构配置一下props,注意! :pr…

windows git bash 使用zsh 并集成 oh my zsh

参考了 这篇文章 进行配置,记录了自己的踩坑过程,并增加了 zsh-autosuggestions 插件的集成。 主要步骤: 1. git bash 这个就不说了,自己去网上下,windows 使用git时候 命令行基本都有它。 主要也是用它不方便&…

Glary Utilities Pro 多语便携版系统优化工具 v6.21.0.25

Glary Utilities是一款功能强大的系统优化工具软件,旨在帮助用户清理计算机垃圾文件、修复系统错误、优化系统性能等。 软件功能 清理和修复:可以清理系统垃圾文件、无效注册表项、无效快捷方式等,修复系统错误和蓝屏问题。 优化和加速&…

【Python使用】嘿马python基础入门全体系教程第12篇:__init__()方法,说明:【附代码文档】

本教程的知识点为:计算机组成 计算机是由什么组成的? 1. 硬件系统: 2. 软件系统: 目标 运算符的分类 1. 算数运算符 2. 赋值运算符 3. 复合赋值运算符 判断语句和循环语句 if嵌套 1. if嵌套的格式 2. if嵌套的应用 if嵌套执行流程…

从入门到精通:RabbitMQ的深度探索与实战应用

目录 一、RabbitMQ 初相识 二、基础概念速览 (一)消息队列是什么 (二)RabbitMQ 核心组件 三、RabbitMQ 基本使用 (一)安装与环境搭建 (二)简单示例 (三)…

【Block总结】WTConv,小波变换(Wavelet Transform)来扩展卷积神经网络(CNN)的感受野

论文解读:Wavelet Convolutions for Large Receptive Fields 论文信息 标题: Wavelet Convolutions for Large Receptive Fields作者: Shahaf E. Finder, Roy Amoyal, Eran Treister, Oren Freifeld提交日期: 2024年7月8日arXiv链接: Wavelet Convolutions for La…

Couchbase UI: Indexes

在Couchbase中,索引的这些指标可以帮助你评估索引的性能和状态。下面是每个指标的详细解释,以及如何判断索引的有效性: 1. Index Name(索引名称) 描述:每个索引都有一个唯一的名称。这个名称通常会包括表…

(3)STM32 USB设备开发-USB存储设备

例程:STM32USBdevice: 基于STM32的USB设备例子程序 - Gitee.com 本篇为使用芯片内部flash作为USB存储设备的例程,没有知识,全是实操,按照步骤就能获得一个STM32的U盘。本例子是在野火F103MINI开发板上验证的,如果代码…

细说STM32F407单片机电源低功耗StopMode模式及应用示例

目录 一、停止模式基础知识 1、进入停止模式 2、停止模式的状态 3、退出停止模式 4、SysTick定时器的影响 二、停止模式应用示例 1、示例功能和CubeMX项目配置 (1)时钟 (2)RTC (3)ADC1 &#xf…

Blazor-Blazor WebAssmbly项目结构(上)

创建项目 今天我们来创建一个BlazorWebAssmbly项目,来看看项目结构是如何得,我们创建带模板得项目,会创建出一个demo,来看看项目结构。 创建的项目可以直接启动运行,首次启动会看见加载的过程,这个过程…

【2024年终总结】我与CSDN的一年

👉作者主页:心疼你的一切 👉作者简介:大家好,我是心疼你的一切。Unity3D领域新星创作者🏆,华为云享专家🏆 👉记得点赞 👍 收藏 ⭐爱你们,么么哒 文章目录 …

开篇:吴恩达《机器学习》课程及免费旁听方法

课程地址: Machine Learning | Coursera 共包含三个子课程 Supervised Machine Learning: Regression and Classification | Coursera Advanced Learning Algorithms | Coursera Unsupervised Learning, Recommenders, Reinforcement Learning | Coursera 免费…

推荐一个开源的轻量级任务调度器!TaskScheduler!

大家好,我是麦鸽。 这次推荐一款轻量级的嵌入式任务调度器,目前已经有1.4K的star,这个项目比较轻量化,只有5个源文件,可以作为学习的一个开源项目。 核心文件 项目概述: 这是一个轻量级的协作式多任务处理&…

暑期实习准备:C语言(持续更新)

1.局部变量和全局变量 局部变量的作用域是在变量所在的局部范围,全局变量的作用域是整个工程;局部变量的生命周期是作用域内,全局变量的生命周期是整个程序的生命周期,当两者命名冲突时,优先使用的是局部变量。 2.C语言…

Harmony Next 支持创建分身

应用分身能实现在一个设备上安装多个相同的应用,实现多个账号同时登录使用和运行并且互不影响。主要应用场景有社交账号双开、游戏大小号双开等,无需账号切换,从而省去频繁登录的繁琐。 Harmony Next 很容易就能让 App 支持创建分身。 官方文…

java ,springboot 对接支付宝支付,实现生成付款二维码,退款,查询订单状态等接口

查看文档 支付宝文档地址&#xff1a; 小程序文档 - 支付宝文档中心 使用沙箱环境 沙箱登录地址 登录 - 支付宝 点击查看 才能看钥匙截图写错了。。 问号可以看默认加密方式 点击沙箱帐号 这里我们就具备所有条件了 实战开始 pom文件增加依赖 <dependency> <gro…

深入内核讲明白Android Binder【三】

深入内核讲明白Android Binder【三】 前言一、服务的获取过程内核源码解析1. 客户端获取服务的用户态源码回顾2. 客户端获取服务的内核源码分析2.1 客户端向service_manager发送数据1. binder_ioctl2. binder_ioctl_write_read3. binder_thread_write4. binder_transaction4.1 …

chrome游览器JSON Formatter插件无效问题排查,FastJsonHttpMessageConverter导致Content-Type返回不正确

问题描述 chrome游览器又一款JSON插件叫JSON Formatter&#xff0c;游览器GET请求调用接口时&#xff0c;如果返回的数据是json格式&#xff0c;则会自动格式化展示&#xff0c;类似这样&#xff1a; 但是今天突然发现怎么也格式化不了&#xff0c;打开一个json文件倒是可以格…

canvas基础

今天我们简单的来认识学习一下canvas的基础概念和使用方法。 1. 认识canvas 1.1 什么是canvas 在网页开发中&#xff0c;canvas是html5中的一个元素&#xff0c;用于通过JavaScript绘制图形。它可以用来制作简单的图表、动画和游戏等。 1.2. 使用场景 游戏开发&#xff1a…

OneData体系架构详解

阿里巴巴的 OneData 体系架构方法论&#xff0c;主要分为三个阶段&#xff1a;业务板块、规范定义 和 模型设计。每个阶段的核心目标是确保数据的高效管理、共享与分析能力。 一. 业务板块&#xff08;Business Segment&#xff09; 业务板块是OneData体系架构中的第一步&…