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爬虫之抓取糗事百科代码分享
Nov 06 Python
Python引用类型和值类型的区别与使用解析
Oct 17 Python
Opencv+Python 色彩通道拆分及合并的示例
Dec 08 Python
python 检查是否为中文字符串的方法
Dec 28 Python
PyCharm 设置SciView工具窗口的方法
Jan 15 Python
python使用参数对嵌套字典进行取值的方法
Apr 26 Python
python 3.6.7实现端口扫描器
Sep 04 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
Oct 17 Python
使用python实现哈希表、字典、集合操作
Dec 22 Python
Python的形参和实参使用方式
Dec 24 Python
python爬取本站电子书信息并入库的实现代码
Jan 20 Python
Python 炫技操作之合并字典的七种方法
Apr 10 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递归复制、移动目录的自定义函数分享
2014/11/18 PHP
Yii2 ActiveRecord多表关联及多表关联搜索的实现
2016/06/30 PHP
php递归函数怎么用才有效
2018/02/24 PHP
java script编程起步(第三课)
2007/01/10 Javascript
js常见表单应用技巧
2008/01/09 Javascript
JS实现从网页顶部掉下弹出层效果的方法
2015/08/06 Javascript
jquery获取复选框checkbox的值实现方法
2016/05/30 Javascript
AngularJS HTML DOM详解及示例代码
2016/08/17 Javascript
JavaScript组合模式学习要点
2016/08/26 Javascript
Vue computed计算属性的使用方法
2017/07/14 Javascript
JS实现浏览上传文件的代码
2017/08/23 Javascript
Vue实现typeahead组件功能(非常靠谱)
2017/08/26 Javascript
JS代码实现电脑配置检测功能
2018/03/21 Javascript
ionic grid(栅格)九宫格制作详解
2018/06/30 Javascript
通过JS深度判断两个对象字段相同
2019/06/14 Javascript
vue 的 solt 子组件过滤过程解析
2019/09/07 Javascript
vue实现动态表格提交参数动态生成控件的操作
2020/11/09 Javascript
JavaScript 生成唯一ID的几种方式
2021/02/19 Javascript
python实现去除下载电影和电视剧文件名中的多余字符的方法
2014/09/23 Python
python嵌套函数使用外部函数变量的方法(Python2和Python3)
2016/01/31 Python
Python使用logging结合decorator模式实现优化日志输出的方法
2016/04/16 Python
Django 添加静态文件的两种实现方法(必看篇)
2017/07/14 Python
在PyCharm中三步完成PyPy解释器的配置的方法
2018/10/29 Python
pytorch nn.Conv2d()中的padding以及输出大小方式
2020/01/10 Python
Python直接赋值及深浅拷贝原理详解
2020/09/05 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
2021/01/08 Python
HTML5如何使用SVG的方法示例
2019/01/11 HTML / CSS
美国知名艺术画网站:Art.com
2017/02/09 全球购物
来自圣地亚哥的实惠太阳镜:Knockaround
2018/08/27 全球购物
线程同步的方法
2016/11/23 面试题
英文求职信写作小建议
2014/02/16 职场文书
企业员工培训感言
2014/02/26 职场文书
2014社区三八妇女节活动总结
2014/03/01 职场文书
运动会广播稿150字(9篇)
2014/09/20 职场文书
React列表栏及购物车组件使用详解
2021/06/28 Javascript
Windows Server 2019 安装DHCP服务及相关配置
2022/04/28 Servers