Use el clasificador OpenCV Haar para detectar rostros (implementación de Python)

inserte la descripción de la imagen aquí

prefacio

La detección de rostros (Face Detection) es un campo de investigación muy popular en el campo actual de detección de objetivos. Es el núcleo del reconocimiento facial y el análisis de expresiones faciales. Este artículo presenta el uso del algoritmo clasificador Haar en OpenCV para detectar rostros en imágenes. La detección de la posición de la cara y los ojos está enmarcada y marcada por un marco rectangular.

1. Clasificador en cascada de Haar

El clasificador en cascada de Haar es un método de detección de objetos basado en la extracción de características y el aprendizaje automático. Utiliza funciones de Haar para el análisis de imágenes y genera un clasificador en cascada de varias capas para detectar objetos de destino mediante el entrenamiento de conjuntos de datos de muestra. Más comúnmente utilizado para la detección de rostros. Fue propuesto por Paul Viola y Michael Jones en 2001.

La idea básica del clasificador en cascada de Haar es construir un clasificador poderoso al combinar múltiples características simples. Estas características se basan en el concepto de características similares a las de Haar, que pueden describir eficazmente regiones locales de imágenes. La característica similar a Haar es una característica local basada en la diferencia en el brillo de la imagen, que se puede usar para distinguir entre áreas con rostro y sin rostro. Por ejemplo, una característica similar a Haar típica puede ser una región rectangular en la imagen, la parte superior izquierda de la región tiene valores de píxeles más oscuros y la parte inferior derecha tiene valores de píxeles más brillantes.

Mediante el uso de características similares a las de Haar, el clasificador en cascada de Haar puede realizar el cálculo de características en diferentes regiones de la imagen e ingresarlas en la cascada de clasificadores para su clasificación. Un clasificador en cascada consta de múltiples clasificadores débiles, cada uno de los cuales es responsable de detectar una característica específica. El clasificador en cascada filtra gradualmente las posibles regiones faciales aplicando estos clasificadores débiles en cascada y, finalmente, obtiene resultados precisos de detección de rostros.

En aplicaciones prácticas, OpenCV proporciona un modelo de clasificador en cascada de Haar preentrenado que se puede usar para la detección de rostros. Estos modelos suelen existir en forma de archivos XML y contienen parámetros de clasificador entrenados en una gran cantidad de muestras positivas y negativas. Puede usar estos modelos preentrenados para la detección de rostros sin entrenar al clasificador usted mismo.

Para usar el clasificador en cascada de Haar para la detección de rostros, debe cargar el archivo clasificador correspondiente, por ejemplo haarcascade_frontalface_default.xml, luego convertir la imagen a una imagen en escala de grises y usar detectMultiScale()la función para la detección de rostros.

En resumen, el clasificador en cascada de Haar es un método de detección de rostros basado en características similares a las de Haar, que filtra gradualmente las regiones del rostro a través de clasificadores débiles en cascada. En OpenCV, puede usar el modelo clasificador en cascada Haar preentrenado para la detección de rostros.

El clasificador en cascada de Haar tiene las siguientes ventajas:

  1. Eficiencia: mediante el uso de las características y la estructura en cascada de Haar, puede reducir rápidamente la cantidad de cálculo cuando se procesan grandes cantidades de datos.
  2. Precisión: los clasificadores en cascada de varios niveles obtenidos a partir de conjuntos de datos de entrenamiento son muy precisos.
  3. Escalabilidad: el rendimiento del modelo se puede mejorar agregando más datos de entrenamiento y parámetros de ajuste.

2. Realización de funciones

2.1 Código completo

# encoding:utf-8
import cv2
import numpy as np



# 通过numpy读取中文路径图像
def image_read_from_chinese_path(image_file_name):
    image_numpy_data = cv2.imdecode(np.fromfile(image_file_name, dtype=np.uint8), -1)
    #返回numpy的ndarray
    return image_numpy_data


# 运行之前,检查cascade文件路径是否在相应的目录下
face_cascade = cv2.CascadeClassifier('model/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('model/haarcascade_eye.xml')

# 读取图像
img = image_read_from_chinese_path('./images/test2.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转为灰度图


# 检测脸部
faces = face_cascade.detectMultiScale(gray,
                            scaleFactor=1.1,
                            minNeighbors=5,
                            minSize=(100, 100),
                            flags=cv2.CASCADE_SCALE_IMAGE)


# 标记位置
for (x, y, w, h) in faces:
    img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)

    roi_gray = gray[y: y + h, x: x + w]
    roi_color = img[y: y + h, x: x + w]

    eyes = eye_cascade.detectMultiScale(roi_gray)
    for (ex, ey, ew, eh) in eyes:
        cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 0, 255), 2)


label = f'OpenCV  Haar Detected {
      
      str(len(faces))} faces'
cv2.putText(img, label, (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 1)

cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Si los nuevos estudiantes no saben cómo configurar el entorno, puede consultar [ Tutorial de Nanny de instalación y configuración de Anaconda3 y PyCharm ] escrito por el blogger

Entre ellos, la función función image_read_from_chinese_pathes principalmente una solución para resolver el problema de que cv2 no puede leer la imagen de la ruta china. Para obtener más detalles, consulte el artículo escrito por el blogger [opencv-python[cv2] lee la imagen de la ruta china ]

2.2 Resultados de la prueba de una sola cara

inserte la descripción de la imagen aquí

2.3 Resultados de pruebas de rostros múltiples

inserte la descripción de la imagen aquí

2.4 Análisis de desventajas del clasificador en cascada de Haar

Aunque el clasificador en cascada de Haar logra buenos resultados en las tareas de detección de rostros, también tiene algunas deficiencias. Aquí hay algunas desventajas comunes:

  1. Alta complejidad computacional: la complejidad computacional del clasificador en cascada de Haar es relativamente alta, especialmente cuando se realiza la detección en imágenes más grandes. Debido a la necesidad de realizar la detección de ventana deslizante en imágenes en diferentes escalas y ubicaciones, y de aplicar múltiples clasificadores en cascada para la clasificación, consume una gran cantidad de recursos computacionales.

  2. Sensible a la iluminación y los cambios de actitud: los clasificadores en cascada de Haar son sensibles a la iluminación y los cambios de actitud. Dado que las funciones similares a las de Haar se basan en las diferencias de brillo, cuando las condiciones de iluminación de la imagen varían mucho, es posible que se degrade el rendimiento de la detección de rostros. Además, el clasificador en cascada puede fallar al detectar caras con precisión cuando las caras muestran grandes cambios de pose.

  3. Robustez deficiente: los clasificadores en cascada de Haar también son sensibles a las oclusiones y los fondos complejos. Cuando la cara está parcialmente ocluida o hay una interferencia de fondo compleja, el clasificador en cascada puede producir detecciones falsas o detecciones perdidas.

  4. Precisión de detección limitada: aunque el clasificador en cascada de Haar puede proporcionar buenos resultados de detección de rostros en general, puede ser difícil de detectar en algunos escenarios desafiantes, como imágenes de baja resolución, caras laterales o caras no frontales. Su precisión de detección puede ser limitado

  5. Requiere una gran cantidad de datos y tiempo de capacitación: la capacitación de un clasificador en cascada de Haar de alta calidad requiere una gran cantidad de datos de muestra positivos y negativos, y el proceso de capacitación es relativamente lento. Además, los parámetros de los clasificadores en cascada deben ajustarse y optimizarse cuidadosamente para lograr un buen rendimiento de detección.

A pesar de estas deficiencias, el clasificador en cascada de Haar sigue siendo un método ampliamente utilizado para la detección de rostros, especialmente en dispositivos integrados con recursos limitados o aplicaciones en tiempo real. Sin embargo, con el desarrollo de métodos de aprendizaje profundo, los algoritmos de detección de rostros basados ​​en redes neuronales convolucionales han logrado un mejor rendimiento y se han convertido en la principal tecnología actual de detección de rostros.

conclusión

Debido a la capacidad limitada de los bloggers, los métodos mencionados en este artículo inevitablemente tendrán omisiones. Espero que puedan señalar los errores con entusiasmo, para que la próxima revisión pueda presentarse a todos de una manera más perfecta y rigurosa.

Supongo que te gusta

Origin blog.csdn.net/weixin_40280870/article/details/131263736
Recomendado
Clasificación