Implementando o reconhecimento de faces usando descritores locais (aprendizado não supervisionado)

Estou tentando implementar um algoritmo de reconhecimento de rosto usando Python. Quero poder receber um diretório de imagens e calcular distâncias entre pares, quandoesperamos que distâncias curtas correspondam às imagens pertencentes à mesma pessoa. O objetivo final é agrupar imagens e executar algumas tarefas básicas de identificação de faces (aprendizado não supervisionado).

Devido à configuração não supervisionada, minha abordagem para o problema é calcular uma"assinatura de rosto" (um vetor em R ^ d para alguns int d) e depois calcule uma métrica na qual duas faces pertencentes à mesma pessoa terão uma curta distância entre elas.

Eu tenho um algoritmo de detecção de rosto que detecta o rosto, corta a imagem e realiza algum pré-processamento básico, para que as imagens que estou alimentando com o algoritmo sejam cinza e equalizadas (veja abaixo).

Para a parte "assinatura de rosto", tentei duas abordagens sobre as quais li em várias publicações:

Tomando o histograma doLBP (Padrão binário local) de toda a imagem (processada)CálculoSIFT descritores em 7 pontos de referência faciais (direita da boca, esquerda da boca etc.), que identifico por imagem usando um aplicativo externo. A assinatura é a concatenação da raiz quadrada dos descritores (isso resulta em uma dimensão muito mais alta, mas por enquanto o desempenho não é um problema).

Para a comparação de duas assinaturas, estou usando a função compareHist do OpenCV (consulteaqui), testando várias métricas de distância diferentes (qui quadrado, euclidiano etc.).

Sei que o reconhecimento facial é uma tarefa difícil, sem falar em nenhum treinamento, por isso não estou esperando grandes resultados. Mas tudo o que estou chegando até agora parececompletamente aleatório. Por exemplo, ao calcular distâncias da imagem na extrema direita contra o resto da imagem, percebo que ela é mais parecida com 4 Bill Clintons (...!).

Eu li emesta ótima apresentação que é popular realizar uma"aprendizado métrico" procedimento em um conjunto de testes, o que deve melhorar significativamente os resultados. Entretanto, na apresentação e em outros lugares, as medidas de distância "regulares" também devem ter bons resultados, portanto, antes de tentar isso, quero entender por que o que estou fazendo não me deixa nada.

Em conclusão, minhas perguntas, que eu adoraria obter qualquer tipo de ajuda:

Uma melhoria que eu pensei seria executar o LBP apenas na face real, e não nos cantos e tudo o que poderia inserir ruído na assinatura. Como posso mascarar as partes que não são a face antes de calcular o LBP? Também estou usando o OpenCV para esta parte.

Eu sou bastante novo na visão de computador; Como eu iria "depurar" meu algoritmo para descobrir onde as coisas dão errado? Isso é possível?

Na configuração não supervisionada, existe alguma outra abordagem (que não seja descritores locais + distâncias computacionais) que possa funcionar para a tarefa de agrupar faces?

Existe mais alguma coisa no módulo OpenCV que talvez eu não tenha pensado que possa ser útil? Parece que todos os algoritmos de lá requerem treinamento e não são úteis no meu caso - o algoritmo precisa trabalhar com imagens completamente novas.

Desde já, obrigado.

questionAnswers(1)

yourAnswerToTheQuestion