Un certain nombre d'opérations sur les images dans TensorFlow sont utilisées pour déformer les images d'entrée pendant la formation, par exemple. tf.image.random_flip_left_right(image, seed=None)
et tf.image.random_brightness(image, max_delta, seed=None)
et plusieurs autres.
Ces fonctions sont conçues pour des images uniques (c'est-à-dire des tenseurs 3D avec une forme [hauteur, largeur, canal de couleur]). Comment puis-je les faire travailler sur un lot d'images (c'est-à-dire des tenseurs 4D avec une forme [lot, hauteur, largeur, canal de couleur])?
Un exemple de travail serait grandement apprécié!
Une possibilité consiste à utiliser le tf.map_fn()
récemment ajouté pour appliquer l'opérateur à une image à chaque élément du lot.
result = tf.map_fn(lambda img: tf.image.random_flip_left_right(img), images)
Cela crée efficacement le même graphique que keveman suggère bâtiment, mais il peut être plus efficace pour les lots de grande taille, en utilisant le support des boucles de TensorFlow.
Vous pouvez appeler l'opération d'image dans une boucle et concaténer le résultat. Par exemple :
transformed_images = []
for i in range(batch_size):
transformed_images.append(
tf.expand_dims(tf.image.random_flip_left_right(image[i, :, :, :]), 0))
retsult = tf.concat(0, transformed_images)
TLDR: vous pouvez créer une file d'attente, définir des données de lecture et de traitement pour un seul élément de la file d'attente et effectuer un traitement par lots, le tout avec les méthodes TF.
Je ne sais pas comment cela fonctionne, mais si vous utilisez des files d'attente, créez des lots et lisez des images à l'aide de méthodes tensorflow, vous pouvez utiliser le traitement par lots comme avec une seule image.
Je ne l'ai pas encore testé sur de grands ensembles de données et je ne sais pas à quel point c'est bon (vitesse, consommation de mémoire, etc.). Peut-être que pour le moment, il est préférable de créer batch par vous-même.
J'ai vu cela dans l'exemple cifar10. Vous pouvez le voir ici https://github.com/tensorflow/tensorflow/tree/r0.10/tensorflow/models/image/cifar10
tf.train.string_input_producer
. https://github.com/tensorflow/tensorflow/blob/r0.10/tensorflow/models/image/cifar10/cifar10_input.py#L222 Vous pouvez utiliser différents types de file d'attente. Par exemple, j'essaie d'utiliser tf.train.slice_input_producer
pour plusieurs images. Vous pouvez lire à ce sujet ici Tensorflow lire des images avec des étiquettes read_cifar10
. En traitement dans distorted_inputs
, c'est ici https://github.com/tensorflow/tensorflow/blob/r0.10/tensorflow/models/image/cifar10/cifar10_input.py#L138tf.train.batch
ou tf.train.shuffle_batch
en fonction des paramètres et le renvoient à partir des fonctions inputs()
et distorted_inputs()
. images, labels = cifar10.distorted_inputs()
et font le travail suivant. C'est ici https://github.com/tensorflow/tensorflow/blob/r0.10/tensorflow/models/image/cifar10/cifar10_train.py#L66Vous pouvez utiliser tf.reverse pour simuler tf.image.random_flip_left_right et tf.image.random_flip_up_down sur des tenseurs 4-D de forme [lot, hauteur, largeur, canal].
random_number = tf.random_uniform([], minval=0, maxval=4, dtype=tf.int32)
random_batch_flip = tf.where(tf.less(tf.constant(2), random_number), tf.image.flip_left_right(batch), batch)
référence: http://www.guidetomlandai.com/tutorials/tensorflow/if_statement/