基本思想:随手记录一下在window10系统上部署TensorRT+YOLO5,尽量详细一些;
注意:驱动版本全部更新到11.1,否则在跑类似的实例分割,存在cuda和torch版本不匹配问题,安装过程根据自己实际安装版本设置路径
首先提供一下本环境安装的安装包
链接:https://pan.baidu.com/s/1M6ynp6soWRFTH0JzbmDJ5g
提取码:8cc4
复制这段内容后打开百度网盘手机App,操作更方便哦
一、【Visual Studio下载】2021年最新官方正式版Visual Studio免费下载 - 腾讯软件中心官网 去腾讯软件中心下载vs2019进行安装
安装完成之后,先写一个hello world 试试是否可以使用~
二、搭建OpenCV库 Download OpenCV from SourceForge.net
(1)安装opencv之后进行解压到C盘,在创建的工程项目名字下点击属性选项--》添加一下配置(X64)
(2)然后设置一下调试的选项卡
(3)opencv文件目录下的\opencv\build\x64\vc15\bin中的三个dll文件,拷贝到C:\Windows\System32 中
测试一下vs2019使用opencv4.5库
#include<opencv2\opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("C:\\Users\\Administrator\\Desktop\\0.jpg");
if (src.empty())
{
printf("could not load image...\n");
return -1;
}
namedWindow("opencv setup demo", WINDOW_AUTOSIZE);
imshow("opencv setup demo", src);
namedWindow("output window", WINDOW_AUTOSIZE);
Mat output_image;
cvtColor(src, output_image, COLOR_BGR2HLS);
imshow("output window", output_image);
imwrite("C:/Users/asus/Desktop/tupian/3.jpg", output_image);
waitKey(0);
return 0;
}
效果图
三、搭建CUDA和cuDNN环境 https://developer.nvidia.com/zh-cn/cuda-downloads
(1)先打开【控制面板】卸载掉cuda**.0 ,
只保留 【NVIDIA的图形驱动程序、NVIDIA Physx系统软件,NVIDIA GeForce Experience】,如果你有这3个软件,就别卸载。
选择精简模式直接点击安装即可~
上述两项是安装完成Cuda后,已自动生成的环境变量的配置,我们需要自行添加的下述变量:
CUDA_BIN_PATH: %CUDA_PATH%\bin
CUDA_LIB_PATH: %CUDA_PATH%\lib\x64
CUDA_SDK_PATH: C:\ProgramData\NVIDIA Corporation\CUDA Samples\v11.1
CUDA_SDK_BIN_PATH: %CUDA_SDK_PATH%\bin\win64
CUDA_SDK_LIB_PATH: %CUDA_SDK_PATH%\common\lib\x64
并在系统变量Path中,添加一下四个信息:
%CUDA_BIN_PATH%
%CUDA_LIB_PATH%
%CUDA_SDK_BIN_PATH%
%CUDA_SDK_LIB_PATH%
在cmd中进行命令行验证一下
测试是否安装成功~
四、然后解压cudnn文件,复制到对应的cuda文件夹中,将cudnn文件夹合并cuda中,并添加环境变量
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\lib\x64
五、使用Visual studio 2019 测试
#include "stdio.h"
/*
修饰符__global__表明这个函数是将会从CPU中调用,在GPU中进行执行。
并借此函数来启动内核函数。
*/
__global__ void hello_world_from_gpu(void)
{
printf("Hello World from GPU\n");
return;
}
int main(void)
{
printf("Hello World from CPU\n");
hello_world_from_gpu <<<1, 5 >>> ();
/*
三重尖括号里的参数表明的是相关的执行配置,用来表明使用多少线程来执行内核函数,
在本例子中有5个GPU线程被系统所调用。
*/
cudaDeviceReset();
/*
执行完成后调用cudaDeviceReset()函数释放和清空与当前进程运行相关的资源。
*/
return 0;
}
(1)工具–>选项–>文本编辑器–>文件拓展名, 新增扩展名 .cu 并将编辑器设置为:Microsoft Visual C++。
(2)工具–>选项–>项目和解决方案–>VC++项目设置,添加要包括的扩展名".cu"。
##############
如果没有列表中没有,点击 “查找现有的”。 在cuda的安装目录下:
默认安装的,一般在: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\extras\visual_studio_integration\MSBuildExtensions
添加进来就行, 然后选择,确定。
或者在 工具=》选项=》项目和解决方案=》vc++项目设置=》生成自定义搜索路径 填上 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\extras\visual_studio_integration\MSBuildExtensions
############
(3)配置生成自定义:右键打开的项目–>生成依赖项–>生成自定义–>勾选CUDA v11.0。(右击 项目名 project1 )(注意要写英文文件名.cpp)
(4)配置.cu文件的配置属性:右键点击.cu文件–>将该类型文件的属性设置为 CUDA c/c++。(右击 源.cpp)(注意要写英文文件名.cpp)
测试成功(注意工程名和源文件名字不要含有中文,我写的中文无法编译,改成英文就可以了~)
六、解压tensorRT 到C盘,添加环境变量,同时将tensorRT对应lib下的.dll拷贝到CUDA的目录下 https://developer.nvidia.com/nvidia-tensorrt-download
首先在cmd命令窗口执行
cd /TensorRT-7.0.0.11/data/mnist
python download_pgms.py
然后使用vs2019 打开
(1)将D:\TensorRT-7.2.3.4\include加入C/C++ --> 常规 --> 包含目录
(2) 将D:\TensorRT-7.2.3.4\lib加入 VC++目录–>库目录
(3) 将下述lib文件名字加入链接器–>输入–>附加依赖项
nvinfer.lib
nvinfer_plugin.lib
nvonnxparser.lib
nvparsers.lib
cudart.lib
cudart_static.lib
执行即可~
七、然后下载GitHub - wang-xinyu/tensorrtx: Implementation of popular deep learning networks with TensorRT network definition API
将核心文件拖到我们创建的工程中(能支持测试CUDA程序的工程中(第一到第五步),配置一下tensorRT即可)
编译过程中遇到三个问题:
(1)缺少dirent.h文件 “dirent.h”:No such file or directory
方法一、去http://github.com/tronkko/dirent下载,导入头文件中,修改代码为“dirent.h” 本地搜索模式
方法二、将dirent.h文件导入系统的vc安装目录中,使用库文件<dirent.h>文件导入方式 C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29910\include
(2) 方法一、遇到一个common.hpp头文件,std::max 报错的问题,直接改成了c++三目表达式就ok了
(推荐)方法二、 项目属性 ——> C/C++ ——> 预处理器 ——> 预处理器定义 (此处添加预定义编译开关 NOMINMAX)
例如,在github上存在个别的tensorRT yolo5工程存在std::max 报错的问题,可以参考下面的方法改,如果参考工程没有报错,就不用管了(比如参考本文)
float iou(float lbox[4], float rbox[4]) {
float interBox[] = {
std::max(lbox[0] - lbox[2]/2.f , rbox[0] - rbox[2]/2.f), //left
std::min(lbox[0] + lbox[2]/2.f , rbox[0] + rbox[2]/2.f), //right
std::max(lbox[1] - lbox[3]/2.f , rbox[1] - rbox[3]/2.f), //top
std::min(lbox[1] + lbox[3]/2.f , rbox[1] + rbox[3]/2.f), //bottom
};
if(interBox[2] > interBox[3] || interBox[0] > interBox[1])
return 0.0f;
float interBoxS =(interBox[1]-interBox[0])*(interBox[3]-interBox[2]);
return interBoxS/(lbox[2]*lbox[3] + rbox[2]*rbox[3] -interBoxS);
}
修改完
float iou(float lbox[4], float rbox[4]) {
float x0 = lbox[0] - lbox[2] / 2.f> rbox[0] - rbox[2] / 2.f? lbox[0] - lbox[2] / 2.f: rbox[0] - rbox[2] / 2.f;
float x1 = lbox[0] + lbox[2] / 2.f>rbox[0] + rbox[2] / 2.f ? rbox[0] + rbox[2] / 2.f : lbox[0] + lbox[2] / 2.f;
float x2= lbox[1] - lbox[3] / 2.f>rbox[1] - rbox[3] / 2.f / 2.f ? lbox[1] - lbox[3] / 2.f : rbox[1] - rbox[3] / 2.f ;
float x3 = lbox[1] + lbox[3] / 2.f> rbox[1] + rbox[3] / 2.f ? rbox[1] + rbox[3] / 2.f : lbox[1] + lbox[3] / 2.f;
float interBox[] = {
x0, //left
x1, //right
x2, //top
x3, //bottom
};
if(interBox[2] > interBox[3] || interBox[0] > interBox[1])
return 0.0f;
float interBoxS =(interBox[1]-interBox[0])*(interBox[3]-interBox[2]);
return interBoxS/(lbox[2]*lbox[3] + rbox[2]*rbox[3] -interBoxS);
}
(3)遇到loggin.h文件中的 localtime 报错====》 C4996'localtime': This function or variable may be unsafe
在文件开头填入 #pragma warning(disable:4996) 就ok了
八、然后在 visual studio 2019 中设置参数:
Project ==> Properties ==> Configuration Properties ==> Debugging ==> Command Arguments
项目=>属性=>配置属性==>调试==>命令参数
然后运行生成yolov5s.engine
同时window10本地存在simples文件夹,我们愉快地检测吧;
九、再次在 visual studio 2019 中设置参数:
Project ==> Properties ==> Configuration Properties ==> Debugging ==> Command Arguments
项目=>属性=>配置属性==>调试==>命令参数
运行结果
结果产生在文件夹
测试yolo5代码,首先安装torch-gpu和torchvision
pip3 install torch==1.8.1+cu111 torchvision==0.9.1+cu111 torchaudio===0.8.1 -f https://download.pytorch.org/whl/torch_stable.html
然后在安装tensorrt
D:\TensorRT-7.2.3.4\uff>pip3 install uff-0.6.9-py2.py3-none-any.whl
WARNING: Value for scheme.headers does not match. Please report this to <https://github.com/pypa/pip/issues/9617>
distutils: c:\python\Include\UNKNOWN
sysconfig: c:\python\Include
WARNING: Additional context:
user = False
home = None
root = None
prefix = None
Processing c:\tensorrt-7.2.3.4\uff\uff-0.6.9-py2.py3-none-any.whl
Requirement already satisfied: numpy>=1.11.0 in c:\python\lib\site-packages (from uff==0.6.9) (1.19.5)
Requirement already satisfied: protobuf>=3.3.0 in c:\python\lib\site-packages (from uff==0.6.9) (3.15.8)
Requirement already satisfied: six>=1.9 in c:\python\lib\site-packages (from protobuf>=3.3.0->uff==0.6.9) (1.15.0)
Installing collected packages: uff
WARNING: Value for scheme.headers does not match. Please report this to <https://github.com/pypa/pip/issues/9617>
distutils: c:\python\Include\UNKNOWN
sysconfig: c:\python\Include
WARNING: Additional context:
user = False
home = None
root = None
prefix = None
Successfully installed uff-0.6.9
D:\TensorRT-7.2.3.4\uff>cd ..
D:\TensorRT-7.2.3.4>dir
驱动器 C 中的卷没有标签。
卷的序列号是 D63A-D659
D:\TensorRT-7.2.3.4 的目录
2021/04/30 14:51 <DIR> .
2021/04/30 14:51 <DIR> ..
2021/04/30 14:51 <DIR> bin
2021/04/30 14:51 <DIR> data
2021/04/30 14:51 <DIR> doc
2021/04/30 14:51 <DIR> graphsurgeon
2021/04/30 14:51 <DIR> include
2021/04/30 14:51 <DIR> lib
2021/04/30 14:51 <DIR> onnx_graphsurgeon
2021/04/30 14:51 <DIR> samples
2021/04/30 14:51 <DIR> uff
0 个文件 0 字节
11 个目录 404,195,282,944 可用字节
D:\TensorRT-7.2.3.4>cd graphsurgeon
D:\TensorRT-7.2.3.4\graphsurgeon>pip3 install graphsurgeon-0.4.5-py2.py3-none-any.whl
WARNING: Value for scheme.headers does not match. Please report this to <https://github.com/pypa/pip/issues/9617>
distutils: c:\python\Include\UNKNOWN
sysconfig: c:\python\Include
WARNING: Additional context:
user = False
home = None
root = None
prefix = None
Processing c:\tensorrt-7.2.3.4\graphsurgeon\graphsurgeon-0.4.5-py2.py3-none-any.whl
Installing collected packages: graphsurgeon
WARNING: Value for scheme.headers does not match. Please report this to <https://github.com/pypa/pip/issues/9617>
distutils: c:\python\Include\UNKNOWN
sysconfig: c:\python\Include
WARNING: Additional context:
user = False
home = None
root = None
prefix = None
Successfully installed graphsurgeon-0.4.5
选中根目录的安装的python可这执行程序目录&测试
首先下载GPU-z查看一下,本机GPU显卡是否支持vulkan
比如RTX2060是支持的
而GTX1060是不支持的
建议以下下载使用motrix工具下载~
下载vulkan: https://sdk.lunarg.com/sdk/download/1.2.176.1/windows/VulkanSDK-1.2.176.1-Installer.exe
下载glfw :Download | GLFW
下载glm https://codeload.github.com/g-truc/glm/zip/refs/heads/master
下载上述三个文件包
glm和glfw解压 -> vulkan目录的Third-Party中,使用VS2019 进行测试一下~
VC++目录 --> 包含目录
C:\VulkanSDK\1.2.176.1\Include
C:\VulkanSDK\1.2.176.1\Third-Party\glm-master
C:\VulkanSDK\1.2.176.1\Third-Party\glfw-3.3.4.bin.WIN64\include
VC++目录--->库目录
C:\VulkanSDK\1.2.176.1\Lib
C:\VulkanSDK\1.2.176.1\Third-Party\glfw-3.3.4.bin.WIN64\lib-vc2019
链接器 -> 输入 -> 附加依赖项
GTX1650测试vulkan
代码
#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>
#define GLM_FORCE_RADIANS
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
#include <glm/vec4.hpp>
#include <glm/mat4x4.hpp>
#include <iostream>
int main() {
glfwInit();
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
GLFWwindow* window = glfwCreateWindow(800, 600, "Vulkan window", nullptr, nullptr);
uint32_t extensionCount = 0;
vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr);
std::cout << extensionCount << " extensions supported" << std::endl;
glm::mat4 matrix;
glm::vec4 vec;
auto test = matrix * vec;
while (!glfwWindowShouldClose(window)) {
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}
RTX5000测试
测试可用,NCNN可以使用vulkan了
补充 如果使用clion 调用vulkan
cmake_minimum_required(VERSION 3.16)
project(untitled15)
set(CMAKE_CXX_STANDARD 20)
set(VULKAN_ROOT_DIR "C:/VulkanSDK/1.2.162.0/Third-Party" )
#### GLM
include_directories(${VULKAN_ROOT_DIR}/glm-master)
### GLFW
include_directories(${VULKAN_ROOT_DIR}/glfw-3.3.7.bin.WIN64/include)
add_library(glfw3 STATIC IMPORTED)
set_target_properties(glfw3 PROPERTIES IMPORTED_LOCATION ${VULKAN_ROOT_DIR}/glfw-3.3.7.bin.WIN64/lib-mingw-w64/libglfw3.a)
####Vulkan
include_directories(${Vulkan_INCLUDE_DIRS})
find_package(Vulkan REQUIRED)
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} glfw3 Vulkan::Vulkan)
测试结果是一样的