def batch_inputs(paths, reference_shape, batch_size=32, is_training=False, num_landmarks=68, mirror_image=False): """Reads the files off the disk and produces batches. Args: paths: a list of directories that contain training images and the corresponding landmark files. reference_shape: a numpy array [num_landmarks, 2] batch_size: the batch size. is_traininig: whether in training mode. num_landmarks: the number of landmarks in the training images. mirror_image: mirrors the image and landmarks horizontally. Returns: images: a tf tensor of shape [batch_size, width, height, 3]. lms: a tf tensor of shape [batch_size, 68, 2]. lms_init: a tf tensor of shape [batch_size, 68, 2]. """ files = tf.concat([ list(map(str, sorted(Path(d).parent.glob(Path(d).name)))) for d in paths ], 0) filename_queue = tf.train.string_input_producer(files, shuffle=is_training, capacity=1000) filename = filename_queue.dequeue() image, lms, lms_init = tf.py_func( partial(load_image, is_training=is_training, mirror_image=mirror_image), [filename, reference_shape], # input arguments [tf.float32, tf.float32, tf.float32], # output types name='load_image') # The image has always 3 channels. image.set_shape([None, None, 3]) if is_training: image = distort_color(image) lms = tf.reshape(lms, [num_landmarks, 2]) lms_init = tf.reshape(lms_init, [num_landmarks, 2]) images, lms, inits, shapes = tf.train.batch( [image, lms, lms_init, tf.shape(image)], batch_size=batch_size, num_threads=4 if is_training else 1, capacity=1000, enqueue_many=False, dynamic_pad=True) return images, lms, inits, shapes
def batch_inputs(paths, reference_shape, batch_size=32, is_training=False, num_landmarks=68, mirror_image=False): """Reads the files off the disk and produces batches. Args: paths: a list of directories that contain training images and the corresponding landmark files. reference_shape: a numpy array [num_landmarks, 2] batch_size: the batch size. is_traininig: whether in training mode. num_landmarks: the number of landmarks in the training images. mirror_image: mirrors the image and landmarks horizontally. Returns: images: a tf tensor of shape [batch_size, width, height, 3]. lms: a tf tensor of shape [batch_size, 68, 2]. lms_init: a tf tensor of shape [batch_size, 68, 2]. """ files = tf.concat(0, [map(str, sorted(Path(d).parent.glob(Path(d).name))) for d in paths]) filename_queue = tf.train.string_input_producer(files, shuffle=is_training, capacity=1000) filename = filename_queue.dequeue() image, lms, lms_init = tf.py_func( partial(load_image, is_training=is_training, mirror_image=mirror_image), [filename, reference_shape], # input arguments [tf.float32, tf.float32, tf.float32], # output types name='load_image' ) # The image has always 3 channels. image.set_shape([None, None, 3]) if is_training: image = distort_color(image) lms = tf.reshape(lms, [num_landmarks, 2]) lms_init = tf.reshape(lms_init, [num_landmarks, 2]) images, lms, inits, shapes = tf.train.batch( [image, lms, lms_init, tf.shape(image)], batch_size=batch_size, num_threads=4 if is_training else 1, capacity=1000, enqueue_many=False, dynamic_pad=True) return images, lms, inits, shapes