gpt4 book ai didi

TensorFlow Serving 将图像作为 Cloud ML Engine 上的 base64 编码字符串

转载 作者:行者123 更新时间:2023-12-04 01:46:41 26 4
gpt4 key购买 nike

如何将 TensorFlow Serving Input 函数实现为 base64 编码字符串的图像并在 Cloud ML Engine 上进行预测

我计划在本地训练后将模型部署到 Cloud Machine Learning (ML) Engine 上,但我不知道如何实现服务输入功能

此外,我尽量避免使用 TensorFlow 低级 API,只专注于 TensorFlow 高级 API(TensorFlow Estimator)。下面的代码块是我正在处理的示例代码。


import numpy as np
import tensorflow as tf
import datetime
import os

# create model
from tensorflow.python.keras.applications.vgg16 import VGG16
from tensorflow.python.keras import models
from tensorflow.python.keras import layers

conv_base = VGG16(weights='imagenet',
include_top=False,
input_shape=(150, 150, 3))

model = models.Sequential()
model.add(conv_base)
model.add(layers.Flatten())
model.add(layers.Dense(256, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
conv_base.trainable = False
model.compile(loss='binary_crossentropy',
optimizer=tf.keras.optimizers.RMSprop(lr=2e-5),
metrics=['acc'])

dt = datetime.datetime.now()
datetime_now = dt.strftime("%y%m%d_%H%M%S")
model_dir = 'models/imageclassifier_'+datetime_now
model_dir = os.path.join(os.getcwd(), model_dir)
if not os.path.exists(model_dir):
os.makedirs(model_dir)
print ("model_dir: ",model_dir)

est_imageclassifier = tf.keras.estimator.model_to_estimator(keras_model=model, model_dir=model_dir)

# input layer name
input_name = model.input_names[0]
input_name

此部分为图片输入功能。

def imgs_input_fn(filenames, labels=None, perform_shuffle=False, repeat_count=1, batch_size=1):
def _parse_function(filename, label):
image_string = tf.read_file(filename)
image = tf.image.decode_image(image_string, channels=3)
image.set_shape([None, None, None])
image = tf.image.resize_images(image, [150, 150])
image = tf.subtract(image, 116.779) # Zero-center by mean pixel
image.set_shape([150, 150, 3])
image = tf.reverse(image, axis=[2]) # 'RGB'->'BGR'
d = dict(zip([input_name], [image])), label
return d
if labels is None:
labels = [0]*len(filenames)
labels=np.array(labels)
# Expand the shape of "labels" if necessary
if len(labels.shape) == 1:
labels = np.expand_dims(labels, axis=1)
filenames = tf.constant(filenames)
labels = tf.constant(labels)
labels = tf.cast(labels, tf.float32)
dataset = tf.data.Dataset.from_tensor_slices((filenames, labels))
dataset = dataset.map(_parse_function)
if perform_shuffle:
# Randomizes input using a window of 256 elements (read into memory)
dataset = dataset.shuffle(buffer_size=256)
dataset = dataset.repeat(repeat_count) # Repeats dataset this # times
dataset = dataset.batch(batch_size) # Batch size to use
iterator = dataset.make_one_shot_iterator()
batch_features, batch_labels = iterator.get_next()
return batch_features, batch_labels

我想创建一个服务输入函数

  1. 将图像获取为 JSON 格式的 base64 编码字符串

  2. 将它们转化为Tensor,并将尺寸缩减为(?, 150, 150, 3)进行预测

如下图,

def serving_input_receiver_fn():

''' CODE HERE!'''

return tf.estimator.export.ServingInputReceiver(feature_placeholders, feature_placeholders)

训练和评估模型,

train_spec = tf.estimator.TrainSpec(input_fn=lambda: imgs_input_fn(train_files,
labels=train_labels,
perform_shuffle=True,
repeat_count=1,
batch_size=20),
max_steps=500)

exporter = tf.estimator.LatestExporter('Servo', serving_input_receiver_fn)

eval_spec = tf.estimator.EvalSpec(input_fn=lambda: imgs_input_fn(val_files,
labels=val_labels,
perform_shuffle=False,
batch_size=1),
exporters=exporter)

tf.estimator.train_and_evaluate(est_imageclassifier, train_spec, eval_spec)

如果我理解正确,在 Cloud ML Engine 上获得预测的输入文件示例应该是这样的

请求.json

{"b64": "9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHJC...”}
{"b64": "9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHJC...”}

gcloud ml-engine predict --model MODEL_NAME  \
--version MODEL_VERSION \
--json-instances request.json

如果您一直读到这里并且有一些想法,能否请您建议我如何针对这种特殊情况实现服务输入功能。

非常感谢,


第 2 篇文章 - 更新我到目前为止所做的事情。

根据 sdcbr 的评论,下面是我的 serving_input_receiver_fn()。

对于 _img_string_to_tensor() 函数或(prepare_image 函数),我想我应该像训练模型一样进行图像准备,您可以看到

imgs_input_fn() => _parse_function()。

def serving_input_receiver_fn():
def _img_string_to_tensor(image_string):
image = tf.image.decode_image(image_string, channels=3)
image.set_shape([None, None, None])
image = tf.image.resize_images(image, [150, 150])
image = tf.subtract(image, 116.779) # Zero-center by mean pixel
image.set_shape([150, 150, 3])
image = tf.reverse(image, axis=[2]) # 'RGB'->'BGR'
return image

input_ph = tf.placeholder(tf.string, shape=[None])

images_tensor = tf.map_fn(_img_string_to_tensor, input_ph, back_prop=False, dtype=tf.float32)

return tf.estimator.export.ServingInputReceiver({model.input_names[0]: images_tensor}, {'image_bytes': input_ph})

在我训练模型并将保存的模型部署到 Cloud ML Engine 上之后。我的输入图像被准备成如下所示的格式。

{"image_bytes": {"b64": "YQ=="}}

但是我在通过gcloud得到预测后发现错误。

gcloud ml-engine predict --model model_1  \
--version v1 \
--json-instances request.json

{ "error": "Prediction failed: Error during model execution: AbortionError(code=StatusCode.INVALID_ARGUMENT, details=\"assertion failed: [Unable to decode bytes as JPEG, PNG, GIF, or BMP]\n\t [[{{node map/while/decode_image/cond_jpeg/cond_png/cond_gif/Assert_1/Assert}} = Assert[T=[DT_STRING], summarize=3, _device=\"/job:localhost/replica:0/task:0/device:CPU:0\"](map/while/decode_image/cond_jpeg/cond_png/cond_gif/is_bmp, map/while/decode_image/cond_jpeg/cond_png/cond_gif/Assert_1/Assert/data_0)]]\")" }

我在 _img_string_to_tensor 函数中做错了吗?

您能否详细说明一下这个 tf.placeholder?

input_ph = tf.placeholder(tf.string, shape=[None])

对于您上面的代码,您使用了 shape=[1],但我认为它应该是 shape=[None]。

最佳答案

按照这些思路应该可以工作:

def serving_input_receiver_fn():
def prepare_image(image_str_tensor):
image = tf.image.decode_image(image_str_tensor,
channels=3)
image = tf.image.resize_images(image, [150, 150])
return image

# Ensure model is batchable
# https://stackoverflow.com/questions/52303403/
input_ph = tf.placeholder(tf.string, shape=[None])
images_tensor = tf.map_fn(
prepare_image, input_ph, back_prop=False, dtype=tf.float32)
return tf.estimator.export.ServingInputReceiver(
{model.input_names[0]: images_tensor},
{'image_bytes': input_ph})

您可以在 prepare_image 函数中添加额外的预处理。请注意,images_tensor 应该映射到您的 tf.keras 模型中应该接收输入的层的名称。

另见 thisthis相关问题。

关于TensorFlow Serving 将图像作为 Cloud ML Engine 上的 base64 编码字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55008988/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com