背景:
在GCP上的视觉应用程序中,我们使用TF服务。使用TF Serving的应用程序用Go编写。该应用程序将图像转换为Tensor,然后使用gRPC将其发送到TF服务。
问题:
使用Keras图像库,Golang中的预处理逻辑无法像Python中那样有效(推理的准确性受到影响)。部分原因可能是在培训期间使用了Python库。
我们尝试过
Tensorflow服务提供了一种引入可以在服务容器上运行的预处理器的方法。它似乎功能有限(无法将Keras库与模型打包在一起)。我们尝试了以下两个选项
有效的是Keras Preprocessing(Python),在客户端如下所述。
img = tf.keras.preprocessing.image.load_img(file_name, target_size=(HEIGHT, WIDTH))
img_array = tf.keras.preprocessing.image.img_to_array(img)
... grpc调用TensorflowServing ...
我们的目标是使用“ serving_input_receiver_fn”并在TFServing空间中预处理图像,如本博客文章所述:https://medium.com/devseed/technical-walkthrough-packaging-ml-models-for-inference-with-tf-serving-2a50f73ce6f8
但是以下执行为“ serving_input_receiver_fn”的代码无法产生正确的推论。
image = tf.image.decode_image(image_str_tensor, channels=CHANNELS dtype=tf.uint8)
image = tf.reshape(image, [HEIGHT, WIDTH, CHANNELS])
我们的目标是在“ serving_input_receiver_fn”内部运行以下Keras代码(以类似的方式)(假定我们可以从“ grpc”流中加载图像)。
img = tf.keras.preprocessing.image.load_img(file_name, target_size=(HEIGHT, WIDTH))
img_array = tf.keras.preprocessing.image.img_to_array(img)
有可能吗?这是一个大规模部署(70个GPU和2300个CPU),因此性能的每一点都至关重要。在我们的例子中,在TF服务机上进行图像预处理是最佳的。
答案 0 :(得分:0)
我实际上没有答案,但是也许可以为您提供一些帮助的资源。我认为首先,keras.preprocessing应该非常慢,请查看https://www.tensorflow.org/tutorials/load_data/images,它建议将预处理管道构建为tf.data.Dataset管道
上面的keras.preprocessing方法很方便,但是有两个 缺点:
很慢。请参阅下面的性能部分。它缺乏细粒度 控制。它没有与TensorFlow的其余部分很好地集成。至 将文件作为tf.data.Dataset加载
为什么不将预处理层作为模型图本身的一部分包含在内,以便它可以在Tensorflow服务内运行?