win10+vs2019+tensorrt+yolov5模型加速

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

最近一直在学习关于tensorrt加速生成engine文件的知识,自己也跟着网上的很多博主在自己电脑上一步一步实现,但是遇到了很多问题和坑,大多数问题是因为在windows系统上进行操作和在linux系统上操作的差异性导致的,这里记录一下方便自己以后查阅并且希望能帮到别人。

一、准备工作

1.需要安装cuda cudnn 以及对应的tensorrt,vs2019,需要注意的是tensorrt的安装一定要和自己的cuda以及cudnn版本相对应,否则会在后续工作中出现很多错误,例如我的cuda版本是10.1,cudnn为cudnn-10.1-windows10-x64-v7.6.3.30,再下载了对应的tensorrt。

下载好tensorrt后,需要验证tensorrt是否安装成功,具体步骤论坛上有很多教程,可以跟着做一下,大多数错误都有详细的解决方式,最后只要运行samples/samoleMNIST文件夹下的sample_mnist.sln,出如下结果就表示安装成功。

 2.需要在

https://github.com/ultralytics/yolov5.git
https://github.com/wang-xinyu/tensorrtx.git

下载yolov5以及tensorrtx的文件,我由于是直接下的,所以是最新版的。需要注意的是tensorrt的tags需要和yolov5的tags保持一致,因此如果要用先前版本的,一定要注意tags的一致性。

3.因为是在windows上运行,所以还需要下载cmake,直接在官网下载就可以,但注意版本不能太低(2.6以上)。

4.安装opencv,安装好后要在环境变量中添加其路径,一共有两处,一个是在系统变量中新建如下图所示的路径,

 然后在系统变量中的path中添加bin文件夹的路径,

                             

如果没有这一步,会在后续生成exe文件的过程中报错找不到opencv_world3416d.ddl,

二、使用步骤

1.生成yolov5.wts文件

将tensorrtx-master中的yolov5文件夹下的gen_wts文件复制到yolov5-master文件夹下,并且运行,生成yolov5s.wts文件,该文件最终会用于生成.egine文件。

 

 2.打开tensorrtx_master文件夹下的yolov5文件夹,由于下载下来的代码是在linux下运行的,所以在windows下,要对CMakeLists.txt文件进行修改,这里放上我修改后的

cmake_minimum_required(VERSION 2.6)

project(yolov5) #1
set(OpenCV_DIR "D:\\opencv\\build") #设置为自己的opencv下build的路径
set(OpenCV_INCLUDE_DIRS ${OpenCV_DIR}\\include) 
set(OpenCV_LIB_DIRS ${OpenCV_DIR}\\x64\\vc15\\lib) 
set(OpenCV_Debug_LIBS "opencv_world3416d.lib") 
set(OpenCV_Release_LIBS "opencv_world3416.lib") 
set(TRT_DIR "E:\\MasterFile\\MasterCode\\TensorRT-6.0.1.5") #设置为自己tensort的路径
set(TRT_INCLUDE_DIRS ${TRT_DIR}\\include) 
set(TRT_LIB_DIRS ${TRT_DIR}\\lib) 
set(Dirent_INCLUDE_DIRS "E:\\MasterFile\\MasterCode\\tensorrtx-master\\yolov5\\yolov5_trt")

add_definitions(-std=c++11)
#add_definitions(-DAPI_EXPORTS)
option(CUDA_USE_STATIC_CUDA_RUNTIME OFF)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_BUILD_TYPE Debug)

# set
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads)

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

include_directories(${CUDA_INCLUDE_DIRS})


enable_language(CUDA)

include_directories(${PROJECT_SOURCE_DIR}/include) 
include_directories(${TRT_DIR}\\include)

include_directories(${TRT_INCLUDE_DIRS}) 
link_directories(${TRT_LIB_DIRS}) #
include_directories(${OpenCV_INCLUDE_DIRS}) 
link_directories(${OpenCV_LIB_DIRS}) 
include_directories(${Dirent_INCLUDE_DIRS}) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Ofast -D_MWAITXINTRIN_H_INCLUDED")
#cuda_add_library(myplugins SHARED yololayer.cu)
#target_link_libraries(myplugins nvinfer cudart)  # 这两行在原来的cmakelists里有,但用不到,所以注释掉

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}")
message(STATUS "    libraries: ${OpenCV_LIBS}")

link_directories(${TRT_DIR}\\lib)


add_executable(yolov5 ${PROJECT_SOURCE_DIR}/yolov5.cpp ${PROJECT_SOURCE_DIR}/common.hpp ${PROJECT_SOURCE_DIR}/yololayer.cu ${PROJECT_SOURCE_DIR}/yololayer.h ${PROJECT_SOURCE_DIR}/preprocess.cu ${PROJECT_SOURCE_DIR}/preprocess.h) #这一步很重要,一个都不能少,否则会在生成.exe文件时报错。


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 ${OpenCV_LIBS})
target_link_libraries(yolov5 Threads::Threads) 

对比原来的,可以看出差别还是很大的,重点已经在#后说明了,总体而言,在windows上做tensorrt加速坑实在很多,但大部分都是因为CMakeLists的原因造成的,所以在改这块的时候应该要多注意

2.cmake编译生成build

具体过程有很多教程有讲解,这里不再赘述,先configure,选择vs2019,x64,然后finish,

这一步我在第一次做的时候会报很多错,大多数原因是一些文件的缺失,这里附上我的解决方式

路径下的四个文件复制到 vs的路径下,如图:

 如果出现和dirent,h有关的错误,说明缺少这个文件,下载后将其复制在vs2019的vc\Tools\MSVC\include下。

然后点击Generate,不用管红色的warning,

如果没错的话,在build文件下会出现工程文件。

 然后点击Open Project,打开工程。

生成解决方案,如果运气好,会不出错生成.exe文件,我在生成解决方案的时候报了很多错,很多原因是因为我先前的cmakelists的原因,还有的原因有

 

 缺少dirent.h,我是直接将该文件放到了yolov5下(与build文件同级)

然后打开utils文件,将dirent.h的尖括号改为双引号。

还有很多人会遇到 error LNK2019:无法解析的外部符号“void——cdecl”,造成这个错的原因是在使用中进行了声明,但找不到定义的位置,我的解决方式是原cmakelists中的add_executable内容中添加了一部分,如下所示:

 没有报错的话,会在build\Debug下生成yolov5.exe文件。

 将之前生成的.wts文件放到该文件夹下,cmd到命令行,cd到yolov5.exe文件所在路径,输入

yolov5.exe -s yolov5s.wts yolov5.engine s, 生成.engine文件,这个过程会持续大概10分钟左右。

之后在build文件夹下新建samples文件夹,里面放上自己想要测的图片,在命令行输入

yolov5.exe -d yolov5s.engine ../samples,就会生成结果并存储在Debug文件夹里。

 

 

最终结果:


总结

总之,在windows下用c++还是很麻烦,最好还是在linux下直接弄,会省事很多。

  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值