终于在大哥的指导下完成了此次任务,我的Cmake编译差不多是复现大哥的文章,解决一些意外的错误,我的VS编译是根据另外几个博主的启发下完成,很多文章只是单独的写了VS或者cmake进行编译进行检测,自我感觉VS进行模型转换编译都比较顺利没有出现什么错误,大家可以先从VS编译开始,如果大家喜欢使用cmake也可以直接进入第二部分。RTX2060下使用yolov5s.engine进行推理可以达到5ms的速度,精度确实有所下降,但是使用yolov5l.engine精度不但有所提升速度也可以达到10ms,总体来说还是不错的。
看看yolov5l.engine的效果吧,yolov5s.engine速度太快了!
1
建议在某个磁盘下面新建一个文件夹命名为:tensorRT之类的,将以下所有用到的东西都下载到该文件夹如图所示:
目录
一.前期准备
二.环境配置
三.VS编译
四.Cmake编译
我的电脑是RTX2060+win10+vs2019;
1.VS2019的下载:
Downloads - Visual Studio Subscriptions Portal直接点击进入下载页面;
2.opencv3.4.1的下载:
Download OpenCV from SourceForge.net直接点击进入下载页面;
3.cmake3.19.1的下载
Index of /files/v3.19 (cmake.org)直接点击进入下载页面;
4.CUDA、CUDNN、TensorRT的下载:
这三个都是对应的版本所以我这里直接下载大哥的,你们也可以自己去官网下载对应版本:
TensorRT:https://developer.nvidia.cn/nvidia-tensorrt-download
cudnn:https://developer.nvidia.cn/rdp/cudnn-archive
CUDA:https://developer.nvidia.cn/cuda-toolkit-archive
songpingwang的百度网盘下载链接:链接:百度网盘 请输入提取码
提取码:3zgc
5.yolov5源码、yolov5权重文件、dirent.h文件、tensorrtx源码;
我使用的是yolov5.4.0版本、yolov5s;
下载yolov5源码:
https://github.com/ultralytics/yolov5/tags
下载yolov5权重:
Releases · ultralytics/yolov5 · GitHub
下载dirent.h:
dirent/dirent.h at master · tronkko/dirent · GitHub 或者 点击下载
下载tensorrtx:
Tags · wang-xinyu/tensorrtx · GitHub (与自己训练的yolov5-xx版本一致)
1.这里大家应该先安装VS再安装CUDA,这样VS才能识别到cuda的存在,如果已经安装了cuda但是识别不到则需要卸载重新安装,安装cuda时选择自定义安装,安装路径默认在C盘不用管。测试cuda是否安装成功:win+R输入CMD,在终端输入nvcc -V.
将cudnn和TensorRT_cuda_cudnn解压,把对应的bin、lib(X64)、include内容复制到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2对应的文件夹下面:
加入环境变量: 右键点击此电脑,打开属性—>高级系统设置—>环境变量,可以看到系统变量中多了CUDA_PATH和CUDA_PATH_V10_2两个环境变量(CUDA默认安装位置路径为:C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.2):
在此页面点击新建:
加入以下:
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%;
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和tensorRT的BIN目录
D:\yolov5_tensort\TensorRT-7.2.3.4.Windows10.x86_64.cuda-10.2.cudnn8.1\TensorRT-7.2.3.4\bin
D:\yolov5_tensort\cudnn-10.2-windows10-x64-v8.1.1.33\cuda\bin
下载opencv并进行环境变量添加:
D:\yolov5_tensort\opencv\build\x64\vc15\bin
D:\yolov5_tensort\opencv\build\bin
在tensort文件夹新建一个文件夹命名为yolov5_trt,打开VS创建新项目,点击空项目,
将tensorrtx-master\yolov5文件夹下的文件拷贝到创建的项目工程中(与yolov5_Trt.vcxproj在同一路径)
将此文件的内容复制到:
将文件添加到工程中可以直接拖拽,也可以右键点击添加现有文件:
右键项目--属性--VC++目录:
添加包含目录:
C:\work\TensorRT-7.2.3.4\include
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\include
C:\work\Opencv3.4.1\opencv\build\include
C:\work\Opencv3.4.1\opencv\build\include\opencv2
库目录:
C:\work\TensorRT-7.2.3.4\lib
C:\work\Opencv3.4.1\opencv\build\x64\vc15\lib
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\lib\x64
点击连接器----输入----添加附加依赖项:
cudart.lib
cublas.lib
cudnn.lib
cudnn64_8.lib
myelin64_1.lib
nvinfer.lib
nvinfer_plugin.lib
nvonnxparser.lib
nvparsers.lib
opencv_world341.lib //opencv版本不同就不一样
将opencv同目录下LIB的dll文件拷贝到C:\Windows\System32;
右键属性----生成依赖项——生成自定义,勾选CUDA10.2;点击第一个就够了,如果都勾选会报错;
右键.cu文件——常规——修改项类型为CUDAC/C++
OK,快完工了,我们需要把yolov5s.pt——yolov5s.wts——yolov5s.engine;
首先将该工层的gen_wts.py复制到yolov5.4.0的根目录下面运行产生yolov5s.wts
将生成的wts文件复制到此工程下面:修改命令参数为 -s yolov5s.wts yolov5s.engine s
右键项目——属性——调试:命令参数:
我的是在release模式下进行编译的,可能会出现以下错误:
1.
C4996'localtime': This function or variable may be unsafe
解决方法:在第一行YOLO.CPP添加
#pragma warning(disable:4996)
2.
const char类型的值不能用于初始化char
解决方法:
项目->属性->C/C+±>语言->符合模式,将原来的“是”改为“否”
3.
无法打开包括文件: “dirent.h”
解决方法:
将dirent.h放在工程目录下,但是我还是识别不了,于是在 项目——yolov5_Trt属性——VC++目录——包含目录 下添加我的工程目录。
4.
[E] [TRT] Could not compute dimensions for (Unnamed Layer* 475) [Convolution]_output, because the network is not valid.
解决方案:
yololayer.h中 修改static constexpr int CLASS_NUM = 2(你的分类数);默认是80
5.
_CRT_SECURE_NO_WARNINGS错误
在 项目->属性->C/C++->预处理器->预处理器定义中添加_CRT_SECURE_NO_WARNINGS
运行成功后会在此工程下面生成yolov5s.engine大家可以修改命令进行检测了:在此工程下面新建samples文件夹,这个下面放几张图片,
d yolov5s.engine ./samples运行成功后会在工程下面出现检测结果和终端出现推理时间:
如果大家想调用摄像头进行检测可以大家直接去原博主查看。
修改yolov5.cpp,直接调用博主的代码,项目——yolov5_Trt属性——调试 修改命令参数为-v yolov5s.engine。
错误1
会出现错误:"const char *" 类型的值不能用于初始化 "char *" 类型的实体
解决方案:在项目上右键,选择“属性”,选择“C/C++”,然后在“语言”中,把“符合模式”改为“否”就好了
将下载的cmake下的bin目录导入环境变量:
tensorRT中yolov5的工程;
在此工程中建立一个文件叫build,同样把下载的dirent.h文件放在此工程下;
点击cmakefile.txt:原本此文件是linux 系统下的,所以我们需要修改如下:
cmake_minimum_required(VERSION 2.8)
#=========================================================
project(yolov5) #1 工程名
set(OpenCV_DIR "E:\\opencv3\\opencv\\build") #2 opencv目录改成自己的目录
set(OpenCV_INCLUDE_DIRS ${OpenCV_DIR}\\include) #3
set(OpenCV_LIB_DIRS ${OpenCV_DIR}\\x64\\vc15\\lib) #4
set(OpenCV_Debug_LIBS "opencv_world341d.lib") #5
set(OpenCV_Release_LIBS "opencv_world341.lib") #6
set(TRT_DIR "E:\\Downloads\\TensorRT-7.2.1.6.Windows10.x86_64.cuda-11.0.cudnn8.0\\TensorRT-7.2.1.6") #7
set(TRT_INCLUDE_DIRS ${TRT_DIR}\\include) #8
set(TRT_LIB_DIRS ${TRT_DIR}\\lib) #9
set(Dirent_INCLUDE_DIRS "F:\\yolov5trt") #10这里需要改成自己dirent.h的目录路径就是本工程的目录
#=========================================================
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) #11
include_directories(${TRT_INCLUDE_DIRS}) #12
link_directories(${TRT_LIB_DIRS}) #13
include_directories(${OpenCV_INCLUDE_DIRS}) #14
link_directories(${OpenCV_LIB_DIRS}) #15
include_directories(${Dirent_INCLUDE_DIRS}) #16
# -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 " lib path: ${OpenCV_LIB_DIRS}")
message(STATUS " Debug libraries: ${OpenCV_Debug_LIBS}")
message(STATUS " Release libraries: ${OpenCV_Release_LIBS}")
message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")
add_executable(yolov5 ${PROJECT_SOURCE_DIR}/yolov5.cpp ${PROJECT_SOURCE_DIR}/common.hpp ${PROJECT_SOURCE_DIR}/yololayer.cu ${PROJECT_SOURCE_DIR}/yololayer.h) #17
target_link_libraries(yolov5 "nvinfer" "nvinfer_plugin") #18
target_link_libraries(yolov5 debug ${OpenCV_Debug_LIBS}) #19
target_link_libraries(yolov5 optimized ${OpenCV_Release_LIBS}) #20
target_link_libraries(yolov5 ${CUDA_LIBRARIES}) #21
target_link_libraries(yolov5 Threads::Threads)
修改完成以后点击保存进入cmake界面:
source code 添加本工程目录,build第二行填写自己新建的build,运行完之后生成的东西全在这个文件,点击configure-------完成之后再点击Gnereta----------再点击open project;
打开之后直接DEBUG和realses进行编译,
最后会出现报错应用程序启动失败的提示,不用管他直接关闭。
我们直接打开生成目录:
大家进入此目录cmd进入终端:
输入:yolov5.exe -s yolov5s.wts yolov5.engine s,将wts文件放到此目录中,最后运行成功生成engine文件,我们在此目录下创建samples文件夹里面放入几张图片进行测试,
输入:yolov5.exe -d yolov5s.engine ./samples得到结果,
温馨提示:如果是转换其他格式的权重文件比如yolov5l.wts需要将后缀改为 l而不是s.
大家可以跟踪我的下一篇CSDN如何将整个项目生成动态连接库调用,我觉得这一部分比较重要可以用到其他平台。大家也可以去大哥的文章学习,大家有什么意见可以进群交流:135163517