Как сделать правильные прогнозы изображения 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)