Opencv Advanced 10-Descripción y ejemplos de principios de reconocimiento facial-cv2.CascadeClassifier.detectMultiScale()

El reconocimiento facial se refiere al proceso en el que el programa juzga la imagen facial de entrada y reconoce a la persona correspondiente. Los programas de reconocimiento facial, como nosotros los humanos, pueden saber si una persona es un familiar, un amigo o una celebridad después de "ver" una cara.

Por supuesto, para realizar el reconocimiento facial, primero es necesario determinar si un rostro aparece en la imagen actual, es decir, la detección de rostros. Sólo cuando se detecta un rostro humano en la imagen se puede determinar quién es la persona basándose en el rostro humano.

Detección de rostro

La "clasificación" ocurre cuando predecimos valores discretos. Por ejemplo, predecir si un niño se convertirá en un buen atleta depende de si se le clasifica como "buen niño" o "niño promedio". Para tareas de "dos clasificaciones" que involucran solo dos categorías, generalmente nos referimos a una de las clases como "clase positiva" (muestra positiva) y a la otra clase como "clase negativa" (clase negativa, muestra negativa).

Por ejemplo, en la detección de rostros, la tarea principal es construir un clasificador que pueda distinguir instancias que contienen rostros de aquellas que no. Estas instancias se denominan "clase positiva" (contiene imágenes de rostros) y "clase negativa" (no contiene imágenes de rostros).

Esta sección presenta el método de construcción básico del clasificador y cómo llamar al clasificador entrenado en OpenCV para realizar la detección de rostros.

Fundamental

OpenCV proporciona tres clasificadores en cascada entrenados diferentes; algunos de los conceptos involucrados se presentan brevemente a continuación.

  1. Clasificadores en cascada
    Normalmente, un clasificador necesita reconocer múltiples características de la imagen. Por ejemplo, para identificar si un animal es un perro (clase positiva) u otros animales (clase negativa), es posible que debamos juzgar en función de múltiples condiciones, lo cual es muy engorroso de comparar.
    Sin embargo, si primero comparamos cuántas patas tienen:
  • Los animales con "cuatro patas" se consideran "posiblemente perros", y los objetos dentro de este rango continúan siendo analizados y juzgados.
  • Los animales sin “cuatro patas” son directamente rechazados, es decir, no pueden ser perros.

De esta manera, solo comparando el número de patas, se puede excluir una gran cantidad de clases negativas en el conjunto de muestras (como pollos, patos, gansos y otros animales que no son perros) en función de esta característica. El clasificador en cascada se basa en esta idea, que se forma conectando en cascada varios clasificadores simples en un orden determinado.

El principio básico del clasificador en cascada se muestra en la Figura 23-1.

inserte la descripción de la imagen aquí
La ventaja del clasificador en cascada es que puede excluir instancias que obviamente no cumplen con los requisitos haciendo un juicio muy simple al principio. La clase negativa excluida en la etapa inicial ya no participará en la clasificación posterior, lo que puede mejorar en gran medida la velocidad de la clasificación posterior. Es un poco como los mensajes de texto fraudulentos que recibimos a menudo: la mayoría de las personas suelen reconocer estos mensajes de texto como fraudulentos de un vistazo y es imposible caer en ellos. Los estafadores inundan aleatoriamente mensajes de texto en los que la mayoría de las personas obviamente no se dejarán engañar y, aunque pueda parecer una tontería, alguien caerá en la trampa de todos modos. Estos mensajes de texto, después de una simple selección y filtrado desde el principio, pueden excluir a personas a las que es completamente imposible engañar. No se puede engañar a quienes no responden a los mensajes de texto, y quienes responden a los mensajes de texto son el grupo objetivo.

De esta manera, los estafadores pueden identificar y encontrar fácilmente al grupo objetivo y pueden centrarse más en "servir" a su "grupo objetivo final" (interactuando constantemente con SMS), evitando así eficazmente el contacto con el "grupo no objetivo" (sin respuesta). mensajes de texto)
se produce más contacto y se "desperdician" tiempo y energía.

OpenCV proporciona herramientas para entrenar clasificadores en cascada y también proporciona clasificadores en cascada capacitados para el posicionamiento facial, que pueden usarse como recursos listos para usar.

  1. Clasificador en cascada Haar
    OpenCV proporciona un clasificador en cascada Haar capacitado para la localización de rostros. La implementación del clasificador en cascada de Haar ha pasado por la siguiente larga historia:
  • En primer lugar, algunos académicos propusieron utilizar las funciones de Haar para la detección de rostros, pero en este momento, la complejidad computacional de las funciones de Haar es extremadamente grande y esta solución no es práctica.

  • A continuación, algunos académicos propusieron un método para simplificar las características de Haar, que facilitó la operación de detección de rostros utilizando las características de Haar, y propusieron el uso de clasificadores en cascada para mejorar la eficiencia de la clasificación.

  • Más tarde, algunos académicos propusieron un esquema similar a Haar para mejorar Haar, que definió más características para los rostros y mejoró aún más la eficiencia de la detección de rostros.

El esquema anterior se describe a continuación con un ejemplo sencillo. Supongamos que hay dos imágenes de 4×4, como se muestra en la Figura 23-2.

Para estas dos imágenes, podemos utilizar cálculos simples para determinar si están relacionadas en la dimensión de relación izquierda-derecha.

inserte la descripción de la imagen aquí
'Reste la suma de los valores de píxeles de la derecha de la suma de los valores de píxeles de la izquierda de las dos imágenes:

  • Para la imagen de la izquierda, suma (píxel izquierdo) - suma (píxel derecho) = (128+96) - (108+76) = 40
  • Para la imagen de la derecha, suma (píxel izquierdo) - suma (píxel derecho) = (47+88) - (27+68) = 40

En ambas imágenes, la "suma de los valores de píxeles de la izquierda" menos la "suma de los valores de píxeles de la derecha" es 40. Por lo tanto, se puede considerar que las dos imágenes tienen una cierta correlación en el ángulo de "la suma de los valores de píxeles de la izquierda" menos la "suma de los valores de píxeles de la derecha" .

Extendiéndolo más allá, podemos considerar las características de las imágenes desde más perspectivas. Los académicos Papageorgiou et al propusieron las características de Haar que se muestran en la Figura 23-3, estas características incluyen características verticales, características horizontales y características diagonales . Utilizaron estas funciones
para implementar la detección de peatones (detección de peatones mediante plantillas Wavelet) y la detección de rostros (un marco general para la detección de objetos).

inserte la descripción de la imagen aquí

La función Haar refleja el cambio de escala de grises de la imagen, que divide los píxeles en módulos y calcula la diferencia. La característica Haar utiliza dos tipos de cuadros rectangulares en blanco y negro para formar una plantilla de características. En la plantilla de características, la suma de píxeles del bloque de píxeles rectangular blanco se usa para restar la suma de píxeles del bloque de píxeles rectangular negro para representar la característica de la plantilla.

Después del procesamiento anterior, algunas características del rostro humano se pueden representar simplemente mediante la diferencia del marco rectangular. Por ejemplo, los ojos son más oscuros que las mejillas, los lados del puente de la nariz son más oscuros que el puente de la nariz y los labios son más oscuros que el área alrededor de los labios.

Con respecto al marco rectangular en la característica de Harr, existen tres variables como se muestra a continuación.

  • Posición rectangular: el marco rectangular debe cruzar (atravesar) toda la imagen píxel a píxel para obtener la diferencia de cada posición.
  • Tamaño del rectángulo: el tamaño del rectángulo se puede ajustar arbitrariamente según sea necesario.
  • Tipo de rectángulo: contiene diferentes tipos, como vertical, horizontal y diagonal.

Las tres variables anteriores garantizan que la información característica de la imagen se pueda obtener de forma meticulosa y completa. Sin embargo, cuanto mayor sea el número de variables, mayor será el número de características.

Por ejemplo, la cantidad de funciones en una sola ventana de detección de 24×24 se acerca a las 200.000. Esta solución no es práctica debido a la complejidad computacional a menos que a alguien se le ocurra una solución que simplifique las funciones.

Más tarde, dos académicos, Viola y Jones, propusieron un método para calcular rápidamente las características de Haar utilizando imágenes integrales en los artículos Detección rápida de objetos utilizando una cascada mejorada de características simples y detección robusta de rostros en tiempo real. Propusieron que al construir una "imagen integral", las características de Haar se pueden obtener rápidamente mediante el método de tabla de búsqueda y un número limitado de operaciones simples, lo que reduce en gran medida la cantidad de cálculo. Al mismo tiempo, en estos dos artículos, propusieron que al construir un clasificador en cascada, las imágenes de fondo no calificadas (muestras negativas) pueden descartarse rápidamente, de modo que se pueda aplicar potencia informática a objetos que puedan contener caras.

Para mejorar aún más la eficiencia, dos académicos, Lienhart y Maydt, propusieron ampliar la biblioteca de funciones de Haar en el artículo An Extended Set Of Haar-LikeFeatures For Rapid Object Inspection. Además, dividieron las características de Haar en 4 categorías como se muestra en la Figura 23-4:

  • 4 características de borde.
  • Características de 8 líneas.
  • 2 características de punto central.
  • 1 elemento diagonal.

inserte la descripción de la imagen aquí
Lienhart y Maydt piensan que en el uso real, "e" y "g" en características diagonales (ver la parte inferior de la Figura 23-4) y características de línea (ver la segunda línea de la Figura 23-4, (e) y (g) figura) son similares, por lo que generalmente no es necesario volver a calcular.
Al mismo tiempo, el artículo también proporciona el método para calcular el número de característica de Haar, el método de cálculo rápido y el método de construcción del clasificador en cascada.

Sobre la base de la investigación anterior, OpenCV implementa el uso de clasificadores en cascada de Haar para la localización de rasgos faciales. Podemos llamar directamente al clasificador de características en cascada Haar que viene con OpenCV para realizar el posicionamiento de la cara.

Uso de clasificadores en cascada.

En OpenCV
1. Característica de borde
2. Característica de línea
3. Característica de punto central
4. Característica diagonal, existen algunos clasificadores en cascada capacitados para que los utilicen los usuarios. Estos clasificadores se pueden utilizar para detectar rostros, rasgos faciales (ojos,
narices), humanos y otros objetos. Estos clasificadores en cascada se almacenan en el directorio de datos de los archivos fuente OpenCV en forma de archivos XML y se pueden detectar diferentes objetos cargando archivos XML de diferentes clasificadores en cascada.

enlace de descarga

https://github.com/opencv/opencv/tree/4.x/data/haarcascades

Los clasificadores en cascada que vienen con OpenCV se almacenan en la carpeta de datos de la carpeta raíz de OpenCV. Esta carpeta contiene tres subcarpetas: haarcascades, hogcascades y lbpcascades, que almacenan clasificadores en cascada Harr, clasificadores en cascada HOG y clasificadores en cascada LBP, respectivamente.
Entre ellos, hay más de 20 clasificadores en cascada de Harr (que seguirán aumentando con las actualizaciones de la versión), que proporcionan funciones de detección para varios objetos. Algunos clasificadores en cascada se muestran en la Tabla 23-1.

inserte la descripción de la imagen aquí

La sintaxis para cargar un clasificador en cascada es:

<CascadeClassifier object> = cv2.CascadeClassifier( filename )

donde nombre de archivo es la ruta y el nombre del clasificador.
El siguiente código es una llamada de ejemplo:

faceCascade =
cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

Tenga en cuenta al utilizar el clasificador en cascada: si instaló OpenCV usando pip en anaconda, no puede obtener directamente el archivo XML del clasificador en cascada. El archivo XML del clasificador en cascada requerido
se puede obtener de las dos maneras siguientes:

  • Después de instalar OpenCV, busque el archivo XML en la carpeta de datos en su directorio de instalación.
  • Busque el archivo XML correspondiente directamente en Internet, descárguelo y utilícelo.

De manera similar, si usa opencv_createsamples.exe y opencv_traincascade.exe, también debe usar el método anterior para obtener el archivo XML.

Introducción a la función cv2.CascadeClassifier.detectMultiScale()

En OpenCV, la detección de rostros utiliza la función cv2.CascadeClassifier.detectMultiScale(), que puede detectar
todos los rostros en la imagen. Esta función es llamada por el objeto clasificador y su formato de sintaxis es:

objetos = cv2.CascadeClassifier.detectMultiScale( imagen[,
scaleFactor[, minNeighbors[, flags[, minSize[, maxSize]]]]] )

Los significados de cada parámetro y valor de retorno en la fórmula son:

  • imagen: la imagen que se va a detectar, normalmente una imagen en escala de grises.
  • scaleFactor: indica la relación de zoom de la ventana de búsqueda en dos escaneos consecutivos.
  • minNeighbors: Indica el número mínimo de rectángulos adyacentes que constituyen el objetivo de detección. De forma predeterminada, el valor es 3, lo que significa que se considera que una cara existe sólo cuando hay más de 3 marcadores de detección. Si desea mejorar la precisión de la detección, puede configurar el valor para que sea mayor, pero al mismo tiempo, es posible que algunas caras no se detecten.
  • banderas: este parámetro generalmente se omite. Cuando se usa una versión inferior de OpenCV (versión OpenCV 1.X), se puede configurar en CV_HAAR_DO_CANNY_PRUNING, lo que significa que el detector de bordes Canny se usa para rechazar algunas áreas.
  • minSize: el tamaño mínimo del objetivo; los objetivos más pequeños que este tamaño se ignorarán.
  • maxSize: el tamaño máximo del objetivo; los objetivos mayores que este tamaño se ignorarán.
  • objetos: el valor de retorno, el grupo de vectores de marco rectangular de objetos de destino.

Ejemplo: use la función cv2.CascadeClassifier.detectMultiScale() para detectar rostros en una imagen

Imagen original:

inserte la descripción de la imagen aquí

import cv2
# 读取待检测的图像
image = cv2.imread('face\\face3.jpg')
# 获取 XML 文件,加载人脸检测器
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 色彩转换,转换为灰度图像
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
# 调用函数 detectMultiScale
faces = faceCascade.detectMultiScale(
 gray,
 scaleFactor = 1.15,
 minNeighbors = 5,
 minSize = (5,5)
)
print(faces)
# 打印输出的测试结果
print("发现{0}个人脸!".format(len(faces)))
# 逐个标注人脸
for(x,y,w,h) in faces:
  cv2.rectangle(image,(x,y),(x+w,y+w),(0,255,0),2) #矩形标注
# 显示结果
cv2.imshow("dect",image)
# 保存检测结果
cv2.imwrite("re.jpg",image)
cv2.waitKey(0)

resultado de la operación:
inserte la descripción de la imagen aquí

Al mismo tiempo, la información de ubicación específica y el número de caras detectadas se mostrarán en la consola. Los resultados específicos son los siguientes:

[[129 59 61 61]
[ 35 76 62 62]
[565 65 61 61]
[443 62 71 71]
[290 13 77 77]]
发现 5 个人脸!

Supongo que te gusta

Origin blog.csdn.net/hai411741962/article/details/132355653
Recomendado
Clasificación