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内置函数dir详解
Apr 14 Python
Python实现的手机号归属地相关信息查询功能示例
Jun 08 Python
Python无损音乐搜索引擎实现代码
Feb 02 Python
使用Python自动化破解自定义字体混淆信息的方法实例
Feb 13 Python
在Python中,不用while和for循环遍历列表的实例
Feb 20 Python
Django Rest framework频率原理与限制
Jul 26 Python
对Django的restful用法详解(自带的增删改查)
Aug 28 Python
python实现程序重启和系统重启方式
Apr 16 Python
TensorFlow使用Graph的基本操作的实现
Apr 22 Python
python使用hdfs3模块对hdfs进行操作详解
Jun 06 Python
Django Session和Cookie分别实现记住用户登录状态操作
Jul 02 Python
Python中第三方库Faker的使用详解
Apr 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
咖啡与水的关系
2021/03/03 冲泡冲煮
整合了前面的PHP数据库连接类~~做成一个分页类!
2006/11/25 PHP
php入门学习知识点五 关于php数组的几个基本操作
2011/07/14 PHP
php存储过程调用实例代码
2013/02/03 PHP
php+MySQL判断update语句是否执行成功的方法
2014/08/28 PHP
使用PHP免费发送定时短信的实例
2016/10/24 PHP
php中的依赖注入实例详解
2019/08/14 PHP
Yii框架学习笔记之应用组件操作示例
2019/11/13 PHP
通过PHP实现获取访问用户IP
2020/05/09 PHP
dojo 之基础篇
2007/03/24 Javascript
Dom加载让图片加载完再执行的脚本代码
2008/05/15 Javascript
jquery 添加节点的几种方法介绍
2013/09/04 Javascript
js的隐含参数(arguments,callee,caller)使用方法
2014/01/28 Javascript
常见浏览器多长时间会提示“脚本运行时间过长”总结
2014/04/29 Javascript
全面解析Bootstrap表单使用方法(表单样式)
2015/11/24 Javascript
jquery实现移动端点击图片查看大图特效
2020/09/11 Javascript
JQuery PHP图片在线裁剪实例
2020/07/27 Javascript
js实现点击每个li节点,都弹出其文本值及修改
2016/12/15 Javascript
微信小程序 支付功能开发错误总结
2017/02/21 Javascript
JS实现课堂随机点名和顺序点名
2017/03/09 Javascript
vue项目如何刷新当前页面的方法
2018/05/18 Javascript
socket在egg中的使用实例代码详解
2019/05/30 Javascript
在微信小程序中使用vant的方法
2019/06/07 Javascript
[01:34]传奇从这开始 2016国际邀请赛中国区预选赛震撼开启
2016/06/26 DOTA
[40:03]RNG vs VG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python学习笔记之字符串和字符串方法实例详解
2019/08/22 Python
CSS3悬停效果案例应用
2012/11/21 HTML / CSS
CSS3实现的渐变幻灯片效果
2020/12/07 HTML / CSS
html5设计原理(推荐收藏)
2014/05/17 HTML / CSS
英国家庭珠宝商:T. H. Baker
2018/02/08 全球购物
舒适的豪华鞋:Taryn Rose
2018/05/03 全球购物
捷克街头、运动和滑板一站式商店:BoardStar.cz
2019/10/06 全球购物
群众路线个人剖析材料及整改措施
2014/11/04 职场文书
办公室岗位职责
2015/02/04 职场文书
圣诞晚会主持词开场白
2015/05/28 职场文书
Java网络编程之UDP实现原理解析
2021/09/04 Java/Android