上一篇博文介绍了win10 tensorrtx lenet使用方法,这里介绍Windows10下yolov5的TensorRT使用方法,官方的CmakeList默认是在linux环境下使用,我参考官方说明,修改了CmakeList,使其可以在windows10下快速构建TensorRT的MSVC工程,用于pytorch版yolov5的pt模型测试。
硬件:
CPU:Intel®Core™i5-10400F CPU @2.90GHz 2.90GHz
GPU: NVIDIA GeForce GTX 1660 Ti (6G显存)
内存:16.0GB(15.9GB可用)
软件:
Visual Studio 2019
Cmake
CUDA10.0/10.1,cudnn
Anaconda python3.8.3
torch 1.6.0+cu101,torchvision 0.7.0+cu101
TensorRT-7.0.0.11.Windows10.x86_64.cuda-10.0.cudnn7.6
OpenCV 3.4.0
Cmake,CUDA,cudnn,Anaconda,OpenCV等常规软件安装参照网上教程安装即可,不再赘述。
2.1 tensorRT安装与测试
参考我的另一篇博客:win10 TensorRT 安装与测试
2.2 tensorRT工具库tensorrtx
tensorrtx是GitHub上star最多的tensorrt资料仓库,这个库就尝试使用TensorRT的各种API直接进行网络的构建,简单粗暴,还很有效。避免模型转onnx时出现的一些网络层不支持问题和不友好的报错提示问题。
tensorrtx下载链接:
https://github.com/wang-xinyu/tensorrtx
与tensorrtx相关的仓库pytorchx:
https://github.com/wang-xinyu/pytorchx
yolov5官方代码链接:
https://github.com/ultralytics/yolov5
2.3 第三方依赖库
1)OpenCV
在网上下载一个版本即可,我用的是3.4.0版本
2)Dirent
Dirent是一个C/ c++编程接口,允许程序员检索有关Linux/UNIX下的文件和目录的信息。这个项目为Microsoft Windows提供了Linux兼容的不同接口。
下载链接:https://github.com/tronkko/dirent
2.4 yolov5官方测试pt模型
yolov5官方测试pt模型在网络不好时,下载较慢,这里有我下载好的模型可以直接使用,点击下载。
3.1 .pt模型转.wts
1)将下载的yolov5的pt模型放到ultralytics/yolov5/weights目录下
2)将tensorrtx/yolov5/gen_wts.py 复制到 ultralytics/yolov5目录下
3)运行 python gen_wts.py,得到yolov5s.py
linux版教程
3.2 修改CmakeList
敲黑板,重点来了!!!官方给的CMakeList是linux版本的,想在Windows下构建工程需要修改CMakeList。这里官方给出的参考windows下MSVC构建方法,写了一个yolov5的TensorRT工程构建CMakeList,具体内容如下:
1)设置工程名:#1
2)设置OpenCV路径:#2—#6
3)设置TensorRT库路径:#7—#9
4)设置Dirent路径:#10
5)配置工程包含目录:#11
6)配置TensorRT包含目录和库目录:#12,#13
7)配置OpenCV包含目录和库目录:#14,#15
8)配置Dirent包含目录:#16
9)添加工程文件:#17
10)配置TensorRT附加依赖项:#18
11)配置OpenCV的debug版附加依赖项:#19
12)配置OpenCV的release版附加依赖项:#20
13)配置CUDA的附加依赖项:#21
cmake_minimum_required(VERSION 2.6)
project(yolov5) #1
set(OpenCV_DIR "D:\\soft\\Opencv\\opencv\\build") #2
set(OpenCV_INCLUDE_DIRS ${OpenCV_DIR}\\include) #3
set(OpenCV_LIB_DIRS ${OpenCV_DIR}\\x64\\vc15\\lib) #4
set(OpenCV_Debug_LIBS "opencv_world340d.lib") #5
set(OpenCV_Release_LIBS "opencv_world340.lib") #6
set(TRT_DIR "D:\\soft\\TensorRT-7.0.0.11") #7
set(TRT_INCLUDE_DIRS ${TRT_DIR}\\include) #8
set(TRT_LIB_DIRS ${TRT_DIR}\\lib) #9
set(Dirent_INCLUDE_DIRS "D:\\PyTorch\\TensorRT\\dirent\\source\\include") #10
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)
主要是自动配置了OpenCV、Dirent和CUDA,其中OpenCV自动配置了debug版和release版附加依赖项,这个命令很方便,值得学习一下。
target_link_libraries(yolov5 debug ${OpenCV_Debug_LIBS}) #19
target_link_libraries(yolov5 optimized ${OpenCV_Release_LIBS}) #20
CMake构建工程,不多说,直接上图,没有erro和warming就可以了
linux版教程
3.3 编译工程
release和debug版都一次编译通过,再也不用担心环境没配好导致编译失败了。
3.4 运行
1)将生成好的yolov5s.wts复制到tensorrtx/yolov5目录下,将测试图像文件夹/samples放到tensorrtx/yolov5目录下
2)在yolov5的配置属性—>调试—>命令参数,设置命令行参数
-s yolov5s.wts yolov5s.engine s
运行结束后在工程目录下得到yolov5s.engine文件
3)在yolov5的配置属性—>调试—>命令参数,设置命令行参数
-d yolov5s.engine …/samples
运行结束后得到测试输出结果
1)用自己的数据集训练的模型(yolov5和yolov3),网络结构与tensorrtx源码不一致,生成engine文件时报错,暂未找到原因,官方的pt模型网络结构和tensorrtx源码一致(待解决)。
2)暂时只测了yolov5s的官方pt模型,跑通所有流程,yolov5系列其他模型未做测试(待测试)。
3)pytorch代码在Windows上运行常见错误:Initializing libiomp5md.dll, but found libiomp5md.dll already initialized,解决办法:
把这句话放到程序最开始的位置(注意使用因为引号)。
import os
os.environ[‘KMP_DUPLICATE_LIB_OK’]=‘True’