我正在研究Google Cloud ML,我希望能够预测jpeg图像.为此,我想使用:
gcloud beta ml预测--instances = INSTANCES --model = MODEL [--version = VERSION]
(https://cloud.google.com/ml/reference/commandline/predict)
Instances是json文件的路径,其中包含有关image的所有信息.如何从jpeg图像创建json文件?
非常感谢!!
第一步是确保导出的图形具有占位符和可以接受JPEG数据的操作.请注意,CloudML假定您正在发送一批图像.我们必须使用a tf.map_fn
来解码和调整一批图像的大小.根据型号的不同,可能需要额外的数据预处理来规范化数据等.如下所示:
# 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) # ...
此外,我们需要确保正确标记输入,在这种情况下,输入的名称(地图中的键)必须结束_bytes
.发送base64编码数据时,它会让CloudML预测服务知道它需要解码数据:
inputs = {"image_bytes": images_placeholder.name} tf.add_to_collection("inputs", json.dumps(inputs))
gcloud命令期望的数据格式将是以下形式:
{"image_bytes": {"b64": "dGVzdAo="}}
(注意,如果image_bytes
是模型的唯一输入,则可以简化为{"b64": "dGVzdAo="}
).
例如,要从磁盘上的文件创建它,您可以尝试以下方法:
echo "{\"image_bytes\": {\"b64\": \"`base64 image.jpg`\"}}" > instances
然后将其发送到服务,如下所示:
gcloud beta ml predict --instances=instances --model=my_model
请注意,在直接向服务发送数据时,您发送的请求正文需要包含在"实例"列表中.所以上面的gcloud命令实际上将以下内容发送到HTTP请求正文中的服务:
{"instances" : [{"image_bytes": {"b64": "dGVzdAo="}}]}