OpenCV 4.3.0 - Невозможно создать слой типа "Макс" в функции 'getLayerInstance' - PullRequest
0 голосов
/ 29 мая 2020
Системная информация (версия)
  • OpenCV => 4.3.0-dev
  • Операционная система / платформа => Ubuntu 20.04
  • Компилятор => G CC 8.4.0
Подробное описание

Я создал модель триплета на основе ResNet50:

    base_model = ResNet50(weights='imagenet', include_top=False, pooling='max')
    for layer in base_model.layers:
        layer.trainable = False
    x = base_model.output
    x = Dropout(0.6)(x)
    x = Dense(embedding_dim)(x)
    out = Lambda(lambda x: K.l2_normalize(x, axis=1))(x)
    embedding_model = Model(base_model.input, out, name="embedding")

После обучения этой модели я заморозил все слои, а затем сохранил ее следующим образом:

    for layer in embedding_model.layers:
        layer.trainable = False
    embedding_model.save('triplet_embedding_model')

, что приводит к папке, содержащей pb-файл и папку с ресурсами и переменными.

Затем я использую следующий скрипт для создания замороженного графика на основе модели, сохраненной ранее:

import tensorflow as tf
from tensorflow.python.framework.convert_to_constants import convert_variables_to_constants_v2
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'


loaded = tf.saved_model.load('triplet_embedding_model')
infer = loaded.signatures['serving_default']

f = tf.function(infer).get_concrete_function(input_1=tf.TensorSpec(shape=[None, 224, 224, 3], dtype=tf.float32))
f2 = convert_variables_to_constants_v2(f)
graph_def = f2.graph.as_graph_def()

# Export frozen graph
with tf.io.gfile.GFile('frozen_graph.pb', 'wb') as f:
   f.write(graph_def.SerializeToString())

Когда я пытаюсь загрузить модель в OpenCV, используя:

net = cv2.dnn.readNet('frozen_graphs/frozen_graph.pb')

, я получаю следующую ошибку:

cv2.error: OpenCV(4.3.0-dev) /home/andreilica/OpenCV/opencv/modules/dnn/src/dnn.cpp:610: error: (-2:Unspecified error) Can't create layer "StatefulPartitionedCall/StatefulPartitionedCall/embedding/max_pool/Max" of type "Max" in function 'getLayerInstance'

Что я здесь делаю не так?

...