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.28.6
Ubuntu升级cmake,可任意切换版本
如果你没有安装ros,可以按下面步骤安装ros,否则跳过第2步。

2、重装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软连接:

xx@yd:/usr/local$ sudo rm -rf cuda
xx@yd:/usr/local$ sudo ln -s /usr/local/cuda-12.2 /usr/local/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.8版本,选择如下选项:
TensorRT 10.8 GA for Linux x86_64 and CUDA 12.0 to 12.8 TAR Package
解压:
tar -xvzf TensorRT-10.8.0.43.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} PRIVATE
        CUDA::cudart
        ${TRT_LIBS}
    )

    # CUDA 特性
    set_target_properties(${target} PROPERTIES
        CUDA_SEPARABLE_COMPILATION ON
        CUDA_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 PROPERTIES
    OUTPUT_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
本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值