配置环境:
–系统: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;
}
测试结果:
本文主要参考博客
欢迎指正!