C++部署pytorch训练的模型如何设置batch_size

最近在用libtorch部署pytorch训练好的模型,由于是第一次使用libtorch,中间遇到不少问题,这次主要记录的是模型推理时如何设置batch_size>1,即一次推理多张图片,网上的教程大多都是推理1张图片(batch_size=1),同时多张图片推理完之后,如何将输出的tensor转换为cv::Mat类型也是花费了不少时间解决,也记录一下。

一、数据读取、预处理

这部分是数据读取、处理及模型的加载,网上教程很多,这里只做记录,不多做解释。

std::string input_img="";
std::string model_path="";
//读取图片
cv::Mat img = cv::imread(input_img);
cv::cvtColor(img,img,cv::COLOR_BGR2RGB);

//加载模型
torch::NoGradGuard no_grad;
torch::jit::script::Module module=torch::jit::load(model_path);
module.to(device);
module.eval();

//mat转tensor
torch::Tensor img_tensor = torch::from_blob(img.data,{1,img.rows,img.cols,3},torch::kByte);
img_tensor = img_tensor.permute({0,3,1,2});
img_tensor = img_tensor.toType(torch::kFloat);

//归一化
img_tensor = img_tensor.div(255);
img_tensor[0][0]=img_tensor[0][0].sub_(0.485).div_(0.229);
img_tensor[0][1]=img_tensor[0][1].sub_(0.456).div_(0.224);
img_tensor[0][2]=img_tensor[0][2].sub_(0.406).div_(0.225);
img_tensor = img_tensor.to(torch::kCUDA);

二、输入batch_size=1时的推理

batch_size=1时的推理过程按照官方给的步骤操作即可。

1、batch_size=1推理

torch::Tensor output_tensor=module.forward({img_tensor}).toTensor();
output_tensor=output_tensor.squeeze(1); // [B,C,H,W]->[B,H,W]
output_tensor=output_tensor.round().to(torch::KU8);

2、转换输出的结果

cv::Mat result_mat(img.rows,img.cols,CV_8U,output_tensor.data_ptr());

三、输入batch_size>1时的推理

这次主要是记录怎么同时推理多张图片,解决方法来自Stack Overflow上的问题How to give a batch of frames to the model in pytorch c++ api?
在这里插入图片描述

1、batch_size=5推理

为了模拟多张图片,我这里将一个img_tensor重复输入了5次。

std::vector<torch::Tensor> tensor_vec;
tensor_vec.push_back(img_tensor);
tensor_vec.push_back(img_tensor);
tensor_vec.push_back(img_tensor);
tensor_vec.push_back(img_tensor);
tensor_vec.push_back(img_tensor);

torch::TensorList tensor_list{tensor_vec};
torch::Tensor batch_of_tensors =torch::cat(tensor_list);

torch::Tensor output_tensor=module.forward({batch_of_tensors}).toTensor();
output_tensor=output_tensor.squeeze(1); // [B,C,H,W]->[B,H,W]
output_tensor=output_tensor.round().to(torch::KU8);

2、推理结果转换为cv::Mat

解决方法来自Pytorch官方社区的一个提问Libtorch C++ convert a Tensor to cv:Mat (single channel,这个问题下的一个回答给了解决思路。
在这里插入图片描述
主要就是分channel来转换。

std::Vector<cv::Mat> result_mat_vec;
for(size_t k=0; k<5;K++)
{
	cv::Mat result_mat_temp(512,512,CV_8U,output_tensor[k].data_ptr());
	cv::Mat result_mat = result_mat_temp.clone();
	result_mat_vec.push_back(result_mat);
}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GHZhao_GIS_RS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值