TensorRT部署YOLOv5(VS和Cmake两种方式)

     终于在大哥的指导下完成了此次任务,我的Cmake编译差不多是复现大哥的文章,解决一些意外的错误,我的VS编译是根据另外几个博主的启发下完成,很多文章只是单独的写了VS或者cmake进行编译进行检测,自我感觉VS进行模型转换编译都比较顺利没有出现什么错误,大家可以先从VS编译开始,如果大家喜欢使用cmake也可以直接进入第二部分。RTX2060下使用yolov5s.engine进行推理可以达到5ms的速度,精度确实有所下降,但是使用yolov5l.engine精度不但有所提升速度也可以达到10ms,总体来说还是不错的。

看看yolov5l.engine的效果吧,yolov5s.engine速度太快了!

1

    建议在某个磁盘下面新建一个文件夹命名为:tensorRT之类的,将以下所有用到的东西都下载到该文件夹如图所示:

TensorRT部署YOLOv5(VS和Cmake两种方式)_第1张图片

目录

一.前期准备

二.环境配置

三.VS编译

四.Cmake编译


一.前期准备

我的电脑是RTX2060+win10+vs2019;

1.VS2019的下载:

Downloads - Visual Studio Subscriptions Portal直接点击进入下载页面;

 2.opencv3.4.1的下载:

Download OpenCV from SourceForge.net直接点击进入下载页面;

3.cmake3.19.1的下载

Index of /files/v3.19 (cmake.org)直接点击进入下载页面;

4.CUDA、CUDNN、TensorRT的下载:

这三个都是对应的版本所以我这里直接下载大哥的,你们也可以自己去官网下载对应版本:

TensorRT:https://developer.nvidia.cn/nvidia-tensorrt-download

cudnn:https://developer.nvidia.cn/rdp/cudnn-archive

CUDA:https://developer.nvidia.cn/cuda-toolkit-archive

songpingwang的百度网盘下载链接:链接:百度网盘 请输入提取码
提取码:3zgc

 5.yolov5源码、yolov5权重文件、dirent.h文件、tensorrtx源码;

我使用的是yolov5.4.0版本、yolov5s;

下载yolov5源码:

https://github.com/ultralytics/yolov5/tags
下载yolov5权重:

Releases · ultralytics/yolov5 · GitHub
下载dirent.h:

dirent/dirent.h at master · tronkko/dirent · GitHub 或者 点击下载
下载tensorrtx:

Tags · wang-xinyu/tensorrtx · GitHub  (与自己训练的yolov5-xx版本一致)

二.环境配置

1.这里大家应该先安装VS再安装CUDA,这样VS才能识别到cuda的存在,如果已经安装了cuda但是识别不到则需要卸载重新安装,安装cuda时选择自定义安装,安装路径默认在C盘不用管。测试cuda是否安装成功:win+R输入CMD,在终端输入nvcc -V.

TensorRT部署YOLOv5(VS和Cmake两种方式)_第2张图片

 将cudnn和TensorRT_cuda_cudnn解压,把对应的bin、lib(X64)、include内容复制到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2对应的文件夹下面:

TensorRT部署YOLOv5(VS和Cmake两种方式)_第3张图片

TensorRT部署YOLOv5(VS和Cmake两种方式)_第4张图片

 加入环境变量: 右键点击此电脑,打开属性—>高级系统设置—>环境变量,可以看到系统变量中多了CUDA_PATH和CUDA_PATH_V10_2两个环境变量(CUDA默认安装位置路径为:C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.2):

TensorRT部署YOLOv5(VS和Cmake两种方式)_第5张图片

 在此页面点击新建:

TensorRT部署YOLOv5(VS和Cmake两种方式)_第6张图片

 加入以下:

CUDA_SDK_PATH = C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.2
CUDA_LIB_PATH = %CUDA_PATH%\lib\x64
CUDA_BIN_PATH = %CUDA_PATH%\bin
CUDA_SDK_BIN_PATH = %CUDA_SDK_PATH%\bin\win64
CUDA_SDK_LIB_PATH = %CUDA_SDK_PATH%\common\lib\x64

在系统变量中双击打开Path变量, 在其末尾添加如下指令路径:

%CUDA_LIB_PATH%;%CUDA_BIN_PATH%;%CUDA_SDK_LIB_PATH%;%CUDA_SDK_BIN_PATH%;

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\lib\x64

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\include

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\extras\CUPTI\lib64

C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.2\bin\win64

C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.2\common\lib\x64
#加入cudnn和tensorRT的BIN目录
D:\yolov5_tensort\TensorRT-7.2.3.4.Windows10.x86_64.cuda-10.2.cudnn8.1\TensorRT-7.2.3.4\bin

D:\yolov5_tensort\cudnn-10.2-windows10-x64-v8.1.1.33\cuda\bin

下载opencv并进行环境变量添加:

D:\yolov5_tensort\opencv\build\x64\vc15\bin
D:\yolov5_tensort\opencv\build\bin

三.VS编译

在tensort文件夹新建一个文件夹命名为yolov5_trt,打开VS创建新项目,点击空项目,

TensorRT部署YOLOv5(VS和Cmake两种方式)_第7张图片

 将tensorrtx-master\yolov5文件夹下的文件拷贝到创建的项目工程中(与yolov5_Trt.vcxproj在同一路径)

TensorRT部署YOLOv5(VS和Cmake两种方式)_第8张图片

 将此文件的内容复制到:

TensorRT部署YOLOv5(VS和Cmake两种方式)_第9张图片

 将文件添加到工程中可以直接拖拽,也可以右键点击添加现有文件:

TensorRT部署YOLOv5(VS和Cmake两种方式)_第10张图片

 右键项目--属性--VC++目录:

添加包含目录:

C:\work\TensorRT-7.2.3.4\include
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\include
C:\work\Opencv3.4.1\opencv\build\include
C:\work\Opencv3.4.1\opencv\build\include\opencv2

库目录:

C:\work\TensorRT-7.2.3.4\lib
C:\work\Opencv3.4.1\opencv\build\x64\vc15\lib
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\lib\x64

点击连接器----输入----添加附加依赖项:

cudart.lib
cublas.lib
cudnn.lib
cudnn64_8.lib
myelin64_1.lib
nvinfer.lib
nvinfer_plugin.lib
nvonnxparser.lib
nvparsers.lib
opencv_world341.lib		//opencv版本不同就不一样

将opencv同目录下LIB的dll文件拷贝到C:\Windows\System32;

右键属性----生成依赖项——生成自定义,勾选CUDA10.2;点击第一个就够了,如果都勾选会报错;

TensorRT部署YOLOv5(VS和Cmake两种方式)_第11张图片

 右键.cu文件——常规——修改项类型为CUDAC/C++

TensorRT部署YOLOv5(VS和Cmake两种方式)_第12张图片TensorRT部署YOLOv5(VS和Cmake两种方式)_第13张图片

 OK,快完工了,我们需要把yolov5s.pt——yolov5s.wts——yolov5s.engine;

首先将该工层的gen_wts.py复制到yolov5.4.0的根目录下面运行产生yolov5s.wts

TensorRT部署YOLOv5(VS和Cmake两种方式)_第14张图片

 将生成的wts文件复制到此工程下面:修改命令参数为 -s yolov5s.wts yolov5s.engine s

 右键项目——属性——调试:命令参数:

TensorRT部署YOLOv5(VS和Cmake两种方式)_第15张图片

 我的是在release模式下进行编译的,可能会出现以下错误:

1.

C4996'localtime': This function or variable may be unsafe
解决方法:在第一行YOLO.CPP添加
#pragma warning(disable:4996)

2.

const char类型的值不能用于初始化char
解决方法:
项目->属性->C/C+±>语言->符合模式,将原来的“是”改为“否”

 3.

无法打开包括文件: “dirent.h”
解决方法:
将dirent.h放在工程目录下,但是我还是识别不了,于是在 项目——yolov5_Trt属性——VC++目录——包含目录 下添加我的工程目录。

 4.

[E] [TRT] Could not compute dimensions for (Unnamed Layer* 475) [Convolution]_output, because the network is not valid.

解决方案:
yololayer.h中 修改static constexpr int CLASS_NUM = 2(你的分类数);默认是80

5.

_CRT_SECURE_NO_WARNINGS错误

在 项目->属性->C/C++->预处理器->预处理器定义中添加_CRT_SECURE_NO_WARNINGS

运行成功后会在此工程下面生成yolov5s.engine大家可以修改命令进行检测了:在此工程下面新建samples文件夹,这个下面放几张图片,

TensorRT部署YOLOv5(VS和Cmake两种方式)_第16张图片

d yolov5s.engine ./samples运行成功后会在工程下面出现检测结果和终端出现推理时间:

TensorRT部署YOLOv5(VS和Cmake两种方式)_第17张图片

如果大家想调用摄像头进行检测可以大家直接去原博主查看。

修改yolov5.cpp,直接调用博主的代码,项目——yolov5_Trt属性——调试 修改命令参数为-v yolov5s.engine。

错误1

会出现错误:"const char *" 类型的值不能用于初始化 "char *" 类型的实体
解决方案:在项目上右键,选择“属性”,选择“C/C++”,然后在“语言”中,把“符合模式”改为“否”就好了

TensorRT部署YOLOv5(VS和Cmake两种方式)_第18张图片

四.Cmake编译

将下载的cmake下的bin目录导入环境变量:

TensorRT部署YOLOv5(VS和Cmake两种方式)_第19张图片

tensorRT中yolov5的工程;

TensorRT部署YOLOv5(VS和Cmake两种方式)_第20张图片

在此工程中建立一个文件叫build,同样把下载的dirent.h文件放在此工程下;

点击cmakefile.txt:原本此文件是linux 系统下的,所以我们需要修改如下:

cmake_minimum_required(VERSION 2.8)

#=========================================================
project(yolov5)                                 #1 工程名
set(OpenCV_DIR "E:\\opencv3\\opencv\\build")    #2 opencv目录改成自己的目录
set(OpenCV_INCLUDE_DIRS ${OpenCV_DIR}\\include) #3 
set(OpenCV_LIB_DIRS ${OpenCV_DIR}\\x64\\vc15\\lib) #4
set(OpenCV_Debug_LIBS "opencv_world341d.lib")     #5
set(OpenCV_Release_LIBS "opencv_world341.lib")    #6
set(TRT_DIR "E:\\Downloads\\TensorRT-7.2.1.6.Windows10.x86_64.cuda-11.0.cudnn8.0\\TensorRT-7.2.1.6")  #7
set(TRT_INCLUDE_DIRS ${TRT_DIR}\\include) #8
set(TRT_LIB_DIRS ${TRT_DIR}\\lib)         #9
set(Dirent_INCLUDE_DIRS "F:\\yolov5trt")  #10这里需要改成自己dirent.h的目录路径就是本工程的目录
#=========================================================

add_definitions(-std=c++11)

option(CUDA_USE_STATIC_CUDA_RUNTIME OFF)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_BUILD_TYPE Debug)

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads)

# setup CUDA
find_package(CUDA REQUIRED)
message(STATUS "    libraries: ${CUDA_LIBRARIES}")
message(STATUS "    include path: ${CUDA_INCLUDE_DIRS}")

include_directories(${CUDA_INCLUDE_DIRS})

####
enable_language(CUDA)  # add this line, then no need to setup cuda path in vs
####
include_directories(${PROJECT_SOURCE_DIR}/include) #11
include_directories(${TRT_INCLUDE_DIRS}) #12
link_directories(${TRT_LIB_DIRS}) #13
include_directories(${OpenCV_INCLUDE_DIRS}) #14
link_directories(${OpenCV_LIB_DIRS}) #15
include_directories(${Dirent_INCLUDE_DIRS}) #16


# -D_MWAITXINTRIN_H_INCLUDED for solving error: identifier "__builtin_ia32_mwaitx" is undefined
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Ofast -D_MWAITXINTRIN_H_INCLUDED")

# setup opencv
find_package(OpenCV QUIET
    NO_MODULE
    NO_DEFAULT_PATH
    NO_CMAKE_PATH
    NO_CMAKE_ENVIRONMENT_PATH
    NO_SYSTEM_ENVIRONMENT_PATH
    NO_CMAKE_PACKAGE_REGISTRY
    NO_CMAKE_BUILDS_PATH
    NO_CMAKE_SYSTEM_PATH
    NO_CMAKE_SYSTEM_PACKAGE_REGISTRY
)

message(STATUS "OpenCV library status:")
message(STATUS "    version: ${OpenCV_VERSION}")
message(STATUS "    lib path: ${OpenCV_LIB_DIRS}")
message(STATUS "    Debug libraries: ${OpenCV_Debug_LIBS}")
message(STATUS "    Release libraries: ${OpenCV_Release_LIBS}")
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")

add_executable(yolov5 ${PROJECT_SOURCE_DIR}/yolov5.cpp ${PROJECT_SOURCE_DIR}/common.hpp ${PROJECT_SOURCE_DIR}/yololayer.cu ${PROJECT_SOURCE_DIR}/yololayer.h)   #17
target_link_libraries(yolov5 "nvinfer" "nvinfer_plugin") #18
target_link_libraries(yolov5 debug ${OpenCV_Debug_LIBS}) #19
target_link_libraries(yolov5 optimized ${OpenCV_Release_LIBS}) #20
target_link_libraries(yolov5 ${CUDA_LIBRARIES}) #21
target_link_libraries(yolov5 Threads::Threads)  

修改完成以后点击保存进入cmake界面:

TensorRT部署YOLOv5(VS和Cmake两种方式)_第21张图片

 source code 添加本工程目录,build第二行填写自己新建的build,运行完之后生成的东西全在这个文件,点击configure-------完成之后再点击Gnereta----------再点击open project;

TensorRT部署YOLOv5(VS和Cmake两种方式)_第22张图片

 打开之后直接DEBUG和realses进行编译,

 TensorRT部署YOLOv5(VS和Cmake两种方式)_第23张图片

 最后会出现报错应用程序启动失败的提示,不用管他直接关闭。

我们直接打开生成目录:

TensorRT部署YOLOv5(VS和Cmake两种方式)_第24张图片

 大家进入此目录cmd进入终端:

TensorRT部署YOLOv5(VS和Cmake两种方式)_第25张图片

输入:yolov5.exe -s yolov5s.wts yolov5.engine s,将wts文件放到此目录中,最后运行成功生成engine文件,我们在此目录下创建samples文件夹里面放入几张图片进行测试,

输入:yolov5.exe -d yolov5s.engine ./samples得到结果,

TensorRT部署YOLOv5(VS和Cmake两种方式)_第26张图片

 温馨提示:如果是转换其他格式的权重文件比如yolov5l.wts需要将后缀改为 l而不是s.

TensorRT部署YOLOv5(VS和Cmake两种方式)_第27张图片

大家可以跟踪我的下一篇CSDN如何将整个项目生成动态连接库调用,我觉得这一部分比较重要可以用到其他平台。大家也可以去大哥的文章学习,大家有什么意见可以进群交流:135163517

你可能感兴趣的:(深度学习,pytorch,c++)