Al combinar técnicas de visión por computadora (como fotometría en pantalla, MediaPipe, BiSeNetV2 y DepthAnythingV2) con una etapa final de recuperación asistida por un LLM, es posible construir un pipeline de verificación facial y prueba de vida altamente efectivo para aplicaciones sociales que reduce los costos operativos hasta 100 veces frente a soluciones comerciales como AWS Rekognition.
Para determinar si la persona frente a la cámara es real y determinar su género y su edad con un nivel de confianza alto y sin causar demasiados falsos positivos que frustren la experiencia ni incurrir en costos masivos, es necesario controlar las condiciones de iluminación en el Cliente ajustando el brillo del display e instruir al usuario mediante una breve indicacion visual sobre cómo posicionarse. Una manera estándar de determinar si en frente de la cámara hay una superficie con iluminación propia (como lo es un display led o lcd) es mediante la prueba de fotometría. El backend envía al cliente una secuencia ordenada de colores que la pantalla destella mientras graba el rostro del usuario.
Aclaracion: No podemos confiar en que el cliente haya realizado las verificaciones, por lo que nosotros vamos a hacerlas nuevamente en el backend. Hay algunas condiciones que deben cumplirse estrictamente, cuyo incumplimiento causará el fracaso inmediato del intento de verificacion. Hay otras condiciones que pueden no cumplirse estrictamente, causando que el intento de verificacion requiera una inspeccion adicional, que yo llamo intento de recuperacion por LLM.
Para normalizar la prueba, verificamos que el video tenga una duracion minima de 3 segundos, una duracion máxima de 20 segundos y una resolución minima de 720p. Tambien verificamos que el video esté en formato vertical y que tenga una cantidad usable de cuadros por segundo.
A continuación utilizamos mediapipe haciendo búsqueda de rostros con landmarks activado, muestreando de manera intercalada un cuadro cada cuatro cuadros para ser eficientes. Si en algún cuadro de nuestra muestra mediapipe no detecta ningun rostro, o detecta multiples rostros, o el rostro hace contacto directo con los bordes del cuadro, o el rostro se posiciona demasiado cerca o demasiado lejos, o el rostro se rota en un ángulo que excede +- 15 grados en el eje Z, el intento de verificacion será rechazado de inmediato.
Esto nos permite asegurarnos de que en ningún momento ocurra un intercambio de cara. Al mismo tiempo se obtiene un promedio de la iluminacion del rostro y del fondo por separado (excluyendo del análisis el cuerpo o torso del usuario), y se mide el promedio de la varianza laplaciana del rostro. En caso que el rostro o el fondo no tengan iluminacion suficiente, el intento de verificacion puede rechazarse o puede marcarse como candidato a ser recuperado, según el umbral de tolerancia. El analisis de varianza permite descartar intentos de spoof con rostros pequeños que se acercan demasiado y se desenfocan.
Durante el escaneo del video se analizan los canales de color de manera independiente sobre algunos landmarks del rostro para ubicar los puntos de referencia donde inicia y finaliza la prueba de fotometría. Se verifica que exista una secuencia de colores real y que coincida con la que fue informada al cliente durante el inicio de la prueba. Si esto no coincide perfectamente, el intento de verificacion fallará sin posibilidad de recuperación. Esta técnica es muy efectiva detectando intentos de spoofing mediante pantallas LCD, Led, fotografías brillantes o cuadros que contengan vidrio, ya que estas superficies no reflejan de manera uniforme el color destellado.
Una vez aprobada la prueba de fotometría, vamos a realizar tres pruebas adicionales sobre los dos o tres mejores cuadros (mejor iluminacion, menor desenfoque, mejor centrado). En primer lugar se realiza una segmentacion semántica rápida usando BiSeNetV2. Esto nos permite detectar (y descartar) intentos de ocluir la boca, el menton, la nariz o los ojos. Podemos detectar si el usuario usa anteojos y pedirle que se los quite. Además usamos este paso para segmentar el cabello del usuario.
En segundo lugar, procesamos la misma imágen con DepthAnythingV2 y comparamos la delta de profundidad entre el rostro segmentado con su cabello incluído y el fondo de la imagen. Esta prueba permite detectar con muy alta precision intentos de spoof de personas sosteniendo una fotografía impresa ya que detecta los bordes del papel y de las pantallas y sus reflejos de iluminacion. Según que tan estricta debe ser nuestra verificacion, podemos elegir rechazar cualquier intento de verificacion que no cumpla con la profundidad de fondo suficiente. En tercer lugar, hacemos el analisis de género, edad y calculo de face embeddings usando FairFace.
En mi app social, he observado que la mayoría de la gente que intenta verificarse se encuentra relajada en su sofá o en su cama o contra una pared, y en condiciones de baja iluminación. En muchos casos la prueba de fotometría se completa correctamente, pero la falta de profundidad suficiente causará un falso rechazo. También en algunos casos FairFace no puede determinar con precision el género de la persona. Todos estos casos son candidatos a recuperacion por un LLM, el cual revisará todo el contexto, la vestimenta del usuario, el peinado, el lugar donde se encuentran, y determinará que tipo de fondo hay detrás del usuario y que tán lejos está, además que determinará el género de la persona, logrando recuperar con éxito la mayoría de intentos de verificacion. Además logra detectar con éxito los intentos de spoof que pudieran haberse filtrado en etapas anteriores.
Demás está decir que esto no fue creado como reemplazo de los sistemas biométicos bancarios, solo lo he diseñado porque necesitaba una alternativa economica porque AWS Rekognition era demasiado caro para mi caso de uso. Para una app social que no requiere analizar la identidad de la persona, cumple perfectamente como prueba de vida detectando los spoof y catfish. Como resultado pasé de pagar $15 a menos de $0.15 por cada 1000 verificaciones intentadas, eso tecnicamente sería una reduccion en 100x de costos, pero no consideré el costo del Backend que corre las verificaciones antes del LLM, ya que de todos modos ya estaba pagando por ello. No obstante es mucho más económico, dockerizable y escalable. La prueba se puede realizar en menos de 20 segundos por parte del cliente, y el backend tarda menos de 10 segundos en completar todas las pruebas. Usuario verificado en 30 segundos y a costo prácticamente nulo, con embeddings incluidos.
Se puede analizar la velocidad a la que se desplaza el centro del rostro durante el video. Si se mueve demasaiado rápido, el intento puede rechazarse por más que se hayan cumplido todas las restricciones anteriores. Se puede pedir al usuario que parpadee durante la verificacion, y se pueden analizar los landmarks del contorno de los ojos mediapipe para determinar si en algún momento de la verificacion el usuario ha parpadeado, esto permitiría detectar con mayor precision intentos de spoof. Alternativamente también podría pedirse a la persona que se aleje luego de terminar la prueba de fotometría.