How to pass base64 encoded image to Tensorflow prediction?

前端 未结 3 1507
死守一世寂寞
死守一世寂寞 2020-12-01 22:13

I have a google-cloud-ml model that I can run prediction by passing a 3 dimensional array of float32...

{ \'instances\' [ { \'input\' : \'[ [ [ 0.0 ], [ 0.5 ],

3条回答
  •  粉色の甜心
    2020-12-01 22:37

    I was trying to use @Lak's answer (thanks Lak) to get online predictions for multiple instances in one json file, but kept getting the following error (I had two instances in my test json, hence the shape [2]):

    input filename tensor must be scalar but had shape [2]

    The problem is that ML engine apparently batches all the instances together and passes them to the serving inpur receiver function, but @Lak's sample code assumes the input is a single instance (it indeed works fine if you have a single instance in your json). I altered the code so that it can process a batch of inputs. I hope it will help someone:

    def read_and_preprocess(filename):
        image_contents = tf.read_file(filename)
        image = tf.image.decode_image(image_contents, channels=NUM_CHANNELS)
        image = tf.image.convert_image_dtype(image, dtype=tf.float32) # 0-1
        return image
    
    def serving_input_fn():
        inputs = {'imageurl': tf.placeholder(tf.string, shape=(None))}
        filename = inputs['imageurl']
        image = tf.map_fn(read_and_preprocess, filename, dtype=tf.float32)
        # make the outer dimension unknown (and not 1)
        image = tf.placeholder_with_default(image, shape=[None, HEIGHT, WIDTH, NUM_CHANNELS])
    
        features = {'image': image}
        return tf.estimator.export.ServingInputReceiver(features, inputs)
    

    The key changes are that 1) you don't squeeze the input tensor (that would cause trouble in the special case when your json contains only one instance) and, 2) use tf.map_fn to apply the read_and_preprocess function to a batch of input image urls.

提交回复
热议问题