Я пытаюсь подготовить свою собственную модель 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
)
Что я делаю не так? Вам нужно больше кода от меня, чтобы ответить? Большое спасибо!
Изменить !!
Изменил название, потому что оно было недостаточно ясным