Tensorflow: извлечение изображения и метки из файла TFRecords - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть файл TFRecords, который содержит изображения с их метками, именем, размером и т. Д. Моя цель - извлечь метку и изображение в виде массива.

Для загрузки файла я делаю следующее:

def extract_fn(data_record):
    features = {
        # Extract features using the keys set during creation
        "image/class/label":    tf.FixedLenFeature([], tf.int64),
        "image/encoded":        tf.VarLenFeature(tf.string),
    }
    sample = tf.parse_single_example(data_record, features)
    #sample = tf.cast(sample["image/encoded"], tf.float32)
    return sample

filename = "path\train-00-of-10"
dataset = tf.data.TFRecordDataset(filename)
dataset = dataset.map(extract_fn)
iterator = dataset.make_one_shot_iterator()
next_element = iterator.get_next()

with tf.Session() as sess:
    while True:
        data_record = sess.run(next_element)
        print(data_record)

Изображение сохраняется в виде строки.Как я могу преобразовать изображение в float32?Я пытался sample = tf.cast(sample["image/encoded"], tf.float32), который не работает.Я хочу, чтобы data_record был списком, содержащим изображение в виде numpy-массива и метку в виде np.int32 числа.Как я могу это сделать?

Прямо сейчас data_record выглядит так:

{'image/encoded': SparseTensorValue(indices=array([[0]]), values=array([b'\xff\xd8\ ... 8G\xff\xd9'], dtype=object), dense_shape=array([1])), 'image/class/label': 394}

Я понятия не имею, как я могу с этим работать.Буду признателен за любую помощь

РЕДАКТИРОВАТЬ

Если я печатаю sample и sample['image/encoded'] в extract_fn(), я получаю следующее:

print(sample) = {'image/encoded': <tensorflow.python.framework.sparse_tensor.SparseTensor object at 0x7fe41ec15978>, 'image/class/label': <tf.Tensor 'ParseSingleExample/ParseSingleExample:3' shape=() dtype=int64>}

print(sample['image/encoded'] = SparseTensor(indices=Tensor("ParseSingleExample/ParseSingleExample:0", shape=(?, 1), dtype=int64), values=Tensor("ParseSingleExample/ParseSingleExample:1", shape=(?,), dtype=string), dense_shape=Tensor("ParseSingleExample/ParseSingleExample:2", shape=(1,), dtype=int64))

Кажется, что изображение является разреженным тензором и tf.image.decode_image выдает ошибку.Как правильно извлечь изображение как тензор tf.float32?

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Если я правильно понял вашу точку зрения, вам просто нужно numpy.fromstring

img_str = (example.features.feature['image_raw'].bytes_list.value)
image = np.fromstring(img_str, dtype=np.float32)

Или, если вам нужна функция тензорного потока, вам нужно добавить tf.decode_raw в вашу функцию разбора, я бы сказал, что лучшеотделить изображение и метку

def extract_fn(data_record):
    features = {
        # Extract features using the keys set during creation
        "image/class/label":    tf.FixedLenFeature([], tf.int64),
        "image/encoded":        tf.VarLenFeature(tf.string),
    }
    sample = tf.parse_single_example(data_record, features)
    image = tf.decode_raw(sample['image/encoded'], tf.float32)
    label = sample['image/class/label']

    return image, label
0 голосов
/ 16 февраля 2019

Я считаю, что вы храните изображения в формате JPEG, PNG или в другом формате.Таким образом, при чтении вы должны декодировать их:

def extract_fn(data_record):
    features = {
        # Extract features using the keys set during creation
        "image/class/label":    tf.FixedLenFeature([], tf.int64),
        "image/encoded":        tf.VarLenFeature(tf.string),
    }
    sample = tf.parse_single_example(data_record, features)
    image = tf.image.decode_image(sample['image/encoded'], dtype=tf.float32) 
    label = sample['image/class/label']
    return image, label

...

with tf.Session() as sess:
    while True:
        image, label = sess.run(next_element)
        image = image.reshape(IMAGE_SHAPE)

Обновление: Кажется, вы получили ваши данные в виде значения одной ячейки в разреженном тензоре.Попробуйте преобразовать его обратно в плотный и проверить до и после декодирования:

def extract_fn(data_record):
    features = {
        # Extract features using the keys set during creation
        "image/class/label":    tf.FixedLenFeature([], tf.int64),
        "image/encoded":        tf.VarLenFeature(tf.string),
    }
    sample = tf.parse_single_example(data_record, features)
    label = sample['image/class/label']
    dense = tf.sparse_tensor_to_dense(sample['image/encoded'])

    # Comment it if you got an error and inspect just dense:
    image = tf.image.decode_image(dense, dtype=tf.float32) 

    return dense, image, label
...