gpt4 book ai didi

python - 在 OpenCV 3 中使用带有 Flatten 层的 Keras 模型

转载 作者:太空宇宙 更新时间:2023-11-03 21:32:11 27 4
gpt4 key购买 nike

我使用 Keras 和 TensorFlow 作为后端来创建和训练一个简单的 CNN。我能够将模型及其权重保存在 .pb 文件中,卡住它并优化它以进行推理,但是当我尝试将它加载到 OpenCV 3.4.1 中时,出现错误:

flatten/Shape:Shape(max_pooling2d/MaxPool)
T:0
out_type:[ ]
OpenCV(3.4.1) Error: Unspecified error (Unknown layer type Shape in op flatten/Shape) in populateNet, file /home/dev/opencv-3.4.1/modules/dnn/src/tensorflow/tf_importer.cpp, line 1582
Traceback (most recent call last):
File "test.py", line 67, in <module>
net = cv.dnn.readNetFromTensorflow('graph.pb')
cv2.error: OpenCV(3.4.1) /home/dev/opencv-3.4.1/modules/dnn/src/tensorflow/tf_importer.cpp:1582: error: (-2) Unknown layer type Shape in op flatten/Shape in function populateNet

这基本上与另一个问题相同:How to import TensorFlow model with flatten layer in OpenCV? .

此线程中很好地解释了错误的原因。建议的解决方法是直接使用 tf.reshape 而不是使用 Keras API。

但是我不知 Prop 体怎么做。我尝试使用功能性 API 并替换:

x = Flatten()(x)

通过:

x = tf.reshape(x, [-1, some_value])

但这不起作用,我收到以下错误:

Traceback (most recent call last):
File "test.py", line 57, in <module>
tf_out = model.predict(inp)
File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/keras/_impl/keras/models.py", line 965, in predict
self.build()
File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/keras/_impl/keras/models.py", line 578, in build
self.model = Model(self.inputs, self.outputs[0], name=self.name + '_model')
File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/keras/_impl/keras/engine/topology.py", line 678, in __init__
super(Network, self).__init__(inputs, outputs, name=name)
File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/layers/network.py", line 341, in __init__
'(thus holding past layer metadata). Found: ' + str(x))
ValueError: Output tensors to a Model must be the output of a TensorFlow `Layer` (thus holding past layer metadata). Found: Tensor("activation_4/Softmax:0", shape=(?, 10), dtype=float32)

知道如何在仍然使用 Keras 完成大部分工作的同时导出 TensorFlow 模型吗?

最佳答案

我遇到了同样的问题。经过大量搜索和测试许多解决方案后,终于,我可以在 opencv 中导入 keras 分类训练模型。首先,您必须用 tensorflow.python.keras 替换 keras。只需从您的代码行中删除 keras 并将其替换为 tensorflow.python.keras其次,您必须用以下代码替换 flatten layares:只需删除展平层并复制并通过此:

a,b,c,d = model.output_shape
a = b*c*d
model.add(K.layers.Permute([1, 2, 3])) # Indicate NHWC data layout
model.add(K.layers.Reshape((a,)))

现在您可以重新训练您的模型。训练完成后,将模型保存为 .h5 格式。现在您必须将 keras .h5 模型转换为 tensorflow .pb 模型。为了转换模型,我使用了这个解决方法: https://stackoverflow.com/a/53386325/5208522现在您可以轻松地在 opencv 中导入 .pb 模型,它可以完美运行。

关于python - 在 OpenCV 3 中使用带有 Flatten 层的 Keras 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49794023/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com