我在.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
2条答案
按热度按时间ttp71kqs1#
尝试将其转换为保存的模型格式,然后转换为onnx。
然后使用tf2onnx进行转换。
k3fezbri2#
这对我有用
通过anaconda powershell控制台(以管理员身份执行):
pip安装tf2onnx
在nxml工具上安装pip
和笔记本电脑(例如)