Подтвердить что ты не робот

Чтение и отображение изображений тензора

У меня есть куча изображений в формате, подобном Cifar10 (двоичный файл, size = 96*96*3 байт на изображение), одно изображение за другим (STL -10 dataset). Файл, который я открываю, имеет 138 МБ.

Я попытался прочитать и проверить содержимое тензоров, содержащих изображения, чтобы убедиться, что чтение сделано правильно, однако у меня есть два вопроса -

  • Загружает ли файл FixedLengthRecordReader весь файл, но просто вводит данные по одному за раз? Поскольку чтение первых байтов size должно быть относительно быстрым. Однако для запуска кода требуется около двух минут.
  • Как получить фактическое содержимое изображения в отображаемом формате или отобразить их внутри, чтобы проверить, что изображения хорошо читаются? Я сделал sess.run(uint8image), однако результат пуст.

Код ниже:

import tensorflow as tf
def read_stl10(filename_queue):
  class STL10Record(object):
    pass
  result = STL10Record()

  result.height = 96
  result.width = 96
  result.depth = 3
  image_bytes = result.height * result.width * result.depth
  record_bytes = image_bytes

  reader = tf.FixedLengthRecordReader(record_bytes=record_bytes)
  result.key, value = reader.read(filename_queue)
  print value
  record_bytes = tf.decode_raw(value, tf.uint8)

  depth_major = tf.reshape(tf.slice(record_bytes, [0], [image_bytes]),
                       [result.depth, result.height, result.width])
  result.uint8image = tf.transpose(depth_major, [1, 2, 0])
  return result
# probably a hack since I should've provided a string tensor

filename_queue = tf.train.string_input_producer(['./data/train_X'])
image = read_stl10(filename_queue)

print image.uint8image
with tf.Session() as sess:
  result = sess.run(image.uint8image)
  print result, type(result)

Вывод:

Tensor("ReaderRead:1", shape=TensorShape([]), dtype=string)
Tensor("transpose:0", shape=TensorShape([Dimension(96), Dimension(96), Dimension(3)]), dtype=uint8)
I tensorflow/core/common_runtime/local_device.cc:25] Local device intra op parallelism threads: 4
I tensorflow/core/common_runtime/local_session.cc:45] Local session inter op parallelism threads: 4
[empty line for last print]
Process finished with exit code 137

Я запускаю это на своем процессоре, если это что-то добавляет.

EDIT: благодаря Rosa я нашел чистое решение TensorFlow. По-видимому, при использовании string_input_producer, чтобы увидеть результаты, вам нужно инициализировать бегуны очереди. Единственная необходимая вещь для добавления в код выше - вторая строка снизу:

...
with tf.Session() as sess:
    tf.train.start_queue_runners(sess=sess)
...

Затем изображение в result может отображаться с помощью matplotlib.pyplot.imshow(result). Я надеюсь, что это помогает кому-то. Если у вас есть дополнительные вопросы, не стесняйтесь спрашивать меня или проверить ссылку в ответе Розы.

4b9b3361

Ответ 1

Чтобы дать полный ответ:

filename_queue = tf.train.string_input_producer(['/Users/HANEL/Desktop/tf.png']) #  list of files to read

reader = tf.WholeFileReader()
key, value = reader.read(filename_queue)

my_img = tf.image.decode_png(value) # use png or jpg decoder based on your files.

init_op = tf.global_variables_initializer()
with tf.Session() as sess:
  sess.run(init_op)

  # Start populating the filename queue.

  coord = tf.train.Coordinator()
  threads = tf.train.start_queue_runners(coord=coord)

  for i in range(1): #length of your filename list
    image = my_img.eval() #here is your image Tensor :) 

  print(image.shape)
  Image.fromarray(np.asarray(image)).show()

  coord.request_stop()
  coord.join(threads)

Или, если у вас есть каталог изображений, вы можете добавить их все через этот исходный файл Github

@mttk и @salvador-dali: Я надеюсь, что это то, что вам нужно

Ответ 2

Согласно документации вы можете декодировать изображения JPEG/PNG.

Это должно быть примерно так:

import tensorflow as tf

filenames = ['/image_dir/img.jpg']
filename_queue = tf.train.string_input_producer(filenames)

reader = tf.WholeFileReader()
key, value = reader.read(filename_queue)

images = tf.image.decode_jpeg(value, channels=3)

Вы можете найти немного больше информации здесь

Ответ 3

Поговорив с вами в комментариях, я считаю, что вы можете просто сделать это с помощью numpy/scipy. Идея состоит в том, чтобы прочитать изображение в 3D-массиве numpy и передать его в переменную.

from scipy import misc
import tensorflow as tf

img = misc.imread('01.png')
print img.shape    # (32, 32, 3)

img_tf = tf.Variable(img)
print img_tf.get_shape().as_list()  # [32, 32, 3]

Затем вы можете запустить свой график:

init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
im = sess.run(img_tf)

и убедитесь, что он одинаков:

import matplotlib.pyplot as plt
fig = plt.figure()
fig.add_subplot(1,2,1)
plt.imshow(im)
fig.add_subplot(1,2,2)
plt.imshow(img)
plt.show()

введите описание изображения здесь

P.S. вы упомянули: Since it supposed to parallelize reading, it seems useful to know.. На что я могу сказать, что редко в анализе данных считывание данных является узким местом. Большую часть времени вы будете тренировать свою модель.

Ответ 4

Загрузите имена с помощью tf.train.match_filenames_once, чтобы получить количество файлов для перебора с помощью tf.size открыть сеанс и наслаждаться; -)

import tensorflow as tf
import numpy as np
import matplotlib;
from PIL import Image

matplotlib.use('Agg')
import matplotlib.pyplot as plt


filenames = tf.train.match_filenames_once('./images/*.jpg')
count_num_files = tf.size(filenames)
filename_queue = tf.train.string_input_producer(filenames)

reader=tf.WholeFileReader()
key,value=reader.read(filename_queue)
img = tf.image.decode_jpeg(value)

init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(coord=coord)
    num_files = sess.run(count_num_files)
    for i in range(num_files):
        image=img.eval()
        print(image.shape)
        Image.fromarray(np.asarray(image)).save('te.jpeg')enter code here

Ответ 5

(Не могу комментировать, недостаточно репутации, но вот модифицированная версия, которая сработала для меня)

Для ошибки @HamedMP о No default session is registered вы можете использовать InteractiveSession, чтобы избавиться от этой ошибки: https://www.tensorflow.org/versions/r0.8/api_docs/python/client.html#InteractiveSession

А для проблемы @NumesSanguis с Image.show вы можете использовать обычный метод PIL .show(), потому что fromarray возвращает объект изображения.

Я делаю оба ниже (обратите внимание, что я использую JPEG вместо PNG):

import tensorflow as tf
import numpy as np
from PIL import Image

filename_queue = tf.train.string_input_producer(['my_img.jpg']) #  list of files to read

reader = tf.WholeFileReader()
key, value = reader.read(filename_queue)

my_img = tf.image.decode_jpeg(value) # use png or jpg decoder based on your files.

init_op = tf.initialize_all_variables()
sess = tf.InteractiveSession()
with sess.as_default():
    sess.run(init_op)

# Start populating the filename queue.

coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)

for i in range(1): #length of your filename list
  image = my_img.eval() #here is your image Tensor :) 

Image.fromarray(np.asarray(image)).show()

coord.request_stop()
coord.join(threads)

Ответ 6

Я использовал формат CIFAR10 вместо STL10, и код появился как

filename_queue = tf.train.string_input_producer(filenames)
read_input = read_cifar10(filename_queue)
with tf.Session() as sess:       
    tf.train.start_queue_runners(sess=sess)
    result = sess.run(read_input.uint8image)        
img = Image.fromarray(result, "RGB")    
img.save('my.jpg')

Отрывок идентичен mttk и Rosa Gronchi, но почему-то мне не удалось показать изображение во время выполнения, поэтому я сохранил его как файл JPG.