pytorch 部署 torchscript
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("flower.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")
c++ libtorch 调用 pytorch 模型
cpu 版测试成功,gpu 可能是 libtorch gpu 版本不对,后期 再研究吧
#include<opencv2/opencv.hpp> #include <torch/torch.h> #include <torch/script.h> int main_succ1() { //定义使用cuda bool s = torch::cuda::is_available; std::cout << s << std::endl; auto device = torch::Device(torch::kCUDA, 0); //读取图片 auto image = cv::imread("C:/Users/yansh/source/repos/data/2.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; //input_tensor.to(device); //加载模型 auto model = torch::jit::load("C:/Users/yansh/source/repos/data/resnet34.pt"); //model.to(device); //model.eval(); //前向传播 auto output = model.forward({input_tensor}).toTensor(); output = torch::softmax(output, 1); std::cout << "模型预测结果为第" << torch::argmax(output) << "类,置信度为" << output.max() << std::endl; system("pause"); return 0; }
测试代码2
int main() { //torch::Device device(torch::kCUDA); auto device = torch::Device(torch::kCUDA, 0); // Deserialize the ScriptModule from a file using torch::jit::load() torch::jit::script::Module module = torch::jit::load("C:/Users/yansh/source/repos/data/resnet34.pt"); //module.to(device); // Create a vector of inputs std::vector<torch::jit::IValue> inputs; inputs.push_back(torch::ones({ 1, 3, 224, 224 })); //.to(device) // Exectute the model at::Tensor output = module.forward(inputs).toTensor(); std::cout << output.slice(/*dims=*/1, /*start=*/0, /*end=*/5) << '\n'; std::cout << "ok\n"; system("pause"); }
参考资料:
https://blog.csdn.net/AllentDan/article/details/115313683 pytorch部署torchscript篇
https://zhuanlan.zhihu.com/p/363611229 Ubuntu 20.04下c++ libtorch gpu配置与运行