win10、GeForce 930M、cuda9.0、cudnn7.4.2
win下可以直接在官网下载编译好的libtorch(1.1),附一下libtorch安装以前版本的方法
https://download.pytorch.org/libtorch/cpu/libtorch-win-shared-with-deps-1.1.0.zip
https://download.pytorch.org/libtorch/cu80/libtorch-win-shared-with-deps-1.1.0.zip
https://download.pytorch.org/libtorch/cu90/libtorch-win-shared-with-deps-1.1.0.zip
https://download.pytorch.org/libtorch/cu100/libtorch-win-shared-with-deps-1.1.0.zip
由于需要用到opencv(4.2.0),只需要官网下载安装即可,网上教程很多,这里不再赘述。
1.VS创建空项目,由于交付需要Release、x64版本,在解决方案配置中进行更改,将.h和.cpp文件(这里就不上传了,有需要可以私聊我)添加到与.sln文件同目录的项目文件夹下,在项目中分别从头文件、源文件导入
2.配置项目属性,包括如下:
-常规-配置类型 动态库改为dll 静态库改为lib
-VC++目录-包含目录(这里根据个人的opencv和libtorch路径进行配置,C:\Users\91223\Downloads\libtorch\include\torch下需要有cuda.h和script.h)
-VC++目录-库目录
-C/C++-常规 SDL检查改为否
-链接器-常规-附加库目录
-链接器-输入-附加依赖项
应用-确定
3.由于我负责的模块需要供给他人调用,所以需要封装成接口函数,在生成动态链接库dll时,在接口的头文件开头需要添加以下几行,大概意思就是针对导出方和调用方dll文件是要导出还是导入,想要具体了解可以点击传送门;生成静态链接库lib时则不需要。
#ifndef NJUST_BODY_PARSING_DLL
#define NJUST_BODY_PARSING_API __declspec(dllimport)
#else
#define NJUST_BODY_PARSING_API __declspec(dllexport)
#endif
//每个函数声明前添加NJUST_BODY_PARSING_API,例如
NJUST_BODY_PARSING_API int NJUST_Body_Parsing_Initialize(int width, //图像宽度
int height, //图像高度
bool isRGB //输入图像是否是彩色图像
);
4.生成-生成解决方案即可生成dll或者lib
VS新建空项目,Release,x64,配置opencv4.2.0的包含目录、库目录和附加依赖项;将模型文件(导出的.pt文件)、测试图片复制到工程目录下;将main.cpp、接口头文件(步骤3中的条件编译可以删掉)复制到工程目录下并添加到工程的源文件/头文件。 然后进行测试即可。
ubantu18.04、TiTan V、cuda10.2
libtorch(1.1)我是直接下载的编译好的版本,ubantu下安装之前版本pytorch的方法如下
https://download.pytorch.org/libtorch/cpu/libtorch-shared-with-deps-1.1.0.zip
https://download.pytorch.org/libtorch/cu90/libtorch-shared-with-deps-1.1.0.zip
https://download.pytorch.org/libtorch/cu100/libtorch-shared-with-deps-1.1.0.zip
但是opencv(3.4.3)是采用源码编译安装的,附一篇肥肠好的博客,其中python依赖我没有安装,博主回复也很及时,墙裂推荐
首先需要安装CMake,我装的是3.10.2版本,关于CMake的用法,附一篇博客详解。
1.新建工程目录BP,下面包含lib、include、src、build四个文件夹以及CMakeLists.txt文件,将头文件放入include文件夹,将源文件放入src文件夹
下面上我的CMakeList.txt,动态库生成时注释掉静态库的两行,反之亦然,当然可执行文件你也可以注释掉。
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
#设置opencv的路径必须在project之前
set(OpenCV_DIR "/home/gye/opencv/build")
project(NJUST_BODY_PARSING_0304)
#torch的cmake路径
set(CMAKE_PREFIX_PATH ("/home/gye/libtorch/share/cmake/Torch"))
#cuda路径
set(CUDA_TOOLKIT_ROOT_DIR "/usr/local/cuda-10.2")
#同一目录下头文件路径
include_directories(include)
#同一目录下源文件路径
include_directories(src)
#寻找opencv、torch依赖,列出相应信息
find_package(Torch REQUIRED)
find_package(OpenCV REQUIRED)
message(STATUS "Pytorch status:")
message(STATUS " libraries: ${TORCH_LIBRARIES}")
message(STATUS "OpenCV library status:")
message(STATUS " version: ${OpenCV_VERSION}")
message(STATUS " libraries: ${OpenCV_LIBS}")
message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")
#设置生成库文件的路径
set(LIBRARY_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/lib)
#生成动态库
#add_library(NJUST_BODY_PARSING_0304 SHARED src/NJUST_BODY_PARSING_proc.cpp src/NJUST_BODY_PARSING.cpp)
#动态库链接到的其他库
#target_link_libraries(NJUST_BODY_PARSING_0304 ${OpenCV_LIBS} ${TORCH_LIBRARIES})
#生成静态库
add_library(NJUST_BODY_PARSING_static_0304 STATIC src/NJUST_BODY_PARSING_proc.cpp src/NJUST_BODY_PARSING.cpp)
#静态库链接到的其他库
target_link_libraries(NJUST_BODY_PARSING_static_0304 ${OpenCV_LIBS} ${TORCH_LIBRARIES})
#生成一个可执行文件用于测试
add_executable(parsing src/main.cpp src/NJUST_BODY_PARSING_proc.cpp src/NJUST_BODY_PARSING.cpp)
#可执行文件链接到的库
target_link_libraries(parsing ${OpenCV_LIBS} ${TORCH_LIBRARIES})
#c++ 11
set_property(TARGET parsing PROPERTY CXX_STANDARD 11)
2. 进入build文件夹:cd build
使用命令cmake .(注意cmake后面有一个空格一个点".")生成Makefile文件,
make生成库文件和可执行文件
3.使用命令./parsing运行以下是否可以
新建一个Cmake工程Test,其中建立文件夹src、lib、include,将模型文件(.pt文件)和测试图片放入Test文件夹下,将所有动态库/静态库文件放入lib文件夹(测试动态库/静态库时,将CMakeLists.txt中静态库/动态库相关的注释掉即可),将所需头文件放入include文件夹,将main.cpp放入src文件夹,将CMakeLists.txt放入Test目录下。
修改完成后在Test目录下用“cmake .”命令生成Makefile文件,再”make”命令生成可执行文件”parsing”,执行“./parsing”即可运行。
附CMakeList.txt
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
set(OpenCV_DIR "/home/gye/opencv/build")
project(test)
include_directories(include)
include_directories(src)
find_package(OpenCV REQUIRED)
message(STATUS "OpenCV library status:")
message(STATUS " version: ${OpenCV_VERSION}")
message(STATUS " libraries: ${OpenCV_LIBS}")
message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")
#需要链接的库文件目录
link_directories(${PROJECT_SOURCE_DIR}/lib)
#测试动态库,动态库路径
find_library(libNJUST_BODY_PARSING_0304.so ${PROJECT_DOURCE_DIR}/lib/)
find_library(libc10_cuda.so ${PROJECT_DOURCE_DIR}/lib/)
find_library(libc10.so ${PROJECT_DOURCE_DIR}/lib/)
find_library(libcudart.so ${PROJECT_DOURCE_DIR}/lib/)
find_library(libcuda.so ${PROJECT_DOURCE_DIR}/lib/)
find_library(libnvrtc.so ${PROJECT_DOURCE_DIR}/lib/)
find_library(libnvToolsExt.so ${PROJECT_DOURCE_DIR}/lib/)
#测试静态库,静态库路径
#find_library(libNJUST_BODY_PARSING_static_0304.a ${PROJECT_DOURCE_DIR}/lib/)
#find_library(libc10_cuda.so ${PROJECT_DOURCE_DIR}/lib/)
#find_library(libc10.so ${PROJECT_DOURCE_DIR}/lib/)
#find_library(libcaffe2.so ${PROJECT_DOURCE_DIR}/lib/)
#find_library(libcaffe2_gpu.so ${PROJECT_DOURCE_DIR}/lib/)
#find_library(libtorch.so ${PROJECT_DOURCE_DIR}/lib/)
#查找src目录下所有源文件,将名称保存到DIR_DRC变量
aux_source_directory(./src/ DIR_SRC)
#制定生成目标SO
add_executable(parsing ${DIR_SRC})
#设置要链接的库的名称,测试动态库
target_link_libraries(parsing ${OpenCV_LIBS} libNJUST_BODY_PARSING_0304.so libc10_cuda.so libc10.so libcudart.so libcuda.so libnvrtc.so libnvToolsExt.so)
#设置要链接的库的名称,测试静态库
#target_link_libraries(parsing ${OpenCV_LIBS} libNJUST_BODY_PARSING_static_0304.a libc10.so libc10_cuda.so libcaffe2.so libcaffe2_gpu.so libtorch.so)
暂时记录到这里,方便以后自己查看,如果后面有别的问题,再来补充,欢迎大家批评,共同学习。