2016-11-28 1 views
4

Я работаю над облаком Google ML, и я хочу получить прогноз на jpeg-образ. Чтобы сделать это, я хотел бы использовать:Как преобразовать jpeg-изображение в json-файл в Google machine learning

gcloud бета-мл предсказывают --instances = Инстансы --model = МОДЕЛЬ [--version = VERSION]

(https://cloud.google.com/ml/reference/commandline/predict)

Экземпляры путь в json-файл со всей информацией об изображении. Как создать json-файл из моего jpeg-изображения?

Большое спасибо!

ответ

4

Первый шаг - убедиться, что на экспортируемом графике есть местозаполнитель и операторы, которые могут принимать данные JPEG. Обратите внимание, что CloudML предполагает, что вы отправляете пакет изображений. Мы должны использовать tf.map_fn для декодирования и изменения размера партии изображений. В зависимости от модели, дополнительная предварительная обработка данных может потребоваться для нормализации данных и т.д. Это показано ниже:

# Number of channels in the input image 
CHANNELS = 3 

# Dimensions of resized images (input to the neural net) 
HEIGHT = 200 
WIDTH = 200 

# A placeholder for a batch of images 
images_placeholder = tf.placeholder(dtype=tf.string, shape=(None,)) 

# The CloudML Prediction API always "feeds" the Tensorflow graph with 
# dynamic batch sizes e.g. (?,). decode_jpeg only processes scalar 
# strings because it cannot guarantee a batch of images would have 
# the same output size. We use tf.map_fn to give decode_jpeg a scalar 
# string from dynamic batches. 
def decode_and_resize(image_str_tensor): 
    """Decodes jpeg string, resizes it and returns a uint8 tensor.""" 

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

    # Note resize expects a batch_size, but tf_map supresses that index, 
    # thus we have to expand then squeeze. Resize returns float32 in the 
    # range [0, uint8_max] 
    image = tf.expand_dims(image, 0) 
    image = tf.image.resize_bilinear(
     image, [HEIGHT, WIDTH], align_corners=False) 
    image = tf.squeeze(image, squeeze_dims=[0]) 
    image = tf.cast(image, dtype=tf.uint8) 
    return image 

decoded_images = tf.map_fn(
    decode_and_resize, images_placeholder, back_prop=False, dtype=tf.uint8) 

# convert_image_dtype, also scales [0, uint8_max] -> [0, 1). 
images = tf.image.convert_image_dtype(decoded_images, dtype=tf.float32) 

# Then shift images to [-1, 1) (useful for some models such as Inception) 
images = tf.sub(images, 0.5) 
images = tf.mul(images, 2.0) 

# ... 

Кроме того, мы должны быть уверены, чтобы правильно обозначить входы, в данном случае, это важно, чтобы имя ввода (ключ на карте) заканчивалось на _bytes. При отправке base64 кодированные данные, это позволит сервис прогнозирования CloudML знаю, что нужно декодировать данные:

inputs = {"image_bytes": images_placeholder.name} 
tf.add_to_collection("inputs", json.dumps(inputs)) 

Формат данных, что команда gcloud ожидает будет иметь вид:

{"image_bytes": {"b64": "dGVzdAo="}} 

(Обратите внимание, если image_bytes - единственный вход для вашей модели, вы можете упростить только {"b64": "dGVzdAo="}).

Например, чтобы создать это из файла на диске, вы можете попробовать что-то вроде:

echo "{\"image_bytes\": {\"b64\": \"`base64 image.jpg`\"}}" > instances 

А затем отправить его на службу, как так:

gcloud beta ml predict --instances=instances --model=my_model 

Пожалуйста, обратите внимание, что при отправляя данные непосредственно в службу, тело отправленного вами запроса должно быть завернуто в список «экземпляры». Таким образом, команда gcloud выше фактически посылает следующую к службе в теле запроса HTTP:

{"instances" : [{"image_bytes": {"b64": "dGVzdAo="}}]} 
+0

Спасибо за ваш ответ! Может быть, я не понимаю, что мне нужно делать именно так. Фактически, когда я отправляю запрос, он возвращает: error: «Prediction failed:». Я написал свою проблему [здесь] (http://stackoverflow.com/questions/41261701/how-make-correct-predictions-of-jpeg-image-in-cloud-ml) –

2

Просто свайный на предыдущий ответ ...

Google опубликовал blog post на задаче распознавания образов и некоторые связанные code, которые будут напрямую решать ваш вопрос и еще несколько, которые вы можете обнаружить. Он содержит файл images_to_json.py, который поможет в создании запроса json.

Смежные вопросы