neural - tensorflow python
Operaciones de imagen TensorFlow para lotes. (5)
Hay una serie de operaciones de imagen en TensorFlow que se utilizan para distorsionar las imágenes de entrada durante el entrenamiento, por ejemplo, tf.image.random_flip_left_right(image, seed=None)
y tf.image.random_brightness(image, max_delta, seed=None)
y varias otras.
Estas funciones están diseñadas para imágenes individuales (es decir, tensores 3D con forma [altura, anchura, canal de color]). ¿Cómo puedo hacer que funcionen en un lote de imágenes (es decir, tensores 4-D con forma [lote, altura, ancho, canal de color])?
Un ejemplo de trabajo sería muy apreciado!
Puede llamar a la operación de imagen en un bucle y concatenar el resultado. Por ejemplo :
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)
Puede usar tf.reverse para simular tf.image.random_flip_left_right y tf.image.random_flip_up_down en tensores 4-D con forma [batch, height, width, channel].
TLDR: puede crear una cola, definir datos de lectura y procesamiento para un solo elemento de la cola y luego hacer un proceso por lotes, todo esto con los métodos de TF.
No estoy seguro de cómo funciona, pero si usa colas y crea lotes y lee imágenes con métodos de tensorflow, puede trabajar con lotes como con una sola imagen.
Todavía no lo probé en grandes conjuntos de datos y no sé qué tan bueno es (velocidad, consumo de memoria, etc.). Puede ser por ahora es mejor crear lotes por ti mismo.
He visto esto en el ejemplo cifar10. Puede verlo aquí https://github.com/tensorflow/tensorflow/tree/r0.10/tensorflow/models/image/cifar10
- En primer lugar, crean una cola con
tf.train.string_input_producer
. https://github.com/tensorflow/tensorflow/blob/r0.10/tensorflow/models/image/cifar10/cifar10_input.py#L222 Puede usar diferentes tipos de cola. Por ejemplo, trato de usartf.train.slice_input_producer
para múltiples imágenes. Puedes leer sobre esto aquí. Tensorflow lee imágenes con etiquetas. - Luego hacen todas las operaciones necesarias en cuanto a una sola imagen. Si solo necesitan leer, es solo leer, si quieren procesar, recortan la imagen y hacen otras cosas. La lectura se describe en
read_cifar10
. Procesando endistorted_inputs
, está aquí https://github.com/tensorflow/tensorflow/blob/r0.10/tensorflow/models/image/cifar10/cifar10_input.py#L138 - Pasan los resultados de 2 a
tf.train.batch
otf.train.shuffle_batch
dependiendo de los parámetros y lo devuelven desde las funcionesinputs()
ydistorted_inputs()
. - Lo leen como
images, labels = cifar10.distorted_inputs()
y hacen el siguiente trabajo. Es aquí https://github.com/tensorflow/tensorflow/blob/r0.10/tensorflow/models/image/cifar10/cifar10_train.py#L66
Una posibilidad es usar el tf.map_fn()
recientemente agregado para aplicar el operador de una sola imagen a cada elemento del lote.
result = tf.map_fn(lambda img: tf.image.random_flip_left_right(img), images)
Esto efectivamente construye el mismo gráfico que keveman sugiere construir, pero puede ser más eficiente para lotes más grandes, al usar el soporte de TensorFlow para bucles.
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)
referencia: http://www.guidetomlandai.com/tutorials/tensorflow/if_statement/