keras 无法通过任何方式将.h5模型转换为ONNX进行推理

vptzau2j  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(439)

我在.h5中从Matterport's MaskRCNN implementation构建了一个自定义模型。我设法使用model.keras_model.save()保存了完整的模型,而不是只保存了权重,并假设它工作正常。
我需要将这个模型转换为ONNX,然后在Unity Barracuda中进行推理,一路沿着我遇到了几个错误。我尝试了:
使用this tutorial和keras 2 onnx包将T1..h5复制到ONNX,我在以下位置遇到错误:

model = load_model('model.h5')

Error:
ValueError: Unknown layer: BatchNorm

T2.使用this GitHub code定义自定义层:

model = keras.models.load_model(r'model.h5', custom_objects={'BatchNorm':BatchNorm, 
'tf':tf, 'ProposalLayer':ProposalLayer, 
'PyramidROIAlign1':PyramidROIAlign1, 'PyramidROIAlign2':PyramidROIAlign2,
'DetectionLayer':DetectionLayer}, compile=False)

Error:
ValueError: No model found in config file.
ValueError: Unknown layer: PyramidROIAlign

T3. .h5到.pb(冻结图)和.pbtxt,然后在找到输入和输出节点(似乎每种都只有一个?)后使用tf 2 onnx从.pb到ONNX:

assert d in name_to_node, "%s is not in graph" % d
AssertionError: output0 is not in graph

使用tf服务代码from here将T4. .h5转换为SavedModel,然后使用python -m tf2onnx.convert --saved-model exported_models\coco_mrcnn\3 --opset 15 --output "model.onnx"将其转换为ONNX:

ValueError: make_sure failure: variable mrcnn_detection/map/while/Enter already exists as state variable.

TLDR:**有没有办法通过任何直接/间接的方式将我的.h5模型转换为ONNX?**我已经在这个问题上困了好几天了!
先谢谢你。
编辑1:keras.models.load_model()似乎抛出了前两个错误--想知道是否有一种方法可以使用.pb/.pbtxt模型,或者有一种方法可以不使用load_model(),或者有一种方法可以解决load_model()问题?
编辑二:
Code for T1:从Matterport's MaskRCNN implementation修改的自定义数据集
Code for T4

ttp71kqs

ttp71kqs1#

尝试将其转换为保存的模型格式,然后转换为onnx。

import numpy as np
import tensorflow as tf
from tensorflow import keras

def get_model():
    # Create a simple model.
    inputs = keras.Input(shape=(32,))
    outputs = keras.layers.Dense(1)(inputs)
    model = keras.Model(inputs, outputs)
    model.compile(optimizer="adam", loss="mean_squared_error")
    return model

model = get_model()
# Train the model.
test_input = np.random.random((128, 32))
test_target = np.random.random((128, 1))
model.fit(test_input, test_target)

# Calling `save('my_model.h5')` creates a h5 file `my_model.h5`.
model.save("my_h5_model.h5")

# It can be used to reconstruct the model identically.
model = keras.models.load_model("my_h5_model.h5")
tf.saved_model.save(model, "tmp_model")

然后使用tf2onnx进行转换。

python3 -m tf2onnx.convert --saved-model tmp_model --output "model.onnx"
k3fezbri

k3fezbri2#

这对我有用
通过anaconda powershell控制台(以管理员身份执行):

pip安装tf2onnx
在nxml工具上安装pip

和笔记本电脑(例如)

from tensorflow.python.keras.models import load_model
import os
os.environ['TF_KERAS'] = '1'
import onnxmltools

model = load_model('[h5 path]')
onnx_model = onnxmltools.convert_keras(model) 

onnxmltools.utils.save_model(onnx_model, '[onnx path]')

相关问题