0.下载准备
-
下载安装VS2017或VS2015
-
下载安装opencv
可以参考博客:VS2017配置opencv教程 ,该博客中写的很详细 -
安装cmake
记得把bin目录添加到环境变量path中,例如我的:E:\SoftEnv\CMake\bin -
下载libtorch
下载地址:PyTorch libtorch ,这个根据自己情况选择下载,因为我自己的是cuda10,并且我选择使用release版本,所以我的选择如下:
1.PyTorch模型转换为Torch脚本
PyTorch模型从Python到C ++的旅程由Torch Script实现,Torch Script是PyTorch模型的一种表示,可以由Torch Script编译器理解,编译和序列化。
这里说下通过跟踪转换为Torch脚本方式(示例),创建一个名为TorchScrip.py的脚本,内容如下:
import torch
import torchvision
# An instance of your model.
model = torchvision.models.resnet18()
# An example input you would normally provide to your model's forward() method.
example = torch.rand(1, 3, 224, 224)
# Use torch.jit.trace to generate a torch.jit.ScriptModule via tracing.
traced_script_module = torch.jit.trace(model, example)
traced_script_module.save("model.pt")
然后运行该脚本,会生成一个 model.pt 文件,该文件就是C++需要调用的模型。
2.准备C++测试代码和CMakelists.txt文件
首先,我在E:/PyTorch/libtorch_test路径下创建一个名为Example的文件夹,然后在该文件夹下分别创建C++测试代码(例如:example-app.cpp)和CMakelists.txt文件以及名为build的文件夹。
CMakelists.txt 内容如下:
cmake_minimum_required(VERSION 3.12 FATAL_ERROR)
project(example-app)
find_package(Torch REQUIRED)
find_package(OpenCV REQUIRED)
if(NOT Torch_FOUND)
message(FATAL_ERROR "Pytorch Not Found!")
endif(NOT Torch_FOUND)
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}")
add_executable(example-app example-app.cpp)
target_link_libraries(example-app ${TORCH_LIBRARIES} ${OpenCV_LIBS})
set_property(TARGET example-app PROPERTY CXX_STANDARD 11)
注意该文件里的关键词:example-app
和example-app.cpp
,这个example-app.cpp
就是接下来要写的C++测试代码文件名。
C++测试代码文件(example-app.cpp)内容如下:
#include <torch/script.h> // One-stop header.
#include <iostream>
#include <memory>
int main() {
// Deserialize the ScriptModule from a file using torch::jit::load().
std::shared_ptr<torch::jit::script::Module> module = torch::jit::load("E:/PyTorch/libtorch_test/Example/model.pt");
assert(module != nullptr);
std::cout << "ok\n";
// Create a vector of inputs.
std::vector<torch::jit::IValue> inputs;
inputs.push_back(torch::ones({ 1, 3, 224, 224 }));
// Execute the model and turn its output into a tensor.
at::Tensor output = module->forward(inputs).toTensor();
std::cout << output.slice(/*dim=*/1, /*start=*/0, /*end=*/5) << '\n';
while (1);
}
Example路径下:
3.构建应用程序
准备好上述内容之后,先进入到build文件夹下,然后打开cmd终端或powershell终端,输入如下命令并执行:
cmake -DCMAKE_PREFIX_PATH=E:/SoftEnv/OpenCV4.1/opencv/build/x64/vc15/lib;E:/PyTorch/libtorch-win-shared-with-deps-latest/libtorch -DCMAKE_BUILD_TYPE=Release -G "Visual Studio 15 Win64" ..
注意:上面的指令需要根据自己实际配置进行修改,第一个是opencv的路径,第二个是libtorch的路径,第三个是使用的VS版本。我这里下载的是release版本的libtorch,使用的是VS2017,所以参数如上设置,如果使用的是VS2015,则需要将Visual Studio 15 Win64
改为 Visual Studio 14 Win64
,opencv/build/x64/vc15/bin
改为 opencv/build/x64/vc14/bin
。不出错的话应该输出类似下图的内容:
看下build文件夹下编译的内容:
然后,右击example-app.vcxproj
,打开方式选择Microsoft Visual Studio 2017
打开程序,改为Release模式:
接下来进行编译:
这时候会发现提示torch.dll找不到问题:
这时需要到libtorch的lib路径下将torch.dll文件复制到工程Example\build\Release中,然后再执行F5,然后这时又报缺少caffe2.dll文件,接着重复同样的问题,接连报缺少nvToolsExt64_1.dll、caffe2_gpu.dll、c10_cuda.dll文件,开始没办法,只能一一将其复制添加到工程Example\build\Release中,到这里执行F5最终才成功。。
看下Example\build\Release中内容:
最后看下成功执行的结果:
最后说一下关于运行测试代码时报dll缺失的问题。如果想避免一条条添加dll文件,可以一次性将libtorch/lib路径下所有的dll都复制一份到工程Example\build\Release中。
另外,看网上还有一种做法,就是把libtorch/lib中的所有dll放到libtorch/bin中,然后把libtorch/bin加到环境变量的path中,这种方法我自己没有尝试过,有兴趣的朋友不妨试一试。