【ATU Book-i.MX8系列 - ONNX】ONNX 模组转换

一.   概述

上篇文章介绍了正在崛起的神经网路框架 ONNX,并完成基础的环境架设。紧接着,这篇文章将向各位介绍 ONNX 的重头戏,即 "各家深度学习框架的模组转成 ONNX 形式"。在转换之前,须安装各深度学习框架的相关套件,来确保程式代码可以顺利运行 !! 事不宜迟,就开始安装套件与转换模组吧 !! 如下图所示,为系列博文之示意架构图。此架构图隶属于 i.MX8M Plus 的方案博文中,并属于机器学习内的推理引擎(Inference Engine) 的 ONNX 部分,目前章节介绍 “ONNX 模组转换”

若欲理解与架设 Tensorflow 框架,请参考另一个博文系列

 大大通精彩博文    AI 即将来临 !! 利用 Tensorflow 与 i.MX8 迈入新领域 

 大大通精彩博文   【 ATU Book-i.MX8系列】博文索引

 

ONNX系列博文-文章架构示意图 (1)

 

 

ONNX系列博文-文章架构示意图 (2)

 

二.  安装必要套件

Step 1 : 开启命令提示字元或 Anaconda Prompt

请点选网址下载 requirements.txt

$ pip install requiremets.txt

Step 2 : 安装软体 Jupyter Notebook

若已安装该软体,可略过此步骤。

$ pip install jupyter

Step 3 : 开启 Jupyter Notebook后,即可进行编写代码

$ Jupyter Notebook

*** 程式皆使用完成 jupyter notebook,若想运行于终端机则需省略 “!” 指令

  

三.  ONNX 模组转换

基本上,大部分的神经网路框架皆可应用于 ONNX 的形式,如下图所示。像是支援 Google 开发的 Keras机器学习框架库的模型 (.h5) 、Facebook 维护的 Caffe 深度学习框架的模型 (.caffemodel) 、Facebook 开发的 PyTorch 机器学习资料库的模型 (.pth) 、微软 Microsoft 开发的深度学习框架 Microsoft Cognitive Toolkit (CNTK) 的模型 (.model) 、亚马逊 Amazon 开发的深度学习框 Apache MXNet 的模型 (.params & .json),苹果 Apple 提供的 Core ML 机器学习框架的模型 (.mlmodel) 以及 MATLAB、Sklearn、Chainer、PaddlePaddie、XGBoost、ML.NET 等等深度学习模型皆可以转换成 ONNX 模型 (.ONNX)

 


ONNX 官方
提供一系列的教学范例,能让初学者可以快速上手进行模型转换,如下方展示。

官方教学网站 : https://github.com/onnx/tutorials#converting-to-onnx-format

若欲理解详细与最新代码,请参考  Google COLAB - ONNX Model Transform 

(1) Keras to ONNX

官方资源 : https://keras.io/zh/
使用模型(参考) :   https://github.com/Shahnawax/HAR-CNN-Keras

代码演示 :

import onnxmltools
from keras.models import load_model
input_keras_model = keras_h5_model
output_onnx_model = keras_h5_model[:-2] + "onnx"
keras_model = load_model(input_keras_model)
onnx_model = onnxmltools.convert_keras(keras_model)
onnxmltools.utils.save_model(onnx_model, output_onnx_model)

 

(2) Caffe to ONNX

官方资源 : https://keras.io/zh/
使用模型(参考) :   https://github.com/BVLC/caffe/tree/master/models/bvlc_alexnet

代码演示 :

import onnx
import coremltools
import onnxmltools
coreml_model = coremltools.converters.caffe.convert((caffe_model, prototxt))
onnx_model = onnxmltools.convert_coreml(coreml_model)
output_onnx_model = caffe_model[:-10] + "onnx"
onnxmltools.utils.save_model(onnx_model, output_onnx_model)

 

(3) Pytorch to ONNX

官方资源 : https://pytorch.org/


使用模型(参考) :   https://pytorch.apachecn.org/docs/1.4/83.html

代码演示 :

import torch
torch.onnx.export(torch_model, pytorch_model_size, output_onnx_model)

 

(4) CTNK to ONNX

官方资源 : https://github.com/microsoft/CNTK
使用模型(参考) :   https://github.com/microsoft/CNTK/tree/master/PretrainedModels

代码演示 :

import cntk 
input_cntk_model = CTNK_model
output_onnx_model = CTNK_model[:-5] + "onnx"
cntk_model = cntk.Function.load(input_cntk_model, device=cntk.device.cpu()) #loaing
cntk_model.save(output_onnx_model, format=cntk.ModelFormat.ONNX)

 

(5) MXnet to ONNX

官方资源 : https://mxnet.apache.org/versions/1.3.1/
使用模型(参考) :   https://mxnet.apache.org/versions/1.3.1/model_zoo/index.html

代码演示 :

import mxnet as mx
import numpy as np
from mxnet.contrib import onnx as onnx_mxnet
input_mxnet_symbol = mxnet_json
input_mxnet_params = mxnet_params
input_shape = (mxnet_model_size[0], mxnet_model_size[1], mxnet_model_size[2], mxnet_model_size[3])
output_onnx_model = mxnet_json[:-4] + 'onnx'
onnx_mxnet.export_model(input_mxnet_symbol, input_mxnet_params, [input_shape], np.float32, output_onnx_model)

 

 (6) CoreML to ONNX 

官方资源 : https://developer.apple.com/documentation/coreml
使用模型(参考) : https://github.com/likedan/Awesome-CoreML-Models  

代码演示 :

import coremltools
import onnxmltools
input_coreml_model = coreml_model
output_onnx_model = coreml_model[:-7] + 'onnx'
coreml_model = coremltools.utils.load_spec(input_coreml_model)
onnx_model = onnxmltools.convert_coreml(coreml_model)
onnxmltools.utils.save_model(onnx_model, output_onnx_model)

 

(7) TensorFlow to ONNX 

官方资源 : 
使用模型(参考) :  https://github.com/tensorflow/models

代码演示 :

!python -m tf2onnx.convert --input <*.pb> --inputs x:0 --outputs prediction:0 --output <*.onnx> --verbose

  

四.  结语

经由上述的介绍,相信各位已经尝试将各框架的模组转换成 ONNX 的模组格式。这里要特别强调,并非所有模组皆能完美转换移植。举例来说  TensorFlow 与 ONNX 可能会因为彼此的版本差异而导致无法转换,故相容性就显得略差了一些 !!  因此 ONNX 的技术仍有很大的修正空间!! 但这不影响整合模组理念所带来的好处,相信未来将能够有效运用模组资源 !!  同时,亦可整合至 ONNX 框架之中,利用强大的优化能力与推理引擎来进行物件识别、物件分割等等机器学习的应用 !! 

 

五.  参考文件

[1] 官方网站 - ONNX
[2] 官方网站 -  ONNX Tutorials

如有任何相关 ONNX 技术问题,欢迎至博文底下留言提问 !!
接下来还会分享更多 ONNX 的技术文章 !!敬请期待 【ATU Book-i.MX8 系列 - ONNX】系列
 !!

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论