recognition c++ opencv face-detection face-recognition

recognition - Cómo alinear las imágenes de la cara c++ opencv



face recognition opencv python (9)

Después de buscar todo un día un algoritmo para lograr esto, encontré " Detección de cara encontrando las características faciales y el ángulo de inclinación de la cara inclinada " por Hemlata et al. después de cambiar de Google a DuckDuckGo. Es compatible con caras que se inclinan en un ángulo mayor de 45 grados.

En cuanto a cómo implementar en código, ese es otro problema en el que estoy trabajando actualmente, pero al menos este es un punto de partida.

Estoy desarrollando una aplicación de C ++ para la autenticación facial. Primero, tengo que detectar la cara y preprocesar la imagen.

  1. Para la detección de rostros he usado el HaarCascadeClassifier. El problema es que esta herramienta o este algoritmo me da una región facial detectada por un rectángulo un poco grande que engloba el cabello y parte del fondo. ¿Hay una solución para cambiar la dimensión de este rectángulo? Utilicé "frontalfacecascaadclassifier.xml".
  2. Para el preprocesamiento de caras, quiero hacer la alineación de caras exactamente como esta técnica . ¿Cómo haría para lograr esto?

Eche un vistazo al software de análisis facial CSIRO ( sitio web y demostraciones , código fuente ), se enfrenta a la alineación, el seguimiento con 66 puntos fiduciales. Es rápido y muy preciso.


El enfoque de vanguardia para la alineación de la cara debe ser este:

Método de descenso supervisado y su aplicación para alinear la alineación X. Xiong y F. De la Torre en CVPR 2013

Es extremadamente rápido y eficaz. Puedes consultar el sitio web de su proyecto IntraFace .

Proporcionan un software fácil de usar. Sin embargo, el código de pieza principal, es decir , el método de descenso supervisado (SDM) no se libera, solo es una regresión lineal simple que se puede implementar fácilmente.

Aquí hay una demostración para mostrar que puede manejar la cara inclinada (para problemas de privacidad, agregue desenfoque y preste atención al eje en la esquina superior izquierda): https://drive.google.com/file/d/0BztytuqPViMoTG9QaEpZWi1NMGc/edit?usp=sharing


Encontrar la posición precisa de los ojos en una imagen dada está lejos de ser trivial. Las cascadas de Haar para encontrar los ojos en OpenCV producen demasiados falsos positivos para ser útiles, además, este enfoque no será robusto a la rotación de la imagen (aunque puede compensar una ligera rotación, no conozco las imágenes de entrenamiento). Si yo fuera usted, comenzaría una búsqueda exhaustiva en http://scholar.google.com para obtener los documentos relevantes de esta área de investigación.

Necesitará una estimación robusta de la postura de la cabeza para alinear las imágenes de la cara. Hice un poco de investigación y creo que compartir algoritmos y códigos es útil aquí. Los enfoques más interesantes que he visto son:


Entonces, ¿no puede usar otro clasificador Haar para encontrar cada ojo (los ojos son muy fáciles de encontrar) y luego suponiendo que la persona tiene dos ojos y definimos una cara "nivelada" para indicar que los ojos están horizontales?

Simplemente mida el ángulo entre los dos ojos y gire la imagen en ese ángulo.

angle = atan ( eye1.Y - eye2.Y ) / (eye1.X - eye2.X )


Intenté el siguiente código de alineación de caras de la página del proyecto Caras etiquetadas en el comodín. Funciona realmente bien y no requiere la detección de puntos de rasgos faciales. El código de C ++ se puede descargar de: http://vis-www.cs.umass.edu/faceAlignment/

Si aún desea encontrar puntos clave, encuentro que el detector Viola-Jones no es muy robusto y preciso. Personalmente recomiendo usar el detector de punto clave de cara de Flandmark: http://cmp.felk.cvut.cz/~uricamic/flandmark/ que es mucho más robusto y preciso. El código C se puede descargar desde el sitio anterior.


La detección de caras desalineadas dificulta el reconocimiento facial. A veces desea corregir la alineación, a veces es suficiente excluir las que no están alineadas correctamente (por ejemplo, si está detectando rostros en un flujo de video). Tomé este último enfoque y entrené una cascada especial de Haar para detectar solo caras correctamente alineadas y bien iluminadas. Más detalles aquí: http://rwoodley.org/?p=417 .

Si usas mi cascada, hazme saber cómo funciona para ti. Tengo curiosidad por los resultados que otros obtendrían. Cumplió mis necesidades.



Para la autenticación facial, puede usar dlib o face_recognition para hacer esto, lo cual es muy conveniente y más preciso que ahora está abierto.

En cuanto a dlib, la alineación de caras se puede encontrar aquí (código C ++) http://dlib.net/face_alignment.py.html

o aquí (código de Python) https://www.pyimagesearch.com/2017/05/22/face-alignment-with-opencv-and-python/ .

El documento de algoritmo denominado Alineación de caras a 3000 FPS mediante Regresión de características binarias locales se realiza mediante dlib.