Model Optimization——常用深度学习模型转换脚本

简介

​ 我们都知道目前流行的深度学习框架有很多种,例如Pytorch、TensorFlow、Caffe等,在实际训练和部署的过程中,常常会接触到不同框架模型之间的转换,大多数时候这些并不复杂,只需要写一些简短的脚本就能够完成。而像OpenVINO中IR这样的特殊模型,我们也可以通过其提供的自带脚本进行转换,下面简单介绍常用的模型之间转换的脚本和方法。

Pth模型 转 ONNX模型

import torch
import argparse

parser = argparse.ArgumentParser()


# the function about making the ".pth" model trained by pytorch convert to the "ONNX" model
def convert_model_to_ONNX(input_pth_model, output_ONNX_model, model_name):
    dummy_input = torch.randn(1, 1, 64, 64)

    model = torch.load(input_pth_model, map_location='cpu')

    input_names = ["input"]
    output_names = ["output"]

    model.eval()

    torch.onnx.export(model, dummy_input, output_ONNX_model + '/' + model_name, verbose=True, input_names=input_names,output_names=output_names)


if __name__ == '__main__':
    parser.add_argument("--input", type=str, help='input pth model path')
    parser.add_argument("--output", type=str, help='output onnx model path')
    parser.add_argument("--name", type=str, help='output onnx model filename')
    opt = parser.parse_args()
    # call the function named "convert_model_to_ONNX".
    convert_model_to_ONNX(opt.input, opt.output, opt.name)

Pth模型 转 Pt模型

import torch
from collections import OrderedDict
import pickle
import os
import sys

sys.path.insert(0, 'model dir')
device = 'cuda' if torch.cuda.is_available() else 'cpu'


if __name__ == '__main__':
    modelfile = 'yolov5s.pt'
    utl_model = torch.load('your output dir/'+modelfile)
    utl_param = utl_model['model'].model
    torch.save(utl_param.state_dict(), os.path.splitext(
        modelfile)[0] + '_param.pth')
    own_state = utl_param.state_dict()
    print(len(own_state))

    numpy_param = OrderedDict()
    for name in own_state:
        numpy_param[name] = own_state[name].data.cpu().numpy()
    print(len(numpy_param))
    with open(os.path.splitext(modelfile)[0] + '_numpy_param.pkl', 'wb') as fw:
        pickle.dump(numpy_param, fw)

Pt模型 转 ONNX模型

​ 使用YOLOv5源码中的export.py脚本,可以很容易地将yolo训练出的pt模型转化成通用的onnx模型。

​ 在yolov5的models文件夹下

python3 export.py --weights 模型路径 --img-size 输入层尺寸

​ 即可直接将pt模型转化成onnx模型。

ONNX模型 转 IR模型

​ OpenVINO推理加速使用的是一种中间表示(IR)模型,其自带的模型优化器中也提供了ONNX模型转换成IR模型的脚本,在deployment_tools/model_optimizer路径下

运行模型转换脚本

cd <INSTALL_DIR>/deployment_tools/model_optimizer/
python3 mo.py --input_model <INPUT_MODEL>.onnx  --output_dir <OUTPUT_MODEL_DIR> --model_name <OUTPUT_MODEL_NAME>

​ 出现SUCCESS则表示转换成功,在对应的路径下会生成.xml和.bin文件,在任何时候,你都需要将这两个模型文件放在统一路径下。

参考

Converting a Model to Intermediate Representation (IR)

后续

 喜欢的话可以关注一下我的公众号技术开发小圈,尤其是对深度学习以及计算机视觉有兴趣的朋友,我会把相关的源码以及更多资料发在上面,希望可以帮助到新入门的大家!
在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Rosen.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值