win10系统下基于tensorrt的yolov5l网络部署

yolov5网络部署

  • 环境和使用项目
  • 模型训练
  • 生成wts文件
  • 构建生成vs项目
  • 修改CMakeList.txt
  • 生成engine文件
  • 用engine文件对图片进行推理
  • 存在的问题
  • 已解决的问题

环境和使用项目

环境:win10,vs2017,opencv3.4.14,cuda11.1.0,cudnn8.2.1,tensorrt7.2.3,pytorch1.9,安装tensorrt的方法见前文
yolov5 项目:https://github.com/ultralytics/yolov5
yolov5对应tensorrt项目tensorrtx:https://github.com/donnyyou/tensorrtx/tree/master/yolov5

模型训练

生成wts文件

根据yolov5训练出来的模型权重为yolov5l.pt,其他yolov5模型类似

根据pt文件生成wts文件:wts文件是从yolov5权重转换到tensorrx权重的中间文件。转换方法为:将yolov5l.pt文件和tensorrtx/yolov5下的gen_wts.py文件放在yolov5的根目录下(主要是为了使用yolov5项目下的相关python模块),python运行gen_wts.py文件,生成yolov5l.wts文件

构建生成vs项目

需要将tensorrtx项目构建成vs项目,使用cmake-gui构建生成项目,配置时注意config中的generator选择Visual Studio 15 2017,platform选择x64

修改CMakeList.txt

tensorrtx项目是用于linux的C++项目,用于win10需要修改CMakeLists.txt文件,具体修改方法作者已给出。

cmake_minimum_required(VERSION 2.6)

project(yolov5) # 1
set(OpenCV_DIR "D:\\opencv\\opencv346\\build")  #2
set(TRT_DIR "D:\\TensorRT-7.0.0.11.Windows10.x86_64.cuda-10.2.cudnn7.6\\TensorRT-7.0.0.11")  #3

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)
include_directories(${TRT_DIR}\\include)

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

include_directories(${OpenCV_INCLUDE_DIRS})
link_directories(${TRT_DIR}\\lib)

add_executable(yolov5 ${PROJECT_SOURCE_DIR}/yolov5.cpp ${PROJECT_SOURCE_DIR}/yololayer.cu ${PROJECT_SOURCE_DIR}/yololayer.h)   #4

target_link_libraries(yolov5 "nvinfer" "nvinfer_plugin")   #5
target_link_libraries(yolov5 ${OpenCV_LIBS})          #6
target_link_libraries(yolov5 ${CUDA_LIBRARIES})   #7
target_link_libraries(yolov5 Threads::Threads)       #8

注意重点是修改opencv和tensorrt的头文件和库文件目录

修改CMakeList.txt后,设置yolov5项目为启动项目

配置项目成功后,运行vs项目如图:
win10系统下基于tensorrt的yolov5l网络部署_第1张图片

生成engine文件

engine文件是tensorrtx项目的权重文件,将yolov5l.wts放在vs项目下,添加启动项目时的命令行参数为:-s yolov5l.wts yolov5l.engine l,其中-s表示序列化模型对象,l表示yolov5l模型。重新运行项目即可获得yolov5l.engine文件。

win10系统下基于tensorrt的yolov5l网络部署_第2张图片
这里实际生成engine文件花了40多分钟,是一个比较慢的速度。之前在jetson xavier平台上生成engine文件一般花2分钟左右的时间,可能和运行平台有关系。

用engine文件对图片进行推理

engine文件实际上保存的是c++用于推理的对象的权重数据,如果要对图像进行推理的话需要改动启动的命令行参数,改为:-d yolov5l.engine …/samples,其中-d表示反序列化文件,…/samples表示用于推理的图片的路径。运行后即可获得识别结果win10系统下基于tensorrt的yolov5l网络部署_第3张图片


存在的问题

已解决的问题

win10平台下的tensorrtx工程生成engine时间过长,多等一下就好

你可能感兴趣的:(cuda)