JohnJ
JohnJ

Reputation: 7056

rescale image in tensorflow to fall between [0,1]

I am fairly new to tensorflow and I have a tflite model which needs inference on a single image (ie no datasets). The docs say the input should be 224,224,3 and scaled to [0,1] (https://www.tensorflow.org/lite/tutorials/model_maker_image_classification#advanced_usage), but I am having trouble doing this rescaling to [0,1].

Currently I have something like so:

    img = tf.io.read_file(image_path)
    img = tf.io.decode_image(img, channels=3)
    img = tf.image.convert_image_dtype(img, tf.uint8)
    print('min max img value',tf.reduce_min(img),tf.reduce_max(img))

The min and max and 0 and 255 respectively. I would like to scale this to [0,1]

I am on tf 2.5 and I do not see a builtin method to do this..

I tried doing this:

    img = tf.io.read_file(image_path)
    img = tf.io.decode_image(img, channels=3)
    scale=1./255
    img=img*scale
    img = tf.image.convert_image_dtype(img, tf.uint8)
    print('min max img value',tf.reduce_min(img),tf.reduce_max(img))

and I get thrown:

TypeError: Cannot convert 0.00392156862745098 to EagerTensor of dtype uint8

I think there is some casting error :(

Upvotes: 0

Views: 2700

Answers (1)

Alexey Tochin
Alexey Tochin

Reputation: 683

In order to avoid TypeError: Cannot convert 0.00392156862745098 to EagerTensor of dtype uint8 error we have to cast img form tf.unit8 to tf.float32 like

img = tf.cast(img, dtype=tf.float32) / tf.constant(256, dtype=tf.float32)
print('min max img value', tf.reduce_min(img), tf.reduce_max(img))

Conversion an image tensor in tf.float32 normalized to scale [0, 1] to tf.uint8 is probably not a good idea.

Upvotes: 2

Related Questions