07 abril 2021

Superman vs Batman

 Hace unos meses que empecé a probar DeepFaceLab, un conjunto de comandos ejecutables con los que trabajar los Deepfakes. Su uso aunque sea a base de pantallas de comandos es fácil e intuitivo.

Durante este tiempo y tras muchas pruebas, ya que trabajar con cualquier inteligencia artificial requiere paciencia, aprendizaje y mucho prueba/error he llegado a varias conclusiones que pasaré a mostraros con ejemplos gráficos, aunque será mejor que primero os ponga en antecedentes.

Carlos Latre / José Ramón de la Morena

Rejuvenecimiento Harrison Ford

Tras mucho trastear, hacer clips chorras cambiando las caras a personajes públicos que se parecen, Steven Tyler - Toñi de Azucar Moreno, rejuveneciendo a Harrison Ford, o intercambiando a Carlos Latre la cara del famoso imitado en ese momento. Pasé a algo más "ambicioso".

El trailer de "Superman vs Batman". La idea pintaba bien, devolverle el traje de Superman y el de Batman a sus primeros actores en el cine. Pasar de Henry Cavill a Christopher Reeve y de Ben Affleck a Michael Keaton, con la idea de ir más allá y los pocos frames en los que aparecen Gal Gadot y Amy Adams como Wonder Woman y Lois Lane, volver a las originales Lynda Carter y Margot Kidder.
Pero no pudo ser, por varias razones, casi todas ellas técnicas, tecnológicas y de morfología.


Para trabajar con Deepfakes hay unos requisitos básicos para un buen resultado.

- Un buen set de caras de la persona que va a aparecer en la versión final del vídeo, entre 4.000 y 6.000 desde todos los ángulos y con expresiones distintas.

- Una buena tarjeta gráfica.

- Y tiempo, mucho, mucho tiempo.


El flujo de trabajo para todos los deepfakes es el mismo.


Faceset Christopher Reeve


- Extraer todos los frames del vídeo que queremos cambiar (destino)

- Extraer las caras de ese vídeo y eliminar las caras que no sean objetivo del cambio.

- Conseguir el "faceset". Conseguir vídeos (fuente) donde se vea bien la cara del personaje en cuestión (los de entrevistas son especialmente buenos), luego descartar las no válidas (todas en las que no se vea la cara completa).

- Comprobar que la IA no se ha confundido y comprobar que las caras las haya reconocido y alineado bien.

- Entrenar a la inteligencia artificial (eso lleva tiempo, cuanto más entrena mejor resultado).

- Fusionar la cara nueva frame a frame al vídeo final.

- Exportarlo a vídeo.


¿Pero qué falló?

Henry Cavill / Christopher Reeve

Ahora una vez contado el funcionamiento de los deepfakes paso a analizar las razones que hace que aunque no sea una chapuza, no quede creíble mi intento en "Superman vs Batman".

- Morfología (rostro): quizá una de las partes que hace que sea más verosímil un deepfake. La estructura de la cara no es sustituida, si la cara destino es cuadrada y la de origen redonda nunca quedará creíble. Por mucho que te esfuerces.

Henry Cavill tiene una mandíbula mucho más cuadrada y un mentón mucho más estrecho que Christopher Reeve, eso hace que aunque el contenido cambie (ojos, nariz, boca, cejas ...) el continente no encaja con el personaje de origen.

- Tecnología: esa es una limitación mía. Los deepfakes se trabajan vía GPU, Nvidia para ser más exactos. Mi gráfica era bastante top hace 5 años, pero para esto va corta de VRAM (4 Gb), puede trabajar en ello pero más lento y limitada ya que con 4 Gb de VRAM no se le permite trabajar a grandes resoluciones.

DeepFaceLab trabaja con dos modelos, uno para gráficas de 2 a 4 Gb de VRAM (Quick96) que como su nombre indica trabaja con resoluciones de caras de 96 x 96 píxeles. Y el modelo SAEHD para GPU de 6 Gb o mayor, que puede trabajar hasta un máximo de 640 x 640 píxeles de resolución.

Yo me las he apañado para trabajar con mis 4 Gb con el modelo SAEHD que da mejores resultados, pero va justita.

- Resolución: Y aquí volvemos a lo anterior, trabajando con caras de 128 x 128 (el tope que da mi GPU), en clips en FHD o 4K se ve la falta de resolución. Hay una solución "cutre" que es trabajar con un vídeo 720 o 480, y luego escalarlo a FHD o 4K con otros programas de IA, pero eso da para otro post.

Pero lo que pierdes cuando trabajas con resoluciones muy bajas es que a la IA le complicas mucho más el reconocimiento facial, y puedes perder caras por el camino y eso supone frames con la cara del vídeo original parpadeando cada x frames que no haya reconocido facialmente y que sean difíciles de alinear a mano.

Henry Cavill / Christopher Reeve (deepfake) 

Ben Affleck / Michael Keaton (deepfake)


¿Se puede hacer algo convincente?

Claro que sí. Un ejemplo de trabajo bien hecho y de entender que los deepfakes convincentes pasan por conocer sus puntos débiles es el anuncio de Cruzcampo con "Lola Flores".


- Para ese anuncio se contrató a una actriz con una forma de cara similar, que actuó como Lola Flores. Con eso solucionas el problema de la estructura de la cara.

- Sólo tomas frontales, o 3/4. Uno de los puntos flojos de los deepfakes son los cambios de cara de perfil, especialmente la nariz. Volvemos a la forma de la cara. 

- Y luego jugar con la resolución, en ese anuncio la imagen de "Lola Flores" tiene el trato de imagen de los 80's / 90's, por necesidad, las imágenes de archivo de Lola Flores no pueden ser HD, mucho menos FHD, con lo cual hay que "ensuciar" la imagen de la "Lola" actriz para hacerlo creíble.

- ... y tener un buen equipo (o varios) entrenando muchas horas, días, o semanas.

Espero que os sea útil, si tenéis alguna duda no dudéis en preguntar. Y si no hacéis deepfakes y sois un poco "cuñaos" tenéis otro tema del que hablar en las comidas familiares, cuando os dejen comer en familia no conviviente claro.




No hay comentarios:

Publicar un comentario