Skip to main content

Converts Machine Learning models to ONNX for use in Windows ML

Project description

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 (CI build). It does not support Python 2.x.

Notes

tf.keras v.s. keras.io

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.

Usage

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)

Validate pre-trained Keras application models

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:

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

We converted successfully for all the keras application models, and several other pretrained models. See below:

Model Name Category
Xception Computer Vision
VGG16, VGG19 Computer Vision
ResNet50 Computer Vision
InceptionV3, InceptionResNetV2 Computer Vision
MobileNet, MobileNetV2 Computer Vision
DenseNet121, DenseNet169, DenseNet201 Computer Vision
NASNetMobile, NASNetLarge Computer Vision
LPCNet Speech
ACGAN (Auxiliary Classifier GAN) GAN
Adversarial Autoencoder GAN
BGAN (Boundary-Seeking GAN) GAN
BIGAN (Bidirectional GAN) GAN

The following models need customed conversion, see the instruction column.

Model Name Category Instruction
YOLOv3 Computer Vision Readme
Mask RCNN Computer Vision Readme

Contribute

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

License

MIT License

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

keras2onnx-1.5.1-py3-none-any.whl (207.9 kB view details)

Uploaded Python 3

File details

Details for the file keras2onnx-1.5.1-py3-none-any.whl.

File metadata

  • Download URL: keras2onnx-1.5.1-py3-none-any.whl
  • Upload date:
  • Size: 207.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/41.0.0 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.6.5

File hashes

Hashes for keras2onnx-1.5.1-py3-none-any.whl
Algorithm Hash digest
SHA256 57b78532987f859edc7c583a9271d05e3953fb4a60940c00e278df4420a89f33
MD5 d29b44064801ab0f8d54309a172257cd
BLAKE2b-256 bfa0ac1e84e39a115155e57654ae4785f29ed1619f8f80cdbe0344526e4fd04c

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page