¿Alguna vez te has preguntado cómo Snapchat aplica con precisión varios filtros en tu rostro? ¿Su teléfono inteligente está haciendo magia cuando se desbloquea usando sus rasgos faciales? No, solo estás viendo la detección de rostros en acción.

La detección de rostros es una tecnología de inteligencia artificial que puede identificar rostros humanos en una imagen o video digital. Descubra cómo puede crear un programa de detección de rostros en tiempo real en menos de 25 líneas de código con el legendario algoritmo Haar Cascade.

¿Qué es la cascada Haar?

Haar Cascade es un algoritmo de detección de objetos presentado por Paul Viola y Michael Jones para detectar rostros en imágenes o videos. Se entrena una función en cascada usando muchas imágenes positivas y negativas que luego se pueden usar para identificar cualquier objeto o cara en otros medios. Estos archivos entrenados están disponibles en el Repositorio OpenCV GitHub.

Usando un enfoque de ventana deslizante, una ventana de un tamaño fijo itera sobre una imagen de izquierda a derecha, de arriba a abajo. En cada fase, la ventana se detiene y clasifica si el área contiene una cara o no.

instagram viewer

OpenCV, una herramienta de visión por computadora, funciona con un modelo Haar Cascade preentrenado para clasificar las características. Cada fase comprueba cinco entidades: dos entidades de borde, dos entidades de línea y una entidad de cuatro rectángulos.

En la observación, el área de los ojos parece más oscura que el área de las mejillas, mientras que el área de la nariz se ve más brillante que el área de los ojos. Puede visualizar estas características de la siguiente manera.

Utilizando estas funciones y el cálculo de píxeles, el algoritmo identifica más de 100.000 puntos de datos. Luego puede usar un algoritmo Adaboost para mejorar la precisión y descartar características irrelevantes. Durante muchas iteraciones, este enfoque minimiza la tasa de error y aumenta el peso de la característica hasta que logra una precisión aceptable.

Sin embargo, la técnica de la ventana deslizante se detiene si un caso de prueba en particular falla y es computacionalmente costoso. Para solucionar esto, se puede aplicar el concepto de la Cascada de Clasificadores. En lugar de aplicar todas las funciones en una sola ventana, este enfoque las agrupa y las aplica por etapas.

Si la ventana falla en la primera etapa, el proceso la descarta, de lo contrario continúa. Esto conduce a una disminución drástica en la cantidad de operaciones a realizar y hace que sea viable su uso para aplicaciones en tiempo real.

Flujo de trabajo de detección de rostros

Siga este algoritmo para construir su programa de detección de rostros:

  1. Cargue el algoritmo de cara frontal en cascada de Haar.
  2. Inicialice la cámara.
  3. Leer fotogramas de la cámara.
  4. Convierte imágenes en color a escala de grises.
  5. Obtenga las coordenadas de la cara.
  6. Dibuja un rectángulo y pon el mensaje apropiado.
  7. Muestre la salida.

¿Qué es OpenCV?

OpenCV es una biblioteca de aprendizaje automático y visión artificial de código abierto. Cuenta con más de 2.500 algoritmos optimizados para diversas aplicaciones. Estos incluyen detección de rostros/objetos, reconocimiento, clasificación y muchos más.

Privacidad de sus datos faciales es una preocupación aparte. Cientos de empresas destacadas como Google, IBM y Yahoo utilizan OpenCV en sus aplicaciones. Algunas personas que pretenden mantener la privacidad de sus datos han demostrado hay formas de evitar el reconocimiento facial.

Para instalar OpenCV en Python, use el comando:

pepita instalar opencv-python

Cómo construir un programa de detección de rostros usando Python

Siga estos pasos para construir el detector de rostros:

Este código de ejemplo, junto con el archivo del algoritmo Haar Cascade, está disponible en un repositorio GitHub y es gratis para su uso bajo la Licencia MIT.

  1. Descargar el XML predeterminado de cara frontal en cascada de Haar y colóquelo en la misma ubicación que su programa Python.
  2. Importe la biblioteca OpenCV.
    # importando las bibliotecas requeridas
    importar cv2
  3. Guarde el archivo de algoritmo de la cara frontal en cascada de Haar para facilitar la referencia.
    # cargando el archivo del algoritmo haar case en la variable alg
    alg = "haarcascade_frontalface_default.xml"
  4. Utilice la clase CascadeClassifier para cargar un archivo XML en OpenCV.
    # pasar el algoritmo a OpenCV
    haar_cascade = cv2.CascadeClassifier (alg)
  5. Captura el video de la cámara. Pasar 0 a la Captura de video() función para usar su cámara principal. Si ha conectado una cámara externa, puede usar los números sucesivos 1, 2, etc. para usarla en su lugar.
    # capturar el video de la cámara
    cámara = cv2.VideoCapture (0)
  6. Configure un bucle infinito para leer la entrada de la cámara cuadro por cuadro. El leer() La función devuelve dos parámetros. El primer valor es de tipo booleano indicando si la operación es exitosa o no. El segundo parámetro contiene el marco real con el que va a trabajar. Guarde este marco en el imagen variable.
    mientrasVerdadero:
    _, img = cámara.leer()
  7. Configure el texto predeterminado para que aparezca como Cara no detectada. Cuando se detecte, actualice el valor de esta variable.
     texto = "Cara no detectada"
  8. La entrada recibida del mundo real es colorida, en formato BGR. BGR significa azul, verde y rojo. Esto crea una gran cantidad de procesamiento para las aplicaciones de visión artificial. Para reducir esto, utilice un formato de escala de grises.
    # convertir cada fotograma de BGR a escala de grises
    grisImg = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY)
    Pase el marco y el formato del código de conversión, COLOR_BGR2GRAY, a cvtColor() para cambiar cada cuadro del video de color a escala de grises.
  9. Usar detectarMultiEscala() para detectar rostros. Este método toma tres parámetros como entrada. Primero está la imagen de origen, grisImg. El segundo parámetro es el factor de escala. Esto especifica cuánto tiene que reducir el tamaño de la imagen en cada escala de imagen. Utilice el valor predeterminado 1,3 como factor de escala. Cuanto mayor sea el factor de escala, menos pasos y más rápida la ejecución. Sin embargo, también hay una mayor probabilidad de que falten caras. El tercer parámetro es minNeighbors. Esto especifica cuántos vecinos debe tener cada rectángulo candidato para conservarlo. Cuanto mayor sea el valor, menor será la posibilidad de un falso positivo, pero también significa perderse rastros faciales poco claros.
    # detectar rostros usando Haar Cascade 
    cara = haar_cascade.detectMultiScale (grayImg, 1.3, 4)
  10. Cuando detectas una cara, obtienes cuatro coordenadas. x representa la coordenada x, y representa la coordenada y, w representa el ancho y h representa la altura. Actualizar el texto a Cara detectada y dibuja un rectángulo usando estas coordenadas. El color del rectángulo es de formato verde (BGR) con un grosor de dos píxeles.
    # dibuje un rectángulo alrededor de la cara y actualice el texto a Face Detected
    para (x, y, w, h) en cara:
    texto = "Cara detectada"
    cv2.rectángulo(imagen, (X, y), (X + w, y + h), (0, 255, 0), 2)
  11. Imprima opcionalmente el texto en la consola de salida. Muestre el texto en la pantalla usando el marco capturado como fuente, texto como se obtuvo en el texto anterior, fuente estilo de FONT_HERSHEY_SIMPLEX, factor de escala de fuente de 1, color azul, grosor de dos píxeles y tipo de línea de AA.
    # mostrar el texto en la imagen
    imprimir(texto)
    imagen = cv2.putText (img, texto, (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2, cv2.LINE_AA)
  12. Mostrar la ventana con el título Detección de rostro y la imagen Utilizar el tecla de espera() método para mostrar la ventana durante 10 milisegundos y comprobar si se ha pulsado una tecla. Si un usuario presiona el Esc (Valor ASCII 27), salga del bucle.
    # mostrar la ventana de salida y presionar la tecla escape para salir
    cv2.imshow("Detección de rostro", imagen)
    clave = cv2.esperaClave (10)

    si clave == 27:
    romper

  13. Finalmente, suelte el objeto de la cámara del programa python y cierre todas las ventanas.
    leva.liberar()
    cv2.destroyAllWindows()

Detección de rostros usando Python en acción

Cuando una cara está a la vista, debería ver un resultado como este:

Cuando no haya ningún rostro presente, verá un mensaje como este:

Limitaciones de la detección de rostros mediante el algoritmo de cascada de Haar

Si bien este algoritmo es liviano, con un tamaño de modelo pequeño y funciona rápido, existen algunas limitaciones:

  • En un video en tiempo real, la cara debe estar en la línea de visión de la cámara. Si la cara está demasiado lejos, demasiado cerca o demasiado inclinada, el algoritmo no detecta las características.
  • Es un algoritmo de cara frontal, por lo que no puede detectar vistas laterales.
  • Altos resultados falsos positivos. A menudo detecta áreas como rostros aunque no haya ningún rostro presente.
  • Necesita tener condiciones óptimas de iluminación. La iluminación excesiva o tenue dificulta la precisión del algoritmo.

Las muchas aplicaciones de la detección de rostros

La detección de rostros tiene una amplia gama de aplicaciones en el mundo actual. Puede usarlo para el reconocimiento facial en teléfonos inteligentes, hogares, vehículos y puntos de control de inmigración. La detección facial ya es común en vigilancia por CCTV, filtros de redes sociales y seguimiento automático de rostros en cinematografía.

Es solo el comienzo de esta maravillosa tecnología. Con los avances, podríamos identificar a los niños desaparecidos, atrapar a los delincuentes y prevenir delitos como el robo de identidad.