Path: blob/master/site/es-419/tutorials/generative/style_transfer.ipynb
25118 views
Copyright 2018 The TensorFlow Authors.
Transferencia de estilo neuronal
En este tutorial se usa aprendizaje profundo para componer una imagen en el estilo de otra imagen (¿le gustaría pintar como Picasso o Van Gogh?). Esto se conoce como transferencia de estilo neuronal y esta técnica se explica en Un algoritmo de estilo artístico (Gatys et al.).
Nota: En este tutorial se muestra el algoritmo original de transferencia de estilo. Optimiza el contenido de la imagen a un estilo específico. Los enfoques modernos entrenan un modelo para generar imágenes estilizadas directamente (similar a CycleGAN). Este enfoque es mucho más rápido (hasta 1000x).
Para ver una aplicación simple de la transferencia de estilo con un modelo preentrenado de TensorFlow Hub, vea el tutorial Fast style transfer for arbitrary styles que usa un modelo de estilización de imagen. Pare ver un ejemplo de transferencia de estilo con TensorFlow Lite, vea Artistic style transfer with TensorFlow Lite.
La transferencia neuronal de estilo es una técnica de optimización que se usa para tomar dos imágenes, una imagen de contenido y una imagen de referencia de estilo (como la pintura de un artista famoso), y las combina para que la imagen de salida se vea como la imagen de contenido pero "pintada" en el estilo de la imagen de referencia.
La forma de implementarlo es optimizando la imagen de salida para que coincida con las estadísticas de la imagen de contenido y las estadísticas de la imagen de referencia. Estas estadísticas se extraen de las imágenes mediante la red neuronal convolucional.
Por ejemplo, usemos la imagen de este perro y la Composition 7 de Wassily Kandinsky.
Yellow Labrador Looking, de Wikimedia Commons de Elf. Licencia CC BY-SA 3.0
Entonces, ¿cómo se vería si Kandisky pintara la imagen de este perro en este estilo exclusivamente? ¿Algo así?
Preparación
Importar y configurar módulos
Descarga imágenes y selecciona una imagen de estilo y una imagen de contenido:
Visualizar la entrada
Defina una función para cargar la imagen y delimite la dimensión máxima a 512 píxeles.
Cree una función simple para que se muestre la imagen.
Transferencia rápida de estilo con TF-Hub
En este tutorial se demuestra el algoritmo original de transferencia de estilo, que optimiza la imagen de contenido en un estilo en particular. Antes de profundizar en los detalles, veamos como lo hace el modelo de TensorFlow Hub:
Definir las representaciones de contenido y estilo
Use las capas intermedias del modelo para obtener las representaciones de contenido y estilo de la imagen. Si empezamos por la capa de entrada de la red, las primeras activaciones de la capa representan características de poca importancia, como bordes y texturas. A medida que se avanza en la red, las últimas capas representan características de mayor importancia (partes de los objetos como ruedas u ojos). En este caso, está usando una arquitectura de red VGG19, una red preentrenada de clasificación de imágenes. Las capas intermedias son necesarias para definir la representación de contenido y estilo de las imágenes. Para obtener una imagen de salida, intente hacer coincidir el estilo las representaciones del estilo correspondiente y el contenido de destino en las capas intermedias.
Cargue una VGG19 y ejecútela en modo de prueba con nuestra imagen para asegurarse de que se pueda usar correctamente:
Ahora cargue una VGG19
sin el encabezado de clasificación y enumere los nombres de las capas
Escoja capas intermedias en la red para representar el estilo y el contenido de la imagen:
Capas intermedias para el estilo y el contenido
¿Por qué las salidas intermedias de la red preentrenada de clasificación de imágenes nos permiten definir las representaciones de estilo y contenido?
A un nivel alto, para que la red pueda realizar la clasificación de la imagen (que para eso fue entrenada), debe comprender la imagen. Para eso debe tomar la imagen sin procesar como píxeles de entrada y construir una representación interna que convierta los píxeles de la imagen sin procesar en una comprensión compleja de las características presentes en la imagen.
Esta es otra de las razones por las que las redes neuronales convolucionales son capaces de generalizar bien: son capaces de captar las invarianzas y las características definitorias dentro de las clases (por ejemplo, gatos o perros) que son agnósticas al ruido de fondo y otras molestias. Así, entre el momento en que se ingresa la imagen sin procesar en el modelo y la etiqueta de clasificación de salida, el modelo actúa como un complejo extractor de características. Al acceder a las capas intermedias del modelo, es capaz de describir el contenido y el estilo de las imágenes de entrada.
Construir el modelo
Las redes en tf.keras.applications
están diseñadas para que usted pueda extraer fácilmente los valores de la capa intermedia con la API funcional de Keras.
Para definir un modelo con la API funcional, especifique las entradas y las salidas:
model = Model(inputs, outputs)
La siguiente función, construye un modelo VGG19 que devuelve una lista de salidas de la capa intermedia:
Y para crear el modelo:
Calcular el estilo
El contenido de una imagen se representa mediante los valores de los mapas de características intermedias.
Lo que pasa es que el estilo de una imagen puede describirse por las medias y las correlaciones en los mapas de características diferentes. Calcule una matriz de Gram que incluya esta información. Para esto debe tomar el producto externo del vector de la característica con sí mismo en cada ubicación y promediar ese producto externo en todas las ubicaciones. La matriz de Gram puede calcularse para una capa en particular de la siguiente manera:
Puede implementarse de forma concisa con la función tf.linalg.einsum
:
Extraer el estilo y el contenido
Construya un modelo que devuelva los tensores de estilo y de contenido.
Cuando se lo llama en una imagen, el modelo devuelve la matriz de Gram (estilo) de style_layers
y el contenido de content_layers
:
Ejecutar el descenso de la gradiente
Con este extractor de estilo y contenido, ahora puede implementar el algoritmo de transferencia de estilo. Para hacer esto, calcule el error cuadrático medio de la salida de su imagen en relación con cada destino, y luego, tome la suma ponderada de estas pérdidas.
Establezca los valores de destino del estilo y del contenido:
Defina una tf.Variable
donde se guarde la imagen que se va a optimizar. Para hacerlo rápido, inícielo con una imagen de contenido (la tf.Variable
debe tener la misma forma que la imagen de contenido):
Ya que esta es una imagen flotante, defina una función para los valores de los píxeles permanezcan entre 0 y 1:
Cree un optimizador. En el artículo se recomienda usar LBFGS, pero Adam funciona bien también:
Para optimizar esto, use una combinación ponderada de dos pérdidas para obtener la pérdida total:
Use tf.GradientTape
para actualizar la imagen.
Ahora, ejecute algunos pasos para probarlo:
Como sí funciona, realice una optimización más larga:
Pérdida total de variación
Una desventaja de esta implementación básica es que produce muchos artefactos de alta frecuencia. Puede reducir esta cantidad con un término de regularización explícito en los componentes de alta frecuencia de la imagen. En la transferencia de estilo, esto se conoce como total variation loss:
Aquí se muestra cómo se redujeron los componentes de alta frecuencia.
También, este componente de alta frecuencia es un detector de bordes, básicamente. Puedes obtener una salida similar con el detector de bordes Sobel, por ejemplo:
La pérdida de regularización asociada es la suma de los cuadrados de los valores:
Esto demostró como lo hace. Pero no hace falta que usted lo implemente, pues TensorFlow incluye una implementación estándar:
Ejecutar la optimización de nuevo
Escoja una ponderación para total_variation_loss
:
Ahora, agréguelo a la función train_step
:
Reinicialice la variable imagen y el optimizador:
Y ejecute la optimización
Para finalizar, guarde el resultado:
Más información
En este tutorial se explica el algoritmo original de transferencia de estilo. Para ver una aplicación simple de la transferencia de estilo, échele un vistazo a este tutorial y encuentre más información sobre cómo usar el modelo arbitrario de transferencia de estilo de TensorFlow Hub.