YOLOv5加速部署:激斗tensorrtx踩坑指南!

Posted CV小老弟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了YOLOv5加速部署:激斗tensorrtx踩坑指南!相关的知识,希望对你有一定的参考价值。

由于项目需要,近日来研究了一下yolov5的tensorrt的c++部署,和各种小bug激斗了十余小时,但网络上的几乎所有教程都忽略了一些小细节,造成了很多的麻烦。但经本人不断试错,最终终于成功生成!本踩坑经验仅适用于win10+tensorrtx+YOLOv5的c++版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")  #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)

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 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

四: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精度下降太高,暂时不考虑)

以上是关于YOLOv5加速部署:激斗tensorrtx踩坑指南!的主要内容,如果未能解决你的问题,请参考以下文章

Yolov5学习笔记——部署在jetson nano上

模型部署Jetson Xavier NX(eMMC)部署YOLOv5-5.0

Shell 脚本踩坑指北

react Hook踩坑指北—一文解决你所有关于setState的疑惑

记录NCNN Yolov5部署华为鸿蒙系统踩过的坑

记录NCNN Yolov5部署华为鸿蒙系统踩过的坑