web-dev-qa-db-fra.com

Opérations sur les images TensorFlow pour les lots

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é!

17
questiondude

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.

28
mrry

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)
4
keveman

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

  1. Tout d'abord, ils créent une file d'attente avec 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
  2. Ensuite, ils effectuent toutes les opérations nécessaires comme pour une seule image. S'ils n'ont besoin que de lire, il s'agit simplement de lire, s'ils veulent un traitement, ils rognent l'image et font d'autres tâches. La lecture est décrite dans 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#L138
  3. Ils transmettent les résultats de 2 à tf.train.batch ou tf.train.shuffle_batch en fonction des paramètres et le renvoient à partir des fonctions inputs() et distorted_inputs()
  4. Ils le lisent comme 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#L66
2
ckorzhik

Vous 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].

0
dominikroblek
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/

0
Manuel Cuevas