由于项目需要,近日来研究了一下yolov5的tensorrt的c++/python部署,和各种小bug激斗了十余小时,但网络上的几乎所有教程都忽略了一些小细节,造成了很多的麻烦。但经本人不断试错,最终终于成功生成!本踩坑经验仅适用于win10+tensorrtx+YOLOv5的c++/python版tensorrt部署方式,并在文章里附上本人运行成功的具体配置, 外网下载资源不易,本文一并附上下载好的cuda,cudnn,opencv等安装包和coco/widerface数据集的int8量化校准数据集coco_calib.zip/widerface_calib.zip的网盘链接。
基础的安装可以参考网络上的教程,本文章主要分享本人配置过程中的注意事项,和网络上没人提及的错误解决办法。
一:安装cuda, cudnn,tensorrt,opencv等环境包要严格对照版本
这是第一个坑,如果你想用tensorrt7,那就要安装7.xx版本号的cudnn, 同时也对应好cuda的版本。
例如:我安装的cuda是10.2, 然后安装了cudnn7.6.5(forcuda10.2), 最后安装了tensorrt7
如果你和我一样选择10.2的cuda,但是想使用tensorrt8(最新), 那就要安装8.xx的cudnn。
注意!:这一步非常重要,版本错误将导致后面编译疯狂失败!强烈建议严格按照我的版本来:
cuda:10.2
cudnn:7.6.5(for cuda10.2)
tensorrt:7.00.11
opencv:3.4.14(一定要选择3.x.xx,实测4版本无法通过camke编译!)
vs:2019(2022版本编译失败 ps:但暂时不知道是不是vs2022的锅,可能是opencv4的锅)
cmake:3.26.0(这个其实没什么影响,我直接下载的最新版本)
本次部署我是用的外网资源整合在这,可以自行下载
链接: https://pan.baidu.com/s/1Tuuu4GsZ0r8R42ONwOCCJA?pwd=nxnb
提取码:nxnb
二:按照想部署的yolo版本下载对应版本的tensorrtx
https://github.com/wang-xinyu/tensorrtx
此链接直接进入下载的是master版本,要切换tag到你想部署的yolo版本下载对应版本的代码
https://github.com/wang-xinyu/tensorrtx/tree/yolov5-v5.0
这是我使用的部署yolov5 5.0的代码
三:修改CMakeLists.txt及编译
万恶的一步!!!主要的时间都卡在cmake编译这里,其实是因为前面出错的话也可能不会体现出来,一般在这里出错都是由于前面没有严格按步骤来,再次呼吁,一定要严格按照版本号、步骤配置!
vs编译报错:error MSB3721或error yololayer.cu相关:
解决办法:要在CMakeLists.txt中添加一句:add_definitions(-DAPI_EXPORTS)
vs编译报错:error“dirent.h”: No such file or directory:
解决办法:复制一份dirent.h放在F:\PyCharmProjects\tensorrtx-yolov5-v5.0\yolov5\include
网上教程告诉放在F:\PyCharmProjects\tensorrtx-yolov5-v5.0\include,我建议两边都放
最后贴上我编译成功的CMakeLists.txt,其中#2#3要修改成你自己配置的路径
cmake_minimum_required(VERSION 2.6)project(yolov5) # 1
set(OpenCV_DIR "F:\\opencv3\\opencv\\build") #2
set(TRT_DIR "F:\\tensorrt_tar\\TensorRT-7.0.0.11") #3add_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)add_definitions(-DAPI_EXPORTS)
# 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 QUIETNO_MODULENO_DEFAULT_PATHNO_CMAKE_PATHNO_CMAKE_ENVIRONMENT_PATHNO_SYSTEM_ENVIRONMENT_PATHNO_CMAKE_PACKAGE_REGISTRYNO_CMAKE_BUILDS_PATHNO_CMAKE_SYSTEM_PATHNO_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) #4target_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
四:cmake编译过程中出现的红字不要怕
下面图中的红字警告均是在成功的过程中生成的,所以别看大段大段的红字看着吓人,但实际没有影响。
五:运行阶段
直到这里出现生成成功2个, 失败0个巴拉巴拉就算是基本完成了,这时在F:\PyCharmProjects\tensorrtx-yolov5-v5.0\yolov5\build\Release目录下会出现一个yolov5.exe和其他几个文件
先激活conda环境
conda activate trt
cd到生成解决方案的release目录(生成解决方案一定要使用release模式)
F:
cd F:\PyCharmProjects\tensorrtx-yolov5-v5.0\yolov5\build\Release
之后打开cmd运行如下命令来序列化yolov5s.wts文件生成yolov5s.engine
yolov5.exe -s yolov5s.wts yolov5s.engine s
下图的报错:Parameter check failed
解决方法:将yolov5s.wts放到cmd的运行目录下(F:\PyCharmProjects\tensorrtx-yolov5-v5.0\yolov5\build\Release)
成功生成yolov5s.engine之后,在运行目录下新建一个sample文件夹,搞几张图片测试一下
yolov5.exe -d yolov5s.engine ./samples
没问题的话应该没什么问题了,本机8代i5+gtx1060运行时间大概是14ms
(此卡不支持fp16,所以速度还是fp32的速度;int8精度下降太高,暂时不考虑)
六:python部署
本文使用python调用dll的方式实现python部署
使用python部署需要使用网盘里的yolov5_tensorrt_win10-master而不是tensorrtx
注意该方案需使用yolov5 6.0版本!
使用教程: https://www.bilibili.com/video/BV113411J7nk?p=1
七:写在最后
本文介绍的方式为tensorrt三种部署工作流中最复杂也是运行速度最快的,但如果使用了自己编写的模块就不能借用大神手搭api的方式了,个人建议还是用onnx的方式进行部署。