🤪

ONNX -> TFLite, TensorFlow, Keras, TFJS, CoreML 変換

2023/05/17に公開

およそ3光年ぶりの公開記事。

1. 自作ツール onnx2tf

実装している機能が多すぎるので、この記事に表現していない変換オプションはREADMEを参照。TransformerやSTTやTTSやその他もろもろの一発変換に対応したつもり。onnx-tensorflow より推論効率が高いモデルを生成できる。また、onnx-tensorflowよりも対応しているオペレーションの種類が多い。

https://github.com/PINTO0309/onnx2tf

コントリビューター

コード量(code = 行)

cloc .

     419 text files.
     414 unique files.                                          
     174 files ignored.

----------------------------------------
Language    files  blank  comment   code
----------------------------------------
Python        300   4820     6637  37182
JSON           27    109        0   3107
Markdown        5    343        0   2061
YAML            7     42       79    586
Dockerfile      1      6        3     38
----------------------------------------
SUM:          340   5320     6719  42974
----------------------------------------

2. 使用方法

  • onnx==1.13.1
  • onnxruntime==1.13.1
  • onnx-simplifier==0.4.17
  • onnx_graphsurgeon
  • simple_onnx_processing_tools
  • tensorflow==2.13.0rc0

2-1. インストールとサンプルモデルダウンロード

  • docker
docker run --rm -it \
-v `pwd`:/workdir \
-w /workdir \
ghcr.io/pinto0309/onnx2tf:latest
  • pip
pip install onnx2tf -U
  • モデル
wget https://github.com/PINTO0309/onnx2tf/releases/download/0.0.2/resnet18-v1-7.onnx

2-2. 基本の「き」

TFLite を出力。

onnx2tf -i resnet18-v1-7.onnx

2-3. 基本の「ほ」

TFLite変換 + 完全体の saved_model を出力。

onnx2tf -i resnet18-v1-7.onnx -osd

2-4. 基本の「ん」

TFLite変換 + 全OPの精度チェック。

onnx2tf -i resnet18-v1-7.onnx -cotof

2-5. Keras

.h5 はイロイロと問題があるので、現状最新のフォーマット keras_v3 フォーマットで出力。

onnx2tf -i resnet18-v1-7.onnx -okv3

.h5 を生成するとき。

onnx2tf -i resnet18-v1-7.onnx -oh5

2-6. TFLite の入出力名を魔改造

# Custom flatc binary for Ubuntu 20.04+
# https://github.com/PINTO0309/onnx2tf/issues/196
wget https://github.com/PINTO0309/onnx2tf/releases/download/1.7.3/flatc.tar.gz \
  && tar -zxvf flatc.tar.gz \
  && sudo chmod +x flatc \
  && sudo mv flatc /usr/bin/

# Custom flatc binary for Windows
# Set the environment variable paths appropriately on your own.
# https://github.com/PINTO0309/onnx2tf/issues/196
https://github.com/PINTO0309/onnx2tf/releases/download/1.7.3/flatc.exe

onnx2tf -i resnet18-v1-7.onnx -coion

2-7. INT8量子化 (per-channel)

onnx2tf -i resnet18-v1-7.onnx -oiqt -qt per-channel

2-8. INT8量子化 (per-tensor)

onnx2tf -i resnet18-v1-7.onnx -oiqt -qt per-tensor

2-9. TFJS変換

onnx2tf -i resnet18-v1-7.onnx -osd

pip install tensorflowjs

tensorflowjs_converter \
--input_format tf_saved_model \
--output_format tfjs_graph_model \
saved_model \
tfjs_model

2-10. CoreML変換

onnx2tf -i resnet18-v1-7.onnx -osd -k data

pip install coremltools
import coremltools as ct

FOLDER_PATH = 'saved_model'

model = ct.convert(
    model=FOLDER_PATH,
    source='tensorflow',
)
model.save(f'{FOLDER_PATH}/model.mlmodel')

3. 対応レイヤー

OP Status
Abs
Acosh
Acos
Add
And
ArgMax
ArgMin
Asinh
Asin
Atanh
Atan
AveragePool
BatchNormalization
Bernoulli
BitShift
BitwiseAnd Help wanted
BitwiseNot Help wanted
BitwiseOr Help wanted
BitwiseXor Help wanted
Cast
Ceil
Celu
CenterCropPad Help wanted
Clip
Col2Im Help wanted
Compress
ConcatFromSequence
Concat
ConstantOfShape
Constant
Conv
ConvTranspose
Cosh
Cos
CumSum
DepthToSpace
Det
DequantizeLinear
DFT Help wanted
Div
Dropout
DynamicQuantizeLinear
Einsum
Elu
Equal
Erf
Expand
Exp
EyeLike
Flatten
Floor
FusedConv
GatherElements
GatherND
Gather
Gemm
GlobalAveragePool
GlobalLpPool
GlobalMaxPool
GreaterOrEqual
Greater
GridSample
GroupNormalization Help wanted
GRU
Hardmax
HardSigmoid
HardSwish
Identity
If
Input
InstanceNormalization
Inverse
IsInf
IsNaN
LayerNormalization
LeakyRelu
LessOrEqual
Less
Log
LogSoftmax
Loop Help wanted
LpNormalization
LRN
LSTM
MatMul
MatMulInteger
MaxPool
Max
MaxRoiPool Help wanted
MaxUnpool
Mean
MeanVarianceNormalization
MelWeightMatrix Help wanted
Min
Mish
Mod
Mul
Multinomial
Neg
NonMaxSuppression
NonZero
Optional Help wanted
OptionalGetElement Help wanted
OptionalHasElement Help wanted
Not
OneHot
Or
Pad
Pow
PRelu
QLinearAdd
QLinearConcat
QLinearConv
QLinearLeakyRelu
QLinearMatMul
QLinearMul
QLinearSigmoid
QLinearSoftmax
QuantizeLinear
RandomNormalLike
RandomNormal
RandomUniformLike
RandomUniform
Range
Reciprocal
ReduceL1
ReduceL2
ReduceLogSum
ReduceLogSumExp
ReduceMax
ReduceMean
ReduceMin
ReduceProd
ReduceSum
ReduceSumSquare
Relu
Reshape
Resize
ReverseSequence
RNN
RoiAlign
Round
ScaleAndTranslate
Scatter
ScatterElements
ScatterND
Scan Help wanted
Selu
SequenceAt
SequenceConstruct
SequenceEmpty
SequenceErase
SequenceInsert
SequenceLength
Shape
Shrink
Sigmoid
Sign
Sinh
Sin
Size
Slice
Softmax
Softplus
Softsign
SpaceToDepth
Split
SplitToSequence
Sqrt
Squeeze
STFT Help wanted
StringNormalizer Help wanted
Sub
Sum
Tanh
Tan
TfIdfVectorizer Help wanted
ThresholdedRelu
Tile
TopK
Transpose
Trilu
Unique
Unsqueeze
Upsample
Where
Xor

Discussion