Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Tensorflow read images with labels

I am building a standard image classification model with Tensorflow. For this I have input images, each assigned with a label (number in {0,1}). The Data can hence be stored in a list using the following format:

/path/to/image_0 label_0 /path/to/image_1 label_1 /path/to/image_2 label_2 ... 

I want to use TensorFlow's queuing system to read my data and feed it to my model. Ignoring the labels, one can easily achieve this by using string_input_producer and wholeFileReader. Here the code:

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) 

However, the labels are lost in that process as the image data is purposely shuffled as part of the input pipeline. What is the easiest way of pushing the labels together with the image data through the input queues?

like image 281
MarvMind Avatar asked Dec 17 '15 17:12

MarvMind


People also ask

What is Image_dataset_from_directory?

image_dataset_from_directory allows to load your data in the tf. data. Dataset format. Hence, it enables also the use, and this is the best, of the Keras preprocessing layers, including data augmentation.

What is Tensorflow_datasets?

tensorflow_datasets ( tfds ) defines a collection of datasets ready-to-use with TensorFlow. Each dataset is defined as a tfds. core.


1 Answers

Using slice_input_producer provides a solution which is much cleaner. Slice Input Producer allows us to create an Input Queue containing arbitrarily many separable values. This snippet of the question would look like this:

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) 

See also the generic_input_producer from the TensorVision examples for full input-pipeline.

like image 121
MarvMind Avatar answered Sep 22 '22 07:09

MarvMind