服务 attention_ocr 模型时出错("error":"Expected one or two output Tensors, found 17")

Error when serving attention_ocr model ("error": "Expected one or two output Tensors, found 17")

我正在尝试提供 attention_ocr model on docker with tensorflow/serving 图片。

首先,我用自己的数据集训练了这个模型,用 demo_inference.py

得到了很好的结果

因此,我将使用 export_model.py
导出经过训练的模型 python export_model.py --checkpoint=model.ckpt-111111 --export_dir=/tmp/mydir

然后,运行 docker 用于服务模型的容器。
docker run -it --rm -p 8501:8501 -v /tmp/mydir:/models/aocr -e MODEL_NAME=aocr --gpus all tensorflow/serving

这是我的 python 客户端脚本。

data_dir = '/root/src/models/research/attention_ocr/python/datasets/data/demo/'

data_files = os.listdir(data_dir)

with open(data_dir + "0.jpg", "rb") as image_file:
    encoded_string = base64.b64encode(image_file.read())

## Some requests I tried ##
# predict_request = '{"examples": [{"inputs": ["%s"]}]}' % encoded_string
# predict_request = '{"examples": [{"inputs": "%s"}]}' % encoded_string
predict_request = '{"examples": [{"inputs": {"b64": ["%s"]}}]}' % encoded_string

r = requests.post('http://MY_IP_ADDR:8501/v1/models/aocr:classify', data=predict_request)
print(r.text)

结果.. "error": "Expected one or two output Tensors, found 17"

这是第一次使用tensorflow/serving。我无法处理这个错误。

请帮助这个新手..在此先感谢。

感谢您报告此问题。我提交了一个错误(#9264) on Github on your behalf. The issue is that the default signature includes all the endpoints that the model provides. If you want to use the Serving's Classification API, we need to modify the export_model script to export just the 2 tensors expected by the classification API (i.e., predictions and scores). In the meantime, you can use the Predict API, which supports an arbitrary number of output tensors. Please note that when using the predict API via GRPC you can specify output_filter,但是 RESTful API 没有那个选项,所以响应很重,因为它发回了所有的注意力掩码和原始图像。在如果其他人试图弄清楚如何 运行 推理,这里是对我有用的步骤。

  1. 导出模型:
wget http://download.tensorflow.org/models/attention_ocr_2017_08_09.tar.gz
tar -xzvf attention_ocr_2017_08_09.tar.gz
python model_export.py --checkpoint=model.ckpt-399731 \
  --export_dir=/tmp/aocr_b1 --batch_size=1

请注意,由于 model_export.py 中的错误,需要 --batch_size=1。签名问题发PR的时候我会处理的。

  1. 运行 docker 模型容器。
sudo docker run -t --rm -p 8501:8501 \
  -v /tmp/aocr_b1:/models/aocr/1 -e MODEL_NAME=aocr tensorflow/serving

请注意路径需要包含版本号/models/aocr/1。如果您不附加 /1,服务器会抱怨找不到任何版本。

  1. 运行 脚本
python send_serving_request.py --image_file=testdata/fsns_train_00.png

这是结果

Prediction: Rue de la Gare░░░░░░░░░░░░░░░░░░░░░░░
Confidence: 0.899479449

代码如下:

send_serving_request.py

from absl import app
from absl import flags
import base64
import json
import os
from PIL import Image
import numpy as np
import requests
import tensorflow as tf

flags.DEFINE_string('image_file', None,
                    'Name of file containing image to request.')


def create_serialized_tf_example(image):
  """Create a serialized tf.Example proto for feeding the model."""
  example = tf.train.Example()
  example.features.feature['image/encoded'].float_list.value.extend(
      list(np.reshape(image, (-1))))
  return example.SerializeToString()


def main(_):
  pil_image = Image.open(flags.FLAGS.image_file)
  encoded_string = base64.b64encode(
      create_serialized_tf_example(np.asarray(pil_image)))
  predict_request = (
      b'{"instances": [{"inputs": {"b64": "%s"}}]}') % encoded_string
  r = requests.post(
      'http://localhost:8501/v1/models/aocr:predict', data=predict_request)
  data = json.loads(r.text)
  print('Prediction:', data['predictions'][0]['predicted_text'])
  print('Confidence:', data['predictions'][0]['normalized_seq_conf'])


if __name__ == '__main__':
  flags.mark_flag_as_required('image_file')
  app.run(main)