【问题标题】:Using Tensorflow 2.X model on OpenCV在 OpenCV 上使用 Tensorflow 2.X 模型
【发布时间】:2020-03-06 10:37:30
【问题描述】:

我必须使用带有 OpenCV 框架的 Tensorflow 2.X 模型(带有 C++ 的 v.4.X)。

为此,我需要一个 .pb 文件或一个 .pb 和一个 .pbtxt 文件,而不是保存的 Tensorflow像我一样的模型。

所以我的问题是:有没有办法将保存的模型转换为 OpenCV 可以读取的格式?比如,也许是 caffe 模型?

我尝试使用MMdnn,但它给了我一个奇怪的错误:

Traceback (most recent call last):
  File "/usr/local/bin/mmconvert", line 8, in <module>
    sys.exit(_main())
  File "/usr/local/lib/python3.5/dist-packages/mmdnn/conversion/_script/convert.py", line 102, in _main
    ret = convertToIR._convert(ir_args)
  File "/usr/local/lib/python3.5/dist-packages/mmdnn/conversion/_script/convertToIR.py", line 62, in _convert
    from mmdnn.conversion.tensorflow.tensorflow_parser import TensorflowParser
  File "/usr/local/lib/python3.5/dist-packages/mmdnn/conversion/tensorflow/tensorflow_parser.py", line 15, in <module>
    from tensorflow.tools.graph_transforms import TransformGraph
ImportError: No module named 'tensorflow.tools.graph_transforms'

我想这是因为它是使用 Tensorflow 1.X 开发和测试的。


编辑:我也有相对的 Keras 模型(现在它与 Tensorflow 2 集成),但它也与 OpenCV DNN 框架不兼容。尝试使用 MMdnn 进行转换时出现此错误:

Traceback (most recent call last):
  File "/usr/local/bin/mmconvert", line 8, in <module>
    sys.exit(_main())
  File "/usr/local/lib/python3.5/dist-packages/mmdnn/conversion/_script/convert.py", line 102, in _main
    ret = convertToIR._convert(ir_args)
  File "/usr/local/lib/python3.5/dist-packages/mmdnn/conversion/_script/convertToIR.py", line 46, in _convert
    parser = Keras2Parser(model)
  File "/usr/local/lib/python3.5/dist-packages/mmdnn/conversion/keras/keras2_parser.py", line 126, in __init__
    model = self._load_model(model[0], model[1])
  File "/usr/local/lib/python3.5/dist-packages/mmdnn/conversion/keras/keras2_parser.py", line 78, in _load_model
    'DepthwiseConv2D': layers.DepthwiseConv2D})
  File "/usr/local/lib/python3.5/dist-packages/keras/engine/saving.py", line 664, in model_from_json
    return deserialize(config, custom_objects=custom_objects)
  File "/usr/local/lib/python3.5/dist-packages/keras/layers/__init__.py", line 168, in deserialize
    printable_module_name='layer')
  File "/usr/local/lib/python3.5/dist-packages/keras/utils/generic_utils.py", line 147, in deserialize_keras_object
    list(custom_objects.items())))
  File "/usr/local/lib/python3.5/dist-packages/keras/engine/network.py", line 1056, in from_config
    process_layer(layer_data)
  File "/usr/local/lib/python3.5/dist-packages/keras/engine/network.py", line 1042, in process_layer
    custom_objects=custom_objects)
  File "/usr/local/lib/python3.5/dist-packages/keras/layers/__init__.py", line 168, in deserialize
    printable_module_name='layer')
  File "/usr/local/lib/python3.5/dist-packages/keras/utils/generic_utils.py", line 149, in deserialize_keras_object
    return cls.from_config(config['config'])
  File "/usr/local/lib/python3.5/dist-packages/keras/engine/base_layer.py", line 1179, in from_config
    return cls(**config)
  File "/usr/local/lib/python3.5/dist-packages/keras/legacy/interfaces.py", line 91, in wrapper
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/keras/layers/convolutional.py", line 484, in __init__
    **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/keras/layers/convolutional.py", line 117, in __init__
    self.kernel_initializer = initializers.get(kernel_initializer)
  File "/usr/local/lib/python3.5/dist-packages/keras/initializers.py", line 515, in get
    return deserialize(identifier)
  File "/usr/local/lib/python3.5/dist-packages/keras/initializers.py", line 510, in deserialize
    printable_module_name='initializer')
  File "/usr/local/lib/python3.5/dist-packages/keras/utils/generic_utils.py", line 140, in deserialize_keras_object
    ': ' + class_name)
ValueError: Unknown initializer: GlorotUniform

编辑 04/2021:现在 cmets 中提到的 ONNX 转换器可以在 OpenCV 4.5.1 上正常工作(4.5.0 版存在一些 ONNX 网络的错误)。

【问题讨论】:

  • 我猜你遇到了这个问题,因为你的机器上有 tf 2.x 来消除这个问题,请安装 tf1.14
  • 您想要使用哪种类型的模型? NLP/对象检测/其他。为什么它需要在 openCV 中而不只是使用 tf 2.0 推理?另一种方法可能是转换为 ONNX 模型并在 openCV 中使用它。但是,如果我对您想要了解的内容有更多了解,我可能会提供更多帮助!
  • 使用您的 H5 模型,理论上它似乎可以工作just fine。 ONNX 代表“开放式神经网络交换”,他们正试图缓解您现在遇到的确切问题。让我知道它是否有效!
  • 现在你有了 .h5 文件,你可以试试this approach 代替 MMdnn 吗?您可以在冻结图形之前使用 model = load_model('./model/keras_model.h5') 加载预训练模型。
  • @ilke444 预测看起来不错。如果你愿意,你可以回答这个问题并获得你的赏金,谢谢!

标签: c++ opencv tensorflow


【解决方案1】:

如果您有 .h5 文件,您可以使用 TensorFlow 尝试使用 this approach 而不是 MMdnn。该函数将当前会话转换为静态计算图以捕获当前状态。然后您可以使用tf.train.write_graph.pb 格式编写图形。

您可以在冻结图形之前使用model = load_model('./model/keras_model.h5') 加载预训练模型。还有一个blog post做进一步的解释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    相关资源
    最近更新 更多