在用VS2015封装yolov5时,由于涉及到TensorRT,CUDA 繁琐的过程总是麻烦不断。
前提使用的是https://github.com/wang-xinyu/tensorrtx
【1】.LNK2001 无法解析的外部符号 “public: __cdecl nvinfer1::YoloPluginCreator::YoloPluginCreator(void)” (??0YoloPluginCreator@nvinfer1@@QEAA@XZ)
step 1: 右键项目->生成依赖项->生成自定义
step 2 勾选带有CUDA版本的选项,点击确定,然后重新编译即可。
【2】严重性代码说明项目文件行错误C4996 ‘localtime’: This function or variable may be unsafe. Consider using localtime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
step 1 右键项目-> C/C++ -> 预处理器 -> 预处理器定义 -> 添加宏定义_CRT_SECURE_NO_WARNINGS
step 2 点击确定
【3】 “dirent.h”: No such file or directory
https://gitcode.net/mirrors/tronkko/dirent/-/tree/master/include
只需要把下面的代码保存dirent.h即可,直接放在工程目录下。
【4】
需要修改yololayer.h部分参数,修改为自己权重文件内容,否则可看到提示窗里【E】即error字样
[01/1/2021-15:12:24] [E] [TRT] Parameter check failed at:*****************************
【5】windows运行需要在所使用的版本包含.cu格式文件对应的yololayer.h 和 mish.h 文件里 nvinfer1 类里添加 生成lib库的 __declspec(dllexport) 代码,否则只有dll,没有lib文件。(我这里举例 我 的版本只有一个.cu文件,对应的是yololayer.h,有些版本mish.cu 也需要修改)
【6】出现“YoloPluginCreator::mFC" may not be initialized”
在cmakefiles.txt 增加add_definitions(-DAPI_EXPORTS)
【7】报错:error D8021无效的数值参数 “Wfatal-errors”。因为使用的makelists 文件里是包含了如下字符,需要删除如下字符即可。
【8】LNK2019: 无法解析的外部符号 “void __cdecl cv::fastFree(void *)”(?fastFree@cv@@YAXPAX@Z),该符号在函数 “public: __thiscallcv::Mat::~Mat(void)” (??1Mat@cv@@QAE@XZ) 中被引用 等 出现cv 这样关键字眼,需要查询makelists 时候 opencv 库路径,lib,头文件,dll是否正确。
【9】CUDA language not currently supported by “Visual Studio 15 2017” generator
则需要查看cuda+ cudnn+ visual studio+tensorrt 版本是否相互兼容。
cuda 和显卡驱动版本匹配样例
【10】nvcc -V 和nvidia-smi 显示cuda的区别
nvcc-v 所显示的版本才是程序正常运行时候加载的,nvidia-smi 显示的是目前电脑能兼容的cuda的最高版本。
安装cuda版本完成后,可通过TensorRT 例子显示数字方式验证是否可用。
【11】yolov4 和yolov5 版本测试tr命令有差异。
yolov5可针对权重文件路径和名字 及输出文件名字、路径可修改,yolov4是固定的,如果想修改需要改动默认程序。
【12】个别版本出现报max min位置异常,有波浪线。这是冲突。
将 std::max(*** )修改为(std::max)(*** )
将 std::min(*** )修改为(std::min)(*** )
【13】[E] [TRT] CUDA initialization failure with error 100
cuda版本问题,跟TensorRT的版本不兼容问题。
【14】C2668 “std::to_string”: 对重载函数的调用问题。对to_string 括号内容进行强制转换即可。
cv::putText(img, std::to_string((int)res[j].class_id));
【15】部分电脑不支持16位推理,将以下这行注释掉:如果是yolov5 可修改为#define USE_FP8.根据自己电脑进行修改即可
#define USE_FP16 // comment out this if want to use FP32
【16】报错找不到nvinfer
查看tensorrt在makelists里是否正确
【17】[01/06/2021-16:2:2] [E] [TRT] Parameter check failed at: runtime.cpp::nvinfer1::Runtime::deserializeCudaEngine::30, condition: (blob) != nullptrAssertion failed: engine != nullptr,
路径有问题。engine路径问题
【18】推理dll库版本,,,待更新******************
【19】
【20】makelists.txt
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_world3412d.lib”) #5 根据自己的修改
set(OpenCV_Release_LIBS “opencv_world3412.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:\yolov5_trt”) #10根据自己的修改
#=========================================================
add_definitions(-std=c++11)
add_definitions(-DAPI_EXPORTS)
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)
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(KaTeX parse error: Expected 'EOF', got '#' at position 31: …_DIR}/include) #̲11 include_dire…{TRT_INCLUDE_DIRS}) #12
link_directories(KaTeX parse error: Expected 'EOF', got '#' at position 17: …TRT_LIB_DIRS}) #̲13 include_dire…{OpenCV_INCLUDE_DIRS}) #14
link_directories(KaTeX parse error: Expected 'EOF', got '#' at position 20: …nCV_LIB_DIRS}) #̲15 include_dire…{Dirent_INCLUDE_DIRS}) #16
set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Ofast -D_MWAITXINTRIN_H_INCLUDED”)
find_package(OpenCV REQUIRED)
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 如果是yolov5以外的其他版本对应修改成所包含的cu格式文件即可
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)