En este artículo vamos a ver cómo detectar rostros utilizando un clasificador en cascada en OpenCV Python. La detección de rostros tiene mucha importancia en diferentes campos del mundo actual. Es un paso significativo en varias aplicaciones, reconocimiento facial (también utilizado como biometría), fotografía (para autoenfoque en el rostro), análisis facial (edad, género, reconocimiento de emociones), videovigilancia, etc.
Uno de los algoritmos populares para la detección facial es «haarcascade». Es computacionalmente menos costoso, un algoritmo rápido y brinda una alta precisión.
El archivo Haarcascade se puede descargar desde aquí: haarcascade_frontalface_default.xml
Funciona en cuatro etapas:
- Selección de características de Haar : una característica similar a Haar consta de regiones oscuras y regiones claras. Produce un solo valor tomando la diferencia de la suma de las intensidades de las regiones oscuras y la suma de las intensidades de las regiones claras. Se realiza para extraer elementos útiles necesarios para la identificación de un objeto. Las características propuestas por viola y jones son:
- Creación de imágenes integrales : un píxel dado en la imagen integral es la suma de todos los píxeles de la izquierda y todos los píxeles de arriba. Dado que el proceso de extracción de características similares a las de Haar implica calcular la diferencia de las regiones rectangulares claras y oscuras, la introducción de imágenes integrales reduce significativamente el tiempo necesario para completar esta tarea.
- Entrenamiento AdaBoost : este algoritmo selecciona las mejores funciones de todas las funciones. Combina múltiples «clasificadores débiles» (mejores características) en un «clasificador fuerte». El «clasificador fuerte» generado es básicamente la combinación lineal de todos los «clasificadores débiles».
- Clasificador en cascada : es un método para combinar clasificadores cada vez más complejos como AdaBoost en una cascada que permite descartar rápidamente entradas negativas (no faciales) mientras gasta más cómputo en regiones prometedoras o positivas similares a rostros. Reduce significativamente el tiempo de cálculo y hace que el proceso sea más eficiente.
OpenCV viene con muchos clasificadores pre-entrenados. Esos archivos XML se pueden cargar mediante el método cascadeClassifier del módulo cv2. Aquí vamos a utilizar haarcascade_frontalface_default.xml para detectar rostros.
Implementación paso a paso:
Paso 1: Cargando la imagen
Python
img = cv2.imread('Photos/cric.jpg')
Paso 2: Convertir la imagen a escala de grises
Inicialmente, la imagen es una imagen de tres capas (es decir, RGB), por lo que se convierte en una imagen de una capa (es decir, en escala de grises).
Python
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Paso 3: Cargar el archivo clasificador XML haar-cascade requerido
El método CascadeClassifier en el módulo cv2 admite la carga de archivos XML haar-cascade. Aquí, necesitamos «haarcascade_frontalface_default.xml» para la detección de rostros.
Python
haar_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
Paso 4: Aplicar el método de detección de rostros en la imagen en escala de grises
Esto se hace usando el método cv2::CascadeClassifier::detectMultiScale, que devuelve rectángulos de límite para las caras detectadas (es decir, x, y, w, h). Toma dos parámetros, a saber, scaleFactor y minNeighbors. ScaleFactor determina el factor de aumento en el tamaño de la ventana que inicialmente comienza en el tamaño «minSize» y, después de probar todas las ventanas de ese tamaño, la ventana se amplía con el «scaleFactor» y el tamaño de la ventana sube a «maxSize». Si el «factor de escala» es grande (por ejemplo, 2,0), habrá menos pasos, por lo que la detección será más rápida, pero es posible que pasemos por alto objetos cuyo tamaño se encuentre entre dos escalas probadas. (el factor de escala predeterminado es 1,3). Cuanto más altos sean los valores de los “minNeighbors”, menor será el número de falsos positivos, y menor será el error en términos de falsa detección de rostros. Sin embargo, también existe la posibilidad de perder algunos rastros faciales poco claros.
Python
faces_rect = haar_cascade.detectMultiScale( gray, scaleFactor=1.1, minNeighbors=9)
Paso 5: Iterando a través de rectángulos de caras detectadas
Los rectángulos se dibujan alrededor de las caras detectadas mediante el método de rectángulo del módulo cv2 iterando sobre todas las caras detectadas.
Python
for (x, y, w, h) in faces_rect: cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), thickness=2) cv2.imshow('Detected faces', img) cv2.waitKey(0)
A continuación se muestra la implementación:
Python
# Importing OpenCV package import cv2 # Reading the image img = cv2.imread('Photos/cric4.jpg') # Converting image to grayscale gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Loading the required haar-cascade xml classifier file haar_cascade = cv2.CascadeClassifier('Haarcascade_frontalface_default.xml') # Applying the face detection method on the grayscale image faces_rect = haar_cascade.detectMultiScale(gray_img, 1.1, 9) # Iterating through rectangles of detected faces for (x, y, w, h) in faces_rect: cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) cv2.imshow('Detected faces', img) cv2.waitKey(0)
Producción: