Win10 C++(Libtorch10.2 & Opencv)部署Pytorch1.9模型

电脑配置:Windows 10;显卡 1660Ti;Cuda 10.2;
Python 3.8;Pytorch 1.9;Libtorch 10.2(与Cuda版本一致)、Opencv343(版本无所谓)

一、下载路径:

将下载好的压缩包解压到自己的电脑文件夹下,以下配置文件夹更换成自己的。

二、C++配置:

Debug模型:

  1. C/C+±-常规–附加包含目录
D:\Software\Store\Libtorch102-debug\include\torch\csrc\api\include
D:\Software\Store\Libtorch102-debug\include
  1. 链接器–常规–附加库目录
D:\Software\Store\Libtorch102-debug\lib
  1. 链接器–输入–附加依赖项
torch.lib;torch_cuda.lib;caffe2_detectron_ops_gpu.lib;caffe2_module_test_dynamic.lib;torch_cpu.lib;c10_cuda.lib;caffe2_nvrtc.lib;mkldnn.lib;c10.lib;dnnl.lib;libprotocd.lib;libprotobufd.lib;libprotobuf-lited.lib;fbgemm.lib;asmjit.lib;cpuinfo.lib;clog.lib;
  1. 调试–环境
PATH=D:\Software\Store\Libtorch102-debug\lib;%PATH%
  1. 配置Opencv

  5.1. VC++目录–包含目录

D:\Software\Store\Opencv343\opencv\build\include
D:\Software\Store\Opencv343\opencv\build\include\opencv
D:\Software\Store\Opencv343\opencv\build\include\opencv2

  5.2. VC++目录–库目录

D:\Software\Store\Opencv343\opencv\build\x64\vc14\lib

  5.3. 链接器–输入–附加依赖项

opencv_world343d.lib

Release模型:

  1. C/C+±-常规–附加包含目录
D:\Software\Store\Libtorch102\include\torch\csrc\api\include
D:\Software\Store\Libtorch102\include
  1. 链接器–常规–附加库目录
D:\Software\Store\Libtorch102\lib
  1. 链接器–输入–附加依赖项
c10.lib;libprotobuf.lib;mkldnn.lib;torch.lib;torch_cpu.lib;
  1. 调试–环境
PATH=D:\Software\Store\Libtorch102\lib;%PATH%
  1. 配置Opencv

  5.1. VC++目录–包含目录

D:\Software\Store\Opencv343\opencv\build\include
D:\Software\Store\Opencv343\opencv\build\include\opencv
D:\Software\Store\Opencv343\opencv\build\include\opencv2

  5.2. VC++目录–库目录

D:\Software\Store\Opencv343\opencv\build\x64\vc14\lib

  5.3.链接器–输入–附加依赖项

opencv_world343.lib

三、Libtorch安装情况—测试代码:

  • Libitorch安装情况–测试代码
#include <torch/script.h> // One-stop header.
#include <iostream>
#include <memory>

int main() {
	// Deserialize the ScriptModule from a file using torch::jit::load().
	// 需提前将模型复制到项目文件夹下
	using torch::jit::script::Module;
	Module module = torch::jit::load("model_cpu.pt");		
    
	//assert(module != nullptr);
	assert(module.buffers().size() > 0);

	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();

	at::Tensor output = module.forward(inputs).toTensor();
	//torch::Tensor output = module.forward(std::move(inputs)).toTensor();

	std::cout << output.slice(/*dim=*/1, /*start=*/0, /*end=*/5) << '\n';
	while (1);
}
  • 将训练好的模型(简单的分类模型就可以)复制到项目文件夹下:(我的是 D:\Project\project1\,需改成自己的)项目文件下的模型如果手头没有模型,可以通过下面链接下载模型进行测试。
      链接:https://pan.baidu.com/s/1bT2qwlk-WHUz3wMQ3N6W4Q
      提取码:1111

  • 当出现以下界面,则证明部署成功。
    部署成功界面

  • 【P.S.】 Release模式和Debug模式下要采用不同的库,如Release下采用opencv343.lib;Debug下采用opencv343d.lib。


-------------------------------- 常见问题 --------------------------------

主要参考:☆https://blog.csdn.net/zzz_zzz12138/article/details/109138805

  • Q1、error :c2872 std 不明确的符号
    A1:C/C+±-语言–符合模式–否

  • Q2、由于找不到VCRUNTIME 140_1D.dll,无法继续执行代码
    A2:去https://www.dll-files.com/网站下载缺少的dll动态库,得到该文件的压缩包,然后解压把该.dll文件复制到C:\Windows\System32
      链接:https://pan.baidu.com/s/14NRFO_IZ4LhJppCGuuW7GQ
      提取码:1111

  • Q3、
    在这里插入图片描述
    A3:往往是路径读取错误,检查下路径中不可以出现中文字符 或 未采用双斜杠而是单斜杠

-------------------------------- GPU版本 C++部署 --------------------------------

以上为CPU版本部署,如需要GPU版本部署,需要修改少许地方。

#include <torch/torch.h> 
#include <torch/script.h> // One-stop header.
#include <iostream>
#include <memory>

int main() {
	// Deserialize the ScriptModule from a file using torch::jit::load().
	// 需提前将模型复制到项目文件夹下
	torch::jit::script::Module module;
	std::cout << torch::cuda::is_available() << std::endl;
	try {
		module = torch::jit::load("./model_gpu.pt");
		module.to(torch::kCUDA);		// set model to cpu / cuda mode
		module.eval();
		std::cout << "MODEL LOADED\n";
	}
	catch (const c10::Error& e) {
		std::cerr << "error loading the model\n";
	}

	//assert(module != nullptr);
	assert(module.buffers().size() > 0);

	std::cout << " ok\n";
	// Create a vector of inputs.
	torch::Tensor input_tensor = torch::ones({ 1, 3, 224, 224 });

	std::vector<torch::jit::IValue> inputs;
	inputs.push_back(input_tensor.to(torch::kCUDA));


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

	at::Tensor output = module.forward(inputs).toTensor();
	//torch::Tensor output = module.forward(std::move(inputs)).toTensor();

	std::cout << output.slice(/*dim=*/1, /*start=*/0, /*end=*/5) << '\n';
	while (1);
}
  • 【P.S.】
      Python中无需将模型转成GPU版本的 pt,因为CPU版本的 pt 在C++中Release模型下也可以调用CUDA,相反GPU版本的 pt 在C++中Debug模型还会报错。
      在Libtorch中:Debug 模型下,默认设备使用的是 CPU; Releas 模型下,根据用户设置使用 GPU / CPU。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值