目录
版本
下载安装包
1.Go to:CUDA10.2
2.Go to:CUDNN
3.Go to:opencv340
4.Go to:pytorch官网
5.Go to:yolov5
6.Go to:tensorRT官网
7.安装pycuda
8.测试TensorRT实例
1).配置VS2019
2).下载pgm文件
9.yoloV5的TensorRT加速
1)克隆tensorrtx-5.0
2)下载文件dirent.h
3)生成yoloV5s.wts权重文件
4)修改CMakeList.txt
5)编译tensorrtx下的yolov5
6)VS2019编译YOLOv5
10.执行TensorRT加速YOLOv5命令
总结
点赞 关注 收藏 不白嫖
引言:去改bug吧,去改不被定义的bug,在你茂密的头上留下一片激战bug后的痕迹
YOLOV5-5.0,tensorrtx-5.0,cuda-10.2,tensorrt-7.0.0.11,opencv 3.4.0,cudnn需对应cuda
后面还需要添加几个环境变量分别是sdk_path,sdk_lib,sdk_bin以及cuda_bin,cuda_lib
CUDA_SDK_PATH = C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.2
CUDA_LIB_PATH = %CUDA_PATH%\lib\x64
CUDA_BIN_PATH = %CUDA_PATH%\bin
CUDA_SDK_BIN_PATH = %CUDA_SDK_PATH%\bin\win64
CUDA_SDK_LIB_PATH = %CUDA_SDK_PATH%\common\lib\x64
在系统变量path的末尾添加
%CUDA_LIB_PATH%;%CUDA_BIN_PATH%;%CUDA_SDK_LIB_PATH%;%CUDA_SDK_BIN_PATH%
再添加5条默认的安装路径
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\lib\x64
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\include
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\extras\CUPTI\lib64
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.2\bin\win64 C:\ProgramData\NVIDIA
Corporation\CUDA Samples\v10.2\common\lib\x64
下载好的cudnn解压后,将cudnn中的bin,include,lib文件复制到cuda的文件夹下
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2
cmd测试是否安装成功
nvcc -V
出现如下信息则为成功
以上是opencv官网编译好的,如果想锻炼自己的编译水平可以看我的另一篇博客YOLOV5python训练到C++的dnn部署,这里不建议自己编译,懂得都懂。
下载后将解压后的文件路径添加到系统变量Path
安装版本需要对应cuda版本,这里小伙伴们自己找一下
这里直接指向的是5.0的版本
a.下载后配置好环境python>=3.7后pip install requirements.txt
b.下载YOLOv5的权重,这里需要注意的是前面所说的需要与版本对应
标签 ·Ultralytics/yolov5 ·GitHub
一切就绪后测试一下
python detect.py --source 图片路径 --weights 下载权重路径 --conf 0.4
注:首先 nvcc --version查看cuda版本 我的是10.2,所以我对应下载tensorRT 7.0版本
1)解压得到的TensorRT-7.0.0.11的文件夹,将里面的lib文件添加绝对路径到换将变量中
2)将tensorRT解压位置lib下的dll文件复制到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin
注:如果有多个cuda,比如本博主有10.0,11.2, 9.0等多个版本一定要对应当前使用的版本的bin目录下
如果要是用python接口的tensorRT,需要安装pycuda
pip install pycuda
用VS2019打开sampleMNIST示例(E:\TensorRT-7.0.0.11\samples\sampleMNIST)
a. 将E:\TensorRT-7.0.0.11\lib加入 项目->属性->VC++目录–>可执行文件目录
b.将E:\TensorRT-7.0.0.11\lib加入 VC++目录–>库目录
c. 将E:\TensorRT-7.0.0.11\include加入C/C++ --> 常规 --> 附加包含目录
d.将nvinfer.lib、nvinfer_plugin.lib、nvonnxparser.lib和nvparsers.lib加入链接器–>输入–>附加 依赖项
E:\TensorRT-7.0.0.11\lib\*.lib
到tensorrt目录下的data文件夹找到对应数据集的download_pgms.py,然后运行。运行的时候没输 出,等一会看到文件夹下有了x.pgm文件就说明下载好了。即执行:
python E:\TensorRT-7.0.0.11\data\mnist\download_pgms.py
注意:有的时候会显示为远程主机强迫关闭,这时候吧代码copy出来在pycharm中运行,一次不行多试几次, 直到目录中
把下载的x.pgm文件放置到E:\TensorRT-7.0.0.11\data\mnist
然后点击编译
注意:有人可能会出现sdk错误,需要点击项目->重订目标解决方案,然后生成最新的sdk就OK了
随后点击调试->开始执行
解释:5后面的******是识别出数字为5后对识别的结果进行的加密
有git的小伙伴可以通过
git clone https://github.com/wang-xinyu/tensorrtx.git下载
如果没有可以点击传送门下载
点击传送门
放置到tensorrtx/include文件夹下 这里的include需要自己创建
将文件tensorrtx/yolov5/gen_wts.py 复制到 yolov5项目中
执行 python gen_wts.py生成wts权重文件
重点必须强调:yolov5s.pt权重版本需要与YOLOv5版本对应下载,也就是说也需要下载5.0的版本
生成的wts文件放到build下
在 E:\tensorrtx\yolov5下的CMakeList.txt中,需要修改#1#2#3#4#5
cmake_minimum_required(VERSION 3.1.0)
project(yolov5)
set(OpenCV_DIR "F:\\opencv340\\build") #1
set(OpenCV_INCLUDE_DIRS "F:\\opencv340\\build\\include") #2
set(OpenCV_LIBS "F:\\opencv340\\build\\x64\\vc15\\lib\\opencv_world340.lib") #3
set(TRT_DIR "F:\\TensorRT-7.0.0.11") #4
add_definitions(-DAPI_EXPORTS)
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)
include_directories(C:\\Users\\Lenovo\\Desktop\\yolov5-5.0\\yolov5-5.0\\tensorrtx-yolov5-v5.0\\tensorrtx-yolov5-v5.0\\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 yolov5 ${PROJECT_SOURCE_DIR}/yolov5.cpp ${PROJECT_SOURCE_DIR}/yololayer.cu ${PROJECT_SOURCE_DIR}/yololayer.h) #4
#add_executable(yolov5 ${PROJECT_SOURCE_DIR}/yolov5.cpp ${PROJECT_SOURCE_DIR}/yololayer.cu ${PROJECT_SOURCE_DIR}/yololayer.h ${PROJECT_SOURCE_DIR}/preprocess.cu ${PROJECT_SOURCE_DIR}/preprocess.h) #4
target_link_libraries(yolov5 "nvinfer" "nvinfer_plugin") #9
target_link_libraries(yolov5 ${OpenCV_LIBS}) #10
target_link_libraries(yolov5 ${CUDA_LIBRARIES}) #11
target_link_libraries(yolov5 Threads::Threads) #12
1.打开cmake设置好路径,与opencv的编译一样
2.更改配置,在vs2019下的x64系统进行
然后编译
以下是我编译遇到的问题以及解决方法:
问题1:
CMAKE_CUDA_ARCHITECTURES must bi valid if set
或者类似cuda框架找不到
这里建议把VS删干净重新装一边,不要头铁一直去解决,我已经帮你们试过了,头铁解决一个星期没解决,重新安装20分钟轻松搞定,原因就是系统不知道什么值一直默认它自己指定的,而不是你自己设定的值
问题2:
出现No CUDA toolset found.参考这位博主,不过这个路径得自己找
YYDS
总结(其实问题一二的问题是一样的,都是默认的这4个写错了,但是问题一不知道在哪里修改,问题二是直接没有了这四个文件,如果有大神还有更的解好决办法,希望评论区见)
随后点击Generate进行检测,随后open Project。
Release模式下生成解决方案
选中yolov5右击选择重新生成,如果不出意外的话你会遇到这些意外:dll找不到,opencv依赖找不到或者MSB3721报错信息等,在tensorrtx->yolov5>build>yolov5.dir->release->yolov5.log中找到这些详细的编译报错信息。
去yolov5/build/Release目录下CMD执行
yolov5.exe -s yolov5s.wts yolov5s.engine s
出现 Build engine successfully时生成结束
随后你的文件夹中会出现yolov5s.engine的权重文件
如果出现以下报错信息:Network::addScale::434
解决方法:
1.我之前说的版本是否匹配
2.可能是wts权重文件找不到,像我一样把权重文件放到yolov5.exe的同一级目录下
3.你可能用了自己的权重文件需要在yolov5.cpp与yololayer.h中把相关的参数修改成自己的参数设定
最后生成内容
随后在yolov5.exe同一级目录中新建images文件夹,里面放入两张测试图片
cmd下运行 yolov5.exe -d yolov5s.engine images
可以看到我们的两张图片处理的时间被打印出来,总费时间7ms
而之前没有做加速时两张图片的处理时间为0.9s 也就是相当于900ms
非常amazing啊,足足快了128倍还要多。接下来看一下生成效果
值得注意的是为什么这些anocher框上的标签是数字而不是英文字母呢,细心的朋友们会发现,这些数字刚好对应coco数据集中标签的位置
别人说一杯茶,一包烟,一个bug改一天,我一直以为是玩笑话,直到我开始编译tensorrt加速时yolo发现我这6处编译bug改了9天!!!每一个编译问题全网都找不出一个有效的解决方法!!!我看着桌上的头发以及编译好的代码,我不经意的感慨到:Linux系统真好。愿世上再无bug。