Запись тензорного потока: как прочитать и построить значения изображения? - PullRequest
3 голосов
/ 05 июля 2019

У меня есть данные в файле записи тензорного потока (data.record), и я, кажется, могу прочитать эти данные.Я хочу сделать что-то простое: просто отобразить (в кодировке png) изображение для данного примера.Но я не могу получить изображение в виде массива и просто показать его.Я имею в виду, данные там, как трудно это просто вытащить и показать?Я предполагаю, что упускаю что-то действительно очевидное.

height = 700 # Image height
width = 500 # Image width

file_path = r'/home/train.record'
with tf.Session() as sess:
    feature = {'image/encoded': tf.FixedLenFeature([], tf.string),
               'image/object/class/label': tf.FixedLenFeature([], tf.int64)}
    filename_queue = tf.train.string_input_producer([data_path], num_epochs=1)
    reader = tf.TFRecordReader()
    _, serialized_example = reader.read(filename_queue)
    parsed_example = tf.parse_single_example(serialized_example, features=feature)
    image_raw = parsed_example['image/encoded']
    image = tf.decode_raw(image_raw, tf.uint8)
    image = tf.cast(image, tf.float32)
    image = tf.reshape(image, (height, width))

Это, кажется, извлекло изображение из train.record, с правильными размерами, но оно имеет тип tensorflow.python.framework.ops.Tensor, и когда я пытаюсь построитьэто что-то вроде:

cv2.imshow("image", image)

Я просто получаю сообщение об ошибке: TypeError: Expected cv::UMat for argument 'mat'.

Я пытался использовать eval, как рекомендовано по ссылке ниже:

array = image.eval(session = sess)

Но это не сработало.Программа просто зависает в этой точке (например, если я поставлю ее после последней строки выше).

В более общем смысле кажется, что я что-то упускаю, потому что даже когда я пытаюсь получить метку класса:

label = parsed_example['label']

Я получаю то же самое: не значение, а объекттипа tensorflow.python.framework.ops.Tensor.Я буквально вижу значение, когда я набираю имя в своей записной книжке ipython, но я не уверен, как получить доступ к как int (или как-то еще).

Обратите внимание, я попробовал это, у него есть некоторые методы, которые, кажется, напрямую преобразуют в массив numpy, но они не работают: https://github.com/yinguobing/tfrecord_utility/blob/master/view_record.py

Я только что получил ошибку there is no numpy method for a tensor object.

Примечание. Я использую tenorflow 1.13, Python 3.7, работающий в Ubuntu 18. Я получаю одинаковые результаты, независимо от того, запускаю ли я из Spyder или из командной строки.

Смежные вопросы
- Как напечатать значение объекта Tensor в TensorFlow?
- https://github.com/aymericdamien/TensorFlow-Examples/issues/40

Ответы [ 2 ]

1 голос
/ 08 июля 2019

Чтобы визуализировать одно изображение из файла TFRecord, вы можете сделать что-то вроде:

import tensorflow as tf
import matplotlib.pyplot as plt

def parse_fn(data_record):
    feature = {'image/encoded': tf.FixedLenFeature([], tf.string),
               'image/object/class/label': tf.FixedLenFeature([], tf.int64)}
    sample = tf.parse_single_example(data_record, feature)
    return sample

file_path = r'/home/train.record'
dataset = tf.data.TFRecordDataset([file_path])
record_iterator = dataset.make_one_shot_iterator().get_next()

with tf.Session() as sess:
    # Read and parse record
    parsed_example = parse_fn(record_iterator)

    # Decode image and get numpy array
    encoded_image = parsed_example['image/encoded']
    decoded_image = tf.image.decode_jpeg(encoded_image, channels=3)
    image_np = sess.run(decoded_image)

    # Display image
    plt.imshow(image_np)
    plt.show()

Это предполагает, что изображение закодировано в формате JPEG.Вы должны использовать соответствующую функцию декодирования (например, для изображений PNG используйте tf.image.decode_png ).

ПРИМЕЧАНИЕ: Не проверено.

1 голос
/ 08 июля 2019
import tensorflow as tf


with tf.Session() as sess:
  r  = tf.random.uniform([10, 10])
  print(type(r))
  # <class 'tensorflow.python.framework.ops.Tensor'>
  a = r.eval()
  print(type(a))
  # <class 'numpy.ndarray'>

Я не смог воспроизвести ваш точный случай.Но вам нужно оценить Tensor до NumPy NDArray.Насколько я понимаю, это не проблема с TensorRecord. Ссылка на Colab для кода .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...