我在 .h5 中构建了一个自定义模型Matterport Mask RCNN 实现 https://github.com/matterport/Mask_RCNN。我成功地保存了完整的模型,而不是单独使用的权重model.keras_model.save()
,并假设它工作正常。
我需要将此模型转换为 ONNX,以便在 Unity Barracuda 中进行推理,在此过程中我遇到了一些错误。
我试过:
T1。 .h5 到 ONNX 使用本教程 https://medium.com/analytics-vidhya/how-to-convert-your-keras-model-to-onnx-8d8b092c4e4f和 keras2onnx 包,我遇到了一个错误:
model = load_model('model.h5')
Error:
ValueError: Unknown layer: BatchNorm
T2。使用定义自定义层这个 GitHub 代码 https://github.com/vagomundo21/Save-Load-MaskRCNN-model:
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,然后在找到输入和输出节点后使用 tf2onnx 从 .pb 到 ONNX(似乎只有一个?):
assert d in name_to_node, "%s is not in graph" % d
AssertionError: output0 is not in graph
T4。使用 tf-serving 代码将 .h5 转换为 SavedModel从这里 https://github.com/moganesyan/tensorflow_model_deployment进而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()
issue?
Edit 2:
T1 代码 https://file.io/tp8AOZBISJNc:
自定义数据集修改自Matterport Mask RCNN 实现 https://github.com/matterport/Mask_RCNN
T4 代码 https://file.io/ZEnstfO8t4Vs