Как импортировать модель TensorFlow со сглаженным слоем в OpenCV?

Я создал CNN с Керасом. Код сети:

model = Sequential()

model.add(Conv2D(32, (3,3), data_format='channels_last', input_shape=(48, 32, 3), name='data'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid', name='result_class'))

Затем, используя этот скрипт, Я конвертировал файл .h5, созданный Keras, в .pb.

Теперь я хочу импортировать модель, используя OpenCV (3.4), но когда я выполняю следующий код

Net net;
try {
net = dnn::readNetFromTensorflow(model_path);
}
catch (cv::Exception& e) {
cerr << "Exception: " << e.what() << endl;
if (net.empty()) {
cerr << "Can't load the model" << endl;
}
}

Я получаю эту ошибку:

OpenCV Error: Unspecified error (Unknown layer type Shape in op flatten_1/Shape) in populateNet, file /home/nicola/Scrivania/opencv-3.4.0/opencv-3.4.0/modules/dnn/src/tensorflow/tf_importer.cpp, line 1487
Exception: /home/nicola/Scrivania/opencv-3.4.0/opencv-3.4.0/modules/dnn/src/tensorflow/tf_importer.cpp:1487: error: (-2) Unknown layer type Shape in op flatten_1/Shape in function populateNet
Can't load the model

Кажется, что OpenCV не может справиться с выравниванием слоя, я прав? Есть ли способ импортировать мою сеть?

Спасибо за вашу помощь.

1

Решение

Да, сейчас похоже, что у Opencv есть проблема с обработкой плоского слоя.
Вы можете увидеть больше об этом здесь: https://github.com/opencv/opencv_contrib/issues/1241

Обходной путь предложил использовать напрямую tf.reshape в сети. Но я также работаю над тем, как сделать это на слоях keras.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]