Как сделать правильные прогнозы изображения JPEG в облаке-мл

Я хочу предсказать изображение JPEG в облаке-мл.

Моя модель обучения - это начальная модель, и я хотел бы отправить входные данные на первый слой графика: 'DecodeJpeg/contents:0' (где я должен отправить изображение в формате JPEG). Я установил этот слой как возможный вход, добавив в retrain.py:

inputs = {'image_bytes': 'DecodeJpeg/contents:0'}
tf.add_to_collection('inputs', json.dumps(inputs))

Затем я сохраняю результаты обучения в двух файлах (export и export.meta) с помощью:

saver.save(sess, os.path.join(output_directory,'export'))

и я создаю модель в облаке-мл, используя эти файлы.

Как предлагается в некоторых сообщениях ( здесь, здесь и здесь, в официальном блоге Google Cloud), я пытаюсь сделать прогноз с

gcloud beta ml predict --json-instances=request.json --model=MODEL

где экземпляр - изображение JPEG, декодированное в формате base64 с помощью:

python -c 'import base64, sys, json; img = base64.b64encode(open(sys.argv[1], "rb").read()); print json.dumps({"key":"0", "image_bytes": {"b64": img}})' image.jpg &> request.json

Однако просьба вернуть меня:

error: 'Prediction failed: '

В чем проблема моей процедуры? Есть ли у вас предложения? В частности, из этого поста я предполагаю, что cloud-ml автоматически преобразует изображение base64 в формат jpeg при чтении запроса с image_bytes. Это правильно? Иначе как я могу это сделать?

3 ответа

CloudML требует, чтобы вы заполнили график пакетом изображений.

Я уверен, что это проблема повторного использования retrain.py. Посмотрите строку sess.run этого кода; он подает одно изображение за раз. Сравните с пакетным заполнителем JPEG в образце цветов.

В своем сообщении вы указали, что в вашей коллекции входных данных есть только тензор псевдонима image_bytes. Однако в коде, в котором вы формируете запрос, вы включаете 2 входа: один - "ключ", а другой - "image_bytes". Таким образом, я предлагаю удалить "ключ" из запроса или добавить "ключ" в коллекцию входных данных.

Вторая проблема заключается в том, что форма DecodeJpeg/contents:0', is (). Для Cloud ML вам нужно иметь форму, похожую на (None,), чтобы ее можно было кормить.

В других ответах на ваш вопрос есть несколько предложений о том, как вы можете следить за общедоступными публикациями, чтобы изменить свой график, но под рукой я могу рассказать об этих двух проблемах.

Дайте нам знать, если у вас возникнут какие-либо проблемы.

Обратите внимание, что необходимо построить три слегка отличающихся графика TF: обучение, оценка и прогнозирование. Смотрите этот недавний пост в блоге для деталей. Графики обучения и прогнозирования напрямую потребляют встраивание из предварительной обработки, поэтому они не содержат начальный граф. Для прогнозирования нам нужно взять байты изображения в качестве входных данных и использовать Inception для извлечения вложений.

Для онлайн-прогноза необходимо экспортировать график прогноза. Также необходимо указать выходные данные и ключ для входных данных.

Для построения графика прогноза ( код):

def build_prediction_graph(self):
   """Builds prediction graph and registers appropriate endpoints."""
   tensors = self.build_graph(None, 1, GraphMod.PREDICT)
   keys_placeholder = tf.placeholder(tf.string, shape=[None])
   inputs = {
      'key': keys_placeholder.name,
      'image_bytes': tensors.input_jpeg.name
   }

   tf.add_to_collection('inputs', json.dumps(inputs))

   # To extract the id, we need to add the identity function.
   keys = tf.identity(keys_placeholder)
   outputs = {
       'key': keys.name,
       'prediction': tensors.predictions[0].name,
       'scores': tensors.predictions[1].name
   }
   tf.add_to_collection('outputs', json.dumps(outputs))

Чтобы экспортировать график прогноза:

def export(self, last_checkpoint, output_dir):
  # Build and save prediction meta graph and trained variable values.
  with tf.Session(graph=tf.Graph()) as sess:        
    self.build_prediction_graph()
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    self.restore_from_checkpoint(sess, self.inception_checkpoint_file,
                                 last_checkpoint)
    saver = tf.train.Saver()
    saver.export_meta_graph(filename=os.path.join(output_dir, 'export.meta'))
    saver.save(sess, os.path.join(output_dir, 'export'), write_meta_graph=False)

last_checkpoint должен указывать на последний файл контрольных точек из обучения:

self.model.export(tf.train.latest_checkpoint(self.train_path), self.model_path)
Другие вопросы по тегам