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 调用DLL操作抄表机
Jan 12 Python
Python3写入文件常用方法实例分析
May 22 Python
python实现壁纸批量下载代码实例
Jan 25 Python
Python实现base64编码的图片保存到本地功能示例
Jun 22 Python
Python3实现爬虫爬取赶集网列表功能【基于request和BeautifulSoup模块】
Dec 05 Python
pybind11在Windows下的使用教程
Jul 04 Python
python requests指定出口ip的例子
Jul 25 Python
把django中admin后台界面的英文修改为中文显示的方法
Jul 26 Python
Python使用os.listdir和os.walk获取文件路径
May 21 Python
Python同时处理多个异常的方法
Jul 28 Python
django使用graphql的实例
Sep 02 Python
python内置进制转换函数的操作
Jun 02 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测试成功的邮件发送案例
2015/10/26 PHP
Yii2实现log输出到file及database的方法
2016/11/12 PHP
基于Laravel-admin 后台的自定义页面用法详解
2019/09/30 PHP
jQuery asp.net 用json格式返回自定义对象
2010/04/07 Javascript
js 如何实现对数据库的增删改查
2012/11/23 Javascript
JS中prototype关键字的功能介绍及使用示例
2013/07/21 Javascript
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
2014/01/02 Javascript
javascript与有限状态机详解
2014/05/08 Javascript
使用javascript提交form表单方法汇总
2015/06/25 Javascript
javascript实现继承的简单实例
2015/07/26 Javascript
vue多级复杂列表展开/折叠及全选/分组全选实现
2018/11/05 Javascript
jQuery判断自定义属性data-val用法示例
2019/01/07 jQuery
详解javascript中的Error对象
2019/04/25 Javascript
如何自定义微信小程序tabbar上边框的颜色
2019/07/09 Javascript
JS实现简单的表格增删
2020/01/16 Javascript
实现vuex原理的示例
2020/10/21 Javascript
vue $router和$route的区别详解
2020/12/02 Vue.js
[54:27]TNC vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
浅谈Python中的闭包
2015/07/08 Python
windows下Python实现将pdf文件转化为png格式图片的方法
2017/07/21 Python
Python爬虫实现百度图片自动下载
2018/02/04 Python
数据清洗--DataFrame中的空值处理方法
2018/07/03 Python
Django中多种重定向方法使用详解
2019/07/17 Python
python如何将两个txt文件内容合并
2019/10/18 Python
浅谈python输出列表元素的所有排列形式
2020/02/26 Python
详解python UDP 编程
2020/08/24 Python
python 对一幅灰度图像进行直方图均衡化
2020/10/27 Python
CSS3 圆角效果
2009/07/15 HTML / CSS
实习生个人的自我评价
2013/12/08 职场文书
平面设计岗位职责
2013/12/14 职场文书
《美丽的田园》教学反思
2014/03/01 职场文书
《伯牙绝弦》教学反思
2014/03/02 职场文书
农业生产宣传标语
2014/10/08 职场文书
质量整改报告范文
2014/11/08 职场文书
2015年材料员工作总结
2015/04/30 职场文书
springboot集成redis存对象乱码的问题及解决
2022/06/16 Java/Android