0

Hi i need to use python cv2 to do exactly the same preprocessing done by tensorflow in the below code snippet. Please help!

file_name = 'image path'
input_name = 'file_reader'
input_height=299
input_width=299
input_mean=0
input_std=255

file_reader = tf.read_file(file_name, input_name)
image_reader = tf.image.decode_jpeg(file_reader, channels = 3,
                                    name='jpeg_reader')
float_caster = tf.cast(image_reader, tf.float32)
dims_expander = tf.expand_dims(float_caster, 0);
resized = tf.image.resize_bilinear(dims_expander, [input_height, input_width])
normalized = tf.divide(tf.subtract(resized, [input_mean]), [input_std])
sess = tf.Session()
result = sess.run(normalized)

2 Answers 2

1

I am going to write OpenCV code for your tensorflow code line by line:

file_name = 'image path'
input_name = 'file_reader'
input_height=299
input_width=299
input_mean=0
input_std=255

#file_reader = tf.read_file(file_name, input_name)
#image_reader = tf.image.decode_jpeg(file_reader, channels = 3,name='jpeg_reader')                              
image = cv2.imread(file_name, -1)


#float_caster = tf.cast(image_reader, tf.float32)
float_caster = image.astype(numpy.float32, copy=False)


#dims_expander = tf.expand_dims(float_caster, 0);
#This line just adds another dimension to the image, which is not needed for OpenCV but if you want:
#dims_expander = numpy.expand_dims(float_caster, axis=0)


#resized = tf.image.resize_bilinear(dims_expander, [input_height, input_width])
resized = cv2.resize(float_caster, (input_height,input_width),interpolation=cv2.INTER_LINEAR)

#normalized = tf.divide(tf.subtract(resized, [input_mean]), [input_std])
normalized = resized - input_mean
normalized /= input_std

Remember that OpenCV reads images as BGR and tensorflow reads images as RGB. So if you want to visually compare results, you need to convert one to the order of the other.

Sign up to request clarification or add additional context in comments.

1 Comment

Can you please help me convert the following img_contents = tf.read_file(input_queue[0]) img = tf.image.decode_jpeg(img_contents, channels=3) img_r, img_g, img_b = tf.split(value=img, num_or_size_splits=3, axis=2) img = tf.cast(tf.concat([img_b, img_g, img_r], 2), dtype=tf.float32) # Extract mean. img -= IMG_MEAN
0

tf.image.resize_bilinear is a buggy function. so, you won't get exactly same values after resizing same image in TF and CV2.

Quick example:

img_original = np.random.randint(0, 255, (4,4,3)).astype(np.uint8)
img_rescaled = cv2.resize(img_original, (3,3), cv2.INTER_LINEAR)
print(img_original)

array([[[144,   9, 253],
    [  5,  87,   5],
    [ 21, 125, 117],
    [109, 159, 142]],

   [[ 64, 124, 196],
    [ 43, 230,  80],
    [ 42, 166,  36],
    [158, 121,  11]],

   [[238, 234,  57],
    [ 86, 254, 239],
    [149, 133, 161],
    [ 96, 245,  99]],

   [[128,   7, 134],
    [169,  69,  70],
    [246,  31,  95],
    [143,   1,  58]]], dtype=uint8)

Check how array has been transformed via CV2:

print(img_rescaled)

array([[[111,  42, 206],
    [ 18, 121,  60],
    [102, 149, 117]],

   [[137, 189, 132],
    [ 80, 196, 129],
    [122, 177,  62]],

   [[148,  54, 117],
    [192,  74, 102],
    [151,  42,  71]]], dtype=uint8)

Now, lets define TF session and see what's happens under the hood:

x = tf.placeholder(tf.uint8, shape=(None,4,4,3), name='x')
resize_op_TF = tf.image.resize_bilinear(x, (3,3), name='resize_op')
session = tf.InteractiveSession()
img_resized_TF = session.run(resize_op_TF, {x: [img_original]})[0]
print(img_resized_TF)

array([[[144.      ,   9.      , 253.      ],
    [ 10.333334,  99.66667 ,  42.333336],
    [ 79.66667 , 147.66667 , 133.66667 ]],

   [[122.00001 , 160.66667 , 149.66666 ],
    [ 64.111115, 210.33333 , 114.55556 ],
    [117.44445 , 159.88889 ,  52.77778 ]],

   [[164.66666 ,  82.66664 , 108.33334 ],
    [165.44446 , 108.777756, 123.22222 ],
    [156.11111 ,  76.55554 ,  86.77777 ]]], dtype=float32)

As you can see the values in array re-scaled with TF and values in array re-scaled with CV2 differ drastically. It is common issue in Tensorflow, and developers still didn't fix it because of bunch of reasons.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.