Libtorch部署与教程

vs2015编译错误解决:/jit/pickler.h(34): error C2059: 语法错误:“常量” ;error C3805: “常量”: 意外标记,应输入“}”或者“,

libtorch环境搭建、生成库文件、测试

利用Pytorch的C++前端(libtorch)读取预训练权重并进行预测

tensorFromBlob”: 不是“at::DeprecatedTypeProperties”的成员

(1)libtorch找不到GPU

通过python import torch时,返回为True。所以cuda、cudnn和torch都没问题。
在“属性 --> 链接器 --> 命令行 --> 其他选项”中添加:

/INCLUDE:?warp_size@cuda@at@@YAHXZ

**加粗样式**

(2)tensor、mat互转

方法一:
cv::Mat resultImg(960, 960, CV_8U , out_byte.data_ptr());#这里遇到过报错,out_byte前面数据处理完,在这里处理可以会报错,512尺寸没问题,1024不知为何报错了
方法二:
std::memcpy((void*)resultImg.data, out_byte.data_ptr(), out_byte.numel());
torch::Tensor tensor_image = torch::from_blob(image.data, { 1, image_h, image_w, 3 }, torch::kByte).to(device_type);
tensor_image = tensor_image.permute({ 0, 3, 1, 2 }).toType(torch::kFloat);
module.eval();
torch::NoGradGuard no_grad;
torch::Tensor out_tensor = module.forward({ tensor_image }).toTensor();

矩阵和tensor相互转换

(3)返回三通道用到contiguous()

torch::Tensor out = out_tensor.squeeze().detach().to(torch::kCPU);
torch::Tensor out_byte = out.clamp(0, 255).toType(torch::kUInt8).permute({ 1, 2, 0 }).contiguous();
cv::Mat resultImg(960, 960, CV_8UC3, out_byte.data_ptr());
cv::Mat resultImg_(960, 960, CV_8UC3);
cv::cvtColor(resultImg, resultImg_, CV_RGB2BGR);

返回三通道tensor不用contiguous()会出现下面的重复图像
在这里插入图片描述

(4)C++不通过libtorch调用pytorch模型

关键是Mat图像转化为PyObject对象
Windows下C++调用Python版的Pytorch模型

(5)tensor类型转换

# tensor转float
auto x = at::tensor(1.0);
float x_val = x.item().toFloat();#法一
float fmax_1 = max_1.item<float>();#法二
# float转tensor
torch::Tensor b = torch::tensor(0.33 )
cx.toType(torch::kFloat);

(6)libtorch教程

c++ 部署libtorch时常用操作API
6.libtorch张量的切片与索引
c++ 部署libtorch 时对Tensor块的常用操作API
libtorch (pytorch c++) 教程(二)
libtorch 常用api函数示例(史上最全、最详细)

(7)libtorch切片

torch::select()只可以取一个索引,内存共享
torch::index_select()可以取好几个索引,没有内存共享。
torch::slice()获取tensor数据块中roi区域的数据,不复制,内存共享。
torch::index通过索引获取张量的值
torch::index_put_通过切片或索引改变张量的值
torch::masked_select根据条件选出指定的元素值

a[2,2]等价 a.index({ 2, 2 })
a[…,2]等价 a.index({ “…”, 2 })
a[:,::2]等价 a.index({ Slice(None), Slice(None,None,2)})
a[1::2,:]等价 a.index({ Slice(1,None, 2),Slice(None) })
a[1:3,:]等价 a.index({ Slice(1,3),Slice(None) })

(8)libtorch张量的合并与拆分

在这里插入图片描述

(9) libtorch张量基本数值类型

在这里插入图片描述

#include <torch/torch.h>
#include <torch/script.h>
#include <opencv2/opencv.hpp>
int main() {
	auto a = torch::tensor({ {1,2,3},{-4,-5,-6} }, torch::kI8);
	auto b = torch::tensor({ {1,2,3},{4,5,6} }, torch::kU8);
	auto c = torch::tensor({ 1.2,1.3,20.159 }, torch::kF32); //kF32是kFloat32缩写
	auto d = torch::tensor({ 0,1,2 }, torch::kBool);

	std::cout << "a:\n" << a << std::endl;
	std::cout << "b:\n" << b << std::endl;
	std::cout << "c:\n" << c << std::endl; 
	std::cout << "d:\n" << d << std::endl;
	return 0;
}

(10)模型转换

pytorch转libtorch,全网最全资料

  • 方法一:Tracing
    缺点是如果模型中存在控制流比如if-else语句,一组输入只能遍历一个分支,这种情况下就没办法完整的把模型信息记录下来。
  • 方法二:Scripting

(11)libtorch组成

三大命名空间:at,torch与c10。at(ATen)负责声明和定义Tensor运算,是最常用到的命名空间,c10是 ATen 的基础,包含了PyTorch的核心抽象、Tensor和Storage数据结构的实际实现。torch命名空间下定义的 Tensor 相比于ATen 增加自动求导功能。

  • C10,来自于Caffe Tensor Library的缩写。这里存放的都是最基础的Tensor库的代码,可以运行在服务端和移动端。PyTorch目前正在将代码从ATen/core目录下迁移到C10中。
  • ATen,来自于 A TENsor library for C++11的缩写,ATen部分有大量的代码是来声明和定义Tensor运算相关的逻辑的
  • Torch

(12) .mul()和.mul_(),.exp()和.exp_()区别

所有带"——"都是inplace的 意思就是操作后 原数也会改动
不带 “——” 的 只在操作适时候改变数据,操作结束后数据变回原状

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
libtorch 是一个用于C++的PyTorch C++前端库,它提供了一个用于构建、训练和部署深度学习模型的高级API。而YOLO(You Only Look Once)是一种流行的目标检测算法,能够在图像中实时地检测和定位多个目标。部署 YOLO 模型需要以下步骤: 1. 安装 PyTorchlibtorch:首先,需要安装 PyTorchlibtorchPyTorch 用于训练模型,而 libtorch 用于将训练好的模型部署到 C++ 环境中。 2. 训练 YOLO 模型:在 PyTorch 中,可以使用现成的 YOLO 模型实现,也可以自定义模型。通过加载训练数据集,定义模型结构并训练模型,可以得到一个经过训练的 YOLO 模型。 3. 导出模型:在训练完成后,可以通过 PyTorch 提供的导出功能将模型导出为 ONNX 格式或 TorchScript 格式,以便在 C++ 环境中使用。 4. 使用 libtorch 进行部署:在 C++ 程序中,使用 libtorch 库加载导出的模型,并编写代码进行图像的预处理和后处理。通过调用模型的前向传播函数,可以输入图像并获取模型的输出,即目标检测的结果。 5. 图像的预处理和后处理:在图像的预处理过程中,需要将图像转换为模型可接受的输入格式,例如将图像进行缩放、归一化和通道转换等操作。在模型的输出结果中,会包含被检测到的目标的位置和类别信息,可以通过解析输出结果并进行后处理,如非最大值抑制和边界框绘制等,来得到最终的目标检测结果。 综上所述,部署 YOLO 模型需要使用 libtorch 进行模型的加载和前向传播,同时编写相关的预处理和后处理代码,以实现目标检测任务的部署

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值