Pytorch转onnx、torchscript方式


Posted in Python onMay 25, 2020

前言

本文将介绍如何使用ONNX将PyTorch中训练好的模型(.pt、.pth)型转换为ONNX格式,然后将其加载到Caffe2中。需要安装好onnx和Caffe2。

PyTorch及ONNX环境准备

为了正常运行ONNX,我们需要安装最新的Pytorch,你可以选择源码安装:

git clone --recursive https://github.com/pytorch/pytorch
cd pytorch
mkdir build && cd build
sudo cmake .. -DPYTHON_INCLUDE_DIR=/usr/include/python3.6 -DUSE_MPI=OFF
make install
export PYTHONPATH=$PYTHONPATH:/opt/pytorch/build

其中 "/opt/pytorch/build"是前面build pytorch的目。

or conda安装

conda install pytorch torchvision -c pytorch

安装ONNX的库

conda install -c conda-forge onnx

onnx-caffe2 安装

pip3 install onnx-caffe2

Pytorch模型转onnx

在PyTorch中导出模型通过跟踪工作。要导出模型,请调用torch.onnx.export()函数。这将执行模型,记录运算符用于计算输出的轨迹。因为_export运行模型,我们需要提供输入张量x。

这个张量的值并不重要; 它可以是图像或随机张量,只要它是正确的大小。更多详细信息,请查看torch.onnx documentation文档。

# 输入模型
example = torch.randn(batch_size, 1, 224, 224, requires_grad=True)

# 导出模型
torch_out = torch_out = torch.onnx.export(model, # model being run
    example, # model input (or a tuple for multiple inputs)
    "peleeNet.onnx",
 verbose=False, # store the trained parameter weights inside the model file
 training=False,
 do_constant_folding=True,
 input_names=['input'],
 output_names=['output'])

其中torch_out是执行模型后的输出,通常以忽略此输出。转换得到onnx后可以使用OpenCV的 cv::dnn::readNetFromONNX or cv::dnn::readNet进行模型加载推理了。

还可以进一步将onnx模型转换为ncnn进而部署到移动端。这就需要ncnn的onnx2ncnn工具了.

编译ncnn源码,生成 onnx2ncnn。

其中onnx转换模型时有一些冗余,可以使用用工具简化一些onnx模型。

pip3 install onnx-simplifier

简化onnx模型

python3 -m onnxsim pnet.onnx pnet-sim.onnx

转换成ncnn

onnx2ncnn pnet-sim.onnx pnet.param pnet.bin

ncnn 加载模型做推理

Pytorch模型转torch script

pytorch 加入libtorch前端处理,集体步骤为:

Pytorch转onnx、torchscript方式

以mtcnn pnet为例

# convert pytorch model to torch script
# An example input you would normally provide to your model's forward() method.
example = torch.rand(1, 3, 12, 12).to(device)
# Use torch.jit.trace to generate a torch.jit.ScriptModule via tracing.
traced_script_module = torch.jit.trace(pnet, example)
# Save traced model
traced_script_module.save("pnet_model_final.pth")

C++调用如下所示:

#include <torch/script.h> // One-stop header.
#include <iostream>
#include <memory>
int main(int argc, const char* argv[]) 
{
 if (argc != 2) 
 {
 std::cerr << "usage: example-app <path-to-exported-script-module>\n";
 return -1;
 }

 // Deserialize the ScriptModule from a file using torch::jit::load().
 std::shared_ptr<torch::jit::script::Module> module = torch::jit::load(argv[1]);

 assert(module != nullptr);
 std::cout << "ok\n";
}
Python 相关文章推荐
python缩进区别分析
Feb 15 Python
详解Django中的form库的使用
Jul 18 Python
python2 与python3的print区别小结
Jan 16 Python
python删除不需要的python文件方法
Apr 24 Python
django主动抛出403异常的方法详解
Jan 04 Python
python scatter散点图用循环分类法加图例
Mar 19 Python
python处理大日志文件
Jul 23 Python
pytorch多GPU并行运算的实现
Sep 27 Python
python 协程 gevent原理与用法分析
Nov 22 Python
Python3如何在服务器打印资产信息
Aug 27 Python
Python lxml库的简单介绍及基本使用讲解
Dec 22 Python
使用Django的JsonResponse返回数据的实现
Jan 15 Python
使用pandas库对csv文件进行筛选保存
May 25 #Python
pytorch中 gpu与gpu、gpu与cpu 在load时相互转化操作
May 25 #Python
基于pandas向csv添加新的行和列
May 25 #Python
Python如何把十进制数转换成ip地址
May 25 #Python
tensorflow模型转ncnn的操作方式
May 25 #Python
MxNet预训练模型到Pytorch模型的转换方式
May 25 #Python
浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式
May 25 #Python
You might like
php中的MVC模式运用技巧
2007/05/03 PHP
浅析ThinkPHP中的pathinfo模式和URL重写
2014/01/06 PHP
php批量删除超链接的实现方法
2015/10/19 PHP
100行PHP代码实现socks5代理服务器
2016/04/28 PHP
浅析php如何实现App常用的秒发功能
2016/08/03 PHP
PHP会话控制实例分析
2016/12/24 PHP
CI框架实现创建自定义类库的方法
2018/12/25 PHP
jQuery中事件对象e的事件冒泡用法示例介绍
2014/04/25 Javascript
jQuery CSS3自定义美化Checkbox实现代码
2016/05/12 Javascript
requirejs + vue 项目搭建详解
2017/06/16 Javascript
Angularjs 事件指令详细整理
2017/07/27 Javascript
vux uploader 图片上传组件的安装使用方法
2018/05/15 Javascript
Typescript的三种运行方式(小结)
2019/09/18 Javascript
Python语言技巧之三元运算符使用介绍
2013/03/04 Python
python追加元素到列表的方法
2015/07/28 Python
详解多线程Django程序耗尽数据库连接的问题
2018/10/08 Python
浅谈Python接口对json串的处理方法
2018/12/19 Python
python求绝对值的三种方法小结
2019/12/04 Python
简单了解Python读取大文件代码实例
2019/12/18 Python
使用opencv识别图像红色区域,并输出红色区域中心点坐标
2020/06/02 Python
如何用python处理excel表格
2020/06/09 Python
美国知名的时尚购物网站:Anthropologie
2016/12/22 全球购物
广州地球村科技数据库题目
2016/04/25 面试题
servlet面试题
2012/08/20 面试题
前台文员职责范本
2014/03/07 职场文书
社区消防工作实施方案
2014/03/21 职场文书
珠宝店促销方案
2014/03/21 职场文书
秋天的怀念教学反思
2014/04/28 职场文书
学校献爱心活动总结
2014/07/08 职场文书
乡镇党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
诚信承诺书
2015/01/19 职场文书
离开雷锋的日子观后感
2015/06/09 职场文书
环保主题班会教案
2015/08/13 职场文书
2016入党积极分子考察评语
2015/12/01 职场文书
九年级化学教学反思
2016/02/22 职场文书
WordPress多语言翻译插件 - WPML使用教程
2021/04/01 PHP