RealBasicVSR模型转成ONNX以及JIT并用c++推理

本文详细介绍了如何将RealBasicVSR模型转换为ONNX格式,并在C++环境中进行推理。首先,创建conda环境,安装PyTorch、mim、mmcv-full和mmedit。接着,下载模型源码和文件,编写转换脚本,解决转换过程中遇到的问题。成功转换后,使用ONNX Runtime进行C++推理。此外,还探讨了将模型转为JIT格式,通过libtorch进行推理的过程。
摘要由CSDN通过智能技术生成

一. RealBasicVSR模型转成ONNX

安装RealBasicVSR的环境

1. 新建一个conda环境

conda create -n RealBasicVSR_to_ONNX  python=3.8 -y
conda activate RealBasicVSR_to_ONNX

2. 安装pytorch(官网上选择合适的版本)版本太低会有问题

conda install pytorch==1.12.1 torchvision==0.13.1 torchaudio==0.12.1 cudatoolkit=11.6 -c pytorch -c conda-forge

3. 安装 mim 和 mmcv-full

pip install openmim
mim install mmcv-full

4. 安装 mmedit

pip install mmedit

下载RealBasicVSR源码

git clone https://github.com/ckkelvinchan/RealBasicVSR.git

下载模型文件

模型文件下载 (Dropbox / Google Drive / OneDrive) ,随便选一个渠道下载就行

cd RealBasicVSR
#然后新建文件夹model
将模型文件放在model文件夹下

写一个模型转换的脚步

import cv2
import mmcv
import numpy as np
import torch
from mmcv.runner import load_checkpoint
from mmedit.core import tensor2img

from realbasicvsr.models.builder import build_model

def init_model(config, checkpoint=None):
    if isinstance(config, str):
        config = mmcv.Config.fromfile(config)
    elif not isinstance(config, mmcv.Config):
        raise TypeError('config must be a filename or Config object, '
                        f'but got {
     type(config)}')
    config.model.pretrained = None
    config.test_cfg.metrics = None
    model = build_model(config.model, test_cfg=config.test_cfg)
    if checkpoint is not None:
        checkpoint = load_checkpoint(model, checkpoint)

    model.cfg = config  # save the config in the model for convenience
    model.eval()
    return model


def main():
    model = init_model("./configs/realbasicvsr_x4.py","./model/RealBasicVSR_x4.pth")
    src = cv2.imread("./data/img/test1.png")
    src = torch.from_numpy(src / 255.).permute(2, 0, 1).float()
    src = src.unsqueeze(0)
    input_arg = torch.stack([src], dim=1)

    torch.onnx.export(model,
        input_arg,
        'realbasicvsr.onnx',
        training= True,
        input_names= ['input'],
        output_names=['output'],
        opset_version=11,
        dynamic_axes={
   'input' : {
   0 : 'batch_size', 3 : 'w', 4 : 'h'}, 'output' : {
   0 : 'batch_size', 3 : 'dstw', 4 : 'dsth'}})


if __name__ == '__main__':
    main()

这里报错:

ValueError: SRGAN model does not support `forward_train` function.

直接将这个test_mode默认值改为Ture,让程序能走下去就行了。
在这里插入图片描述

测试生成的模型

这里已经得到了 realbasicvsr.onnx 模型文件了.

import onnxruntime as ort
import numpy as np
import onnx
import cv2


def main():
    onnx_model = onnx.load_model("./realbasicvsr.onnx")
    onnxstrongmodel = onnx_model.SerializeToString()
    sess = ort.InferenceSession(onnxstrongmodel)
    
    providers = ['CPUExecutionProvider']
    options = [{
   }]
    is_cuda_available = ort.get_device() == 'GPU'
    if is_cuda_available:
        providers.insert(0, 'CUDAExecutionProvider')
        options.insert(0, {
   'device_id': 0})
    sess.set_providers(providers, options)

    input_name = sess.get_inputs()[0].name
    output_name = sess.get_outputs()[1].name
    print(sess.get_inputs()[0])
    print(sess.get_outputs()[0])
    print(sess.get_outputs()[0].shape)
    print(sess.get_inputs()[0].shape)

    img = cv2.imread("./data/img/test1.png")
    img = np.expand_dims((img/255.0).astype(np.float32).transpose(2,0,1), axis=0)
    imgs = np.array([img])
    print(imgs.shape)
    print(imgs)
    output = sess.run([output_name], {
   input_name : imgs})

    print(output)

    print(output[0].shape)
    output = np.clip(output, 0, 1)

    res = output[0][0][0].transpose(1, 2, 0)
    cv2.imwrite("./testout.png", (res * 255).astype(np.uint8))

if __name__ == '__main__':
    main()

至此模型转换部分就成功完成了

用ONNX Runtime c++推理

根据cuda版本选择合适的onnxruntime版本

下载onnx runtime的运行环境 onnxruntime
我这里下载这个:
在这里插入图片描述

#include <iostream>
#include <assert.h>
#include <vector>
#include <onnxruntime_cxx_api.h>
#include <opencv2/opencv.hpp>

class ONNX_RealBasicVSR{
   
  public:
    ONNX_RealBasicVSR():session(nullptr){
   };
    virtual ~ONNX_RealBasicVSR() = default;
    /*初始化
    * @param model_path 模型
    * @param gpu_id 选择用那块GPU
    */
    void Init(const char * model_path,int gpu_id = 0);

    /**执行模型推理
     * @param src : 输入图
     * @param inputid : 输入id
     * @param outputid : 输出的id
     * @return 输出结果图
    */
    cv::Mat Run(cv::Mat src,unsigned inputid = 0,unsigned outputid = 0,bool show_log = false);

  private:
    /*获取模型的inputname 或者 outputname
    * @param input_or_output  选择要获取的是input还是output
    * @param id 选择要返回的是第几个name
    * @param show_log 是否打印信息
    * @return 返回name
    */
    std::string GetInputOrOutputName(std::string input_or_output = "input",unsigned id = 0,bool show_
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Onnxruntime是一个用于推理和训练的开源深度学习库,它支持多种硬件平台和编程语言,包括C++。要在C++中使用Onnxruntime进行半精度推理,你需要按照以下步骤进行操作: 1. 首先,确保你已经安装了Onnxruntime库。你可以从Onnxruntime的官方GitHub页面下载并编译源代码,或者使用预编译的二进制文件。 2. 在你的C++项目中,包含Onnxruntime的头文件和库文件。你可以在编译选项中添加Onnxruntime的头文件路径和库文件路径,或者将它们复制到你的项目目录中。 3. 加载和初始化模型。在C++中,你可以使用onnxruntime::InferenceSession类来加载和运行模型。使用onnxruntime::SessionOptions类可以设置推理选项,包括精度设置。 4. 设置输入数据。使用onnxruntime::RunOptions类可以设置运行选项,包括精度设置。使用onnxruntime::Value类可以创建和设置输入数据。 5. 执行推理。调用onnxruntime::InferenceSession的Run函数来执行推理。在Run函数中,你可以指定输入和输出张量的名称,以及精度设置。 6. 获取输出结果。使用onnxruntime::Value类可以获取输出数据。 7. 清理资源。在推理完成后,记得释放所有分配的资源。 需要注意的是,在进行半精度推理时,你需要确保模型已经经过了半精度训练,并且Onnxruntime版本支持使用半精度进行推理。你可以查阅Onnxruntime的官方文档,了解更多关于在C++中使用Onnxruntime进行推理的详细信息和示例代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值