sábado, 3 de marzo de 2018

Más falso que Nicolas Cage

Qué encontrarás en esta entrada?
  • ¿Qué son los 'Deep Fakes'?
  • Programas para realizar 'Face Swaps' por 'Deep Learning'.
  • Problemas con los que me he topado. 

Introducción

Que me disculpe el Sr. Cage por el título ya que nada tengo contra él y es tan solo un juego de palabras. Seguro que muchos de vosotros habéis visto ya el siguiente vídeo, o alguno muy similar.


Los Deep Fakes están de moda. Se trata de una aplicación del Deep Learning (un método de aprendizaje automático) para el intercambio de una cara por otra en un vídeo. Un programa para realizar Deep Fakes reconoce las caras de dos vídeos distintos, y después de la creación de un modelo (el cual es necesario "entrenar"), es capaz de intercambiarlas.

Aplicaciones

La aplicación más conocida, que ha popularizado esta práctica, es FakeApp (gratuita, pero requiere registro). No es la única, y existen otras alternativas como MyFakeApp.

Instalación y resolución de problemas

Nota: posiblemente, como pre-requisito, será necesaria la instalación de Visual Studio.

Os comento un poco mi experiencia con estas aplicaciones. Vaya por delante una declaración de humildad: llevo metido en el maravilloso mundo del los Deep Fakes unos tres días, por lo que seguro que cualquiera que lleve más tiempo en esto pueda aportar más información, y así le agradecería que lo hiciese en comentarios.

Estas aplicaciones suelen tener tres fases:

  1. Detección de caras.
  2. Creación del modelo (entrenamiento).
  3. Intercambio y renderización del resultado final.

Para realizar cada una de estas tareas - de forma independiente - se puede utilizar procesamiento CPU o GPU (éste último es a través de la tarjeta gráfica y es infinitamente más rápido). El inconveniente es que el procesamiento por GPU a mi me ha dado muchos problemas de configuración.

De las tres fases, es vital que la segunda se haga por GPU, debido a que es mucho más rápido y a que la calidad del cambio depende de cómo de entrenado esté el modelo. Por ilustrarlo con mi caso particular, una iteración en el entrenamiento del modelo con CPU a mi me tarda al rededor de 5 minutos, mientras que por GPU me tarda 5 segundos. Teniendo en cuenta que para tener un modelo aceptable se requieren cientos o miles de iteraciones, podéis sacar vuestras propias conclusiones.
Para intentar hacer funcionar el procesamiento por GPU, hay que instalar (dependencias para FakeApp 2.2):

  • CUDA 9.0 + Patch 1 (25/01/2018): ¡Ojo!, que versiones posteriores puede que ya no nos valgan (actualmente está la 9.1). Se pueden descargar ambos de NVIDIA Developers (requiere registro).
  • cudnn 7.0: La v7.0 y no la v7.1 que actualmente está disponible (o posteriores en el futuro), ya que puede no ser compatible. Igualmente se puede descargar desde aquí.

Con esto, debería funcionar la "fase 2" con GPU. A día de hoy, sin embargo, a mi los otros dos pasos me dan errores, como el famoso 'undefined  File "align_faces.py"', por el que todo el mundo pregunta, pero del que nadie parece saber nada en Internet. En cualquier caso, esto es menos problemático debido a que puede hacerse por CPU (tarda bastante, pero no es tan crítico como entrenar un modelo, que la calidad depende del tiempo que esté entrenándose).

Para otros problemas, FakeApp tiene un foro, aunque algunas cosas se encuentran mejor preguntándole al Sr. Google.

Modo de uso

Como comentaba, el proceso tiene tres fases. La primera es la del laminado de vídeo y reconocimiento de los rostros.


En esta primera etapa se descompone el vídeo en sus fotogramas, y la aplicación reconoce y alinea los rostros guardándolos en una carpeta. Este proceso se realiza tanto para el vídeo base como para el vídeo con la cara que queramos que aparezca al final, con lo cual tendremos dos carpetas con las caras que queramos intercambiar en distintas poses.


Como indicaba anteriormente, este proceso se realiza razonablemente bien por CPU tanto en FakeApp como en MyFakeApp, y los archivos resultantes se pueden utilizar de manera indistinta para la siguiente fase con independencia de la aplicación que los haya generado.

La segunda fase es la del entrenamiento.


Esta etapa toma como entrada los rostros de la fase anterior y entrena el modelo para intercambiarlos. Como también indicaba con anterioridad, debido a que es un proceso del que depende críticamente la calidad del cambio y que lleva mucho tiempo, es extremadamente recomendable que se utilice procesamiento GPU para esta fase.


Como salida genera unos archivos ".h5". Comentar un par de cosas:
  • Puedes dejar un modelo a medio entrenar, y completarlo más tarde. Esto es muy útil teniendo en cuenta el largo tiempo que puede llevar el entrenar un modelo.
  • Los modelos no son compatibles entre aplicaciones. Mientras que el reconocimiento de caras de FakeApp se puede usar como dato de entrada en MyFakeApp y al revés, los archivos que se generan del modelo (aparentemente con el mismo formato) no se pueden usar en una aplicación distinta a la que lo ha generado.
Durante el entrenamiento, se puede ver una representación gráfica de las caras originales y de sus modificaciones para adaptarse a las poses del vídeo contrario al que pertenecen, de manera que pueda tenerse una idea de cuán bueno es el modelo.

Se han difuminado algunas caras por privacidad

En la última fase también he encontrado problemas con el procesamiento GPU, pero con un poco de paciencia, se puede realizar la tarea con CPU. En esta etapa se edita el vídeo con los datos del modelo: se divide en sus fotogramas, se les inserta la cara como una máscara sobre cada imagen original, y se vuelve a renderizar para crear el vídeo final.


El resultado... puede llegar a ser muy inquietante...

2 comentarios:

  1. Respuestas
    1. ¡Muchas gracias! Lástima que hayan eliminado el último vídeo. Se ven algunos ejemplos de uso de esta aplicación por Internet alucinantes, pero la verdad es que yo no conseguí muy buenos resultados por mi mismo. Lo mismo necesitaba un equipo más potente y muchas más horas de procesamiento.

      Gracias por tu comentario. ¡Un saludo!

      Eliminar

Querido astarothista!,

Si te ha gustado la entrada y quieres dejar constancia de ello, tienes alguna sugerencia para completarla o corregirla, quieres mostrar tu opinión respecto a algo de lo que se haya hablado en esta entrada (con respeto) o simplemente quieres dejarme un mensaje a mi o a la comunidad, no dudes en comentar ;)!

Recuerda que también estamos en Facebook y en Google+.