1、首先进入pytorch官网下载对应版本的libtorch,如果你需要安装GPU版本那么在前面你需要提前在本地下载安装好相应版本的cuda环境,,安装cpu版本则不需要配置GPU。现在最新版本为1.12并且cuda是11.3官网上一般只提供最新版本 当前我们教程中用的版本是1.11,cuda是11.3 后续我会将所有东西上传到我的网盘里面欢迎大家下载。提取码:7y2e
2、下载完以后将其解压到本地 注意解压路径不要有中文路径不要有中文 建议解压到某个盘的根目录:
3、配置环境变量 找到libtorch 中的bin 目录和lib目录将其添加到path环境变量中
打开项目属性中 点击VC++目录
包含目录中添加
C:\libtorch\include\torch\csrc\api\include
C:\libtorch\include
并在库目录中添加:
然后在连接器 附加依赖项中 添加lib目录下所有lib结尾的文件
由于1.11版本有bug 所以需要在强制链接cuda 的lib 函数 因此需要在连接器的命令行中输入:
/INCLUDE:“?ignore_this_library_placeholder@@YAHXZ”
其他版本的如果cuda不能用也可以尝试配一下指令详情参加这篇博客
首先打开自己的jupyter notebook 插入以下代码进行测试和运行 ,注意让你pytorch的版本尽量和libtorch保持一致,运行后会训练生成一个pt权重文件
from torchvision.models import resnet34
import torch.nn.functional as F
import torch.nn as nn
import torch
import cv2
#read a picture, convert to [1,3,224,224] float tensor
image = cv2.imread("flower.jpg")
image = cv2.resize(image,(224,224))
input_tensor = torch.tensor(image).permute(2,0,1).unsqueeze(0).float()/225.0
#define resnet34 and load ImageNet pretrained
model = resnet34(pretrained=True)
model.eval()
#check outputs
output = model(input_tensor)
output = F.softmax(output,1)
print("predicted class:{}th,prob:{}".format(torch.argmax(output),output.max()))
#generate .pt
#使用GPU训练
#model=model.to(torch.device(0))
model.eval()
#使用GPU创建测试样例
#var=torch.ones((1,3,224,224)).to(torch.device(0))
var=torch.ones((1,3,224,224))
#traced_script_module = torch.jit.trace(model, var)
traced_script_module = torch.jit.trace(model,var)
traced_script_module.save("resnet341.pt")
然后下载这个.pt的经过脚本转换的权重文件自己创建一个visual studio项目 在这里除了需要按照我们这个来配置pytorch 还需要配置opencv 配置opencv的教程大家可以去看我上一篇博客,
我的文件夹大致是这样的大家将下载好的pt权重文件和测试图像放在项目文件里面
然后在visualstudio 中写下如下代码 路径需要同学们自己根据自己路径来进行更改
#include
#include
#include
#include
#include
using namespace std;
using namespace cv;
int main()
{
//定义使用cuda
auto device = torch::Device(torch::kCUDA,0);
//torch::Device device(torch::kCPU);
//读取图片
auto image = imread("C:\\Users\\Administrator\\Desktop\\C++练习\\opencv\\opencv\\flower.jpg");
imshow("Image", image);
imwrite("test.jpg", image);
waitKey(0);
//缩放至指定大小
resize(image, image, 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("C:\\Users\\Administrator\\Desktop\\C++练习\\opencv\\opencv\\resnet34.pt"); //cpu版本
//auto model = torch::jit::load("C:\\Users\\Administrator\\Desktop\\C++练习\\opencv\\opencv\\resnet341.pt");
model.to(device);
model.eval();
//前向传播
auto output = model.forward({ input_tensor.to(device) }).toTensor();
output = torch::softmax(output, 1);
cout << "模型预测结果为第" << torch::argmax(output) << "类,置信度为" << output.max() << endl;
waitKey(0);