Detección de rostros usando Cascade Classifier usando OpenCV-Python

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:

Publicación traducida automáticamente

Artículo escrito por sachin801 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *