pytorch版yolov5模型用TenserRT生成engine推理模型参考过程

作者:RayChiu_Labloy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处


目录

首先准备ONNX模型

TenserRT下载安装配置

根据cuda、cudnn环境下载trt

配置TensorRT环境变量 

将trt的lib加至环境变量 

将lib下的dll动态库复制到cuda的安装目录lib下

测试一下官方Demo 

双击trt的sample官方demo路径下的mnist测试程序用vs2017打开:

vs2017配置trt的各种库目录

下载数据集

 运行

利用TenserRT生成推理模型

下载TenserRT repo版: 

下载文件dirent.h

生成wts文件:

修改CMakeList.txt

用cmake-gui编译:

VS2017打开编译的yolov5配置环境

配置附加目录:

库目录:

以及链接器的输入:

生成解决方案遇到问题:

 搞定:

生成engine文件


首先准备ONNX模型

参考这里的前半部分:win10+python环境yolov5s预训练模型转onnx然后用openvino生成推理加速模型并测试推理_RayChiu757374816的博客-CSDN博客

TenserRT下载安装配置

根据cuda、cudnn环境下载trt

官方下载链接: https://developer.nvidia.com/nvidia-tensorrt-download

安装GA版本的,tenserRT6.0、 7.1cuda支持范围比较好 ,具体看你的CUDA版本选择,TensorRT的版本只依赖于CUDA版本。

查看自己安装的cuda版本命令:  

nvcc --version

配置TensorRT环境变量 

将trt的lib加至环境变量 

将lib下的dll动态库复制到cuda的安装目录lib下

测试一下官方Demo 

双击trt的sample官方demo路径下的mnist测试程序用vs2017打开:

vs2017配置trt的各种库目录

1)将E:/api/TensorRT-7.0.0.11/include加入C/C++ --> 常规 --> 包含目录

2)    将E:/api/TensorRT-7.0.0.11/lib加入 VC++目录–>库目录

3)   将下述lib文件名字加入链接器–>输入–>附加依赖项

下载数据集

 执行 E:\api\TensorRT-7.0.0.11\data\mnist 目录下的 download_pgms.py:

python download_pgms.py

发现报提示: DeprecationWarning: The binary mode of fromstring is deprecated, as it behaves surprisingly on unicode inputs. Use frombuffer instead
  raw_buf = np.fromstring(buffer, dtype=np.uint8)

把脚本改一下:

raw_buf = np.fromstring(buffer, dtype=np.uint8)
# 改为
raw_buf = np.frombuffer(buffer, dtype=np.uint8)

 运行

看到报错:C2664    “HMODULE LoadLibraryW(LPCWSTR)”: 无法将参数 1 从“const _Elem *”转换为“LPCWSTR”,这个错误设置一下字符集:

 再次运行:

利用TenserRT生成推理模型

下载TenserRT repo版: 

 啥叫repo版?我理解的意思就是TensorRT的源码库api较为底层,像我这样的小白使用起来较为吃力,那好多大神会基于官方这套api封装一套自己的实现,很多场景拿来即用。

GitHub - shouxieai/tensorRT_Pro: C++ library based on tensorrt integration

使用介绍:详解TensorRT的C++/Python高性能部署,实战应用到项目_哔哩哔哩_bilibili 

其他TenserRT repo版比较好的还有 :https://github.com/wang-xinyu/tensorrtx.git 

我这这里就使用这一版做转换了。

下载文件dirent.h

下载地址:GitHub - tronkko/dirent: C/C++ library for retrieving information on files and directories放置到 tensorrtx/include文件夹下,文件夹需新建

生成wts文件:

把trtx中yolov5/gen_wts.py 复制到yolov5项目中,执行命令:

python gen_wts.py -w yolov5s.pt

修改CMakeList.txt

匹配我的环境是:

cmake_minimum_required(VERSION 3.15)

project(yolov5)
set(OpenCV_DIR "E:/tools/opencv/opencv4.4.1_17/build")  #1
set(TRT_DIR "E:/api/TensorRT-7.0.0.11")  #2
set(OpenCV_INCLUDE_DIRS "E:/tools/opencv/opencv4.4.1_17/build/include")   #3
set(OpenCV_LIBS "E:/tools/opencv/opencv4.4.1_17/build/x64/vc15/lib")   #4

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

####
include_directories(${PROJECT_SOURCE_DIR}/include)
include_directories(${TRT_DIR}/include)
include_directories(E:/api/TensorRT-7.0.0.11/include)  # 5


##### find package(opencv)
include_directories(${OpenCV_INCLUDE_DIRS})
include_directories(${OpenCV_INCLUDE_DIRS}/opencv2)  #6


# -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)           #7
link_directories(${OpenCV_DIR}\\x64\\vc15\\lib)                         #8

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

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


在trtx的yolov5目录下新建编译路径build:

用cmake-gui编译:

 编译失败:

 有人说vs和cuda安装顺序有影响,我重新装了这两个,先装cuda再装vs后来还不行,听大佬说makefile中enable去掉,显式配cuda,没听懂,不过我删了带enable字眼的配置,编译通过。

VS2017打开编译的yolov5配置环境

配置附加目录:

E:/api/tensorrtx/include;E:/tools/opencv/opencv4.4.1_17/build/include;E:/tools/opencv/opencv4.4.1_17/build/include/opencv2;E:/api/TensorRT-7.0.0.11/include

库目录:

E:/tools/opencv/opencv4.4.1_17/build/x64/vc15/lib;E:/api/TensorRT-7.0.0.11/lib

以及链接器的输入:

myelin64_1.lib;nvonnxparser.lib;nvparsers.lib;opencv_world411.lib

生成解决方案遇到问题:

问题1:无法解析的外部符号 “public: __cdecl nvinfer1::YoloPluginCreator::YoloPluginCreator

配置cu文件,右键:

 问题2:YoloPluginCreator::mFC" may not be initialized

这个在cmakelists.txt中加:

add_definitions(-DAPI_EXPORTS)
add_definitions(-std=c++11)

问题3:无法解析的外部符号 "void __cdecl preprocess_kernel_img

这个在cmakelists.txt中add_executable里追加:

 preprocess.cu preprocess.h

 别忘了像其他cu文件一样也同样配置一下:

 搞定:

生成engine文件

我的环境是cuda10.2,环境变量也没问题,但是执行报找不到cublas64_100.dll等cuda10.0的动态库,这个问题可以找到10.2的对应的dll复制一份改名字改成需要的dll即可。

命令:

yolov5.exe -s E:/projects/pyHome/about_yolo/yolov5-master/yolov5_v5_modle/yolov5s.wts E:/projects/pyHome/about_yolo/yolov5-master/yolov5_v5_modle/yolov5s.engine s

第一次失败遇到的报错:.wts Parameter check failed at :Network.cpp::nvinfer1::Network::addScale::43

应该是pt模型和tensorrtx支持的不一样,看readme后重新找了一个yolov5s v5.0的pt模型,再次执行:

 虽然提示成功了,但是日志中可以看到,显存分配出现了问题,可能真是GTX1050太低端了,不过此过程可以作为其他好一点显卡的参考。

参考:Windows下TensorRT-yolov5-使用总结_高祥xiang的博客-CSDN博客

41、window10 +visual Studio 2019+CUDA11.1+cudnn8.0.4+TensorRT7.2.3.4+Deepsteam5.1+YOLO5(含安装vulkan)_sxj731533730-CSDN博客

YoloV5在tensorRT上加速(Windows)(C++)(webcam)_海里的羊的博客-CSDN博客 

【如果对您有帮助,交个朋友给个一键三连吧,您的肯定是我博客高质量维护的动力!!!】 

根据引用\[1\]、\[2\]和\[3\]的内容,推理engine文件的步骤如下: 1. 首先,需要加载engine文件并创建一个引擎对象。可以使用文件流读取engine文件的二进制数据,并获取文件的大小。然后,使用这些数据和大小来创建一个ICudaEngine对象。具体的代码可以参考引用\[1\]和\[2\]中的示例。 2. 创建一个上下文对象。使用ICudaEngine对象来创建一个IExecutionContext对象,这个上下文对象将用于执行推理操作。具体的代码可以参考引用\[2\]中的示例。 3. 准备输入数据。根据具体的推理任务,需要准备输入数据并将其传递给上下文对象。具体的数据准备过程可能因任务而异。 4. 执行推理。调用上下文对象的推理方法,将输入数据传递给引擎进行推理。具体的代码可以根据任务需求进行编写。 需要注意的是,以上步骤中的代码示例可能是基于不同的推理框架或库编写的,具体的实现方式可能会有所不同。因此,在实际应用中,需要根据所使用的推理框架或库的文档和示例进行相应的调整和编写。 #### 引用[.reference_title] - *1* [TensorRT创建Engine并推理engine](https://blog.csdn.net/bobchen1017/article/details/129900569)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [TensorRT学习(3):加载engine文件进行推理](https://blog.csdn.net/qq_43144751/article/details/123647791)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [jetson nx tensorRT: 使用engine文件进行网络推理(语意分割,内存零copy,同步异步inference)](https://blog.csdn.net/level_code/article/details/121954035)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值