Mi artículo anterior tiene casi el mismo título, con la única diferencia de que creé lentes para Snapchat algorítmicamente usando dlib y openCV, y hoy quiero mostrar cómo puede lograr el resultado usando el aprendizaje automático. Este enfoque permitirá no participar en el diseño manual del algoritmo, sino obtener la imagen final directamente de la red neuronal.
Esto es lo que obtenemos:
¿Qué es pix2pix?
Esta es una forma de convertir una imagen en una imagen utilizando redes de contención (comúnmente conocidas como pix2pix).
El nombre "pix2pix" significa que la red está capacitada para convertir la imagen de entrada en su imagen de salida correspondiente. Aquí hay ejemplos de tales transformaciones:
La característica más genial de pix2pix es su versatilidad . En lugar de crear un nuevo algoritmo o un nuevo modelo para cada una de las tareas anteriores, es suficiente usar diferentes conjuntos de datos para entrenar la red.
A diferencia de los enfoques utilizados anteriormente, pix2pix aprende a resolver problemas mucho más rápido y con un conjunto de entrenamiento más pequeño. Por ejemplo, los resultados a continuación se obtuvieron al entrenar con la GPU Pascal Titan X en un conjunto de datos de 400 pares de imágenes y en menos de dos horas.
¿Cómo funciona pix2pix?
pix2pix usa dos redes neuronales que aprenden en paralelo:
- Generador
- Discriminador
El generador intenta generar una imagen de salida a partir de los datos de entrenamiento de entrada, y el discriminador intenta determinar si el resultado es real o generado.
Cuando el generador produce imágenes indistinguibles (discriminatorias) de las reales, comenzamos a entrenar al discriminador en ellas y en las imágenes reales. Cuando el discriminador logra distinguir las imágenes reales de las generadas, nuevamente comenzamos a entrenar al generador para que nuevamente aprenda a engañar al discriminador.
Tal “carrera armamentista” lleva al hecho de que a una persona le resulta difícil distinguir las imágenes reales de las imágenes generadas.
Practica
Entrenaremos nuestro generador de filtros para Snapchat en imágenes de 256x256 (los tamaños grandes requerirán más memoria de video). Para crear un conjunto de datos, use el código del tutorial anterior .
Descargué muchas imágenes de caras y apliqué un filtro de "Gafas de vida de matón" a cada una. Resultará algo así como estos pares:
Para crear el modelo, tome el repositorio pix2pix basado en TensorFlow. Clónelo e instale Tensorflow.
El comando para comenzar el entrenamiento será el siguiente:
python pix2pix.py --mode train --output_dir dir_to_save_checkpoint --max_epochs 200 --input_dir dir_with_training_data --which_direction AtoB
El parámetro which_direction establece la dirección del entrenamiento. AtoB significa que queremos convertir la imagen A (izquierda, sin gafas) en imagen B (derecha, con gafas). Por cierto, tenga en cuenta que pix2pix puede aprender con éxito cómo restaurar la imagen original de una imagen con un filtro, solo cambie la dirección del entrenamiento.
Puede monitorear el progreso del entrenamiento usando el tensorboard, para lo cual necesita ejecutar el comando:
tensorboard --logdir=dir_to_save_checkpoint
Tan pronto como vea que los resultados en los datos de entrenamiento se han vuelto bastante buenos, puede detener el entrenamiento y probar el modelo con datos arbitrarios. Puede continuar entrenando desde el último punto de control de la siguiente manera:
python pix2pix.py --mode train --output_dir dir_to_save_checkpoint --max_epochs 200 --input_dir dir_with_training_data --which_direction AtoB --checkpoint dir_of_saved_checkpoint
Conclusión
El advenimiento de las redes generativas de tipo pix2pix abre grandes perspectivas para una solución universal y simple para todo tipo de tareas de procesamiento de imágenes.