keras-onnx

Convert Keras models to ONNX

Github星跟蹤圖

keras2onnx, Linux, Windows, ----------, -------, ---------, keras.io, Build Status, Build Status, tf.keras, Build Status, Build Status, # Introduction

The keras2onnx model converter enables users to convert Keras models into the ONNX model format.
Initially, the Keras converter was developed in the project onnxmltools. keras2onnx converter development was moved into an independent repository to support more kinds of Keras models and reduce the complexity of mixing multiple converters.

All Keras layers have been supported for conversion using keras2onnx since ONNX opset 7. Please refer to the Keras documentation for details on Keras layers. The keras2onnx converter also supports the lambda/custom layer by working with the tf2onnx converter which is embedded directly into the source tree to avoid version conflicts and installation complexity.

Windows Machine Learning (WinML) users can use WinMLTools to convert their Keras models to the ONNX format. If you want to use the keras2onnx converter, please refer to the WinML Release Notes to identify the corresponding ONNX opset for your WinML version.

keras2onnx has been tested on Python 3.5, 3.6, and 3.7, with tensorflow 1.x/2.0/2.1 (CI build). It does not support Python 2.x.

Install

You can install latest release of Keras2ONNX from PyPi:

pip install keras-onnx

or install from source:

pip install git+https://github.com/microsoft/onnxconverter-common
pip install git+https://github.com/onnx/keras-onnx

Before running the converter, please notice that tensorflow has to be installed in your python environment,
you can choose tensorflow package(CPU version) or tensorflow-gpu(GPU version)

Notes

Keras2ONNX supports the new Keras subclassing model which was introduced in tensorflow 2.0 since the version 1.6.5. Some typical subclassing models like huggingface/transformers have been converted into ONNX and validated by ONNXRuntime.

Since its version 2.3, the multi-backend Keras (keras.io) stops the support of the tensorflow version above 2.0. The auther suggests to switch to tf.keras for the new features.

Multi-backend Keras and tf.keras:

Both Keras model types are now supported in the keras2onnx converter. If the user's Keras package was installed from Keras.io, the converter converts the model as it was created by the keras.io package. Otherwise, it will convert it through tf.keras.

If you want to override this behaviour, please specify the environment variable TF_KERAS=1 before invoking the converter python API.

Development

Keras2ONNX depends on onnxconverter-common. In practice, the latest code of this converter requires the latest version of onnxconverter-common, so if you install this converter from its source code, please install the onnxconverter-common in source code mode before keras2onnx installation.

Validated pre-trained Keras models

Most Keras models could be converted successfully by calling keras2onnx.convert_keras, including CV, GAN, NLP, Speech and etc. However some models with a lot of custom operations need custom conversion, the following are some examples., Model Name, Category, Instruction, ----------, -------, -------, YOLOv3, Computer Vision, Readme, Mask RCNN, Computer Vision, Readme, Context-Conditional GAN, GAN, Unit test, Cycle GAN, GAN, Unit test, Disco GAN, GAN, Unit test, PixelDA (Domain Adaptation), GAN, Unit test, ## Scripts
It will be useful to convert the models from Keras to ONNX from a python script.
You can use the following API:

import keras2onnx
keras2onnx.convert_keras(model, name=None, doc_string='', target_opset=None, channel_first_inputs=None):
    # type: (keras.Model, str, str, int, []) -> onnx.ModelProto
    """
    :param model: keras model
    :param name: the converted onnx model internal name
    :param doc_string:
    :param target_opset:
    :param channel_first_inputs: A list of channel first input.
    :return:
    """

Use the following script to convert keras application models to onnx, and then perform inference:

import numpy as np
from keras.preprocessing import image
from keras.applications.resnet50 import preprocess_input
import keras2onnx
import onnxruntime

# image preprocessing
img_path = 'street.jpg'   # make sure the image is in img_path
img_size = 224
img = image.load_img(img_path, target_size=(img_size, img_size))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)

# load keras model
from keras.applications.resnet50 import ResNet50
model = ResNet50(include_top=True, weights='imagenet')

# convert to onnx model
onnx_model = keras2onnx.convert_keras(model, model.name)

# runtime prediction
content = onnx_model.SerializeToString()
sess = onnxruntime.InferenceSession(content)
x = x if isinstance(x, list) else [x]
feed = dict([(input.name, x[n]) for n, input in enumerate(sess.get_inputs())])
pred_onnx = sess.run(None, feed)

An alternative way to load onnx model to runtime session is to save the model first:

temp_model_file = 'model.onnx'
keras2onnx.save_model(onnx_model, temp_model_file)
sess = onnxruntime.InferenceSession(temp_model_file)

Contribute

We welcome contributions in the form of feedback, ideas, or code.

License

MIT License

主要指標

概覽
名稱與所有者onnx/keras-onnx
主編程語言Python
編程語言Python (語言數: 2)
平台
許可證Apache License 2.0
所有者活动
創建於2018-12-18 20:15:57
推送於2021-09-09 19:50:42
最后一次提交2021-08-11 16:49:18
發布數7
最新版本名稱v1.7.0 (發布於 )
第一版名稱v1.5.0 (發布於 )
用户参与
星數380
關注者數15
派生數107
提交數423
已啟用問題?
問題數277
打開的問題數102
拉請求數398
打開的拉請求數3
關閉的拉請求數58
项目设置
已啟用Wiki?
已存檔?
是復刻?
已鎖定?
是鏡像?
是私有?