Reconhecimento Facial
Utilizando auto-vetores e auto-valores no reconhecimento de faces!
Diariamente nós, os humanos, relacionamos e interagimos com pessoas tanto no âmbito profissional ou pessoal. Nessas interações temos a capacidade de reconhecer o rostos das pessoas e com o passar do tempo e a familiaridade que tal rosto tem, mesmo com algumas alterações, seja pelo uso de máscaras, corte de cabelo ou a ação natural do tempo, ainda continuamos a reconhecer aquela pessoa, bastando apenas olhar para seu rosto.
Replicar esse notável reconhecimento de faces/pessoas nos computadores não é uma tarefa trivial, no entanto existem computadores que realizam tal tarefa e usam modelos que reconhecem pessoas, como Linear Discriminant Analysis, Elastic Bunch Graph Matching e Reconhecimento Facial utilizando Eigenfaces.
O Reconhecimento Facial utilizando Eigenfaces, emprega um conceito emprestado da Matemática os “auto-valores” e “auto-vetores”.
De forma bem resumida, a ideia é se puder substituir uma matriz inteira por um número escalar, os vetores que respeitam esta regra são chamados de autovetores e o número escalar é o que chamamos de autovalor.
Usando um repositório público de imagens, da California Institute of Technology, referência popular para algoritmos de reconhecimento facial, onde foi catalogada 450 imagens de pessoas diferentes (31 ao todo) e que cada foto foi capturada em várias condições de iluminação, cenas de fundo e expressões faciais. O intuito do projeto foi exercitar o uso dos Eigenfaces (auto-espaço de faces) no pré-processamento das imagens e após entregar esses Eigenfaces ao algoritmo classificador, SVM (tempos atrás falei um pouco do SVM — Suport Vector Machine) que tem por objetivo treinar um modelo de reconhecimento facial.
No meu repositório do GitHub encontra-se o código fonte.
Para esse projeto, a parte de pré-processamento dos dados foi extremamente importante, pois é nessa parte que usamos a técnica do Eigenfaces e foi foco do projeto.
Uma imagem é vista como uma matriz de pixels pelos computadores e se colorida temos uma matriz com 3 dimensões (RGB). Para estabelecer o relacionamento das imagens para que o algoritmo aprenda a similaridade das faces, o primeiro desafio que temos é redimensionar o tamanho das matrizes com três dimensões a um tamanho e formato, que ao mesmo tempo (i) mantenha as propriedades da matriz original e (ii) garanta performance nos cálculos.
A imagem lida em seu formato original, podemos identificar a dificuldade que teríamos se fossémos utilizar as imagens sem um pré-tratamento:
Para superar esse primeiro obstáculo, uma técnica em visão computacional é tranformar uma imagem que possua 3 dimensões em apenas 1 dimensão, em uma escala de cinza, mantendo as mesmas características da imagem colorida e facilitando a manipulação destas imagens:
Um segundo obstáculo, foi a extração do ROI — Region of Interest das imagens em questão. Como o escopo principal do projeto é detectar a face de uma imagem, temos que extrair dessas imagens apenas o local da face, antes de alimentar o modelo de machine learning. A extração do ROI das imagens foi realizada por um mapeamento feito pelo proprietário das imagens, que foi muito “bonzinho”, no entanto caso não tivéssemos tais locais ou (a) faríamos esse processo quando estivéssemos etiquentando os dados ou (b) usaríamos algum algoritmo de ML para essa finalidade.
Após esses pré-processamentos, das 450 imagens de 31 pessoas diferentes obtemos a seguinte matriz:
Entretanto o pré-processamento não termina por aqui, muito embora os dados já estejam em escala de cinza e apenas as faces de cada imagem eles possuem uma dimensionalidade grande e provavelmente treinar um classificador com dados de alta dimensionalidade não teremos performance e nem acurácia. É aqui que utilizamos os Eigenfaces para estabelecer o relacionamento entre um conjunto de imagens e encontramos o auto-espaço de faces (os auto-vetores e auto-valores), no qual se pode computar o quão similar duas ou mais faces são. Empregando uma técnica difundida para determinar padrões em dados de grande dimensão o PCA (Principal Component Analysis) remove informações que não são úteis e especificamente decompõe a estrutura da face em componentes que não estão correlacionados com isso obtemos os Eigenfaces.
Resumindo, das imagens de cada pessoa, nesse caso 25 imagens da “pessoa_15”, comprime e extrai o PCA desse indivíduo. Com o PCA o modelo aprende a relação/similaridade/correlação de cada face e quando é apresentado uma nova face realiza a previsão, lógico que de forma recursiva para todas as faces.
No repositório do GitHub , no read-me tem um gif que resume o que descrevi (não consegui hospedar aqui no medium pelo tamanho) procurei comentar bem o código e esta modularizado. Estou a disposição para dúvidas ou suegstões de temas, bast entrar em contato: Linkedin, GitHub e aqui no próprio Medium!!
Referências:
- https://www.lcg.ufrj.br/marroquim/courses/cos756/trabalhos/2013/abel-nascimento/abel-nascimento-report.pdf
- https://en.wikipedia.org/wiki/Eigenface
- https://www.cs.ucsb.edu/~mturk/Papers/mturk-CVPR91.pdf
- https://arxiv.org/pdf/1705.02782.pdf
- http://vision.stanford.edu/teaching/cs231a_autumn1112/lecture/lecture2_face_recognition_cs231a_marked.pdf