Ask Your Question

Revision history [back]

Tensorflow/Keras inference using OpenCV difficulties

Hi all:

I have made a neural network classification model using Keras (Tensorflow) backend.

The architecture is as below:

from keras.applications.mobilenet_v2 import MobileNetV2 
from keras.layers import MaxPooling2D, Dropout, Dense, Reshape, Permute
from keras.models import Sequential

base_model = MobileNetV2(include_top=False, weights='imagenet', input_shape = (224, 224, 3))  

model = Sequential () 
model.add (base_model)
model.add (MaxPooling2D())  
n, h, w, c = model.output_shape
n = c*h*w
model.add (Permute([3, 1, 2]))  # Indicate NHWC data layout
model.add (Reshape((n,)))
model.add (Dropout(0.92))   
model.add (Dense(2, activation='sigmoid')) 

model.summary ()

Note: since I read OpenCV can't handle the "flatten" layer (and experimented), I replaced it with "permute" and "reshape" layer following instructions here. This works fine, I got 95%+ val accuracy.

I then converted the HDF5 format of the Keras model to .pb graph using this script that I found, this seems to work:

from tensorflow.python.tools import freeze_graph
from tensorflow.python.tools import optimize_for_inference_lib

MODEL_PATH = 'keras_test'
MODEL_NAME = 'test'
input_node_name = 'mobilenetv2_1.00_224_input'
output_node_name = 'dense_18/Sigmoid'

tf.train.write_graph(sess.graph_def, MODEL_PATH, f'{MODEL_NAME}_graph.pb', as_text=False)
tf.train.write_graph(sess.graph_def, MODEL_PATH, f'{MODEL_NAME}_graph.pbtxt')
tf.train.Saver().save(sess, f'{MODEL_PATH}/{MODEL_NAME}.chkp')

freeze_graph.freeze_graph(f'{MODEL_PATH}/{MODEL_NAME}_graph.pbtxt',
                          None, False,
                          f'{MODEL_PATH}/{MODEL_NAME}.chkp',
                          output_node_name,
                          "save/restore_all",
                          "save/Const:0",
                          f'{MODEL_PATH}/frozen_{MODEL_NAME}.pb', 
                          True, "")

The inference code is as below:

import cv2 as cv
cvNet = cv.dnn.readNetFromTensorflow('test_graph.pb')
img = cv.imread('some_img.jpg')
cvNet.setInput(cv.dnn.blobFromImage(img, size=(300, 300), swapRB=True, crop=False))
dnn_out = cvNet.forward()

But I keep getting this message when doing inference:

error: OpenCV(4.1.2) /io/opencv/modules/dnn/src/layers/fully_connected_layer.cpp:154: error: (-215:Assertion failed) srcMat.dims == 2 && srcMat.cols == weights.cols && dstMat.rows == srcMat.rows && dstMat.cols == weights.rows && srcMat.type() == weights.type() && weights.type() == dstMat.type() && srcMat.type() == CV_32F && (biasMat.empty() || (biasMat.type() == srcMat.type() && biasMat.isContinuous() && (int)biasMat.total() == dstMat.cols)) in function 'run'

Any advice would be appreciated, thanks in advance.