Implementación del reconocimiento facial mediante descriptores locales (aprendizaje no supervisado)

Estoy tratando de implementar un algoritmo de reconocimiento facial con Python. Quiero poder recibir un directorio de imágenes y calcular distancias por pares entre ellas, cuandoEsperemos que distancias cortas correspondan a las imágenes que pertenecen a la misma persona. El objetivo final es agrupar imágenes y realizar algunas tareas básicas de identificación de rostros (aprendizaje no supervisado).

Debido a la configuración no supervisada, mi enfoque del problema es calcular un"firma de la cara" (un vector en R ^ d para algún int d) y luego calcula una métrica en la que dos caras que pertenecen a la misma persona tendrán una corta distancia entre ellas.

Tengo un algoritmo de detección de rostros que detecta el rostro, recorta la imagen y realiza un preprocesamiento básico, por lo que las imágenes que estoy alimentando al algoritmo son grises y ecualizadas (ver a continuación).

Para la parte de "firma facial", probé dos enfoques sobre los que leí en varias publicaciones:

Tomando el histograma de laLBP (Patrón binario local) de toda la imagen (procesada)CalculadorTAMIZAR descriptores en 7 puntos de referencia faciales (derecha de boca, izquierda de boca, etc.), que identifico por imagen usando una aplicación externa. La firma es la concatenación de la raíz cuadrada de los descriptores (esto da como resultado una dimensión mucho más alta, pero por ahora el rendimiento no es un problema).

Para la comparación de dos firmas, estoy usando la función compareHist de OpenCV (veraquí), probando varias métricas de distancia diferentes (Chi Square, Euclidean, etc.).

Sé que el reconocimiento facial es una tarea difícil, y mucho menos sin ningún tipo de capacitación, por lo que no espero grandes resultados. Pero todo lo que estoy llegando hasta ahora parececompletamente al azar Por ejemplo, cuando calculo distancias desde la imagen en el extremo derecho contra el resto de la imagen, obtengo que es más parecida a 4 Bill Clintons (...!).

He leído enesta gran presentación que es popular para llevar a cabo una"aprendizaje métrico" procedimiento en un conjunto de prueba, que debería mejorar significativamente los resultados. Sin embargo, sí dice en la presentación y en otros lugares que las medidas de distancia "regulares" también deberían obtener buenos resultados, así que antes de probar esto quiero entender por qué lo que estoy haciendo no me da nada.

En conclusión, mis preguntas, sobre las que me encantaría obtener cualquier tipo de ayuda:

Una mejora que pensé sería realizar LBP solo en la cara real, y no en las esquinas y todo lo que pueda insertar ruido en la firma. ¿Cómo puedo enmascarar las partes que no son la cara antes de calcular LBP? Estoy usando OpenCV para esta parte también.

Soy bastante nuevo en visión artificial; ¿Cómo voy a "depurar" mi algoritmo para averiguar dónde van las cosas mal? es posible?

En el entorno no supervisado, ¿hay algún otro enfoque (que no sean descriptores locales + distancias de cálculo) que pueda funcionar para la tarea de agrupar caras?

¿Hay algo más en el módulo OpenCV que tal vez no haya pensado que pueda ser útil? Parece que todos los algoritmos allí requieren entrenamiento y no son útiles en mi caso: el algoritmo debe funcionar en imágenes que son completamente nuevas.

Gracias por adelantado.

Respuestas a la pregunta(1)

Su respuesta a la pregunta