Подача данных изображения в тензорном потоке для передачи обучения

Я пытаюсь использовать тензорный поток для обучения перевода. Я загрузил предварительно подготовленную модель inception3 из учебника. В коде для прогнозирования:

prediction = sess.run(softmax_tensor,{'DecodeJpeg/contents:0'}:image_data})

Есть ли способ передать png-изображение. Я попытался изменить DecodeJpeg на DecodePng, но это не сработало. Кроме того, что я должен изменить, если я хочу подавать файл декодированного изображения, например, массив numpy или пакет массивов?

Спасибо!!

Ответы

Ответ 1

Отправленный граф InceptionV3, используемый в classify_image.py, поддерживает только изображения JPEG из коробки. Существует два способа использования этого графика с изображениями PNG:

  • Преобразование PNG-изображения в массив height x width x 3 (каналов) Numpy, например, используя PIL, затем подайте тензор 'DecodeJpeg:0':

    import numpy as np
    from PIL import Image
    # ...
    
    image = Image.open("example.png")
    image_array = np.array(image)[:, :, 0:3]  # Select RGB channels only.
    
    prediction = sess.run(softmax_tensor, {'DecodeJpeg:0': image_array})
    

    Возможно, смутно, 'DecodeJpeg:0' является результатом операции DecodeJpeg op, поэтому, подавая этот тензор, вы можете передавать необработанные данные изображения.

  • Добавьте tf.image.decode_png() op к импортированному графу. Простое переключение имени тензора подачи с 'DecodeJpeg/contents:0' на 'DecodePng/contents:0' не работает, потому что на отгруженном графике нет 'DecodePng' op. Вы можете добавить такой node в график, используя аргумент input_map для tf.import_graph_def():

    png_data = tf.placeholder(tf.string, shape=[])
    decoded_png = tf.image.decode_png(png_data, channels=3)
    # ...
    
    graph_def = ...
    softmax_tensor = tf.import_graph_def(
        graph_def,
        input_map={'DecodeJpeg:0': decoded_png},
        return_elements=['softmax:0'])
    
    sess.run(softmax_tensor, {png_data: ...})
    

Ответ 2

Следующий код должен обрабатывать оба случая.

import numpy as np
from PIL import Image

image_file = 'test.jpeg'
with tf.Session() as sess:

    #     softmax_tensor = sess.graph.get_tensor_by_name('final_result:0')
    if image_file.lower().endswith('.jpeg'):
        image_data = tf.gfile.FastGFile(image_file, 'rb').read()
        prediction = sess.run('final_result:0', {'DecodeJpeg/contents:0': image_data})
    elif image_file.lower().endswith('.png'):
        image = Image.open(image_file)
        image_array = np.array(image)[:, :, 0:3]
        prediction = sess.run('final_result:0', {'DecodeJpeg:0': image_array})

    prediction = prediction[0]    
    print(prediction)

или более короткая версия с прямыми строками:

image_file = 'test.png' # or 'test.jpeg'
image_data = tf.gfile.FastGFile(image_file, 'rb').read()
ph = tf.placeholder(tf.string, shape=[])

with tf.Session() as sess:        
    predictions = sess.run(output_layer_name, {ph: image_data} )