本文最后更新于 1860 天前,其中的信息可能已经有所发展或是发生改变。
最近需要把深度学习模型直接部署到Qt里,然后遇到了不少坑,就顺带记录一下
MSVC调用Pytorch模型
首先第一步是通过VS调用Pytorch模型,这步还算简单,官方直接有编译好的库下载
下载地址:https://download.pytorch.org/libtorch/cu90/libtorch-win-shared-with-deps-latest.zip
然后配合各种博客配置一番就搞定编译了
https://oldpan.me/archives/pytorch-windows-libtorch
https://www.cnblogs.com/geoffreyone/p/10827010.html
不过要注意一下CMake的时候,如果没有把libtorch放到环境变量里,就要手动在CMake里指定路径
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(torch_demo)
# 就是下面两句设定了torch路径
FIND_PATH(Libtorch REQUIRED)
set(CMAKE_PREFIX_PATH ${Libtorch})
find_package(Torch REQUIRED)
set(CMAKE_BUILD_TYPE Release)
add_executable(torch_demo main.cpp)
target_link_libraries(torch_demo "${TORCH_LIBRARIES}")
set_property(TARGET torch_demo PROPERTY CXX_STANDARD 11)
SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES LINK_FLAGS "/RELEASE")
# 本来想直接拷贝dll的,不过写的太暴力了,还是算了
# file(GLOB TORCH_DLL "${Libtorch}/lib/*.dll")
# foreach(loop_var ${TORCH_DLL})
# add_custom_command(TARGET torch_demo POST_BUILD # Adds a post-build event to torch_demo
# COMMAND ${CMAKE_COMMAND} -E copy_if_different # which executes "cmake - E copy_if_different..."
# "${loop_var}" # <--this is in-file
# $<TARGET_FILE_DIR:torch_demo>) # <--this is out-file path
# endforeach(loop_var)
然后使用的时候,建议看官网文档,API可能会有变动,像上面的博客里的代码就有一处变动
Qt调用libtorch
一开始这步就是编译不过,每次都是440个错误
找了半天,找到篇博客,说了解决方案,include的时候要像下面这样
#undef slots
#include "torch/torch.h"
#def slots Q_SLOTS
不过在我这里还是不行,得改成下面这样
#undef slots
#undef UNICODE
#include "torch/torch.h"
#include "torch/script.h"
#define slots Q_SLOTS
不过我没找到UNICODE
的原始定义是啥,不过好像程序运行也没啥问题,就先这样吧
在pro
文件里按照这篇博客修改,只要把那些没有的静态库去掉,还有一处cpu
换成gpu
就行了,改完以后我的.pro
文件如下所示
INCLUDEPATH += E:\pytorch_demo\libtorch\include \
E:\pytorch_demo\libtorch\include\torch\csrc\api\include \
C:\Program Files\NVIDIA Corporation\NvToolsExt\include \
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\include \
DEPENDPATH += E:\pytorch_demo\libtorch\include
LIBS += -LE:\pytorch_demo\libtorch\lib\ -lc10 \
-lcaffe2_detectron_ops_gpu \
-lcaffe2_module_test_dynamic \
-lclog -lcpuinfo \
-llibprotobuf -llibprotobuf-lite -llibprotoc \
-ltorch
LIBS += $$quote(C:\Program Files\NVIDIA Corporation\NvToolsExt\lib\x64\nvToolsExt64_1.lib) \
$$quote(C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\lib\x64\cudart_static.lib) \
$$quote(C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\lib\x64\cufft.lib) \
$$quote(C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\lib\x64\curand.lib) \
$$quote(C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\lib\x64\cudnn.lib) \
$$quote(C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\lib\x64\cublas.lib)
这样就编译过了,不过运行直接出错,模型加载就有问题。。
update:
上面的pro文件有两个地方路径有空格,所以有问题,加上就好了,但是速度差了近4倍。。如果是cpu模式下能差近7倍,不知道为啥Qt上速度这么慢
( ̄▽ ̄)