【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次,發文人進小黑屋喔~

評論