ubuntu20.04基于tensorRT和c++跑yolo11

设备

系统:Ubuntu 20.04
显卡:NVIDIA GeForce RTX 3050
显卡驱动: Driver Version: 535.183.01 CUDA Version: 12.2

关键软件版本总结

Cmake: 3.28.6
Cuda: 12.2.2
Cudnn: 8.9.7
TensorRT: 10.8.0.43
Python:3.10.16

环境配置步骤

1、安装高版本cmake

由于用到的tensorRT_yolo工具需要cmake 3.18以上,所以按如下办法卸载了原有的cmake 3.16,重装了cmake 3.28.6
https://zhuanlan.zhihu.com/p/519732843
注意按照如上办法卸载cmake时,会顺带卸载掉你设备上的ros环境,之后需要重装ros

2、重装ros

经过上面第一个步骤,原有ros被卸载,重装一下ros,是否安装ros和跑tensorRT没有关系,只是我这边后面会用到ros,所以装了,步骤参考:
ros安装(一键最简安装,吹爆鱼香ROS,请叫我鱼吹)

3、多版本切换CUDA

设备的显卡驱动最高支持cuda 12.2.2,所以选择该版本使用。
设备上有很多个cuda版本(/usr/local/ 路径下看),这里需要用到cuda 12.2.2,所以安装如下方法实现多版本cuda共存,并指定使用cuda 12.2.2:
ubuntu 20.04下多版本cuda&cudnn下载与安装
安装之后,除了根据以上链接设置cuda软连接之外,还需要配置下环境变量:
在~/.bashrc文件中添加如下内容

# CUDA enviroment variable
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

4、安装TensorRT

下载TensorRT: https://developer.nvidia.com/tensorrt/download
我开始选择了如下兼容cuda 12版本的tensorRT的tar包,如下选项
TensorRT 10.7 GA for Linux x86_64 and CUDA 12.0 to 12.6 TAR Package
但是安装后发现,使用trtexec工具会报错:

(py310_yolo) tl@tl-Default-string:~/code/tensorRT_test$ trtexec --version
&&&& RUNNING TensorRT.trtexec [TensorRT v100700] [b23] # trtexec --version
Cuda failure at /_src/samples/common/safeCommon.h:262: unknown error

于是改为下载TensorRT 10.8版本,选择如下选项:
TensorRT 10.8 GA for Linux x86_64 and CUDA 12.0 to 12.8 TAR Package
解压:
tar -xvzf TensorRT-10.7.0.23.Linux.x86_64-gnu.cuda-12.6.tar.gz
将解压后的所有文件剪切到目录:

sudo mv TensorRT-10.8.0.43 /usr/local

设置环境变量
gedit ~/.bashrc
添加TensorRT环境变量

export PATH=$PATH:/usr/local/TensorRT-10.8.0.43/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/TensorRT-10.8.0.43/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/TensorRT-10.8.0.43/targets/x86_64-linux-gnu/lib

安装后,其中有个叫trtexec的工具,这个可以用来将.onnx模型转成TensorRT的序列化.engine模型文件:

(py310_yolo) tl@tl-Default-string:~$ whereis trtexec
trtexec: /usr/local/TensorRT-10.8.0.43/targets/x86_64-linux-gnu/bin/trtexec(py310_yolo) tl@tl-Default-string:~$ trtexec --version
&&&& RUNNING TensorRT.trtexec [TensorRT v100800] [b43] # trtexec --version
[07/09/2025-14:25:23] [I] TF32 is enabled by default. Add --noTF32 flag to further improve accuracy with some performance cost.
=== Model Options ===--onnx=<file>               ONNX model
...

5、安装python虚拟环境

由于后面的TensorRT_yolo需要用到python虚拟环境,且需要python 3.9以上的版本,我选择了训练yolo 11时所用的python 3.10.16,安装步骤参考:
ubuntu创建指定版本python虚拟环境

6、配置TensorRT-YOLO工具

TensorRT-YOLO编译安装,参考如下
快速编译安装
若看不明白官方参考,可以无脑按我如下步骤配置
首先,克隆 TensorRT-YOLO 仓库:

git clone https://github.com/laugh12321/TensorRT-YOLO
cd TensorRT-YOLO

然后使用 CMake,按照以下步骤操作:

pyenv activate py310_yolo    # 激活前面安装的python 3.10.16虚拟环境,后面要用到python相关的步骤都得在此环境下操作
pip install "pybind11[global]"
cmake -S . -B build -DTRT_PATH=/usr/local/tensorrt -DBUILD_PYTHON=ON
cmake --build build -j$(nproc) --config Release

构建最新版本的 tensorrt_yolo,并安装:

cd TensorRT-YOLO/python
pip install --upgrade build
python -m build --wheel# 安装模型导出及推理相关依赖
pip install /home/tl/code/TensorRT-YOLO/python/dist/tensorrt_yolo-6.2.0-py3-none-any.whl[export]

注意以上最后一个步骤跟官方的有点不一样,用的是安装包的绝对路径,以防出错。
经过第6步,会有个trtyolo工具生成,这个可以用来将python训练的yolo11.pt模型装成.onnx模型:

(py310_yolo) tl@tl-Default-string:~$ whereis trtyolo
trtyolo: /home/tl/.pyenv/shims/trtyolo /home/tl/.local/bin/trtyolo

7、独立使用Detect功能

上面第6步骤安装好了TensorRT-YOLO工具,可以按照其说明,在该工具工程下使用detect、segment、obb等各种功能,具体参考官方文档:
在这里插入图片描述
但是我们写的算法工程需要独立于该工具,且只需要用到其中的Detect功能,那么只需从工具如下目录中,

..//TensorRT-YOLO/examples/detect

拷贝出如下内容,形成单独的工程即可,图中红框为从上面路径必须拷贝的文件
在这里插入图片描述

其中,labels.txt改为你自己的所需的类名,CMakeLists.txt针对ubuntu系统做了删减,CMakeLists.txt内容如下:

cmake_minimum_required(VERSION 3.18)#-------------------------------------------------------------------------------
# 项目基础配置
#-------------------------------------------------------------------------------
project(detect LANGUAGES CXX CUDA)# 生成编译数据库(供clangd等工具使用)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)#-------------------------------------------------------------------------------
# 依赖配置
#-------------------------------------------------------------------------------
find_package(OpenCV REQUIRED)# CUDA 配置
find_package(CUDAToolkit REQUIRED)# 允许用户覆盖默认的 CUDA 架构
if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES)set(CMAKE_CUDA_ARCHITECTURES "89;86;75;70;61")  # 默认支持架构
endif()# TensorRT 路径配置
set(TRT_PATH /usr/local/TensorRT-10.8.0.43)
if(NOT TRT_PATH)message(FATAL_ERROR "TensorRT path must be specified with -DTRT_PATH=/path/to/tensorrt")
endif()# 定义 TensorRT 库的版本选择
set(TRT_LIB_DIR "${TRT_PATH}/lib")
set(TRT_LIBS nvinfer nvinfer_plugin nvonnxparser)#-------------------------------------------------------------------------------
# 编译工具链配置
#-------------------------------------------------------------------------------
function(set_target_compile_options target)# GCC/Clang 配置# C++编译选项target_compile_options(${target} PRIVATE$<$<AND:$<CONFIG:Release>,$<COMPILE_LANGUAGE:CXX>>:-O3 -march=native -flto=auto -DNDEBUG>$<$<AND:$<CONFIG:Debug>,$<COMPILE_LANGUAGE:CXX>>:-O0 -g3 -fno-omit-frame-pointer -fno-inline>)# CUDA编译选项target_compile_options(${target} PRIVATE$<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-Wno-deprecated-declarations>$<$<AND:$<CONFIG:Release>,$<COMPILE_LANGUAGE:CUDA>>:-O3>$<$<AND:$<CONFIG:Debug>,$<COMPILE_LANGUAGE:CUDA>>:-g -G>)target_link_options(${target} PRIVATE $<$<AND:$<CONFIG:Release>,$<COMPILE_LANGUAGE:CXX>>:-O3 -flto=auto>$<$<AND:$<CONFIG:Debug>,$<COMPILE_LANGUAGE:CXX>>:-g3>)# 跨平台宏定义target_compile_definitions(${target} PRIVATE$<$<CONFIG:Debug>:DEBUG>$<$<NOT:$<CONFIG:Debug>>:NDEBUG>)
endfunction()#-------------------------------------------------------------------------------
# TensorRT/CUDA 目标配置
#-------------------------------------------------------------------------------
function(configure_cuda_trt_target target)# 包含目录target_include_directories(${target} PRIVATE${TRT_PATH}/include)# 链接目录target_link_directories(${target} PRIVATE${TRT_LIB_DIR})# 添加链接库target_link_libraries(${target} PRIVATECUDA::cudart${TRT_LIBS})# CUDA 特性set_target_properties(${target} PROPERTIESCUDA_SEPARABLE_COMPILATION ONCUDA_RESOLVE_DEVICE_SYMBOLS ON)
endfunction()#-------------------------------------------------------------------------------
# 可执行文件
#-------------------------------------------------------------------------------
add_executable(detect ${PROJECT_SOURCE_DIR}/src/detect.cpp)
configure_cuda_trt_target(detect)
set_target_compile_options(detect)set(DEPLOY_PATH /home/tl/code/TensorRT-YOLO)# 包含头文件目录
target_include_directories(detect PRIVATE${OpenCV_INCLUDE_DIRS}${DEPLOY_PATH}
)# 链接库目录
target_link_directories(detect PRIVATE${DEPLOY_PATH}/lib
)# 私有链接库
target_link_libraries(detect PRIVATE${OpenCV_LIBS}deploy
)# 模块配置
set_target_properties(detect PROPERTIESOUTPUT_NAME "detect"RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/bin"RUNTIME_OUTPUT_DIRECTORY_DEBUG "${PROJECT_SOURCE_DIR}/bin"RUNTIME_OUTPUT_DIRECTORY_RELEASE "${PROJECT_SOURCE_DIR}/bin"
)

上面CMakeLists.txt内容注意设置你的TensorRT-YOLO工具目录,set(DEPLOY_PATH /home/tl/code/TensorRT-YOLO)
如此编译你的单独工程,会自动生成bin目录,有个名为detect的可执行文件,用此文件即可推理你的图片了。
推理过程
首先参考官方文档,生成.engine模型文件:
https://github.com/laugh12321/TensorRT-YOLO/blob/main/examples/detect/README.md
然后到你自己的工程
使用以下命令运行推理:

cd bin
./detect -e ../models/yolo11n.engine -i ../images -o ../output -l ../labels.txt

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

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

相关文章

玖玖NFT数字藏品源码(源码下载)

玖玖NFT数字藏品源码 这套还是很不错的&#xff0c;前端uniapp&#xff0c;后端FastAdmin&#xff0c;对接汇元支付&#xff0c;富友支付&#xff0c;对接avata链&#xff0c;感兴趣的自行下载研究 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/9133…

【Redis-05】高可用方案-主从哨兵

1 概述 高可用&#xff08;High Availability&#xff09;指系统在部分节点故障时仍能持续提供服务的能力。Redis 作为核心缓存组件&#xff0c;主流的高可用方案有主从复制、哨兵模式、集群模式三种。本文介绍主从复制、哨兵模式两种高可用方案。 2 主从复制 通过 “一主多从”…

焊接机器人智能节气装置

工业焊接作为现代制造业的重要组成部分&#xff0c;广泛应用于汽车、航空航天、建筑、船舶等多个领域。随着自动化技术的快速发展&#xff0c;焊接机器人已成为提升焊接效率和质量的关键装备。在传统焊接及部分自动化焊接过程中&#xff0c;气体流失问题仍然普遍存在&#xff0…

【6.1.0 漫画数据库技术选型】

漫画数据库技术选型 &#x1f3af; 学习目标&#xff1a;掌握架构师核心技能——数据库技术选型&#xff0c;针对不同业务场景选择最合适的数据库方案 &#x1f3db;️ 第一章&#xff1a;关系型数据库对比选型 &#x1f914; MySQL vs PostgreSQL vs TiDB 想象数据库就像不同…

CVE-2022-4262/CVE-2022-3038

CVE-2022-4262&#xff08;Linux内核UAF漏洞&#xff09;漏洞原理CVE-2022-4262是Linux内核中RDS&#xff08;Reliable Datagram Sockets&#xff09;协议实现的一个UAF&#xff08;Use-After-Free&#xff0c;释放后使用&#xff09;漏洞。具体来说&#xff1a;在rds_rdma_ext…

[Token]Token merging for Vision Generation

Token Compression for Vision Domain_Generation 文章目录Image GenerationToken Merging for Fast Stable Diffusion, CVPRW 2023.Token Fusion: Bridging the Gap between Token Pruning and Token Merging, WACV 2024ToDo: Token Downsampling for Efficient Generation of…

React封装过哪些组件-下拉选择器和弹窗表单

背景&#xff08;S - Situation&#xff09;&#xff1a;在某活动管理系统中&#xff0c;前端页面需要支持用户选择“要配置的当前活动”&#xff0c;并提供「新增」「编辑」功能&#xff0c;操作内容包括填写活动名称、ID、版本号等字段。原始实现逻辑分散、复用性差&#xff…

多租户架构下的多线程处理实践指南

在现代 SaaS 系统中&#xff0c;多租户架构&#xff08;Multi-Tenant Architecture&#xff09;已成为主流。然而&#xff0c;随着系统性能要求的提升和业务复杂度的增加&#xff0c;多线程成为不可避免的技术手段。但在多租户环境下使用多线程&#xff0c;容易引发数据错乱、租…

MyBatis插件机制揭秘:从拦截器开发到分页插件实战

一、拦截器体系架构解析 1.1 责任链模式在MyBatis中的实现 MyBatis通过动态代理技术构建拦截器链&#xff0c;每个插件相当于一个切面&#xff1a; // 拦截器链构建过程 public class InterceptorChain {private final List<Interceptor> interceptors new ArrayList<…

百度文心一言开源ERNIE-4.5深度测评报告:技术架构解读与性能对比

目录一、技术架构解读1.1、ERNIE 4.5 系列模型概览1.2、模型架构解读1.2.1、异构MoE&#xff08;Heterogeneous MoE&#xff09;1.2.2、视觉编码器&#xff08;Vision Encoder&#xff09;1.2.3、适配器&#xff08;Adapter&#xff09;1.2.4、多模态位置嵌入&#xff08;Multi…

Matplotlib 模块入门

Python 中有个非常实用的可视化库 ——Matplotlib。数据可视化是数据分析中不可或缺的环节&#xff0c;而 Matplotlib 作为 Python 的 2D 绘图库&#xff0c;能帮助我们生成高质量的图表&#xff0c;让数据更直观、更有说服力。接下来&#xff0c;我们将从 Matplotlib 的概述、…

LeetCode 3169.无需开会的工作日:排序+一次遍历——不需要正难则反,因为正着根本不难

【LetMeFly】3169.无需开会的工作日&#xff1a;排序一次遍历——不需要正难则反&#xff0c;因为正着根本不难 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-days-without-meetings/ 给你一个正整数 days&#xff0c;表示员工可工作的总天数&#xff08;从第…

VUE3 el-table 主子表 显示

在Vue 3中&#xff0c;实现主子表&#xff08;主从表&#xff09;的显示通常涉及到两个组件&#xff1a;一个是主表&#xff08;Master Table&#xff09;&#xff0c;另一个是子表&#xff08;Detail Table&#xff09;。我们可以使用el-table组件来实现这一功能。这里&#x…

张量数值计算

一.前言前面我们介绍了一下pytorch还有张量的创建&#xff0c;而本章节我们就来介绍一下张量的计算&#xff0c;类型转换以及操作&#xff0c;这个是十分重要的&#xff0c;我们的学习目标是&#xff1a;掌握张量基本运算、掌握阿达玛积、点积运算 掌握PyTorch指定运算设备。Py…

部署项目频繁掉线-----Java 进程在云服务器内存不足被 OOM Killer 频繁杀死-----如何解决?

一、查询系统日志grep -i "java" /var/log/messages执行这条命令&#xff0c;检查系统日志里是否有 Java 进程被 OOM Killer 杀死的记录。日志中反复出现以下内容&#xff1a;Out of memory: Killed process 3679325 (java) total-vm:2947000kB, anon-rss:406604kB..…

【保姆级教程】基于anji-plus-captcha实现行为验证码(滑动拼图+点选文字),前后端完整代码奉上!

前言 验证码作为Web应用的第一道安全防线&#xff0c;其重要性不言而喻。但你是否还在为以下问题烦恼&#xff1a; 传统字符验证码用户体验差&#xff0c;识别率低&#xff1f;验证码安全性不足&#xff0c;轻易被爬虫破解&#xff1f;前后端对接繁琐&#xff0c;集成效率低&…

HTML-八股

1、DOM和BOM DOM是表示HTML或者XML文档的标准的对象模型&#xff0c;将文档中每个组件&#xff08;元素、属性等&#xff09;都作为一个对象&#xff0c;使用JS来操作这个对象&#xff0c;从而动态改变页面内容&#xff0c;结合等。 DOM是以树型结构组织文档内容&#xff0c;树…

ADI的EV-21569-SOM核心板和主板转接卡的链接说明

ADI提供给客户很多DSP的核心板&#xff0c;比如EV-21569-SOM&#xff0c;EV-21593-SOM&#xff0c;EV-SC594-SOM等&#xff0c;非常多&#xff0c;但是没有底板&#xff0c;光一个核心板怎么用呢&#xff1f;于是我就在想&#xff0c;我的21569评估板就有通用底板&#xff0c;能…

基于 Redisson 实现分布式系统下的接口限流

在高并发场景下&#xff0c;接口限流是保障系统稳定性的重要手段。常见的限流算法有漏桶算法、令牌桶算法等&#xff0c;而单机模式的限流方案在分布式集群环境下往往失效。本文将介绍如何利用 Redisson 结合 Redis 实现分布式环境下的接口限流&#xff0c;确保集群中所有节点的…

ubuntu播放rosbag包(可鼠标交互)

1 前言 众所周知&#xff0c;ubuntu中播放bag包最主要的工具是rviz&#xff0c;然而rviz有一个无法忍受的缺陷就是不支持鼠标回滚&#xff0c;并且显示的时间的ros时间&#xff0c;不是世界时间&#xff0c;因此在遇到相关bug时不能与对应的世界时间对应。基于以上&#xff0c…