GCP ML引擎预测失败:处理输入错误:预期float32获得base64

时间:2019-01-17 18:21:22

标签: python tensorflow machine-learning google-cloud-platform google-cloud-ml

我正在尝试对部署到GCP ML引擎的经过定制训练的TensorFlow模型进行预测。当我尝试在模型上调用预测时,它会返回以下错误消息“ Expected float32 got base64”

  1. 我使用了{strong>转移学习和TensorFlow的retrain.py脚本,按照official documentation

    在图像上训练模型

    $ python retrain.py --image_dir〜/ training_images saved_model_dir / saved_model_directory

  2. 我已经使用TensorFlow的label_img.py脚本在本地测试了预测,预测在本地对图片有效

    $ python label_image.py --graph = / tmp / output_graph.pb --labels = / tmp / output_labels.txt --input_layer =占位符--output_layer = final_result \

  3. 我已经按照retrain.py脚本的文档中所述导出了我的模型以用于Tensorflow Serving。

    retrain.py --image_dir〜/ training_images --saved_model_dir / saved_model_directory

  4. 我已将模型上传到Firebase,GCP验证并接受了我的模型,因此能够触发我的模型。

  5. 尝试调用在线预测时,我收到“ Expected float32”错误。

    test.json = {“ image_bytes”:{“ b64”:“ / 9j / 4AAQSkZJ ....... ==”}}

    gcloud ml-engine预测\ --model my_model \ --version v1 \ --json-instances ./test.json

是否需要修改retrain.py以使保存的模型接受base64,还是有其他解决方案?

我已经检查了以下答案,但不幸的是它不能解决我的问题:     How to pass base64 encoded image to Tensorflow prediction?

2 个答案:

答案 0 :(得分:1)

问题在于,retrain.py以浮点数的形式导出了一个模型,该模型的输入期望已解码并已调整大小的图像(请参见此line),但是您正在传递原始,未解码的图像数据

有两种解决方案。

  1. 以预期的格式(浮点数)创建JSON请求。这是一个简单的修复程序,但可能会对性能产生影响(发送float32数据会导致JSON效率低下)。
  2. 更改模型以接受原始图像数据作为输入。这需要对模型进行一些修改。

对于(1),您将发送类似于以下内容的JSON文件:

{"images": [[[0.0, 0.0, 0.0], [0,0,0], [...]], [...], ...]}

当然,您可能会使用一些客户端库进行构建

(2)涉及更多一点。 This sample可以指导您如何做。

答案 1 :(得分:0)

虽然在 json 中发送一个 float32 数组可以工作,但您会发现由于网络延迟,它非常慢。如果可能,您希望使用 base64 编码的字符串。

为此,您可以对导出脚本进行的一项非常简单的更改是将图像输入名称更改为以 _bytes 结尾。发生这种情况时,tensorflow 服务将自动为您解码 base64 编码的图像字符串。基本上更新这一行 https://github.com/tensorflow/hub/blob/a96bbd73abbecfad8c5517684cf3655b48bab39b/examples/image_retraining/retrain.py#L963

inputs={'image_bytes': in_image},

这可能是处理图像输入时 tensorflow 服务最有用但鲜为人知的行为之一。

您也可以在导出模型时使用 tf.io.decode 并编写自己的解码函数。

最后,你的 json 负载看起来像这样

{"inputs": {"image_bytes": {"b64": "/9j/4AAQSkZJ.......=="}}}

或者,如果您更喜欢实例格式

{"instances": [{"image_bytes": {"b64": "/9j/4AAQSkZJ.......=="}}]}