Как загрузить файл изображения в клиент Tensorflow Serving, чтобы input_tensor 'DecodeJpeg / contents: 0' получал скаляр вместо формы [1] - PullRequest
0 голосов
/ 11 сентября 2018

Я успешно обучен, экспортировал модель классификации изображений в 'retrained_graph.pb'. Моя функция экспорта выглядит так:

def export_model(sess, keys, architecture, saved_model_dir):
  if architecture == 'inception_v3':
    input_tensor = 'DecodeJpeg/contents:0'
  elif architecture.startswith('mobilenet_'):
    input_tensor = 'input:0'
  else:
    raise ValueError('Unkonwn architecture', architecture)
  in_image = sess.graph.get_tensor_by_name(input_tensor)
  inputs = {'image': tf.saved_model.utils.build_tensor_info(in_image)}

  out_classes = sess.graph.get_tensor_by_name('final_result:0')
  outputs = {'prediction': tf.saved_model.utils.build_tensor_info(out_classes),
             'classes': tf.saved_model.utils.build_tensor_info(tf.convert_to_tensor(list(keys))),}

  signature = tf.saved_model.signature_def_utils.build_signature_def(
    inputs=inputs,
    outputs=outputs,
    method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME
  )

  legacy_init_op = tf.group(tf.tables_initializer(), name='legacy_init_op')

  builder = tf.saved_model.builder.SavedModelBuilder(saved_model_dir)
  builder.add_meta_graph_and_variables(
    sess, [tf.saved_model.tag_constants.SERVING],
    signature_def_map={
      tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: signature
    },
    legacy_init_op=legacy_init_op)
  builder.save()

Я пытаюсь запустить эту модель в Tensorflow Serving на моем ноутбуке, которую я запускаю в Docker следующим образом:

docker run -p 8500:8500 -t $USER/inception_serving

Мой клиент классификации изображений (inception_client.py) выглядит следующим образом:

import grpc
import tensorflow as tf

from tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_service_pb2_grpc


tf.app.flags.DEFINE_string('server', 'localhost:9000',
                           'PredictionService host:port')
tf.app.flags.DEFINE_string('image', '', 'path to image in JPEG format')
FLAGS = tf.app.flags.FLAGS


def main(_):
  channel = grpc.insecure_channel(FLAGS.server)
  stub = prediction_service_pb2_grpc.PredictionServiceStub(channel)
  # Send request
  with open(FLAGS.image, 'rb') as f:
    # See prediction_service.proto for gRPC request/response details.
    image_data = f.read()
    request = predict_pb2.PredictRequest()
    request.model_spec.name = 'model'
    request.model_spec.signature_name = tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY
    request.inputs['image'].CopyFrom(
        tf.contrib.util.make_tensor_proto(image_data, shape=[1]))
    result = stub.Predict(request, 10.0)  # 10 secs timeout
    print(result)

Теперь, когда я пытаюсь классифицировать изображение с помощью этой команды:

tools/bazel_in_docker.sh bazel-bin/tensorflow_serving/example/inception_client   --server=127.0.0.1:8500 --image=./photo.jpg

Я получаю эту ошибку:

debug_error_string = "{"created":"@1536674119.695152100","description":"Error received from 
peer","file":"src/core/lib/surface/call.cc","file_line":1095,"grpc_message":"contents must be 
scalar, got shape [1]\n\t [[Node: DecodeJpeg = DecodeJpeg[_output_shapes=[[?,?,3]], 
acceptable_fraction=1, channels=3, dct_method="", fancy_upscaling=true, ratio=1, 
try_recover_truncated=false, _device="/job:localhost/replica:0/task:0/
device:CPU:0"](_arg_DecodeJpeg/contents_0_0)]]","grpc_status":3}"

Итак, мой вопрос: как мне ввести свое изображение в request.inputs ['image'], чтобы оно было в правильной форме (скалярный тензор)?

1 Ответ

0 голосов
/ 27 марта 2019

Вам нужно загрузить изображение, которое декодирует формат jpeg в numpy массив. См. OpenCV imread для начала. Это самый быстрый

image = cv2.imread(img_path,1)
image = image.astype('f')

Предварительная обработка, которую вам нужно сделать, зависит от вашей модели или, возможно, от нее.

Используя чистый Tensorflow, вы также можете использовать tf.read_file и tf.decode_jpeg

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...