Libtorch模型部署指南

前言:libtorch是pytorch原生支持的生态,理论上只要是pytorch训练的模型都能用libtorch部署,因为他们共用相同的c++代码。
主要参考:Pytorch官网

一. PyTorch模型转为Troch Script

import torch
import torchvision

# An instance of your model.
model = torchvision.models.resnet18()

script_module = torch.jit.script(model)

script_module.save("my_resnet_model.pt")

二. 用c++进行模型推理

#include <torch/script.h>
#include <iostream>
#include <vector>

int main()
{
    // 加载模型
    torch::jit::script::Module module;
    module = torch::jit::load(model_path, torch::kCUDA);
    module.to(torch::kCUDA);
    module.eval();
    
    // 模型推理
    torch::NoGradGuard no_guard;
    torch::jit::getProfilingMode() = false;
    std::vector<torch::jit::IValue> inputs;
    inputs.push_back(torch::ones({1, 3, 224, 224}));
    at::Tensor output = module.forward(inputs).toTensor();
    std::cout << output.slice(/*dim=*/1, /*start=*/0, /*end=*/5) << '\n';  
}

三. cmake构建工程

cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(custom_ops)
list(APPEND CMAKE_PREFIX_PATH /home/guopei/workspace/table_libtorch/libtorch_learning/libtorch)
find_package(Torch REQUIRED)
add_executable(example-app example-app.cpp)
target_link_libraries(example-app "${TORCH_LIBRARIES}")
set_property(TARGET example-app PROPERTY CXX_STANDARD 14)

四. 转模型可能遇到的问题

1. 显示指定类型

错误栈:
在这里插入图片描述
解析:这是由于模型转换过程中默认输入变量为 torch.Tensor 因此需要显示申明其为List[torch.Tensor]
解决方法:

from typing import List 
def forward(self, features:List[torch.Tensor], gt=None, masks=None, training=False): 

五. 模型推理可能遇到的问题

1. c++ model forword有多个返回值

参考:c++ load pytorch 的数据转换
我的实现:

void My_example::inference(cv::Mat &resize_img) {
    torch::Tensor tensor = torch::from_blob(resize_img.data, {1, 640, 640,3}, torch::kFloat);
    tensor = tensor.permute({0, 3, 1, 2});
    tensor = tensor.add(-1);
    tensor = tensor.to(torch::kCUDA);
    std::vector<torch::jit::IValue>inputs;
    inputs.push_back(tensor);

    auto outputs = this->module.forward(inputs).toTuple();
    this->out_0 = outputs->elements()[0].toTensor().squeeze();
    this->out_1 = outputs->elements()[1].toTensor().squeeze();
    this->out_2 = outputs->elements()[2].toTensor().squeeze();
}

2. 图片的预处理操作尽量放到gpu中处理(加快推理速度)

// 修改前
img.convertTo(img, CV_32FC1, 1.0/255, -0.5);

// 修改后
img.convertTo(img, CV_32FC1);
tensort.mut(1.0/255).add(-0.5)

参考:
TorchScript使用的注意事项和常见错误
c++ 部署libtorch时常用操作API

每天进步一点,加油!!!
欢迎技术交流:
在这里插入图片描述

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值