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

Как преобразовать каталог jpeg-изображений в файл TFRecords в тензорном потоке?

У меня есть данные обучения, которые представляют собой каталог jpeg-изображений и соответствующий текстовый файл, содержащий имя файла и соответствующую метку категории. Я пытаюсь преобразовать эти данные обучения в файл tfrecords, как описано в документации по методу tensorflow. Я потратил довольно много времени, пытаясь заставить это работать, но нет примеров в тензорном потоке, которые демонстрируют, как использовать любого из читателей для чтения в файлах jpeg и добавлять их в tfrecord, используя tfrecordwriter

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 decode_png or decode_jpeg decoder based on your files.

init_op = tf.initialize_all_variables()
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.show(Image.fromarray(np.asarray(image)))

coord.request_stop()
coord.join(threads)

Для получения всех изображений в виде массива тензоров используйте следующий пример кода.

Github-репозиторий ImageFlow


Обновление:

В предыдущем ответе я только что рассказал, как читать изображение в формате TF, но не сохранять его в TFRecords. Для этого вы должны использовать:

def _int64_feature(value):
  return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))


def _bytes_feature(value):
  return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))

# images and labels array as input
def convert_to(images, labels, name):
  num_examples = labels.shape[0]
  if images.shape[0] != num_examples:
    raise ValueError("Images size %d does not match label size %d." %
                     (images.shape[0], num_examples))
  rows = images.shape[1]
  cols = images.shape[2]
  depth = images.shape[3]

  filename = os.path.join(FLAGS.directory, name + '.tfrecords')
  print('Writing', filename)
  writer = tf.python_io.TFRecordWriter(filename)
  for index in range(num_examples):
    image_raw = images[index].tostring()
    example = tf.train.Example(features=tf.train.Features(feature={
        'height': _int64_feature(rows),
        'width': _int64_feature(cols),
        'depth': _int64_feature(depth),
        'label': _int64_feature(int(labels[index])),
        'image_raw': _bytes_feature(image_raw)}))
    writer.write(example.SerializeToString())

Подробнее здесь

И вы читаете данные так:

# Remember to generate a file name queue of you 'train.TFRecord' file path
def read_and_decode(filename_queue):
  reader = tf.TFRecordReader()
  _, serialized_example = reader.read(filename_queue)
  features = tf.parse_single_example(
    serialized_example,
    dense_keys=['image_raw', 'label'],
    # Defaults are not specified since both keys are required.
    dense_types=[tf.string, tf.int64])

  # Convert from a scalar string tensor (whose single string has
  image = tf.decode_raw(features['image_raw'], tf.uint8)

  image = tf.reshape(image, [my_cifar.n_input])
  image.set_shape([my_cifar.n_input])

  # OPTIONAL: Could reshape into a 28x28 image and apply distortions
  # here.  Since we are not applying any distortions in this
  # example, and the next step expects the image to be flattened
  # into a vector, we don't bother.

  # Convert from [0, 255] -> [-0.5, 0.5] floats.
  image = tf.cast(image, tf.float32)
  image = tf.cast(image, tf.float32) * (1. / 255) - 0.5

  # Convert label from a scalar uint8 tensor to an int32 scalar.
  label = tf.cast(features['label'], tf.int32)

  return image, label

Ответ 2

Модель запуска Tensorflow имеет файл build_image_data.py, который может выполнить то же самое, предполагая, что каждый подкаталог представляет метку.

Ответ 3

У меня тоже такая же проблема.

Итак, вот как я могу получить файлы tfrecords из моих собственных файлов JPEG

Изменить: добавить соль 1 - лучше & более быстрый путь

(Рекомендуется) Решение 1:

Из официального gitub tenorflow: Как создать новый набор данных для переподготовки, используйте официальный скрипт на python build_image_data.py напрямую, и bazel - лучшая идея.

Вот инструкция:

Чтобы запустить build_image_data.py, вы можете запустить следующую командную строку:

# location to where to save the TFRecord data.        
OUTPUT_DIRECTORY=$HOME/my-custom-data/

# build the preprocessing script.
bazel build inception/build_image_data

# convert the data.
bazel-bin/inception/build_image_data \
  --train_directory="${TRAIN_DIR}" \
  --validation_directory="${VALIDATION_DIR}" \
  --output_directory="${OUTPUT_DIRECTORY}" \
  --labels_file="${LABELS_FILE}" \
  --train_shards=128 \
  --validation_shards=24 \
  --num_threads=8

где $OUTPUT_DIRECTORY - местоположение осколка TFRecords. $LABELS_FILE будет текстовым файлом, который читается скрипт, который предоставляет список всех меток.

тогда это должно сработать.

пс. bazel, созданный Google, превращает код в make файл.

Решение 2:

Сначала я ссылаюсь на инструкцию @capitalistpug и проверяю файл сценария оболочки

(файл сценария оболочки, предоставленный Google: download_and_preprocess_flowers.sh)

Во-вторых, я также узнаю о мини-учебном пособии по началу работы с версией v3 от NVIDIA

(Официальный представитель NVIDIA ускорил тренировку с ускоренным графическим процессором потоком)

Будьте осторожны, в среде Bazel WORKSAPCE необходимо выполнить следующие шаги

поэтому файл сборки Bazel может успешно выполняться


Сначала я закомментирую часть загрузки набора данных imagenet, которую я уже скачал

и остальная часть, которая мне не нужна, download_and_preprocess_flowers.sh

Второй шаг, измените каталог на tenorflow/models/inception

где это среда Bazel и она создается Bazel до

$ cd tensorflow/models/inception 

Необязательно: если он не был собран ранее, введите следующий код в cmd

$ bazel build inception/download_and_preprocess_flowers 

Вы должны выяснить содержание на следующем изображении

enter image description here

И последний шаг, введите следующий код:

$ bazel-bin/inception/download_and_preprocess_flowers $Your/own/image/data/path

Затем он начнет вызывать build_image_data.py и создавать файл tfrecords.

Ответ 4

Обратите внимание, что изображения будут сохраняться в TFRecord в виде несжатых тензоров, возможно увеличивая их размер примерно в 5 раз. Это приводит к напрасной трате места на диске и, скорее всего, будет довольно медленным из-за объема данных, которые необходимо прочитать.

Гораздо лучше просто сохранить имя файла в TFRecord и прочитать файл по требованию. Новый API Dataset работает хорошо, и документация содержит следующий пример:

# Reads an image from a file, decodes it into a dense tensor, and resizes it
# to a fixed shape.
def _parse_function(filename, label):
  image_string = tf.read_file(filename)
  image_decoded = tf.image.decode_jpeg(image_string)
  image_resized = tf.image.resize_images(image_decoded, [28, 28])
  return image_resized, label

# A vector of filenames.
filenames = tf.constant(["/var/data/image1.jpg", "/var/data/image2.jpg", ...])

# 'labels[i]' is the label for the image in 'filenames[i].
labels = tf.constant([0, 37, ...])

dataset = tf.data.Dataset.from_tensor_slices((filenames, labels))
dataset = dataset.map(_parse_function)