Manual
do
Maker
.
com
Tudo o que você ver por aí lhe será apresentado como um mundo encantado e mágico onde o reconhecimento facial feito pelo CSI é primeiro ano na escolhinha do "hackeísmo". Mas no mundo real não funciona como nos filmes e a teoria na prática opera de outra maneira. Estou empolgado com essa solução que estou implementando, mas devo deixar claro uma coisa muito importante; reconhecimento facial não é as mil maravilhas que se se espera, essa é a área mais complexa da visão computacional e não tem uma solução matemática ideal até agora. Vamos ver como usar OpenCV e OpenFace de maneira rápida e prática.
Nesse outro artigo escrevi sobre face detection, e esse conceito você precisa ter em mente - detecção não é reconhecimento. A detecção facial feita pelo haar cascades é muito boa, junto ao non_maximum_supression fica melhor ainda e com alguns outros ajustes pode ser chamado de "muito satisfatório". Com o face detection tenho pego alguns poucos falsos-positivo, mas em alguns desses casos já tenho sensibilidade o suficiente para saber como corrigir. Essa sensibilidade só vem com o tempo de uso, infelizmente.
Experimentei tudo, com todas as possibilidades que se enquadram no dia-a-dia do mundo real, mas nenhuma destas soluções são sequer aceitáveis. E começa pelo treinamento dessas bases, pois se você quer um produto no mercado, é fundamental que ele não precise "incomodar" as pessoas. As imagens para treinamento precisam ser alinhadas à altura dos olhos, levando em conta o tamanho da imagem, que deve ser igual para todas as amostras. Mas não é só isso.
Esse algorítmo é muito legal e está presente no OpenCV. Ele é bom para reconhecer texturas e utilizado também para reconhecimento facial. Basicamente, ele pega um pixel e mais um pixel arredor em todas as direções, tendo um tamanho padrão de 9 pixels. Você pode aumentar o neighbor para aumentar o padrão e acuidade, mas o algorítmo é fortemente afetado por luminosidade. Além disso, aumentar o número de pontos para 24 pixels gera um processamento descomunal.
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.
E esse é o terceiro algorítmo incluso no OpenCV, também não pronto para produtos.
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.
Uma grande vantagem do Torch é que ele permite ser executado tanto em CPU como em CUDA. E esse último está na minha linha de visada. Eu o considero um projeto extremamente promissor, mas é uma opinião pessoal baseando-me nos envolvidos (Google, Intel, Vodafone, NVIDIA).
Infelizmente, não. Esse é um caminho que está sendo trilhado e as soluções estão nascendo. Apesar de grandes passos terem sido dados, não chegamos perto de algo que possa ser vendido em uma caixinha. Se precisar de reconhecimento facial como produto, tenha em mente que será necessário um double checking com algum outro recurso como um beacon, wifi do smartphone ou ainda, autenticação biométrica. De outro modo, esse recurso de reconhecimento facial pode ser utilizado, mas sem o compromisso de acertar. Isto é, sem que a vida de alguém dependa do reconhecimento; não dá pra fazer um robô atirador de elite, porque ele pode facilmente confundir um comandante com um meliante (perdão pelo trocadilho).
Nesse link você pode ver alguns comparativos de reconhecimento facial, o OpenCV e OpenFace estão realmente bons combinados em relação a tudo o que existe e provavelmente escreverei mais a respeito. Nesse momento só vou fazer um breve tutorial para que você possa experimentar essa brincadeira.
Claro que quando iniciamos um setup, queremos o mais rápido possível experimentar. Vamos ao "mais rápido possível". Só recomendo que a distribuição Linux seja atual o suficiente. No notebook de trabalho estou utilizando o Mint Sarah (o mais atual no momento desse post) e nesse ultrabook que vós escrevo estou ainda com o Rafaela. Adivinha? O procedimento abaixo não funcionou.
O docker é outra ferramenta fantástica que deixarei para outro artigo. Agora apenas siga o processo:
sudo apt-get install docker.io
Após isso, inicie os mesmos testes descritos na documentação:
# OpenCV e OpenFace
sudo su
docker pull bamos/openface
docker run -p 9000:9000 -p 8000:8000 -t -i bamos/openface /bin/bash
cd /root/openface
./demos/compare.py images/examples/{lennon*,clapton*}
./demos/classifier.py infer models/openface/celeb-classifier.nn4.small2.v1.pkl ./images/examples/carell.jpg
./demos/web/start-servers.sh
Após tornar-se root, as linhas seguintes fazem o seguinte:
Para fazer o treinamento e reconhecimento real time, apenas abra agora a URL 'http://127.0.0.1:8000/' no browser e dê permissão para acesso à webcam. Nesse primeiro momento você verá o "desconhecimento" ("unknown"). Dê um nome, clique em "Add person" e ligue o treinamento (ON). Deixe por uns 100 quadros, interrompa o treinamento e a partir de então já haverá uma pessoa reconhecida. Faça o mesmo para adicionar outras pessoas. Quando entrar uma pessoa nova, o que percebi foi a tentativa de acertar a todo o custo e isso gerou falso-positivo. Mas basta treinar a nova pessoa e tudo se resolverá. O OpenFace oferece um índice de acuidade para considerar (ou não) o reconhecimento e a margem entre o certo e o errado me pareceu boa o suficiente.
Após a base treinada, ocasionalmente peguei alguns falso-positivo. De 5 pessoas treinadas, uma delas resultou em alguns falso-positivos, as demais funcionaram surpreendentemente bem. Agora é só criar as bases e partir pro abraço na sua solução com OpenCV e OpenFace!
Vídeo demonstrativo do OpenCV e OpenFace.
Inscreva-se no nosso canal Manual do Maker Brasil no YouTube.
Também estamos no Instagram.
Próximo post a caminho!
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.