Detección de caras en imágenes

A la hora de realizar detección de caras en imágenes existen varios métodos que arrojan resultados satisfactorios. Algunos de los más conocidos son: Clasificadores Haar en Cascada, Histograma de Gradientes Orientados, entre otros.

En este proyecto se decidió trabajar con Histograma de Gradientes Orientados (HOG por su sigla en inglés), ya que la función de OpenCV que implementa Clasificadores Haar en Cascada (cv2.detectMultiScale) es muy sensible a sus parámetros de entrada, arrojando falsos positivos si no se ajustan los parámetros correctamente, pero este ajuste podría ser distinto entre imagen e imagen, y como el objetivo del proyecto es procesar un video entonces de optó por trabajar con HOG.

HOG

Un esquema simplificado del funcionamiento del algoritmo se puede ver en la siguiente imagen:

El funcionamiento del algoritmo a grandes rasgos se puede explicar de la siguiente manera. A partir de una cantidad de imágenes de prueba debidamente etiquetadas, se procedió a deslizar ventanas de izquierda a derecha y de arriba hacia abajo, con diferentes escalas, y para cada ventana (en cada posición y para cada escala) se extrajeron descriptores HOG. Con ese conjunto de descriptores y las correctas etiquetas de las imágenes de prueba se procedió a entrenar un clasificador SVM. Una vez realizado esto se le pasaron nuevas imágenes, también debidamente etiquetadas, con el fin de testear el funcionamiento. 

Un ejemplo del detectado de caras con este método se puede observar en la siguiente imagen.

Detección de landmarks en caras

Los landmarks son básicamente puntos de interés de un objeto que se quieren detectar. A partir de estos landmarks se pueden detectar regiones en las caras, las cuales generalmente son: ojos, cejas, boca, nariz y mentón. Para la detección de estos landmarks lo que se tiene generalmente es una región donde se encuentra un objeto, es por esto que en la sección anterior se implemento el detectado de caras, porque los rectángulos que delimitan las caras son una entrada para la detección de landmarks.

La detección de los landmarks con la librería dlib, utiliza básicamente un detector de landmarks previamente enterando a partir del cual se obtienen 68 puntos que mapean la estructura facial en la cara de la imagen. Los indicies de estos puntos se puede apreciar en la siguiente imagen.

Donde los puntos 1-17 corresponden al mentón, 18-22 a la ceja izquierda, 23-27 a la ceja derecha, 28-36 a la nariz, 37-42 al ojo izquierdo, 43-48 al ojo derecho y 49-68 a la boca.

En la siguiente imagen se puede observar la correcta detección de estos landmarks.

Para apreciar mejor los landmarks detectados también se realizo sobre otra imagen.

En ambas imágenes se puede apreciar el correcto detectado de los landmarks.

Detección de gestos faciales

Una vez que se pueden localizar rostros y sus respectivos landmarks, es que se puede empezar a detectar gestos faciales. Se pueden detectar una gran variedad de gestos, pero durante este proyecto se decidió detectar 4 tipos de gestos distintos:

  • Abrir y cerrar los ojos
  • Abrir y cerrar la boca
  • Inclinar la cabeza hacia la izquierda
  • Inclinar la cabeza hacia la derecha

Para poder realizar la detección de estos mismos lo que se hizo fue trabajar con los distintos landmarks detectados, y desarrollar un método para cada uno.

Abrir y cerrar los ojos

Para la detección de este gestos se utilizaron los landmarks 37-42 para el ojo izquierdo y 43-48 para el ojo derecho. A partir de estos puntos los que se hizo fue calcular el Eye Aspect Ratio (EAR) de la siguiente forma:

Donde los puntos corresponden a los puntos de los ojos de la siguiente forma:

Esta cuenta fue propuesta por Soukupová and Čech en uno de sus papers (ver referencias) y se puede observar que mientras el ojo se encuentra abierto este término se mantiene relativamente constante, pero cuando el ojo se cierra baja su valor rápidamente.

Como lo que se quiere es que se detecten cuando ambos ojos se cierran y se abren, es por esto que este término se calcula para ambos ojos y luego se realiza un promedio de ambos, con lo cual mientas ambos ojos estén abiertos el término debería mantenerse constante y cuando ambos se cierran el término baja.

La detección de este gesto se realizo con una umbralización, cuando el coeficiente EAR baja por debajo de un cierto umbral que se fijo experimentalmente entonces consideramos que el ojo esta cerrado. A su vez es necesario darle un poco de robustez al algoritmo, es por esto que se considero que para detectar cuando una persona abrió y cerro los ojos era necesario que se mantuvieran los ojos cerrados durante una cierta cantidad de frames, lo cual se dejo como una variable que se puede cambiar dependiendo de la aplicación.

Abrir y cerrar la boca

El proceso para la detección de este gesto es bastante similar al anterior, solo que a diferencia de los ojos en la boca hay varios landmarks más. Sin embargo en este proyecto se decidió trabajar con un subconjunto de estos landmarks y realizar la misma cuenta que el EAR, ahora denominado MAR (Mouth Aspect Ratio) utilizando los puntos que se observan en la siguiente imagen:

Esos puntos corresponden con los puntos 49,51,53,55,57,59 de los landmarks encontrados para la boca. La detección de cuando se abre y cierra la boca es análoga que para los ojos, con la diferencia de que ahora el MAR se mantiene relativamente constante cuando la boca esta cerrada y aumenta cuando ésta se abre, por lo cual la detección se realiza cuando el MAR pasa por encima de un umbral, no por debajo como era el caso del EAR.

Inclinación de la cabeza

Ver la inclinación de la cabeza requirió de un procedimiento distinto y se trabajo principalmente con landmarks de la nariz, más específicamente con el 32 y el 36 los cuales marcan los extremos horizontales de la nariz. A partir de estos se calculó la pendiente de la recta que los une de la siguiente forma:

Siendo las coordenadas (x2,y2) las correspondientes al punto 36 y las coordenadas (x1,y1) las del punto 32. Una vez calculada esa pendiente es posible saber el ángulo que forma con la horizontal de la siguiente forma:

Entonces una vez detectado este ángulo se puede saber la inclinación de la cabeza, si el angulo es positivo entonces quiere decir que se esta inclinando la cabeza hacia la izquierda y por el contrario si el angulo es negativo entonces se esta inclinando la cabeza hacia la derecha. También para ser mas robustos a errores o ruido, fue que no se utilizó como umbral el ángulo cero, sino que se dejó como una variable a ajustar dependiendo de la aplicación.

Juan Llaguno, jllaguno@fing.edu.uy
Creado con Webnode
¡Crea tu página web gratis! Esta página web fue creada con Webnode. Crea tu propia web gratis hoy mismo! Comenzar