У меня есть куча изображений в формате, подобном 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)
. Я надеюсь, что это помогает кому-то. Если у вас есть дополнительные вопросы, не стесняйтесь спрашивать меня или проверить ссылку в ответе Розы.