TenstoRT加速YOLOv11——C++端加速
前言
本文介绍C++语言下使用TenstoRT加速YOLOv11推理
一.资料下载
1.camke下载
https://cmake.org/download/
2.tensorrtx-master下载
https://link.gitcode.com/i/e6e98255605d4185b43a58662eb49fb6?uuid_tt_dd=11_80042856162-1735808112822-061453&isLogin=1&from_id=151696398
3.dirent.h 下载
https://link.gitcode.com/i/d3c3033a0c0d19740cfee7ee482bace9?uuid_tt_dd=11_80042856162-1735808112822-061453&isLogin=1&from_id=142399431
4.opencv下载
自行下载
二.部署
我们打开tensorrtx-master中的YOLOv11文件夹
我们看到CMakeLists这个文件
我将我的贴出来,请仔细阅读根据自己的设备,下载地址进行修改:
cmake_minimum_required(VERSION 3.10)project(yolov11)
# 设置CUDA编译器标志,允许不支持的编译器
set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -allow-unsupported-compiler")
add_definitions(-std=c++11)
add_definitions(-DAPI_EXPORTS)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_BUILD_TYPE Debug)set(CMAKE_CUDA_COMPILER "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.4/bin/nvcc.exe") #这里去CUDA文件夹中找到自己的nvcc文件路径
set(CMAKE_CUDA_ARCHITECTURES 89) #这里代表显卡的系列,我是40就是89
enable_language(CUDA)include_directories(${PROJECT_SOURCE_DIR}/include)
include_directories(${PROJECT_SOURCE_DIR}/plugin)# include and link dirs of cuda and tensorrt, you need adapt them if yours are different
if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")message("embed_platform on")include_directories(/usr/local/cuda/targets/aarch64-linux/include)link_directories(/usr/local/cuda/targets/aarch64-linux/lib)
else()message("embed_platform off")# cuda 注意这里都改成自己CUDA的路径include_directories("C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.4/include")link_directories("C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.4/lib/x64")# tensorrt 注意这里都改成自己tensorrt的路径include_directories("E:/tenstort/TensorRT-10.3.0.26/include")link_directories("E:/tenstort/TensorRT-10.3.0.26/lib")
endif()add_library(myplugins SHARED ${PROJECT_SOURCE_DIR}/plugin/yololayer.cu)
set_target_properties(myplugins PROPERTIES CUDA_SEPARABLE_COMPILATION ON) # 分离编译
target_link_libraries(myplugins nvinfer cudart)find_package(OpenCV)
include_directories(${OpenCV_INCLUDE_DIRS})file(GLOB_RECURSE SRCS ${PROJECT_SOURCE_DIR}/src/*.cpp ${PROJECT_SOURCE_DIR}/src/*.cu)add_executable(yolo11_det ${PROJECT_SOURCE_DIR}/yolo11_det.cpp ${SRCS})
target_link_libraries(yolo11_det nvinfer)
target_link_libraries(yolo11_det cudart)
target_link_libraries(yolo11_det myplugins)
target_link_libraries(yolo11_det ${OpenCV_LIBS})add_executable(yolo11_cls ${PROJECT_SOURCE_DIR}/yolo11_cls.cpp ${SRCS})
target_link_libraries(yolo11_cls nvinfer)
target_link_libraries(yolo11_cls cudart)
target_link_libraries(yolo11_cls myplugins)
target_link_libraries(yolo11_cls ${OpenCV_LIBS})add_executable(yolo11_seg ${PROJECT_SOURCE_DIR}/yolo11_seg.cpp ${SRCS})
target_link_libraries(yolo11_seg nvinfer)
target_link_libraries(yolo11_seg cudart)
target_link_libraries(yolo11_seg myplugins)
target_link_libraries(yolo11_seg ${OpenCV_LIBS})add_executable(yolo11_pose ${PROJECT_SOURCE_DIR}/yolo11_pose.cpp ${SRCS})
target_link_libraries(yolo11_pose nvinfer)
target_link_libraries(yolo11_pose cudart)
target_link_libraries(yolo11_pose myplugins)
target_link_libraries(yolo11_pose ${OpenCV_LIBS})add_executable(yolo11_obb ${PROJECT_SOURCE_DIR}/yolo11_obb.cpp ${SRCS})
target_link_libraries(yolo11_obb nvinfer)
target_link_libraries(yolo11_obb cudart)
target_link_libraries(yolo11_obb myplugins)
target_link_libraries(yolo11_obb ${OpenCV_LIBS})
加入opencv的地址,我们要在环境变量中加入opencv的地址如下:
加入之后我们进入camke编译的步骤
如果你是第一次编译c++,没有使用过mingw,你可以直接打开
修改地址点击Configure即可开始编译
如果你使用过mingw,请按下面方法编译
1.清理环境:打开一个 全新的普通命令行窗口(CMD 或 PowerShell)
2.清除冲突变量:在新窗口中输入并执行:
set CC=
set CXX=
set RC=
3.激活纯正 MSVC 环境:在同一个窗口中,运行 Visual Studio 的开发人员命令提示符脚本:
"D:\Microsoft Visual Studio\Community\VC\Auxiliary\Build\vcvars64.bat"
4.导航到您的构建目录:
cd/d E:\tenstort\tensorrtx-master\yolo11\build2 (在yolo11中自己创建一个确保文件夹中没有任何文件)
6.开始编译
cmake ..
等待编译成功
成功后用VS2022打开这个文件
这个就是检测的文件,我们看到还有分割,姿态识别等,拿检测举例
这里理论上camke成功后直接运行就行了,但是这里应该会有几个共性问题,主要是因为tenstort版本问题,这套代码是基于8.X版本写的,如果你用的是10.X就会有问题。
1.代码因为版本不适配,这个问题一般的大模型都可以解决改好。
2.函数名称改变
在这里改过来就可以了。
3.不同设备可能遇到各种问题,如果解决不了可以放评论区大家一起看看。
三.运行
首先,我们需要将pt转换为wts
用pycharm打开它,终端输入,会在与pt同级下得到.wts
用VS2022编译成功后的文件就在这里了,将待检测的图片和.wts文件复制过来。
鼠标右击,打开终端输入
.\yolo11_det.exe -s yolo11n.wts yolo11n.engine n
再输入
.\yolo11_det.exe -d yolo11n.engine ../images [c/g] #c是CPU,G是GPU
这样就成功啦!看看结果