Tensorflow Serving: InvalidArgumentError: Ожидаемое изображение (JPEG, PNG или GIF), получило неизвестный формат, начиная с 'AAAAAAAAAAAAAAAA' - PullRequest
0 голосов
/ 23 мая 2019

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

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

def process_image_from_tf_example(self, image_str_tensor, n_channels=3):
    image = tf.image.decode_image(image_str_tensor)
    image.set_shape([256, 256, n_channels])
    image = tf.cast(image, tf.float32) / 255.0
    return image

def read_and_decode(self, serialized):
    parsed_example = tf.parse_single_example(serialized=serialized, features=self.features)
    input_image = self.process_image_from_tf_example(parsed_example["image_raw"], 3)
    ground_truth_image = self.process_image_from_tf_example(parsed_example["gt_image_raw"], 1)
    return input_image, ground_truth_image

Мои изображения сохраняются в формате PNG локально, и когда я записываю их в файлы .tfrecord, которые я использую tf.gfile.GFile(str(image_path), 'rb').read()

Это работает, я могу тренировать свою модель и использовать ее для локальных прогнозов.

Теперь я хочу развернуть мою модель для использования с Tensorflow Serving. Моя serving_input_receiver_fn функция выглядит так:

def serving_input_receiver_fn(self):
    input_ph = tf.placeholder(dtype=tf.string, shape=[None], name='image_bytes')
    images_tensor = tf.map_fn(self.process_image_from_tf_example, input_ph, back_prop=False, dtype=tf.float32)
    return tf.estimator.export.ServingInputReceiver({'input_1': images_tensor}, {'image_bytes': input_ph})

где process_image_from_tf_example та же функция, что и выше, но я получаю следующую ошибку:

InvalidArgumentError (see above for traceback): assertion failed: [Unable to decode bytes as JPEG, PNG, GIF, or BMP]

Чтение здесь похоже, что эта ошибка связана с тем, что я не использую tf.gfile.GFile(str(image_path), 'rb').read()

как с моими тренировочными / тестовыми файлами, но я не могу использовать его, потому что мне нужно отправить закодированные байты в формате

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

по запросу TF Serving.

Примеры онлайн отправка байтов в кодировке JPEG и предварительная обработка изображения, начиная с

tf.image.decode_jpeg(image_buffer, channels=3)

, но если я использую другую функцию предварительной обработки в моем serving_input_receiver_fn (отличную от той, которая используется для обучения), которая начинается с

tf.image.decode_png(image_buffer, channels=3)

я получаю следующую ошибку:

InvalidArgumentError (see above for traceback): Expected image (JPEG, PNG, or GIF), got unknown format starting with 'AAAAAAAAAAAAAAAA'

(кстати, то же самое происходит с decode_jpeg)

Что я делаю не так? Вам нужно больше кода от меня, чтобы ответить? Большое спасибо!

Изменить !! Изменил название, потому что оно было недостаточно ясным

1 Ответ

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

ОК, я решил.

image был массивом, но я должен был сделать следующее:

buffer = cv2.imencode('.jpg', image)[1].tostring()
bytes_image = base64.b64encode(buffer).decode('ascii')
{"image_bytes": {"b64": bytes_image}}

Также изменились мои функции предварительной обработки и serving_input_receiver_fn:

def process_image_from_buffer(self, image_buffer):
    image = tf.image.decode_jpeg(image_buffer, channels=3)
    image = tf.image.convert_image_dtype(image, dtype=tf.float32)
    image = tf.expand_dims(image, 0)
    image = tf.image.resize_bilinear(image, [256, 256], align_corners=False)
    image = tf.squeeze(image, [0])
    image = tf.cast(image, tf.float32) / 255.0
    return image

def serving_input_receiver_fn(self):
    input_ph = tf.placeholder(dtype=tf.string, shape=[None])
    images_tensor = tf.map_fn(self.process_image_from_buffer, input_ph, back_prop=False, dtype=tf.float32)
    return tf.estimator.export.ServingInputReceiver({'input_1': images_tensor}, {'image_bytes': input_ph})

process_image_from_buffer отличается от process_image_from_tf_example, использованного выше для обучения. Я также удалил name='image_bytes' из input_ph выше.

Надеюсь, достаточно ясно, чтобы помочь кому-то еще.

Отличное руководство, частично использованное для его решения

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