Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I convert a directory of jpeg images to TFRecords file in tensorflow?

I have training data that is a directory of jpeg images and a corresponding text file containing the file name and the associated category label. I am trying to convert this training data into a tfrecords file as described in the tensorflow documentation. I have spent quite some time trying to get this to work but there are no examples in tensorflow that demonstrate how to use any of the readers to read in jpeg files and add them to a tfrecord using tfrecordwriter

like image 436
Nadav Ben-Haim Avatar asked Nov 21 '15 22:11

Nadav Ben-Haim


People also ask

How do you make TFRecords?

Creating TFRecord Files with Code Most often we have labeled data in PASCAL VOC XML or COCO JSON. Creating a TFRecord file from this data requires following a multistep process: (1) creating a TensorFlow Object Detection CSV (2) Using that TensorFlow Object Detection CSV to create TFRecord files.

What is a TFRecord file?

The TFRecord format is a simple format for storing a sequence of binary records. Protocol buffers are a cross-platform, cross-language library for efficient serialization of structured data. Protocol messages are defined by . proto files, these are often the easiest way to understand a message type.

What is the ideal size of a TFRecord file size?

Ideally, you should shard the data to ~10N files, as long as ~X/(10N) is 10+ MBs (and ideally 100+ MBs).


1 Answers

I hope this helps:

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) 

For getting all images as an array of tensors use the following code example.

Github repo of ImageFlow


Update:

In the previous answer I just told how to read an image in TF format, but not saving it in TFRecords. For that you should use:

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()) 

More info here

And you read the data like this:

# 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 
like image 137
Hamed MP Avatar answered Sep 20 '22 06:09

Hamed MP