Google CloudML serve_input_receiver_fn () ошибка декодирования b64 - PullRequest
0 голосов
/ 18 февраля 2019

Я отправляю изображение в кодировке base64 через AJAX POST на модель, хранящуюся в Google CloudML.Я получаю сообщение об ошибке, сообщающее, что мой input_fn (): не может декодировать изображение и преобразовать его в формат JPEG.

Ошибка:

Prediction failed: Error during model execution: 
AbortionError(code=StatusCode.INVALID_ARGUMENT,  
details="Expected image (JPEG, PNG, or GIF), got 
unknown format starting with 'u\253Z\212f\240{\370
\351z\006\332\261\356\270\377' [[{{node map/while
/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"](map/while/TensorArrayReadV3)]]") 

Ниже приведено полное описание Serving_input_receiver_fn():

  1. Первый шаг, который я считаю, заключается в обработке входящей кодированной строки b64 и ее декодировании.Это делается с помощью:

    image = tensorflow.io.decode_base64(image_str_tensor)

  2. Следующим шагом, на мой взгляд, является открытие байтов, но здесь я не знаю, как обращаться с декодированным b64.строка с кодом тензорного потока и нужна помощь.

С помощью приложения Python Flask это можно сделать с помощью:

image = Image.open(io.BytesIO(decoded))
передать байты для декодирования в tf.image.decode_jpeg ????

image = tensorflow.image.decode_jpeg(image_str_tensor, channels=CHANNELS)

Полный input_fn (): код

def serving_input_receiver_fn(): 
   def prepare_image(image_str_tensor): 
   image = tensorflow.io.decode_base64(image_str_tensor)
   image = tensorflow.image.decode_jpeg(image_str_tensor, channels=CHANNELS)
   image = tensorflow.expand_dims(image, 0) image = tensorflow.image.resize_bilinear(image, [HEIGHT, WIDTH], align_corners=False)
   image = tensorflow.squeeze(image, axis=[0])    
   image = tensorflow.cast(image, dtype=tensorflow.uint8) 
   return image

Как мне декодировать мою строку b64 обратно в jpeg, а затем преобразовать jpeg в тензор?

1 Ответ

0 голосов
/ 23 августа 2019

Это образец для обработки изображений b64.

HEIGHT = 224
WIDTH = 224
CHANNELS = 3
IMAGE_SHAPE = (HEIGHT, WIDTH)
version = 'v1'

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])
    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(
        {'input': images_tensor},
        {'image_bytes': input_ph})

export_path = os.path.join('/tmp/models/json_b64', version)
if os.path.exists(export_path):  # clean up old exports with this version
    shutil.rmtree(export_path)
estimator.export_savedmodel(
    export_path,
    serving_input_receiver_fn=serving_input_receiver_fn)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...