O paper da base de imagens para reconhecimento facial da Universidade de Yale fez um comparativo entre 2 algorítmos, sendo um deles o Eigenfaces. Também influenciado pela luminosidade, a precisão dele foi baixíssima, em torno de 2%. É impossível utilizar para um produto profissional um algorítmo que vai consumir processamento e devolver uma informação tão pouco confiável.
Não estou desmerecendo nenhum desses recursos, gosto de todos, mas para se tornar minimamente aceitável é necessário utilizá-los em ambiente de luz controlada. Isto é, além de você precisar fazer um “ensaio fotográfico” com o target, também será necessário manter o ambiente sempre adequado; se a luz enfraquecer, se receber influência da luz do dia, se a lâmpada for trocada por uma com mais ou menos Kelvin ou uma fluorescente for trocada por LED, tenha absoluta certeza de que o alvo será diretamente afetado.
A câmera é um outro fator que você sempre precisará considerar. Se você for considerar uma zona de referência, controlar a luminosidade, foco, white-balance, contraste e tamanho serão pré-requisitos fundamentais. A câmera tem que oferecer obrigatoriamente um controle manual, deixar em controle automático fará com que os pixels mudem de cor, gerando falsos-positivos inclusive em outros recursos do OpenCV como por exemplo, detecção de movimento, detecção de objetos etc.
Se você consegue atender a todos esses requisitos e sua câmera estiver devidamente posicionada a ponto de pegar os traços frontais do rosto adequadamente, você pode considerar utilizar um destes.
Esses modelos do OpenCV tem um sério problema e certamente precisarão evoluir ou ganhar um “acessório” para incrementar sua acuidade. Atualmente as melhores soluções estão diretamente ligadas ao deep learning, ou machine learning ou o nome que queiram utilizar, que é um sub-campo da inteligência artificial. Isto é, a máquina precisa mais do que se basear em um padrão, ela precisa aprender com o padrão, melhorar sua capacidade de identificação. Esses algorítmos do OpenCV só tem o treinamento e 2 deles tem update da base de treinamento, não tem rede neural envolvida.
E após um longo periodo tentando trabalhar sobre as solução disponíveis no próprio OpenCV, percebi que precisaria de algo mais complexo do que apenas os algorítmos disponíveis nativamente nele. Até esse ponto eu já havia testado o SightHound, que não me foi de todo o mal, mas não foi também uma grande solução. Enfim, procurei por outras possibilidades e cheguei à conclusão de que para o momento, o que mais me atenderia seria o OpenFace, mas existem outros produtos que você pode contratar online, inclusive do próprio google (só não sei se o google tem algum serviço de reconhecimento facial como produto).
Hoje fiz meu primeiro teste com o OpenFace, não posso dizer sequer que tenho um mínimo de especialidade, mas tive uma agradável experiência. E você também pode ter essa experiência agora mesmo, se estiver utilizando Linux enquanto lê esse artigo.
O OpenFace é uma implementação de Python e Torch para reconhecimento facial com DNN (Deep Neural Networks) e é baseado no paper CVPR2015 (FaceNet: A Unified Embedding for Face Recognition and Clustering), por Florian Schroff, Dmitry Kalenichenko e James Philbin, do Google.