Ask Your Question

Revision history [back]

Difference in prediction for TensorFlow and OpenCV DNN (Inception V1))

I am getting different predictions for similar image on native TensorFlow vs OpenCV dnn inference.

I have solved issues with TensorFlow graph using https://github.com/opencv/opencv/issues/13751

.pb .pbtxt and test images can be obtained at https://drive.google.com/open?id=1WHix43VOs1aRqOMfERLQdcNrtjyAer4E

TensorFlow Inference

import tensorflow as tf
import cv2
import numpy as np
import time

frozen_graph = './transformed_frozen_graph.pb'
if __name__ == "__main__":
    with tf.gfile.GFile(frozen_graph_filename, "rb") as f:
        graph_def = tf.GraphDef()
        graph_def.ParseFromString(f.read())
    with tf.Graph().as_default() as graph:
        tf.import_graph_def(graph_def, name='80ms')


x = graph.get_tensor_by_name('80ms/x:0')
keep_prob = graph.get_tensor_by_name('80ms/p:0')
y_hat = graph.get_tensor_by_name('80ms/inception_v1/fully_connected/prob_output:0')

test_image = cv2.imread("./user01_fluorescent@5:139661764.png")
cv2.imshow("test_image", test_image)
cv2.waitKey(50)
test_image = cv2.resize(test_image, (224, 224))
batch_of_size_one = np.zeros((1, 224, 224, 3), dtype=np.float32)
batch_of_size_one[0, :, :, :] = test_image

batch_of_size_one[:, :, :, 0] = batch_of_size_one[:, :, :, 0] - 13.05
batch_of_size_one[:, :, :, 1] = batch_of_size_one[:, :, :, 1] - 13.07
batch_of_size_one[:, :, :, 2] = batch_of_size_one[:, :, :, 2] - 12.39

batch_of_size_one[:, :, :, 0] = batch_of_size_one[:, :, :, 0] / 56.20
batch_of_size_one[:, :, :, 1] = batch_of_size_one[:, :, :, 1] / 56.24
batch_of_size_one[:, :, :, 2] = batch_of_size_one[:, :, :, 2] / 54.82

with tf.Session(graph=graph) as sess:
    start_time = time.time()
    print(sess.run(y_hat, feed_dict={x:batch_of_size_one, keep_prob:

OpenCV Inference

import cv2
import numpy as np
import time

nn_2 = cv2.dnn.readNetFromTensorflow("./transformed_frozen_graph.pb", "./cv_graph.pbtxt")

test_image = cv2.imread("./user01_fluorescent@4:127784861.png")
test_image = cv2.resize(test_image, (224, 224))

blob = cv2.dnn.blobFromImage(test_image, 55.02, (224, 224), (13.05, 13.05, 12.39), False)

nn_2.setInput(blob)
start_time = time.time()
out = nn_2.forward()
print("Eval time:{}".format(time.time() - start_time))


out = out.flatten()
print(out)
classId = np.argmax(out)
print(classId)
confidence = out[classId]
print(confidence)

Number after @ in image name is the correct class. TensorFlow predictions are correct but OpenCV predictions are incorrect.