我是TF的新手,并且已部署在GCP上。因此,非常感谢您的帮助!
目前,我正在尝试使用TensorFlow Serving在Google Cloud Platform(GCP)上部署Mnist手写烧瓶应用程序。我已将模型部署在TF服务上,并使用自定义MySimpleScaler类对图像进行预处理和调整大小,然后再将其输入模型中。我的问题是,是否可以在保存模型中添加预处理和调整大小的类,以便我的flask应用程序不具有任何张量流依赖关系。原因是TF库对于应用程序引擎而言太大。
我的应用程序的流程如下:
1)我的flask应用程序已部署在应用程序引擎上。它具有MySimpleScaler类,可以调整从画布输入的图像的大小。我允许用户从前端的画布上绘制->使用jquery获取数据->使用parse_image函数将其写为output.jpg->从本地驱动器读取output.jpg并将其输入到MySimpleScaler进行预处理
2)我的模型是使用TF服务部署在AI平台上的。我在步骤1中使用MysimpleScaler的输出发送了一个预测请求。预测值随后被推送到Flask后端,然后使用Jinja将其推送到前端
这是我用来获取和预处理数据的两个函数:
def parse_image(imgData):
# imgData fetch img from canvas using request.get_data()
imgstr = re.search(b"base64,(.*)", imgData).group(1)
img_decode = base64.decodebytes(imgstr)
with open("output.jpg", "wb") as file:
file.write(img_decode)
return img_decode
class MySimpleScaler(object):
def preprocess_img(self, img_decode):
# img_decode from parse_image
img_raw = img_decode
image = tf.image.decode_jpeg(img_raw, channels=1)
image = tf.image.resize(image, [28, 28])
image = (255 - image) / 255.0 # normalize to [0,1] range
image = tf.reshape(image, (1, 28, 28, 1))
return image
TL; DR:在将其部署到TF服务之前,我想添加preprocess_img函数作为保存模型中的一层。 非常感谢您的参与!
答案 0 :(得分:0)
如果您对batch_size=1
没问题,可以直接在图表中添加预处理功能,这就是我的处理方法,
代码:
import tensorflow as tf
import numpy as np
print('TensorFlow:',tf.__version__)
def preprocess_single_image(image_bytes, h=299, w=299):
image = tf.image.decode_jpeg(image_bytes[0], channels=3)
image = tf.image.resize(image, size=[h, w])
image = (image - 127.5) / 127.5
image = tf.expand_dims(image, axis=0)
return image
image_bytes = tf.keras.Input(shape=[], batch_size=1, name='image_bytes', dtype=tf.string)
preprocessed_image = preprocess_single_image(image_bytes)
model = tf.keras.applications.Xception(weights='imagenet')
predictions = model(preprocessed_image)
new_model = tf.keras.Model(image_bytes, predictions)
new_model.save('export/1', save_format='tf')
print('Model Input Shape:', new_model.input_shape)
### !wget -q -O "cat.jpg" "https://images.pexels.com/photos/617278/pexels-photo-617278.jpeg?cs=srgb&dl=adorable-animal-blur-cat-617278.jpg&fm=jpg"
loaded_model = tf.saved_model.load('export/1')
cat_bytes = tf.expand_dims(tf.io.read_file('cat.jpg'), axis=0)
preds = loaded_model(cat_bytes).numpy()
print(tf.keras.applications.xception.decode_predictions(preds, top=3)[0])
输出:
TensorFlow: 2.0.0
WARNING:tensorflow:From /tensorflow-2.0.0/python3.6/tensorflow_core/python/ops/resource_variable_ops.py:1781: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version.
Instructions for updating:
If using Keras pass *_constraint arguments to layers.
INFO:tensorflow:Assets written to: export/1/assets
Model Input Shape: (1,)
[('n02123045', 'tabby', 0.5762127), ('n02123159', 'tiger_cat', 0.24783427), ('n02124075', 'Egyptian_cat', 0.09435685)]
PS:如果您想扩展此支持范围,可以使用tf.map_fn
batch_size > 1