Tensorflow считывает изображения с метками
Я строю стандартную модель классификации изображений с Tensorflow. Для этого у меня есть входные изображения, каждому из которых присвоена метка (номер в {0,1}). Таким образом, данные могут храниться в виде списка в следующем формате:
/path/to/image_0 label_0
/path/to/image_1 label_1
/path/to/image_2 label_2
...
Я хочу использовать систему очередей TensorFlow для чтения моих данных и подачи их в мою модель. Игнорируя ярлыки, можно легко добиться этого с помощью string_input_producer
и wholeFileReader
. Вот код:
def read_my_file_format(filename_queue):
reader = tf.WholeFileReader()
key, value = reader.read(filename_queue)
example = tf.image.decode_png(value)
return example
#removing label, obtaining list containing /path/to/image_x
image_list = [line[:-2] for line in image_label_list]
input_queue = tf.train.string_input_producer(image_list)
input_images = read_my_file_format(input_queue)
однако, метки теряются в этом процесс, поскольку данные изображения намеренно перемешиваются как часть входного конвейера. Каков самый простой способ проталкивания меток вместе с данными изображения через входные очереди?
3 ответа:
используя
slice_input_producer
обеспечивает решение, которое намного чище. Производителем входного среза дает возможность создать очереди ввода, содержащие сколь угодно много сепаров значения. Этот фрагмент вопроса будет выглядеть так:def read_labeled_image_list(image_list_file): """Reads a .txt file containing pathes and labeles Args: image_list_file: a .txt file with one /path/to/image per line label: optionally, if set label will be pasted after each line Returns: List with all filenames in file image_list_file """ f = open(image_list_file, 'r') filenames = [] labels = [] for line in f: filename, label = line[:-1].split(' ') filenames.append(filename) labels.append(int(label)) return filenames, labels def read_images_from_disk(input_queue): """Consumes a single filename and label as a ' '-delimited string. Args: filename_and_label_tensor: A scalar string tensor. Returns: Two tensors: the decoded image, and the string label. """ label = input_queue[1] file_contents = tf.read_file(input_queue[0]) example = tf.image.decode_png(file_contents, channels=3) return example, label # Reads pfathes of images together with their labels image_list, label_list = read_labeled_image_list(filename) images = ops.convert_to_tensor(image_list, dtype=dtypes.string) labels = ops.convert_to_tensor(label_list, dtype=dtypes.int32) # Makes an input queue input_queue = tf.train.slice_input_producer([images, labels], num_epochs=num_epochs, shuffle=True) image, label = read_images_from_disk(input_queue) # Optional Preprocessing or Data Augmentation # tf.image implements most of the standard image augmentation image = preprocess_image(image) label = preprocess_label(label) # Optional Image and Label Batching image_batch, label_batch = tf.train.batch([image, label], batch_size=batch_size)
см. также generic_input_producer С TensorVision примеры для полного входного трубопровода.
есть три основных шага к решению этой проблемы:
заполнить
tf.train.string_input_producer()
со списком строк, содержащих исходную строку, разделенную пробелом, содержащую имя файла и метку.использовать
tf.read_file(filename)
, а неtf.WholeFileReader()
для чтения файлов изображений.tf.read_file()
- это операция без состояния, которая использует одно имя файла и создает одну строку, содержащую содержимое файла. Оно имеет преимущество в том, что это чистая функция, поэтому легко связать данные с входом и выходом. Например, ваш
помимо ответов есть несколько других вещей, которые вы можете сделать:
Закодируйте свою метку в имя файла. если у вас есть N различных категорий, вы можете переименовать свои файлы в что-то вроде:
0_file001, 5_file002, N_file003
. Потом, когда вы читаете данные из читательkey, value = reader.read(filename_queue)
ваш ключ/значение:выводом Read будет имя файла (ключ) и содержимое этого файла (значение)
затем анализировать имя файла, извлеките метку и преобразуйте ее в int. Это потребует немного предварительной обработки данных.
использовать TFRecords что позволит вам хранить данные и метки в одном файле.