La detección de rostros es un tema muy popular con una amplia gama de aplicaciones. Los teléfonos inteligentes, por ejemplo, de hoy en día vienen con software de detección de rostros incorporado, que puede autentificar la identidad del usuario. Existen numerosas aplicaciones que pueden capturar, detectar y procesar una cara en tiempo real, pueden identificar la edad y el género del usuario y también pueden aplicar algunos filtros realmente geniales. La lista no se limita a estas aplicaciones móviles, ya que la detección de rostros también tiene una amplia gama de aplicaciones en vigilancia, seguridad y biometría.
Es un algoritmo de detección de objetos que se utiliza para identificar rostros en una imagen o un vídeo en tiempo real . El algoritmo utiliza funciones de detección de bordes o líneas propuestas por Viola y Jones en su trabajo de investigación "Detección rápida de objetos usando una cascada potenciada de funciones simples" publicado en 2001. El algoritmo recibe muchas imágenes positivas que consisten en rostros y muchas imágenes negativas que no constan de ningún rostro para entrenar sobre ellas. El modelo creado a partir de esta capacitación está disponible en el repositorio de OpenCV GitHub https://github.com/opencv/opencv/tree/master/data/haarcascades .
El repositorio tiene los modelos almacenados en archivos XML y se pueden leer con los métodos OpenCV. Estos incluyen modelos para detección de rostros, detección de ojos, detección de la parte superior e inferior del cuerpo, detección de matrículas, etc.
Debido a su antigüedad muchos algoritmos actuales son más precisos que las cascadas de Haar (como por ejemplo YOLO), pero siguen siendo relevantes y útiles en la actualidad.
Uno de los principales beneficios de las cascadas de Haar es que son tan rápidas que es difícil superar su velocidad. La desventaja de las cascadas de Haar es que tienden a ser propensas a detecciones de falsos positivos y, en general, no son tan precisas como los algoritmos más "modernos" que tenemos hoy.
A partir del minuto 1:35 del vídeo, después de la introducción, Gaby nos habla de la extracción de características de las imágenes, comentando que se aplica un algoritmo que utiliza elementos parecidos a las "ondículas de Haar" (un proceso matemático que no necesitamos entender) para discriminar zonas de las imágenes y detectar aquello para lo que se las ha entrenado. De forma muy básica es como si le pasáramos unos filtros matemáticos a las imágenes con unos patrones preestablecidos que según la publicación de Viola y Jones, antes comentada son los que aparecen a la derecha y que gracias a las características de las imágenes facilitan la búsqueda de los bordes o las líneas dentro de la misma, o detecta zonas donde hay un cambio repentino en la intensidad de los píxeles.
Para entender de forma muy básica este proceso matemático es conveniente ver este video, que si bien en su fondo no está relacionado, (ya que el objetivo es explicar la necesidad de las redes neuronales convolucionales) nos permite conocer como se aplica el proceso matemático de las funciones de Haar a las imágenes.
Tras ver el vídeo podremos entender esto algo mejor. Aquí se muestra un ejemplo de cálculo del valor de Haar a partir de una sección de imagen rectangular. Las áreas más oscuras en la característica haar son píxeles con valores 1 y las áreas más claras son píxeles con valores 0. Cada uno de estos es responsable de encontrar una característica particular en la imagen. Como un borde, una línea o cualquier estructura en la imagen donde hay un cambio repentino de intensidades. por ej. en la imagen de arriba, la función haar puede detectar un borde vertical con píxeles más oscuros a la derecha y píxeles más claros a la izquierda.
El objetivo aquí es averiguar la suma de todos los píxeles de la imagen que se encuentran en el área más oscura de la función haar y la suma de todos los píxeles de la imagen que se encuentran en el área más clara de la función haar. Y luego descubre su diferencia. Ahora, si la imagen tiene un borde que separa los píxeles oscuros a la derecha y los píxeles claros a la izquierda, entonces el valor de haar estará más cerca de 1. Eso significa que podemos decir que hay un borde detectado si el valor de haar está más cerca de 1. En el ejemplo anterior, no hay borde ya que el valor haar está lejos de 1.
En principio este proceso matemático se aplicaría a la imagen, tal como lo vemos en la imagen de abajo a la izquierda, para cada una de las funciones Haar (de las cuales antes expusimos una pequeña muestra en una imagen). Este proceso aplicado de esta forma tan lineal, sería poco operativo por la cantidad de cálculos a realizar, por tanto, y aquí viene la parte de las cascadas se agrupan las funciones en diferentes etapas de clasificadores y se aplican una por una a la imagen dividida en regiones. (Normalmente, las primeras etapas contendrán una cantidad muy pequeña de funciones). Si una ventana falla en la primera etapa, esta se descarta no sometiendo esa zona al resto de las funciones. No consideramos las características restantes en él. Si se pasa la primera etapa, aplicaríamos la segunda etapa de características y así, continuaría el proceso. La ventana que pasa todas las etapas es una región de la cara.
fuentes para elaborar esta página:
¿CÓMO USAMOS ESTO?
El proceso para enmarcar rostros, cuerpos, sonrisas, etc., dentro de una imagen consta de varios pasos.
Cargar el clasificador HaarCascades (cv2.CascadeClassifier ()) que nos interese (rostro, cuerpo entero, sonrisa, labios, etc...)
Cargar la imagen sobre la que vamos a trabajar.
Pasar la imagen a escala de grises.
Aplicar el módulo detectMultiScale () del clasificador que hemos cargado previamente. Este nos devolverá las coordenadas que marcan los rostros, por ejemplo, de la imagen en escala de grises.
Aplicar la el módulo cv2.rectangle () para dibujar sobre la imagen en escala de grises, los rectángulos con las características elegidas, usando las coordenadas que nos ha devuelto el módulo detecMultiScale () al aplicarlo previamente
Veamos esto con más detalle, analizando la sintaxis y los parámetros de las funciones utilizadas:
CascadeClassifier () es un clasificador entrenado en OpenCV que podemos llamar y nos haga el trabajo de detección de una característica concreta. Este clasificador contiene distintas especializaciones que nos pueden permitir identificar distintos rasgos como son los rostros (haarcascade_frontalface), los ojos (haarcascade_eye), la sonrisa (haarcascade_smile), cuerpo entero (haarcascade_fullbody) y varios más que podemos ver en esta web : https://github.com/opencv/opencv/tree/master/data/haarcascades.
La sintaxis del clasificador cv2.CascadeClassifier () es : (Podemos encontrar información exhaustiva aquí. )
Sintaxis:
face_cascade = cv2.CascadeClassifier('filename')
Parámetros:
filename --> ubicación del archivo con la herramienta entrenada (haarcascade_frontalface, haarcascade_eye, haarcascade_smile, etc)
A continuación, y una vez cargada la imagen con la que vamos a trabajar y la hemos pasado a escala de grises, deberemos usar un módulo del clasificador CascadeClassifier denominado detecMultiScale, que nos detectará la característica buscada (por ejemplo un rostro) de una imagen en base a unos parámetros de tamaño de búsqueda y nos devolverá los puntos delimitadores que marcan el objeto, por ejemplo el rostro, dentro de la imagen en escala de grises. Para ello se deben especificar algunos argumentos que veremos a continuación .
Sintaxis:
face = face_cascade.detectMultiScale(image,scaleFactor,minNeighbors,minSize,maxSize)
Argumentos:
image --> Es la imagen en donde va a actuar el detector de rostros.
scaleFactor --> Este parámetro especifica que tanto va a ser reducida la imagen.
minNeighbors --> Este parámetro especifica cuántos vecinos debe tener cada rectángulo candidato para retenerlo.
minSize --> Este parámetro indica el tamaño mínimo posible del objeto. Objetos más pequeños son ignorados.
maxSize --> Este parámetro indica el tamaño máximo posible del objeto. Objetos más grandes son ignorados.
Más detallada información:
https://omes-va.com/deteccion-de-rostros-con-haar-cascades-python-opencv/
https://docs.opencv.org/2.4/modules/objdetect/doc/cascade_classification.html
https://docs.opencv.org/3.4/db/d28/tutorial_cascade_classifier.html
En tercer lugar mediante la función cv2.rectangle () (que explicamos en la página Básico 4) enmarcamos los rostros detectados utilizando los puntos límite devueltos por detectMultiScale ().
El proceso de creación en Google Colab del código Python de la aplicación será:
El resultado de ejecutar el código:
PRÁCTICA INTERMEDIO 2 - DETECCIÓN DE ROSTROS Fichero de la práctica
Descarga la imagen person.jpg y el fichero haarcascade_frontalface.xml y replica lo explicado anteriormente.
Actuando sobre los parámetros de las funciones detectMultiScale () y rectangle (), obtén un resultado similar al mostrado en la imagen de la derecha. Observa que ha cambiado el color y grosor del cuadrado principal y que ha aparecido otro cuadrado más pequeño. Esto que vemos es un error en el ajuste de parámetros busca un valor que haga aparecer algo parecido a lo mostrado.
Descarga la imagen grupo.jpg y juega con los parámetros para conseguir un resultado aproximado a lo mostrado en la imagen de abajo. Verás que existen varios rostros sin detectar en dicha imagen, intenta que tu algoritmo detecte alguno de los que no están recuadrados.
Verás, en esta imagen de más abajo, que hay algunos rostros nuevos detectados.