Обслуживание Tensorflow, онлайн-прогнозы: Как создать signature_def, который принимает image_bytes в качестве имени входного тензора? - PullRequest
0 голосов
/ 21 мая 2019

Я успешно обучил модель Keras и использовал ее для прогнозов на своей локальной машине, теперь я хочу развернуть ее с помощью Tensorflow Serving.Моя модель принимает изображения в качестве входных данных и возвращает прогноз маски.

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

{'image_bytes': {'b64': base64.b64encode(jpeg_data).decode()}}

ТеперьФайл saved_model.pb, автоматически сохраненный моей моделью Keras, имеет следующие тензорные имена:

input_tensor = graph.get_tensor_by_name('input_image:0')
output_tensor = graph.get_tensor_by_name('conv2d_23/Sigmoid:0')

, поэтому мне нужно сохранить новый файл saved_model.pb с другим signature_def.

Я попробовал следующее (см. здесь для справки), которое работает:

with tf.Session(graph=tf.Graph()) as sess:
    tf.saved_model.loader.load(sess, ['serve'], 'path/to/saved/model/')
    graph = tf.get_default_graph()
    input_tensor = graph.get_tensor_by_name('input_image:0')
    output_tensor = graph.get_tensor_by_name('conv2d_23/Sigmoid:0')
    tensor_info_input = tf.saved_model.utils.build_tensor_info(input_tensor) 
    tensor_info_output = tf.saved_model.utils.build_tensor_info(output_tensor)
    prediction_signature = (
        tf.saved_model.signature_def_utils.build_signature_def(
            inputs={'image_bytes': tensor_info_input},
            outputs={'output_bytes': tensor_info_output},
method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME))
    builder = tf.saved_model.builder.SavedModelBuilder('path/to/saved/new_model/')
    builder.add_meta_graph_and_variables(
        sess, [tf.saved_model.tag_constants.SERVING],
        signature_def_map={'predict_images': prediction_signature, })
    builder.save()

, но когда я развертываю модель и запрашиваю прогнозы на платформе AI, яполучаю следующую ошибку:

RuntimeError: Prediction failed: Error processing input: Expected float32, got {'b64': 'Prm4OD7JyEg+paQkPrGwMD7BwEA'} of type 'dict' instead.

повторная запись ответа здесь , я также пытался переписать

input_tensor = graph.get_tensor_by_name('input_image:0')

как

image_placeholder = tf.placeholder(tf.string, name='b64')
graph_input_def = graph.as_graph_def()
input_tensor, = tf.import_graph_def(
    graph_input_def,
    input_map={'b64:0': image_placeholder},
    return_elements=['input_image:0'])

с(неправильное) понимание того, что это добавило бы слой поверх моего входного тензора с соответствующим именем 'b64' (согласно документации), который принимает строку и соединяет ее с исходным входным тензором, но ошибка на платформе AI остается той же.

(соответствующий код, который я использую для запроса прогноза:

instances = [{'image_bytes': {'b64': base64.b64encode(image).decode()}}]
response = service.projects().predict(
    name=name,
    body={'instances': instances}
).execute()

, где image - это numpy.ndarray из dtype('float32'))

Я чувствую, что яЯ достаточно близко, но я определенно что-то упускаю.Можете ли вы помочь?

1 Ответ

0 голосов
/ 22 мая 2019

После кодирования b64 -> декодирования буфер img изменится на тип string и не будет соответствовать типу ввода вашей модели.Вы можете попытаться добавить препроцесс в вашу модель и снова отправить запрос b64.

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