Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Number of channels in the input image
- CHANNELS = 3
- # Dimensions of resized images (input to the neural net)
- HEIGHT = 200
- WIDTH = 200
- # A placeholder for a batch of images
- images_placeholder = tf.placeholder(dtype=tf.string, shape=(None,))
- # The CloudML Prediction API always "feeds" the Tensorflow graph with
- # dynamic batch sizes e.g. (?,). decode_jpeg only processes scalar
- # strings because it cannot guarantee a batch of images would have
- # the same output size. We use tf.map_fn to give decode_jpeg a scalar
- # string from dynamic batches.
- def decode_and_resize(image_str_tensor):
- """Decodes jpeg string, resizes it and returns a uint8 tensor."""
- image = tf.image.decode_jpeg(image_str_tensor, channels=CHANNELS)
- # Note resize expects a batch_size, but tf_map supresses that index,
- # thus we have to expand then squeeze. Resize returns float32 in the
- # range [0, uint8_max]
- image = tf.expand_dims(image, 0)
- image = tf.image.resize_bilinear(
- image, [HEIGHT, WIDTH], align_corners=False)
- image = tf.squeeze(image, squeeze_dims=[0])
- image = tf.cast(image, dtype=tf.uint8)
- return image
- decoded_images = tf.map_fn(
- decode_and_resize, images_placeholder, back_prop=False, dtype=tf.uint8)
- # convert_image_dtype, also scales [0, uint8_max] -> [0, 1).
- images = tf.image.convert_image_dtype(decoded_images, dtype=tf.float32)
- # Then shift images to [-1, 1) (useful for some models such as Inception)
- images = tf.sub(images, 0.5)
- images = tf.mul(images, 2.0)
- # ...
- inputs = {"image_bytes": images_placeholder.name}
- tf.add_to_collection("inputs", json.dumps(inputs))
- {"image_bytes": {"b64": "dGVzdAo="}}
- echo "{"image_bytes": {"b64": "`base64 image.jpg`"}}" > instances
- gcloud beta ml predict --instances=instances --model=my_model
- {"instances" : [{"image_bytes": {"b64": "dGVzdAo="}}]}
Add Comment
Please, Sign In to add comment