Препроцессор tenorflow.keras в Службе обработки тензорных потоков? - PullRequest
0 голосов
/ 23 января 2019

Я преобразую модель tenorflow.keras в оценщик и использую estimator.export_saved_mode(serving_input_receiver_fn=serving_input_receiver_fn), чтобы подготовить мою модель для обслуживания TensorFlow.Вот как выглядит мой serving_input_receiver_fn:

def image_preprocessing(image):   
    image = tf.expand_dims(image, 0)
    image = tf.image.resize_bilinear(image, [HEIGHT, WIDTH], align_corners=False)
    image = tf.squeeze(image, axis=[0])
    image = tf.cast(image, dtype=tf.uint8)
    return image

def serving_input_receiver_fn():
    def prepare_image(image_str_tensor):
        image = tf.image.decode_jpeg(image_str_tensor, channels=CHANNELS)
        return image_preprocessing(image)

    input_ph = tf.placeholder(tf.string, shape=[None], name='image_binary')
    images_tensor = tf.map_fn(prepare_image, input_ph, back_prop=False, dtype=tf.uint8)
    images_tensor = tf.image.convert_image_dtype(images_tensor, dtype=tf.float32)

    return tf.estimator.export.ServingInputReceiver(
        {model.input_names[0]: images_tensor},
        {'image_bytes': input_ph})

Есть ли способ продолжить принимать uint8 в качестве входных данных, но преобразовать его в float32 и затем применить функцию предварительной обработки tenorflow.keras, такую ​​как tensorflow.keras.applications.xception.preprocess_input?

Я не уверен, как нормализовать этот вход в соответствии со средним / стандартным значением модели tenorflow.keras.applications.Перед добавлением вышеупомянутого моя модель приняла сериализованные списки json массивов json, и я бы нормализовал их на стороне клиента.Теперь, когда он принимает байтовые строки в кодировке uint8 base64, я не уверен, как переместить нормализацию керасов на эту функцию.

1 Ответ

0 голосов
/ 24 января 2019

Если вы посмотрите реализацию Xception в Keras на github, вы заметите, что она использует общую функцию предварительной обработки imagenet , которая используется большинством других предварительно обученных моделей в этом репо. Эта функция должна работать с массивами numpy, а также с тензорами Keras / TensorFlow. Следовательно, вы должны быть в состоянии импортировать его и добавить в вашу image_preprocessing функцию.

Теперь не совсем понятно, почему вы хотите привести к tf.uint8. Я ожидаю, что функция предварительной обработки выглядит следующим образом:

def image_preprocessing(im):
    im = tf.expand_dims(im, 0)
    im = tf.image.resize_bilinear(im, [HEIGHT, WIDTH], align_corners=False)
    im = tf.squeeze(im, axis=[0])
    im = preprocess_input(im)
    return im
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...