CMake+libtorch+Qt
毕业设计打算做一个小软件,实现一个简单的Machine Reading。前几天pytorch发布了1.0稳定版,据说在部署上更方便,于是尝试一下。
首先准备anaconda+pycharm+Qt+pytorch1.0+libtorch。
流程:
- pytorch训练模型完成,保存为.pt文件(包含模型与参数,相当于tensorflow的pb文件?)
- 编写CMakeLists文件(保留一个以后直接用)
- Qt中制作界面,把pytorch C++加载使用.pt文件的代码加进去
- CMake
首先将pytorch官方的示例在ubuntu中做了一遍,完成之后,需要的是把Qt做的界面加入到里面,走了一些弯路,在windows中也进行了尝试,但是出现: Does libtorch support mingw on windows? 这样的问题,不知道如何解决。于是改用官方推荐的CMake,但是对CMake不熟悉,找到了这篇文章,单独在Qt中使用CMake进行构建,也是很顺利。
然后就是把Qt做的界面和pytorch模型合并了。我在这里只使用了一个QMessageBox,显示出来一个对话框,如果这个可以成功的话,那么更复杂的应该也没有问题了。
我在原来的pytorch C++调用模型的代码里,添加头文件:
#include <QMessageBox>
#include <QApplication>
代码稍作修改:
// if (argc != 2) {
// std::cerr << "usage: example-ap <path-to-exported-script-module>\n";
// return -1;
// }
QApplication a(argc, argv);
// Deserialize the ScriptModule from a file using torch::jit::load().
std::shared_ptr<torch::jit::script::Module> module = torch::jit::load("/home/beidou/QtWork/model.pt"); //argv[1]
中间都不变,仅在最后添加:
QMessageBox msgBox;
msgBox.setText("success!!!");
msgBox.exec();
return a.exec();
在CMakeLists.txt文件中把之前的两部分CMakeLists.txt合并就差不多了。
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(example-ap)
#set里设置你的libtorch的路径,你可以到这个目录下看一看有什么文件
set(Torch_DIR /home/beidou/libtorch/share/cmake/Torch)
find_package(Torch REQUIRED)
include_directories($(Torch_INCLUDE_DIRS))
add_executable(example-ap example-ap.cpp)
target_link_libraries(example-ap "${TORCH_LIBRARIES}")
set_property(TARGET example-ap PROPERTY CXX_STANDARD 11)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
find_package(Qt5 REQUIRED Widgets)
target_link_libraries(example-ap Qt5::Widgets)
在这里我们不需要资源文件qrc和界面文件ui
#set(CMAKE_AUTORCC ON)
#set(RESOURCE_DIR resources/resources.qrc)
#qt5_wrap_cpp( MOC widget.h)
#qt5_wrap_ui( UIC widget.ui)
然后把CMakeLists.txt拖进QT就好了,自动CMake,后面可以直接在Qt里修改这个文件,在上方菜单栏构建,如果成功了,就可以运行了。总的来说挺顺利的,像我这么菜的看着几个教程都做出来了。
希望在github里的那个windows中使用libtorch的问题得到解决,以后有空的话试一下在windows中用CMake的方式进行构建,然后,感觉部署到android上还是有困难呀,这几天弄那个Qt+Caffe部署到Android设备上的程序简直弄的心累,现在还是有莫名其妙的问题。
第二天,在windows中尝试使用上述方法,我以为只需要改个文件路径就会没有问题了,结果出现了:
我在CMakeLists里加了:
if(CONAN_LIBCXX STREQUAL "libstdc++11")
add_definitions(-D_GLIBCXX_USE_CXX11_ABI=1)
elseif(CONAN_LIBCXX STREQUAL "libstdc++")
add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)
endif()
但是没有变化。然后就不知道怎么解决了。。。
参考文章:
CMake的详细使用方式:https://www.jianshu.com/p/c71ec5d63f0d