我正在开发Google云端ML,我希望能够预测jpeg图像。为此,我想使用:
gcloud beta ml预测--instances = INSTANCES --model = MODEL [--version = VERSION]
(https://cloud.google.com/ml/reference/commandline/predict)
Instances是json文件的路径,其中包含有关image的所有信息。 如何从jpeg图像创建json文件?
非常感谢!!
答案 0 :(得分:6)
第一步是确保导出的图形具有可以接受JPEG数据的占位符和操作。请注意,CloudML假定您正在发送一批图像。我们必须使用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="}}]}
答案 1 :(得分:2)
只是填写上一个答案......
Google在图片识别任务上发布了一个blog post,以及一些可以直接解决您问题的相关code以及您可能会发现的其他问题。它包含一个images_to_json.py文件,以帮助构建json请求
答案 2 :(得分:0)
在python中,您可以使用以下代码创建与“ gcloud ml-engine Forecast”一起使用的base64 JSON文件:
$level1 = array_map('basename', glob('MainFolder/*', GLOB_ONLYDIR));
...
我花了很长时间使所有这些工作都适用于TensorFlow Keras模型和Google Cloud ML。在使一切正常工作之后,我整理了一个代码示例,希望它可以为将相同的问题部署到Google Cloud ML的其他人提供帮助。可以在这里找到:https://github.com/mhwilder/tf-keras-gcloud-deployment。