Как записать закодированный jpeg в виде байтов в tfrecord Tensorflow, а затем прочитать его?

Я пытаюсь использовать формат tfrecords tensorflows для хранения своих наборов данных.

Мне удалось прочитать изображения в формате jpeg, декодировать их в необработанный формат и записать в файл tfrecord. Затем я могу прочитать их позже, используя tf.decode_raw.

Проблема в том, что это приводит к огромным размерам файлов, потому что я храню изображения как необработанные. Теперь я видел много руководств и блогов, в которых говорилось, что я могу хранить их в закодированном формате, а затем при чтении просто декодировать их. Я не могу найти ни одного примера этого. Я пытался какое-то время, но независимо от того, как я это делаю, я получаю ошибки форматирования.

TLDR Кто-нибудь знает, как записывать изображения в файл tfrecord как jpeg, а не как raw.

Спасибо, Дэвид.

Моя писательская функция.

def convert(image_paths, labels, out_path):

num_images = len(image_paths)

with tf.python_io.TFRecordWriter(out_path) as writer:
    for i, (path, label) in enumerate(zip(image_paths, labels)):

        print_progress(count=i, total=num_images-1)
        img = open(path, 'rb').read()

        data ={'image': wrap_bytes(img),
            'label': wrap_int64(label)}

        feature = tf.train.Features(feature=data)
        example = tf.train.Example(features=feature)
        serialized = example.SerializeToString()
        writer.write(serialized)

Преобразуйте набор данных с помощью этого:

{convert(image_paths=image_paths_train,
    labels=cls_train,
    out_path=path_tfrecords_train)}

Моя функция чтения

def parse(serialized):

features = \
    {
        'image': tf.FixedLenFeature([], tf.string),
        'label': tf.FixedLenFeature([], tf.int64)
    }
parsed_example = tf.parse_single_example(serialized=serialized,
                                         features=features)

# Get the image as raw bytes.
image_raw = parsed_example['image']

# Decode the raw bytes so it becomes a tensor with type.
image = tf.image.decode_image(image_raw,channels=3)

#image = tf.decode_raw(image_raw, tf.uint8)

# The type is now uint8 but we need it to be float.
image = tf.cast(image, tf.float32)

# Get the label associated with the image.
label = parsed_example['label']

# The image and label are now correct TensorFlow types.
return image, label

person D. Rusk    schedule 19.01.2018    source источник


Ответы (1)


Для записи просто откройте файл как двоичный файл (fp = open('something.jpg', 'rb')) и .read() его содержимое. Сохраните этот контент в tfrecord Example так же, как сейчас вы сохраняете изображение (т. е. как функцию байтов).

Для чтения вместо decode_raw используйте tf.image.decode_image и передайте тензор, полученный из программы чтения образцов.

Если вы опубликуете свой код, я могу предоставить лучшие примеры кода, но не зная, как выглядит ваш код, это настолько подробно, насколько я могу получить.

person GPhilo    schedule 19.01.2018
comment
Привет, GPhilo, спасибо, я добавил свой код. Как я могу отобразить изображение после использования decode_image(). Кажется, я получаю сообщение об ошибке при использовании plt.imshow(). Спасибо, ваш ответ кажется тем, что я искал. - person D. Rusk; 19.01.2018
comment
Когда вы работаете с операциями TensorFlow, (почти) все операции не возвращают данные напрямую, а вместо этого возвращают Tensor объекты, которые будут содержать ваши данные после фактического запуска графа . Различие между временем создания графа и временем выполнения графа является характеристикой TensorFlow, и вам может потребоваться больше исследований в этом направлении. Все это говорит о том, что вы не сможете распечатать результат decode_image непосредственно в pyplot, вам нужно создать sess = tf.Session() и sess.run(decoded_image) - person GPhilo; 19.01.2018
comment
Кроме того, ваш код выглядит нормально для меня, если предположить, что wrap_bytes и wrap_int64 верны (в чем у меня нет причин сомневаться). - person GPhilo; 19.01.2018
comment
Ах да конечно. К мышлению в тензорном потоке нужно привыкнуть. Я попробую ваше предложение выше и покажу несколько изображений во время сеанса. Спасибо за ваше время GPhilo. - person D. Rusk; 19.01.2018