Windows下使用C++调用pytorch模型教程(VS工程)

如果读者有在VS下配置opencv工程的经历,那么在本教程的指导下配置起来将非常轻松。大致可以分为三步:

  1. 生成Torch Script
  2. 下载libtorch
  3. 在VS下配置项目属性及系统环境变量

生成Torch Script

新建一个python脚本,写下

import torch
import torchvision

model = torch.load('模型路径')

model.cuda()


# An example input you would normally provide to your model's forward() method.

example = torch.rand(1, 3, 224, 224).cuda()

# 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-gpu.pt')

model.cpu()
example = torch.rand(1, 3, 224, 224)
traced_script_module = torch.jit.trace(model, example)
traced_script_module.save("model-cpu.pt")

注意该脚本的目录下要放入自己网络结构的代码(网络结构的.py文件)。

下载libtorch

想要下载对应版本的libtorch可以参看该文章,Windows可用以下链接。下载gpu版本不需要再下载cpu版本压缩包,gpu版本包含了cpu版本运行所需的库。

https://download.pytorch.org/libtorch/cpu/libtorch-win-shared-with-deps-1.0.1.zip
https://download.pytorch.org/libtorch/cu80/libtorch-win-shared-with-deps-1.0.1.zip
https://download.pytorch.org/libtorch/cu90/libtorch-win-shared-with-deps-1.0.1.zip
https://download.pytorch.org/libtorch/cu100/libtorch-win-shared-with-deps-1.0.1.zip

修改版本号可以下载相应版本。下载后解压,并记住解压后文件夹路径,后续配置将用上该路径。

配置Visual Studio工程及系统环境

笔者使用的是win10和vs2015环境。

  1. 新建一个项目工程,打开VS的“项目->属性”,在C/C++一栏的“附加包含目录”中添加libtorch的头文件路径
你自己的路径\libtorch-win-shared-with-deps-1.0.1\libtorch\include
你自己的路径\libtorch-win-shared-with-deps-1.0.1\libtorch\include\torch\csrc\api\include
  1. 在“链接器->常规->附加库目录”中添加libtorch的静态库路径
你自己的路径\libtorch-win-shared-with-deps-1.0.1\libtorch\lib
  1. 在“链接器->输入->附加依赖项”中写入静态库名称
c10_cuda.lib
c10.lib
caffe2_detectron_ops_gpu.lib
caffe2_gpu.lib
caffe2.lib
caffe2_module_test_dynamic.lib
clog.lib
cpuinfo.lib
libprotobuf.lib
libprotobuf-lite.lib
libprotoc.lib
onnxifi_dummy.lib
onnxifi_loader.lib
onnx.lib
onnx_proto.lib
torch.lib
  1. 右键“此电脑”,点击“高级系统设置”,点击“环境变量”,在上下两个框中找到“Path”变量,添加libtorch的动态库路径(静态库和动态库在同一个文件夹下)
你自己的路径\libtorch-win-shared-with-deps-1.0.1\libtorch\lib

至此,环境配置结束,示例代码如下

#include <torch/script.h>
#include <iostream>

int main(void)
{
	std::shared_ptr<torch::jit::script::Module> module = torch::jit::load("model-gpu.pt");
	
	assert(module != nullptr);

	std::cout << "Model is loaded!" << std::endl;
	// Create a vector of inputs.
	std::vector<torch::jit::IValue> inputs;
	inputs.push_back(torch::ones({ 1, 3, 224, 224 }).cuda());

	// Execute the model and turn its output into a tensor.
	at::Tensor output = module->forward(inputs).toTensor();

	std::cout << output << std::endl;
	
	system("pause");
	
	return 0;
}

若遇到错误

error C4996: 'getenv': This function or variable may be unsafe.

在项目->属性->C/C+±>预处理器->预处理器定中添加 _CRT_SECURE_NO_WARNINGS 这个预定义。

本文参看了以下链接:
https://zhuanlan.zhihu.com/p/52806730
https://blog.csdn.net/qq_37569355/article/details/104246813

  • 7
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
好的,我可以回答你的问题。首先,你需要了解 ONNX 是什么。ONNX(Open Neural Network Exchange)是一种开放的格式,用于表示深度学习模型。ONNX 可以将模型从一个框架转换到另一个框架,从而使模型在不同的平台上运行。MNIST 手写字体识别是一个常见的示例,我们可以使用 ONNX 将该模型转换为 ONNX 格式,然后在 Windows使用 C++ 进行部署和调用。 以下是实现步骤: 1.首先,你需要安装 ONNX 工具包。可以从 ONNX 官网下载并安装 ONNX 工具包。 2.然后,你需要下载 MNIST 手写字体识别模型并将其转换为 ONNX 格式。你可以从 PyTorch 官网下载 MNIST 模型使用 PyTorch 转换器将其转换为 ONNX 格式。 3.接下来,在 Windows 系统中,你需要安装 Visual Studio 2017 或更高版本。你还需要安装 CMake 和 OpenCV 库。 4.然后,你需要下载 ONNX Runtime 并将其添加到项目中。可以从 ONNX Runtime 的 GitHub 仓库下载 ONNX Runtime。 5.接下来,创建一个新的 Visual Studio 项目,将 ONNX Runtime 添加到项目中,并将 MNIST 手写字体识别模型添加到项目中。 6.然后,你可以编写 C++ 代码来加载模型并进行推理。以下是一个简单的代码示例: ``` #include <iostream> #include <vector> #include <string> #include "opencv2/opencv.hpp" #include "onnxruntime_cxx_api.h" using namespace std; using namespace cv; using namespace Ort; int main() { // Load MNIST model Env::VarLogger logger = Env::Default().GetLogger(); SessionOptions session_options; session_options.SetIntraOpNumThreads(1); session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_BASIC); const char* model_path = "mnist.onnx"; Ort::Session session{Env::Default(), model_path, session_options}; Ort::AllocatorWithDefaultOptions allocator; // Load image Mat image = imread("test.png", IMREAD_GRAYSCALE); resize(image, image, Size(28, 28)); vector<float> input_data(image.ptr<float>(), image.ptr<float>() + 28 * 28); vector<const char*> input_node_names = {"Input3"}; vector<const char*> output_node_names = {"Plus214_Output_0"}; vector<int64_t> input_node_dims = {1, 1, 28, 28}; // Run inference vector<Ort::Value> inputs; inputs.emplace_back(Ort::Value::CreateTensor<float>(allocator, input_data.data(), input_data.size(), input_node_dims.data(), input_node_dims.size())); auto output_tensors = session.Run(Ort::RunOptions{nullptr}, input_node_names.data(), inputs.data(), inputs.size(), output_node_names.data(), output_node_names.size()); // Get results vector<float> output_data(output_tensors.front().GetTensorMutableData<float>(), output_tensors.front().GetTensorMutableData<float>() + 10); int max_index = distance(output_data.begin(), max_element(output_data.begin(), output_data.end())); cout << "Predicted digit: " << max_index << endl; return 0; } ``` 这段代码将加载 MNIST 手写字体识别模型,将图像转换为模型的输入格式,运行推理并输出预测结果。 7.最后,你可以构建并运行程序,测试部署和调用 ONNX 模型的效果。 希望这个示例可以帮助你实现 WindowsC++ 部署调用 ONNX 模型

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值