提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
最近一直在学习关于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,
将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的原因造成的,所以在改这块的时候应该要多注意
具体过程有很多教程有讲解,这里不再赘述,先configure,选择vs2019,x64,然后finish,
这一步我在第一次做的时候会报很多错,大多数原因是一些文件的缺失,这里附上我的解决方式
路径下的四个文件复制到 vs的路径下,如图:
如果出现和dirent,h有关的错误,说明缺少这个文件,下载后将其复制在vs2019的vc\Tools\MSVC\include下。
如果没错的话,在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下直接弄,会省事很多。