1. windows软件配置
CUDA,CUDNN,libtorch,opencv,CMake
笔者使用:cuda10.1, cudnn7.6.5, libtorch 1.4.0(cuda10.1)
注意:libtorch版本>1.3.0时,需要支持c++14的编译器编译
2. 输入
模型pt文件(模型文件需要转化,pt->wts),linux下的cmakelist工程文件
详情见yolov3工程
1) 安装Anaconda
2) 创建虚拟空间
`conda create -n env_name python=X.X`
3) 激活虚拟环境
`activate env_name`
可能存在的错误:
CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/main/win-64/curre
修改./condarc文件(`C:\Users\Administrator\.condarc`):
channels:
- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
- http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
- http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
- https://mirrors.ustc.edu.cn/anaconda/cloud/bioconda/linux-64
- https://mirrors.ustc.edu.cn/anaconda/cloud/bioconda/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
- https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
show_channel_urls: true
其它指令
- 查看安装包:`conda list`
- 查看当前虚拟环境:`conda-env list ` 或 `conda info -e`
- 检查更新当前conda:`conda update conda`
3. cuda下载
cuda下载地址
选择10.1版本 ,傻瓜式安装
4. libtorch下载
windows-cuda版下载,修改cu版本和torch版本即可下载相应的libtorch版本。
在win10下的运算速度比linux下慢,后弃用,改为TensorRT.
5. 安装TensorRT
下载地址,选择TensorRT 7.0 For Windows 下
4. cudnn安装
cudnn下载地址
选择与操作系统版本和cuda版本一致的(需要注册)。
cudnn下载之后不用安装,解压即可。
下载解压缩后,将其文件夹下cndnn64_7.dll cudnn.h cudnn.lib分别复制到
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\include
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\lib\x64
4. 跨平台编译
1) 编写CMakeLists文件,配置cuda toolkit目录,cuda compile目录,torch目录
if(MSVC)
#msvc下配置
else()
#其它平台下配置
endif(MSVC)
2) cmake编译,生成vs工程
cd build文件夹
(vs2015)
cmake -DCMAKE_PREFIX_PATH=D:/soft/opencv/build/x64/vc14/lib;D:/soft/libtorch -DCMAKE_BUILD_TYPE=Release -G "Visual Studio 14 Win64" ..
(vs2019) 注意:cudnn中相关文件拷贝文件到cuda中
cmake -DCMAKE_PREFIX_PATH=D:/soft/opencv/build/x64/vc15/lib;D:/soft/libtorch -DCMAKE_BUILD_TYPE=Release -G "Visual Studio 16 2019" ..
3) 在VS工程中重新生成项目
**注意**:
a) 对于生成动态库项目,找到头文件,确保添加了API输出口“__declspec(dllexport)”
b) cuda显卡序号选择需要斟酌,建议优先使用0,笔者在双显卡上使用1后无法完成网络推理工作
c) torch::Tensor数据类型转化不支持long类型:eg: int *poutput_max_idxes = max_idxes_int.data<int>();
d) 推理完成后的输出结果需要拷贝到cpu上执行 (.to(torch:kCPU))
5. 跨平台宏定义
#if (defined _WIN32 || defined _WIN64)
#ifdef PointDetector_EXPORTS
#define PointDetector_EXPORTS __declspec(dllexport)
#else
#define PointDetector_EXPORTS __declspec(dllimport)
#endif
#else
#ifdef __linux__
#define PointDetector_EXPORTS
#endif
#endif
6. 重新编译opencv(cuda版)
libtorch1.4 + vs2015 + cuda10.1
-
环境和资源准备
– 计算机必须有支持CUDA 的NVIDIA GPU,并且装好了驱动程序。
安装CUDA toolkit,本文使用的是CUDA10.1。下载地址;
– 下载opencv-4.3.0,下载地址,选择 source源码;
– 下载opencv-contirb-3.4.2,下载地址下载3.4.2的zip文件;
– 下载Eigen ,Eigen是用来库优化矩阵的计算的。下载地址;下载最近的稳定版本即可,这里使用的是eigen-3.3.6。或者选择源码进行编译,编译过程见下文。
– 下载tbb,Intel TBB是用来优化OpenCV库函数的多核计算性能的。下载地址;我下载的是tbb2018_20180312oss_win.zip
。或者选择源码进行编译,编译过程见下文。
– 下载cmake-3.17.1-win64-x64.msi安装,下载地址 -
cmake工程配置
– 打开CMAKE,输入OpenCV的sources路径,以及将要编译的结果路径(自主创建一个文件夹),勾选择Grouped选项和Advanced选项。
– 选择编译器:选择Studio 2013 Win64,默认Use defualt native complers。
– WITH栏配置:选中WITH_CUDA,WITH_CUBLAS,从而可以使用cuBLAS,选中WITH_EIGN,WITH_TBB。
– 点击Configure,添加目录:
OPENCV_EXTRRA_MODULES_PATH: ~/opencv_contrib-3.4.2/modules
EIGEN_INCLUDE_PATH:~/ eigen-eigen-b70bf4fad467
TBB_ENV_INCLUDE: ~/tbb2018_20180312oss/include
TBB_ENV_LIB: ~/Library/tbb2018_20180312oss/lib/intel64/vc12/tbb.lib
TBB_ENV_LIB_DEBUG: ~/Library/tbb2018_20180312oss/lib/intel64/vc12/tbb_debug.lib
TBB_VER_FILE: ~/Library/tbb2018_20180312oss/include/tbb/tbb_stddef.h
注意已上的“~”都要落实到自己的文件目录下,根据解压的位置选择
– 点击Configure,如果还出现红色提示,再点击configure就行,直到没有红色的警告出现为止。
– 点击Generate,CMake就完成了亦可通过编辑opencv编译脚本设置相关参数(TBB(静态库)和eigne(仅头文件)需要重新编译)
:: 删除文件 del /f /s /q .\build\*.* :: 删除文件夹 rd /s /q build :: 新建文件夹 md build cd build ::cmake -DCMAKE_BUILD_TYPE=Release -G "Visual Studio 14 Win64" -DTIME_LOG=ON .. cmake -DOPENCV_EXTRA_MODULES_PATH="D:/tools/opencv_contrib/modules" ^ -DWITH_CUDA=ON -DWITH_CUBLAS=ON ^ -DWITH_EIGNE=ON -DEIGEN_INCLUDE_PATH="C:/Library/eigen3.4.0" ^ -DWITH_TBB=ON -DTBB_ENV_INCLUDE="C:/Library/tbb12/include" -DTBB_ENV_LIB="C:/Library/tbb12/lib" ^ -DCMAKE_BUILD_TYPE=Release -DCMAKE_VERBOSE_MAKEFILE=ON -G "Visual Studio 14 Win64" ..
eigen编译脚本
:: 删除文件 del /f /s /q .\build\*.* :: 删除文件夹 rd /s /q build :: 新建文件夹 md build cd build cmake -DCMAKE_INSTALL_PREFIX="C:/Library/eigen3.4.0" ..
TBB编译脚本
:: 删除文件 del /f /s /q .\build\*.* :: 删除文件夹 rd /s /q build :: 新建文件夹 md build cd build cmake -DCMAKE_BUILD_TYPE=Release -G "Visual Studio 16" -DTIME_LOG=ON ..
-
VS2015编译
1、用Vs2015打开OpenCV.sln,等待项目加载就绪完成。
2、点击菜单栏中的生成,批生成。
3、选中ALL_BUILD中debug和release两个选框,以及INSTALL中的debug和release两个选框,一次性生成debug和release版本,省的debug和release两个版本分开编译。
4、等待编译完成,编译需要花费大量时间,看个人配置,一般4-8小时之间,完成之后在build路径下面会有install文件夹,在x64/vc14下有需要的动态库,在include文件夹下有所有的头文件。 -
CMake编译出错处理:
在进行Cmake配置OpenCV时出现以下问题的解决办法:- IPPICV:Download:ippicv_2020_Win_ia32_20191018_general.zip下载失败
– 进入opencv4.3.0\sources\3rdparty\ippicv目录,将 ippicv.cmake 第42行的"https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/"
修改为:
"https://raw.staticdn.net/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/
- ** opencv_videoio_ffmpeg_64.dll、opencv_videoio_ffmpeg.dll下载失败**
– 进入opencv4.3.0\sources\3rdparty\ffmpeg目录,将 ffmpeg.cmake 第25行的"https://raw.githubusercontent.com/opencv/opencv_3rdparty/${FFMPEG_BINARIES_COMMIT}/ffmpeg/"
修改为:
"https://raw.staticdn.net/opencv/opencv_3rdparty/${FFMPEG_BINARIES_COMMIT}/ffmpeg/"
- boostdesc_bgm.i相关文件下载失败
– 进入opencv_contrib-4.3.0\modules\xfeatures2d\cmake目录
将 download_boostdesc.cmake中的https://raw.githubusercontent.com/…
修改为
https://raw.staticdn.net/…
- vgg_generated_120.i相关文件下载失败
– 进入opencv_contrib-4.3.0\modules\xfeatures2d\cmake目录
将 download_vgg.cmake中的https://raw.githubusercontent.com/…
修改为https://raw.staticdn.net/…
- face_landmark_model.dat下载失败
– 进入\opencv_contrib\modules\face\CMakeLists.txt,将https://raw.githubusercontent.com/…
修改为:https://raw.staticdn.net/…
- 编译速度慢
– 每个架构都编译了
– 解决方案:指定cuda编译架构版本cmake -D CUDA_ARCH_BIN=6.1
gpu架构版本查询
- IPPICV:Download:ippicv_2020_Win_ia32_20191018_general.zip下载失败
7. 常见错误
-
nvcc fatal : unknown option ‘openmp’
– Move all nvcc flags to Xcompiler like this -Xcompiler=“/EHsc -Ob2 /Z7 /EHa /wd4267 /wd4251 /wd4522 /wd4838 /wd4305 /wd4244 /wd4190 /wd4101 /wd4996 /wd4275 /bigobj /openmp”
– change -openmp to /openmp" -
C:\Library\libtorch\include\torch/csrc/jit/script/module.h(479):error:member “torch::jit::script::detail::ParameterPolicy::all_slots” may not be initialized
– 将model.h和argument_spec.h文件中constexpr->const -
fatal error C1041: 无法打开程序数据库
“D:\cp03\inferengine\inferengine\build\src\infer\TorchInferEngine.dir\Release\vc142.pdb”;
如果要将多个 CL.EXE 写入同一个 .PDB 文件,请使用 /FS
– 属性->C/C+±>命令行-> /FS
– 属性->CUDA C/C+±>Host -> Additional Compiler Options->/FS -
forward()出错,std::runtime_error
– libtorch中的所有动态库都要拷贝 -
**cv_bgr2gray未定义 **
– #include <opencv2/imgproc/types_c.h> -
从“double”转换到“_Tp”需要收缩转换
– 强转(int) -
**cv::resize函数不接受七个参数 **
–#include <opencv2\cudawarping.hpp>
–#include <opencv2\cudaimgproc.hpp>
-
** 未声明变量,跨平台编译中文不识别问题**
– utf-8有无bom的区别/*(空格)注释的内容 (空格)*/
– 直接修改文件格式:文件->高级保存选项->Unicode(utf-8有bom) -
多cuda编译器时,手动生成VC++自定义文件,把继承文件和dll拷贝到vs目录。例如:“C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\extras\visual_studio_integration\MSBuildExtensions”下文件拷贝到“C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomizations”中, 然后再在项目->属性->生成依赖项->生成自定义->先择需要使用的cuda版本。注意cuda10.0不支持vs2019
-
Namespace std没有成员“to_string”
– 添加头文件#include