配置环境:
 –系统:Win10
 –开发工具:VS2019
 –opencv版本:3.4.14
 –torch版本:1.4
 –torchvision版本:0.5.0
主要步骤:
 –1.安装libtorch
 –2.python版torch权重文件生成(应用于后续实验)
 –3.VS中libtorch配置
第一部分:安装libtorch
 (1)直接上pytorch官网下载libtorch,其中libtorch尽量和环境下的torch版本一致;如下图所示,可根据自己下载的libtorch版本更改红线中版本号即可,本文主要是下载1.4.0的release版本;
 
 
 第二部分:python版torch权重文件生成(应用于后续实验)
 (1)使用以下代码生成 “.pt” 权重文件,以ResNet34分类网络为例,代码如下所示:
 运行以下代码,在本地获取 "resnet34.pt"权重文件,应用于后续实验;
from torchvision.models import resnet34
import torch.nn.functional as F
import torch.nn as nn
import torch
import cv2
#读取一张图片,并转换成[1,3,224,224]的float张量并归一化
image = cv2.imread("dog.jpg")
image = cv2.resize(image,(224,224))
input_tensor = torch.tensor(image).permute(2,0,1).unsqueeze(0).float()/225.0
#定义并加载resnet34模型在imagenet预训练的权重
model = resnet34(pretrained=True)
model.eval()
#查看模型预测该付图的结果
output = model(input_tensor)
output = F.softmax(output,1)
print("模型预测结果为第{}类,置信度为{}".format(torch.argmax(output),output.max()))
#生成pt模型,按照官网来即可
model=model.to(torch.device("cpu"))
model.eval()
var=torch.ones((1,3,224,224))
traced_script_module = torch.jit.trace(model, var)
traced_script_module.save("resnet34.pt")
 
第三部分:VS中libtorch配置
 (1)VS中Opencv配置可参考博客
 (2)打开VS2019->新建空白c++项目->右键新建项 “main.cpp”;同时,在项目的管理器中设置项目的编译为Release,平台选择x64;
 (3)项目右键属性,配置 “VC++目录” 和 “链接器”
 ①在配置"VC++目录"中:
 – 选择包含目录:添加libtorch文件路径:“D:\vs_config\libtorch_release\include” 和 “D:\vs_config\libtorch_release\include\torch\csrc\api\include”;
 – 选择库目录:添加libtorch文件路径 “D:\vs_config\libtorch_release\lib”;
 ②配置链接器,“链接器->输入->附加依赖项”:
 将libtorch路径 “D:\vs_config\libtorch_release\lib” 下的 “.lib” 文件都加入 “附加依赖项”;
 
 
 (4)动态链接库dll文件放置
 将libtorch路径 “D:\vs_config\libtorch_release\lib” 下的 “.dll” 文件直接复制到VS2019项目的执行目录中;
 另外,也可以直接libtorch中的lib文件夹路径添加到path环境变量中;
 
 
 (5)测试
 测试代码如下:
#include<opencv2/opencv.hpp>
#include <torch/torch.h>
#include <torch/script.h> 
int main()
{
	//定义使用cuda
	//auto device = torch::Device(torch::kCUDA, 0);
	auto device = torch::Device(torch::kCPU);
	//读取图片
	auto image = cv::imread("E:/C++_workplace/libtorch_epx/demo/dog.jpg");
	//缩放至指定大小
	cv::resize(image, image, cv::Size(224, 224));
	//转成张量
	auto input_tensor = torch::from_blob(image.data, { image.rows, image.cols, 3 }, torch::kByte).permute({ 2, 0, 1 }).unsqueeze(0).to(torch::kFloat32) / 225.0;
	//加载模型
	auto model = torch::jit::load("E:/C++_workplace/libtorch_epx/demo/resnet34.pt");
	model.to(device);
	model.eval();
	//前向传播
	auto output = model.forward({ input_tensor.to(device) }).toTensor();
	output = torch::softmax(output, 1);
	std::cout << "模型预测结果为第" << torch::argmax(output) << "类,置信度为" << output.max() << std::endl;
	return 0;
}
 
测试结果:
 
 本文主要参考博客
 欢迎指正!









