Системная информация (версия)
- 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'
Что я здесь делаю не так?