TorchFakes: Detección de DeepFake
TorchFakes: Detección de DeepFake
Proyecto de aprendizaje compartido por la comunidad. El artículo documenta el equipo, el método y los resultados; no acredita que el prototipo esté listo para su uso fuera del entorno de aprendizaje.

Este archivo incluye traducciones automáticas. El audio, el vídeo y el texto de las imágenes conservan su idioma original.
Autores: Aarón Espasandín Geselmann, Concepción Olivares Herráiz, Jorge González Sierra y Jaime Merino Alberto
Mentores: Alejandro Iñigo, Teresa García y Nerea Encina
Este es el proyecto final de la Bootcamp de los AI Saturdays.
Puedes probar este modelo usando el siguiente enlace, ¡solo ingresa una imagen y mira los resultados!
Introducción
Un DeepFake puede ser una imagen o un vídeo con sonidos creados artificialmente mediante una combinación de algoritmos de aprendizaje automático.
Se pueden encontrar similitudes entre esta tecnología y el software de edición de imágenes, sin embargo, es un paso más. Puede crear personas que no existen o crear un vídeo haciendo que una persona real diga o haga cosas que en realidad no hizo ni dijo, como en el caso del famoso vídeo de Obama.
Es una herramienta de desinformación, que puede usarse para estafas, manipulación electoral, robo de identidad e incluso para crear videos pornográficos falsos de celebridades.
La motivación detrás del proyecto.
Hoy en día parece cada vez más complicado detectar si el contenido que se difunde por la red es cierto y cada vez más complicado detectar qué es real y qué no.
Es por ello que la principal motivación de nuestro proyecto es desarrollar un modelo de detección de deepfakes que pueda ayudar a personas, instituciones y empresas a detectar imágenes falsas en situaciones en las que puedan ser manipuladas.
Pero no todas las aplicaciones deep fake están enfocadas a la manipulación o el engaño, también existen usos positivos de los deep fakes; aplicaciones en entretenimiento, publicidad, cine, investigación en usos médicos, etc.
Estructura del proyecto
Para el proyecto hemos utilizado el modelo InceptionResNetV1 entrenado con FaceForensics++ con vídeos HD a 30 FPS creando con él un conjunto de datos equilibrado de más o menos un 50% de imágenes falsas y un 50% de imágenes reales. Para extraer las caras hemos utilizado el modelo MTCNN previamente entrenado.
Decidimos utilizar el marco de aprendizaje profundo PyTorch debido a la libertad que ofrece en comparación con Keras.
Crear una cara a partir del conjunto de datos
Utilizamos el conjunto de datos FaceForensics++ con un total de 21.000 imágenes falsas y 5.500 imágenes reales. Filtramos las imágenes borrosas que podrían afectar la calidad del entrenamiento mediante el uso de un script eso eliminó los borrosos aplicando una convolución usando el núcleo de Laplace (que se puede encontrar justo debajo) y obteniendo la varianza. Ajustamos los borrosos a todos aquellos con una variación inferior a 30.
Código para la convolución con LaPlace Kernel
Si quieres saber más sobre por qué usar el kernel de Laplace, puedes echar un vistazo a este artículo. En resumen, al aplicar una convolución, se resaltan los bordes de la imagen. Si hay una gran cantidad de aristas, entonces tiene una variación alta y, por lo tanto, podemos concluir que no está borrosa.
Aunque inicialmente realizamos un aumento de datos, que detallaremos a continuación, decidimos no usarlo porque no notamos una diferencia en los resultados y el conjunto de datos ya era diverso.
a extraer las caras De los videos e imágenes del conjunto de datos, hemos utilizado el modelo preentrenado MTCNN. Lo importamos con la siguiente línea de código:
>>de facenet_pytorch importar MTCNN
Este modelo se explica a continuación. artículo mediano. En resumen, es un modelo de 3 etapas convolucionales consecutivas, en la que la primera es una CNN donde se toma la imagen y se redimensiona a diferentes escalas para construir una pirámide de imágenes. La segunda etapa es un FCN, que se utiliza para obtener las ventanas candidatas y sus vectores de regresión del cuadro delimitador.
La tercera y última etapa (O-NET) es similar a la anterior pero tiene como objetivo describir en detalle el rostro, posicionando los ojos, la nariz y la boca.
Pudimos ver que el proceso de extracción de caras de las imágenes estuvo bien hecho con este ejemplo:

Ejemplo de caras extraídas con el modelo preentrenado MTCNN
Inicialmente, aunque luego lo prescindimos como se mencionó anteriormente, realizamos un aumento de datos para equilibrar adecuadamente nuestros conjuntos de datos de entrenamiento y validación. Para ello hemos utilizado las siguientes transformaciones:

Código de aumento de datos
Clasificador de imágenes binarias mediante aprendizaje por transferencia
ResNetV1 es un modelo lanzado en 2015. Antes de que existiera, existían varias formas de evitar el problema del gradiente de fuga, sin embargo, ninguna lo solucionaba por completo.
El problema de ResNet nos permitió resolver el problema del gradiente evanescente.

Ilustración de Inception ResNetV1
Esto significó que la información entre capas no solo circulaba secuencialmente sino también entre “saltos”, lo que agregaba complejidad al algoritmo.
Si quieres saber más sobre ResNet y sus variantes, te recomendamos este artículo, del que hemos obtenido las imágenes de la arquitectura.
Para cargar el modelo en PyTorch necesitas esta línea de código:
>>de facenet_pytorch importar InceptionResnetV1
Hemos configurado RESNET para que la última capa tenga una única clase para realizar una clasificación binaria entre “Real” y “Fake”.

Configuración de inicio ResNetV1
Evaluación y Resultados
Resultados de métricas típicas como la precisión
La precisión de la validación es del 96,6 % para 80 épocas con una pérdida de validación del 0,16.
Todas estas métricas se pueden ver en la siguiente imagen. Hemos realizado esta evaluación en Pesos y sesgos para la red InceptionResnetV1 entrenada con el conjunto de datos FaceForensics++.

Métricas de nuestro modelo
En Weights & Biases, podemos ver cómo no tenemos el problema de que los gradientes desaparezcan cuando usamos ResNet.

gradiente de desaparición
Para entrenar el modelo utilizamos un portátil con una GTX 1070. El número de lotes elegidos para el entrenamiento fue 16. Vimos que si usábamos un número mayor la GPU no aguantaba.
En la siguiente imagen, mostramos el uso de GPU para 80 lotes.

Uso de GPU durante el entrenamiento
Mapas de activación de clases para ver en qué se centra nuestro modelo
Para ayudarnos a comprender las decisiones de nuestro modelo, hemos utilizado mapas de activación de clase para ver en qué se centra cuando analiza una imagen. Para ello hemos utilizado el método Grad-CAM, que consiste en encontrar qué partes de la imagen han llevado a una red neuronal convolucional a su decisión final. Este método consiste en producir mapas de calor que representan las clases de activación sobre las imágenes de entrada recibidas. Una clase de activación está asociada con una clase de salida específica. Estas clases permitirán indicar la importancia de cada píxel con respecto a la clase en cuestión aumentando o disminuyendo la intensidad del píxel.
Tras analizar varios ejemplos, tanto reales como falsos, podemos llegar a algunas conclusiones. En primer lugar, nuestro modelo se centra principalmente en el área de la barbilla y la boca para detectar imágenes reales. Aquí podemos ver algunos ejemplos de imágenes reales donde podemos apreciarlo.

Sin embargo, cuando se trata de analizar imágenes falsas, nuestro modelo se centra más en el área de la nariz y la boca. Estos ejemplos de imágenes falsas lo demuestran claramente.

Inferencia usando Gradio
hemos usado GRADIO para crear una interfaz básica donde podamos implementar nuestro modelo.
Conclusiones, dificultades y próximos pasos
Próximos pasos: aplicación con PyTorch Live, clasificación de videos, tenga en cuenta el audio
Aplicación con PyTorch Live, clasificación de vídeo, consideración de audio.
Durante el proyecto hemos tenido una serie de dificultades, la principal ha sido a la hora de realizar la evaluación del modelo, tras las fases de entrenamiento, aunque la precisión binaria de ambas validaciones ha mostrado un buen resultado (96,39% tras 10 épocas), cuando probamos el modelo las clasificó erróneamente todas como “Reales”. Al principio atribuimos este error al conjunto de datos, que después de las transformaciones, había ciertas imágenes que tenían defectos y que teníamos que descargar los videos para extraer los rostros con mayor calidad.
Finalmente lo solucionamos filtrando las imágenes borrosas que eran muy perjudiciales para el entrenamiento del modelo. Evitamos el uso de transformaciones en el conjunto de datos de entrenamiento (solo cambiar el tamaño y convertir a tensor). Ampliamos el conjunto de datos de imágenes falsas filtrando las borrosas como se describe en la sección del conjunto de datos.
El siguiente paso de este proyecto sería crear un modelo que sea capaz de distinguir entre vídeos falsos y reales sin necesidad de extraer caras de diferentes fotogramas. Además de distinguir entre audio manipulado o audio generado por algoritmos de aprendizaje profundo.
El código se puede encontrar en nuestro repositorio de GitHub.
¡Más inteligencia artificial!
La misión de Saturdays.ai es hacer la inteligencia artificial más accesible (#ai4all) mediante cursos y programas intensivos donde se realizan proyectos para el bien (#ai4good).
Infórmate de nuestro master sobre inteligencia artificial en https://saturdays.ai/master-ia-online/
Si quieres aprender más inteligencia artificial únete a nuestra comunidad en community.saturdays.ai o visítanos en nuestra web www.saturdays.ai ¡te esperamos!
Una historia de la comunidad Saturdays.AI. Publicado originalmente el 17 de junio de 2022.
← Más historias de la comunidad


