35
MINISTÉRIO DA DEFESA EXÉRCITO BRASILEIRO SECRETARIA DE CIÊNCIA E TECNOLOGIA INSTITUTO MILITAR DE ENGENHARIA (Real Academia de Artilharia Fortificação e Desenho - 1792) TEMA DIRIGIDO ÁLGEBRA LINEAR APLICADA A RECONHECIMENTO FACIAL GUSTAVO FARIAS VICTOR VILLAS BÔAS 2 o ANO PROF a . CARLA PAGLIARI RIO DE JANEIRO 18 DE NOVEMBRO DE 2013

Álgebra Linear Aplicada a Reconhecimento Facial

Embed Size (px)

DESCRIPTION

Resultado final do Tema Dirigido, trabalho de iniciação científica parte da grade curricular do Instituto Militar de Engenharia.Resumo: Ao transportar faces para um espaço vetorial, podemos identificar um subespaço que possua dimensão reduzida e preserve uma quantidade suficiente de informação para manter a distinção entre as faces. Com o método da análise das componentes principais (PCA - Principal Component Analysis), além de comprimir os dados, destacamos o subespaço que contém as características mais distintas de cada face, maximizando a preservação de informação. Após introduzir a modelagem teórica do PCA, é feito um estudo de caso com uma implementação simples do algoritmo em linguagem C++ com o auxílio da biblioteca OpenCV. No estudo de caso são utilizadas 75 fotos em condições ideais para testes e 10 experimentos de tentativa de reconhecimento. Os testes tiveram os resultados mais diversos possíveis, indicando a necessidade de outros algoritmos de processamento serem empregados antes de começar o PCA, entre eles detecção de rosto e detecção de bordas. A modelagem matemática do algoritmo resultou uma resistência a erros por parte de poluição visual aleatória no rosto dos indivíduos, sendo uma consequência de importante interpretação em termos de álgebra linear e estatística.

Citation preview

Page 1: Álgebra Linear Aplicada a Reconhecimento Facial

MINISTÉRIO DA DEFESAEXÉRCITO BRASILEIRO

SECRETARIA DE CIÊNCIA E TECNOLOGIAINSTITUTO MILITAR DE ENGENHARIA

(Real Academia de Artilharia Fortificação e Desenho - 1792)TEMA DIRIGIDO

ÁLGEBRA LINEAR APLICADA ARECONHECIMENTO FACIAL

GUSTAVO FARIASVICTOR VILLAS BÔAS

2o ANO

PROFa. CARLA PAGLIARI

RIO DE JANEIRO18 DE NOVEMBRO DE 2013

Page 2: Álgebra Linear Aplicada a Reconhecimento Facial

Lista de ilustrações

Figura 1 – Conversão da foto original (750x500) para escala de cinza (470x336) . . 10Figura 2 – Foto após translação e o primeiro autovetor da covariância . . . . . . . 11

Figura 3 – Imagem alvo e sua translação (flash) . . . . . . . . . . . . . . . . . . . 13Figura 4 – Imagem descomprimida e imagem mais próxima (flash) . . . . . . . . . 13Figura 5 – Imagem alvo e sua translação (bronzeado) . . . . . . . . . . . . . . . . 14Figura 6 – Imagem descomprimida e imagem mais próxima (bronzeado) . . . . . . 14Figura 7 – Imagem alvo e sua translação (zoom) . . . . . . . . . . . . . . . . . . . 15Figura 8 – Imagem descomprimida e imagem mais próxima (zoom) . . . . . . . . 15Figura 9 – Imagem alvo e sua translação (cabelo) . . . . . . . . . . . . . . . . . . 16Figura 10 – Imagem descomprimida e imagem mais próxima (cabelo) . . . . . . . . 16Figura 11 – Imagem alvo e sua translação (foco) . . . . . . . . . . . . . . . . . . . 17Figura 12 – Imagem descomprimida e imagem mais próxima (foco) . . . . . . . . . 17Figura 13 – Imagem alvo e sua translação (altura) . . . . . . . . . . . . . . . . . . 17Figura 14 – Imagem descomprimida e imagem mais próxima (altura) . . . . . . . . 18Figura 15 – Imagem alvo e sua translação (rotação) . . . . . . . . . . . . . . . . . . 18Figura 16 – Imagem descomprimida e imagem mais próxima (rotação) . . . . . . . 19Figura 17 – Imagem alvo e sua translação (sujeira) . . . . . . . . . . . . . . . . . . 19Figura 18 – Imagem descomprimida e imagem mais próxima (sujeira) . . . . . . . . 19Figura 19 – Imagem alvo e sua translação (tapa olho) . . . . . . . . . . . . . . . . 20Figura 20 – Imagem descomprimida e imagem mais próxima (tapa olho) . . . . . . 20Figura 21 – Imagem alvo e sua translação (combinado) . . . . . . . . . . . . . . . . 21Figura 22 – Imagem descomprimida e imagem mais próxima (combinado) . . . . . 21

Sumário

Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.1 Álgebra Linear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

1.1.1 Projeção de Vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.1.2 Operador Linear . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

Page 3: Álgebra Linear Aplicada a Reconhecimento Facial

1.1.3 Teorema Espectral . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.1.4 Busca de Autovetores . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.2 Estatística . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.2.1 Valor Esperado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.2.2 Variância . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.2.3 Covariância . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

2 Análise das Componentes Principais . . . . . . . . . . . . . . . . . . . . . . 62.1 Translação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.2 Diagonalização . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.3 Projeção . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.4 Descompressão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

3 Reconhecimento Facial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93.1 Treinamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103.2 Reconhecimento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

4 Discussão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134.1 Teste do Flash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134.2 Teste do Bronzeado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144.3 Teste do Zoom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154.4 Teste do Cabelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154.5 Teste do Foco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164.6 Teste da Altura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174.7 Teste da rotação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184.8 Teste da Sujeira . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194.9 Teste do Tapa Olho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204.10 Teste Combinado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

5 Conclusão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

APÊNDICE A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

REFERÊNCIAS BIBLIOGRÁFICAS . . . . . . . . . . . . . . . . . . . . . . . . 32

Page 4: Álgebra Linear Aplicada a Reconhecimento Facial

1

Resumo

Ao transportar faces para um espaço vetorial, podemos identificar um subespaçoque possua dimensão reduzida e preserve uma quantidade suficiente de informação paramanter a distinção entre as faces. Com o método da análise das componentes principais(PCA - Principal Component Analysis), além de comprimir os dados, destacamos o subes-paço que contém as características mais distintas de cada face, maximizando a preservaçãode informação. Após introduzir a modelagem teórica do PCA, é feito um estudo de casocom uma implementação simples do algoritmo em linguagem C++ com o auxílio da bibli-oteca OpenCV. No estudo de caso são utilizadas 75 fotos em condições ideais para testese 10 experimentos de tentativa de reconhecimento. Os testes tiveram os resultados maisdiversos possíveis, indicando a necessidade de outros algoritmos de processamento seremempregados antes de começar o PCA, entre eles detecção de rosto e detecção de bordas.A modelagem matemática do algoritmo resultou uma resistência a erros por parte depoluição visual aleatória no rosto dos indivíduos, sendo uma consequência de importanteinterpretação em termos de álgebra linear e estatística.

Page 5: Álgebra Linear Aplicada a Reconhecimento Facial

2

1 Introdução

1.1 Álgebra Linear

1.1.1 Projeção de Vetores

Sejam dois vetores u, v ∈ R𝑛, definimos a projeção ortogonal de v sobre u como:

𝑝𝑟u(v) = u · v||u||

(1.1)

A interpretação geométrica desta projeção ortogonal é a componente de v nadireção de u. Ao definirmos uma base ortonormal U = {u1, ..., u𝑛}, podemos escrever ovetor v nesta base usando as projeções, conforme a equação:

v =𝑛∑

𝑘=1𝑝𝑟𝑢𝑘

(v)||𝑢𝑘||−1u𝑘 (1.2)

Se a base for ortonormal, substituimos (1.1) em (1.2) e usando ||𝑢𝑘|| = 1, obtém-se:

v =𝑛∑

𝑘=1(v · u𝑘)u𝑘 (1.3)

Portanto, podemos representar unicamente v na base U com o vetor vU = (u1 ·v, ..., u𝑛 · v). De forma semelhante, é possível expandir o conceito de projeção ortogonalpara subespaços. Seja uma base ortonormal U′ = {u’1, ..., u’𝑚} de um subespaço ℱ deR𝑛. A projeção de um vetor v em ℱ é:

vℱ =𝑚∑

𝑘=1(v · u’𝑘)u’𝑘 (1.4)

1.1.2 Operador Linear

Operadores lineares são funções em espaços vetoriais que satisfazem para todosvetores u, v do domínio e 𝛼, 𝛽 reais:

𝑇 (𝛼v + 𝛽u) = 𝛼𝑇 (v) + 𝛽𝑇 (u) (1.5)

Qualquer transformação 𝐴 : R𝑛 → R𝑛 pode ser representada na forma de um pro-duto matricial. Em particular, mudanças de base e projeções são transformações lineares.

Page 6: Álgebra Linear Aplicada a Reconhecimento Facial

Capítulo 1. Introdução 3

Por exemplo, seja a matriz 𝐹𝑛×𝑚 tal que seu 𝑖-ésimo vetor coluna é u’𝑖 definido para aequação (1.4). Podemos reescrever (1.4) na seguinte equação matricial:

vℱ = 𝐹 𝑇 v (1.6)

Onde 𝐹 𝑇 é a matriz transposta de 𝐹 . Dizemos que 𝐹 𝑇 é a representação matricialdo operador linear de projeção sobre ℱ .

1.1.3 Teorema Espectral

Um conceito importante sobre operadores e representações matriciais é sobre ope-radores simétricos. Diremos que um operador linear é simétrico se e somente se sua re-presentação matricial 𝐹 é uma matriz simétrica, ou seja, tal que 𝐹 = 𝐹 𝑇 .

Agora seja 𝐴𝑛×𝑛. Dizemos que v é autovetor de 𝐴 se e somente se existe 𝜆 ∈ R talque

𝐴v = 𝜆v (1.7)

Chamamos 𝜆 de autovalor de 𝐴 associado a v.

Apresentadas as definições acima, enunciamos o seguinte teorema:

Teorema 1 (Teorema Espectral). Se 𝐴 é um operador simétrico, existe uma base orto-normal de R𝑛 formada por autovetores de 𝐴. Nesta base, 𝐴 possui representação matricialdiagonalizada, onde os elementos da diagonal são os autovalores de 𝐴.

1.1.4 Busca de Autovetores

Se 𝐴 é uma matriz 𝑛 × 𝑘 onde 𝑛 ≫ 𝑘, a matriz 𝐴𝐴𝑇 será 𝑛 × 𝑛 e terá certo custocomputacional para ser calculdada. Supondo que seja viável construir essa matriz, haveráainda outro custo para encontrar seus autovetores e autovalores. Já a matriz 𝐴𝑇 𝐴 será𝑘×𝑘 e terá o custos de construção e de busca de autovetores e autovalores muito menores.

Seja 𝜆 um autovalor de 𝐴𝑇 𝐴 e v seu autovetor associado. Da equação (1.7), temos:

𝐴𝑇 𝐴v = 𝜆v (1.8)

Multiplicando a equação (1.8) por 𝐴 à esquerda, obtemos:

𝐴𝐴𝑇 𝐴v = 𝜆𝐴v (1.9)

Observando a equação (1.9), percebe-se que ela possui a forma 𝐴𝐴𝑇 (𝐴v) = 𝜆(𝐴v).Comparando com a equação (1.7), podemos enunciar o teorema:

Page 7: Álgebra Linear Aplicada a Reconhecimento Facial

Capítulo 1. Introdução 4

Teorema 2 (Busca de Autovetores). Se v é autovetor de 𝐴𝑇 𝐴 associado ao autovalor 𝜆,𝐴v é autovetor de 𝐴𝐴𝑇 associado ao mesmo autovalor 𝜆.

O teorema (2) mostra que embora a busca dos autovetores de 𝐴𝐴𝑇 possa ser inviá-vel computacionalmente, é possível realizar essa busca em 𝐴𝑇 𝐴 e a partir daí, encontraralguns autovetores de 𝐴𝐴𝑇 . Quanto mais próximo 𝑘 é de 𝑛, mais autovetores podem serencontrados desta forma.

1.2 Estatística

1.2.1 Valor Esperado

O valor esperado de uma distribuição discreta uniforme é dado por:

�� = 1𝑘

𝑘∑𝑖=1

𝑥𝑖 (1.10)

Podemos definir o valor esperado sobre um conjunto de vetores 𝑋 = {x1, x2, ..., x𝑘} ⊂R𝑛 de forma análoga:

x = 1𝑘

𝑘∑𝑖=1

x𝑖 (1.11)

O nome ’valor esperado’ ou ’esperança’ vem do fato de que se os vetores repre-sentam dados obtidos experimentalmente, ao reproduzir o experimento esperamos que osnovos dados estejam próximos a esse valor. No caso de distribuições discretas e uniformes,o valor esperado assume a forma de média aritmética.

1.2.2 Variância

A variância de uma amostra é uma medida da sua dispersão estatística, indicandoa proximidade da distribuição de dados em relação ao valor esperado.

Dado o conjunto amostral discreto 𝑋 de valor esperado ��, a variância da distri-buição uniforme é dada pela equação:

𝑣𝑎𝑟(𝑋) = 1𝑘

𝑘∑𝑖=1

(𝑥𝑖 − ��)2 (1.12)

Uma amostra com alta variância indica distribuições afastadas do valor médio, enquantouma variância pequena indica um espaço amostral pouco disperso.

1.2.3 Covariância

A covariância é uma medida da correlação entre duas amostras. A covariância podeindicar quando duas grandezas não estão correlacionadas, se tem crescimentos relaciona-dos ou se possuem relação inversa.

Page 8: Álgebra Linear Aplicada a Reconhecimento Facial

Capítulo 1. Introdução 5

Dados dois conjuntos amostrais de igual cardinalidade 𝐴 e 𝐵, a covariância de 𝐴

e 𝐵 de uma distribuição conjunta uniforme é:

𝑐𝑜𝑣(𝐴, 𝐵) = 1𝑘

𝑘∑𝑖=1

(𝑎𝑖 − 𝐴)(𝑏𝑖 − ��) (1.13)

Observando a equação (1.12), nota-se que 𝑐𝑜𝑣(𝑋, 𝑋) = 𝑣𝑎𝑟(𝑋).

Se a covariância de duas variáveis é positiva, singifica que seus valres crescem e de-crescem juntos. Se a covariância for negativa, o crescimento de uma variável está associadoa um decrescimento na outra. Se a covariância é zero, as variáveis são descorrelacionadas.

Ao lidar com objetos multidimensionais, para analisar a relação entre as dimensõesé comum utilizar a matriz de covariância. Essa matriz sumariza as covariâncias entretodas as dimensões e se mostra útil em algoritmos de análise estatística de distribuiçõesconjuntas.

Definiremos a matriz de covariância Σ de um conjunto 𝑋 de espaços amostrais 𝑋𝑖:

Σ𝑖,𝑗(𝑋) = 𝑐𝑜𝑣(𝑋𝑖, 𝑋𝑗) (1.14)

A simetria da equação (1.14) indica que Σ é simétrica, mas é possível garantirmais do que isso, conforme o teorema a seguir:

Teorema 3 (Positividade). A matriz de covariância é não-negativa: ela é simétrica etodos seus autovalores são não-negativos.

O teorema (3) juntamente com o teorema (1) garante que ao diagonalizar Σ, todosos elementos da diagonal são maiores ou iguais a zero. A importância (e uma justificativaintuitiva) deste fato se torna clara ao interpretar a diagonalização da matriz de covariância.

Page 9: Álgebra Linear Aplicada a Reconhecimento Facial

6

2 Análise das Componentes Principais

O objetivo da análise das componentes principais é obter, para um determinadoconjunto de vetores de um espaço de dimensão 𝑛, um subespaço de dimensão 𝑚 < 𝑛

que descreva esse mesmo conjunto de forma semelhante e com o mínimo de perda deinformação. Por isso, o algoritmo frequentemente é referenciado como um método decompressão de dados.

O algoritmo de análise das componentes principais se divide principalmente emtrês etapas: translação, diagonalização e projeção. Os procedimentos de cada etapa sãodetalhados a seguir, simulando o procedimento em uma lista 𝑋 de 𝑁 vetores em R𝑛

representada por uma matriz 𝑋𝑛×𝑁 , onde cada coluna é o vetor x𝑖 da lista.

2.1 Translação

∙ Cálculo do vetor médio x aplicando a equação (1.11);

∙ construção de uma nova matriz 𝑌 onde y𝑖 = x𝑖 − x.

Uma equação matricial que define 𝑌 é dada por

𝑌 = 𝑋 − X (2.1)

onde X é a matriz onde todas as colunas são iguais a x.

Essa nova matriz 𝑌 possui média das colunas y = 0. Isso significa que os dadosforam transladados no espaço de forma que o centróide (vetor médio) da distribuiçãoesteja na origem.

A justificativa para esse procedimento é que para identificar as componentes prin-cipais na distinção dos objetos, é preciso analisar as diferenças entre um vetor e todo oconjunto. O vetor médio reúne as semelhanças entre os objetos da lista e, portanto, adiferença entre um vetor e o centróide é uma medida da distinção desse objeto em relaçãoao espaço amostral.

2.2 Diagonalização

∙ Construção da matriz de covariância Σ(𝑋);

Page 10: Álgebra Linear Aplicada a Reconhecimento Facial

Capítulo 2. Análise das Componentes Principais 7

∙ busca dos autovetores e autovalores de Σ.

A matriz de covariância nos informa as dependências entre as dimensões que com-põem os vetores e pelo teorema (3), ela é uma matriz diagonalizável. Podemos entãoencontrar uma base U de autovetores de Σ que gera R𝑛.

Pelo teorema (1), sabemos que a base U diagonaliza Σ, então ao mudarmos arepresentação dos vetores da base canônica para a base U, encontramos um conjunto decomponentes que se usadas para decompor os vetores, geram uma matriz de covariânciadiagonalizada.

Como os elementos fora da diagonal na matriz de covariância serão nulos, as no-vas dimensões componentes dos vetores passam a ser descorrelacionadas. Além disso, osautovalores indicam as variâncias das componentes geradas pelo autovetor associado. Issosignifica que pelos autovalores podemos identificar quais autovetores abrangem dimensõescom maior variação entre os vetores. Autovalores maiores estão associados a componentesde maior relevância para distinguir os objetos.

2.3 Projeção

∙ Escolha da base reduzida U′ = {u′1, ..., u′

𝑚};

∙ projeção dos vetores de 𝑌 no subespaço ℱ = 𝑆(U′), conforme a equação (1.6).

Escolhendo um subconjunto U′ ⊂ U que contenha os autovetores associados aosmaiores autovalores de Σ, o subespaço ℱ irá conservar a maior parte da informação (ea capacidade de distinguir os objetos iniciais). Quanto menor a dimensão 𝑚 de ℱ , maisinformação é perdida. Porém, como essa perda é minimizada pela escolha das componentesprincipais, ℱ poderá ter dimensão 𝑚 ≪ 𝑛 e descrever suficientemente bem a diferençaentre os objetos e o centróide.

Após projetar os vetores y𝑖 em ℱ , obtemos uma nova matriz 𝑍𝑚×𝑁 onde z𝑖 = y𝑖ℱ .Podemos resumir a aplicação da equação (1.6) na seguinte equação matricial:

𝑍 = 𝐹 𝑇 𝑌 (2.2)

2.4 DescompressãoPara descomprimir os dados projetados no subespaço ℱ , basta notar que como

𝐹 possui vetores coluna ortonormais e se o vetor projetado estava próximo ao subespaçoℱ (quer dizer, perdeu pouca informação ao ser projetado), acontecerá 𝐹𝐹 𝑇 ≈ 𝐼𝑛×𝑛.

Page 11: Álgebra Linear Aplicada a Reconhecimento Facial

Capítulo 2. Análise das Componentes Principais 8

Daí, se multiplicamos a equação (2.2) por 𝐹 à esquerda, podemos predizer a seguinteaproximação:

𝑌 ≈ 𝐹𝑍 (2.3)

Relembrando a equação (2.1), a equação (2.3) pode ser reescrita como:

𝑋 ≈ 𝐹𝑍 + X (2.4)

Ou de forma equivalente:x𝑖 ≈ 𝐹z𝑖 + x (2.5)

Page 12: Álgebra Linear Aplicada a Reconhecimento Facial

9

3 Reconhecimento Facial

O algoritmo de reconhecimento facial baseado no PCA se divide em dois meca-nismos principais: preparação e reconhecimento. A execução da preparação é o únicomomento onde o PCA é efetivamente executado, enquanto no mecanismo de reconheci-mento ocorre a tentativa de identificar uma imagem de entrada como uma das imagensarmazenadas no banco de dados.

Caso o reconhecimento falhe ou a identificação não tenha sido precisa, é possívelum mecanismo de aprendizado: a imagem que falhou nos testes de reconhecimento podeser adicionada como novo objeto no banco de dados (cadastro) sem necessitar realizaro PCA novamente. Para isso, basta projetar a nova imagem no subespaço escolhido eadicionar este caso de testes. O mecanismo de aprendizado é acessório, pois em sistemascom baixa rotatividade de dados é viável adicionar as novas imagens manualmente nobanco de dados e refazer a etapa de preparação.

No apêndice A consta uma implementação das etapas do software de reconheci-mento facial em C++ com auxílio da biblioteca OpenCV, cujos comentários indicam cadaum dos procedimentos descritos. Nas seções a seguir, é feito um estudo de caso com 75imagens obtidas de alunos do Instituto Militar de Engenharia durante o primeiro ano dociclo básico.

A qualidade das imagens para o estudo de caso é ideal (posição do rosto padroni-zada para fotos 3x4 e cortes de cabelo padronizados pelo Exército Brasileiro). O aspectopositivo destas circunstâncias é que o algoritmo terá sua modelagem teórica testada emcondições ótimas, dando confiabilidade aos resultados. O aspecto negativo é que os resul-tados não refletem diretamente o esperado em aplicações reais. Para analisar o compor-tamento do algoritmo em outras situações, são feitos testes com diferentes luminosidadese posicionamentos.

Embora a qualidade das imagens seja ideal, seria necessário um pré-processamentodemasiado complexo para garantir a real aplicabilidade do PCA que não condiz com arealidade de uma curta implementação. Todas as imagens deveriam passar por um algo-ritmo de detecção de contornos para eliminar todas as informações visuais que não sejamda face (cabelo, fundo, pescoço etc.) e um algoritmo de posicionamento que centralizasseum ponto em comum a todas as imagens, como a ponta do nariz em um lugar específico.

Como tais recursos não foram implementados por sua complexidade e por estaremfora do escopo do trabalho, são analisados 10 testes onde diferentes fontes de erro no reco-

Page 13: Álgebra Linear Aplicada a Reconhecimento Facial

Capítulo 3. Reconhecimento Facial 10

nhecimento são propositalmente inseridos em uma imagem usada como caso de controle.Sendo esta imagem parte do próprio banco de treinamento do algoritmo, ela consiste nomelhor caso possível para facilidade de acerto pelo algoritmo.

A etapa de treinamento do algoritmo cria os objetos necessários durante a etapareconhecimento. Com uma quantidade inicial de faces armazenadas, realiza-se o PCA so-bre este espaço amostral conhecido. São fixados então o vetor médio, a matriz de projeção𝐹 𝑇 conforme as equações (1.11) e (1.6) e também os autovalores correspondentes.

Além do pré-processamento das imagens, a etapa de diagonalização no PCA seráotimizada computacionalmente com o uso do teorema (2), viabilizando a execução doalgoritmo em qualquer computador pessoal. A etapa de preparação é crítica em termosde custo computacional, principalmente pelo custo de processamento para fazer produtosmatriciais e resolver o autosistema.

3.1 TreinamentoAo carregar as imagens do banco de dados, elas são convertidas para escala de

cinza. É mais fácil trabalhar com imagens de um só canal de cores para que cada pixelnecessite de apenas um número (e portanto seja representado por uma matriz). Paramelhorar a eficácia do PCA, as fotos também foram cortadas para focar na região dorosto e eliminar a influência das roupas.

Figura 1 – Conversão da foto original (750x500) para escala de cinza (470x336)

No código apresentado no apêndice A está implementada a função CarregarIma-gensTreinamento() que lê as imagens de uma pasta com o auxílio da biblioteca OpenCVe as converte para matrizes já na forma de escala de cinza. As imagens são vetorizadas

Page 14: Álgebra Linear Aplicada a Reconhecimento Facial

Capítulo 3. Reconhecimento Facial 11

e armazenadas nas colunas de uma matriz 𝑋. Esta função é chamada na rotina Treina-mento(), que logo após o carregamento chama a função FazerPCA().

Em seguida é calculado o vetor médio 𝑥𝑀𝑒𝑑 e criada a matriz 𝑌 dos vetores de𝑋 transladados. Como a matriz covariância de 𝑋 é dada por 1

𝑛𝑌 𝑌 𝑇 e teria dimensão

157920×157920, utiliza-se o teorema (2) para calcular os autovetores de 𝑌 𝑇 𝑌 , chamandoesta matriz de 𝐶𝑜𝑣𝐴𝑢𝑥. A função eigen() da biblioteca OpenCV retorna os autovetoresnas linhas de 𝑎𝑉 𝑒𝑐 e os autovalores respectivos nas linhas de 𝑎𝑉 𝑎𝑙.

Em seguida, a matriz 𝑎𝑉 𝑎𝑐 é transposta e multiplicada por 𝑌 para obtermos amatriz 𝐹 cujos vetores coluna são os autovetores da matriz da covariância. Os autoveto-res são em seguida normalizados para que as colunas de F sejam uma base ortornomaldo subespaço gerado pelas fotos iniciais. Como essa busca alternativa para autovetorespermite que sejam encontrados apenas 75, nenhum deles foi descartado para maximizara qualidade da compressão.

Figura 2 – Foto após translação e o primeiro autovetor da covariância

Em seguida, a matriz de projeção 𝐹𝑡 é construída como a transposta de 𝐹 e pro-jetamos as imagens transladadas na matriz 𝑍. A função ArmazenarDadosTreinamento()é executada e a matriz de projeção, o vetor médio, os vetores do espaço amostral e osautovalores são armazenados num arquivo binário chamado "resultados".

3.2 ReconhecimentoAo iniciar o programa no modo de reconhecimento, a imagem alvo é carregada em

escala de cinza e as informações do arquivo "resultados"são lidas, construindo a matrizde projeção 𝐹𝑡, o vetor médio 𝑥𝑀𝑒𝑑 e o vetor dos autovalores 𝑎𝑉 𝑎𝑙. A imagem alvo é

Page 15: Álgebra Linear Aplicada a Reconhecimento Facial

Capítulo 3. Reconhecimento Facial 12

vetorizada e é chamada a rotina BuscaVizinhos(), que encontra os três vetores do subes-paço ℱ mais próximos do alvo projetado utilizando a função Metrica() para calcular asdistâncias.

Para calcular a distância entre as imagens projetadas no subespaço escolhido nãoé utilizada a métrica euclidiana. O trabalho de Moon (2001) sobre a aplicação do PCA emreconhecimento facial mostra uma maior eficiência utilizando a métrica de Mahalanobis,dada por:

𝑑(��, ��) =√

(�� − ��)Σ−1(�� − ��)

onde Σ é a matriz de covariância. Como a mudança de base diagonalizou Σ, temos achamada distância euclidiana normalizada:

𝑑(��, ��) =⎯⎸⎸⎷ 𝑛∑

𝑖=1

(𝑥𝑖 − 𝑦𝑖)2

𝜎2𝑖

onde 𝜎2𝑖 é a variância da componente 𝑖, dada pelos autovalor 𝜆𝑖 de Σ.

Esta métrica se torna mais eficiente por levar em consideração as variâncias dascomponentes como uma forma de atribuição de pesos no cálculo da distância. Se umacomponente tem variância alta, um grande desvio nessa componente já era esperado enão é relevante. Se uma componente tem variância pequena, um desvio nessa compo-nente é um fator que deve ser evidenciado na métrica de Malahanobis. Esta métrica estáimplementada na função Metrica().

Page 16: Álgebra Linear Aplicada a Reconhecimento Facial

13

4 Discussão

Como era de se esperar do algoritmo sem as etapas de pré-processamento exigidas,ele apresentou quase total impossibilidade de implementação. Para evidenciar os pontospositivos e negativos do algoritmo, foram escolhidos dez casos teste para representarpossíveis problemas a serem enfrentados.

4.1 Teste do FlashUm dos problemas esperados no desempenho do PCA em reconhecimento facial é

em relação à luminosidade. Um ambiente com iluminação muito forte ou uma câmera comflash podem afetar profundamente a capacidade de reconhecimento. Para isso, a imagemde controle foi clareada e submetida ao algoritmo de reconhecimento.

Figura 3 – Imagem alvo e sua translação (flash)

Figura 4 – Imagem descomprimida e imagem mais próxima (flash)

O algoritmo respondeu corretamente. A distância entre o alvo e a imagem corretafoi de 9, 67.1016 e para a segunda imagem mais próxima foi 1, 99.1017. Como a segunda

Page 17: Álgebra Linear Aplicada a Reconhecimento Facial

Capítulo 4. Discussão 14

distância é mais que 200% da distância para a imagem correta, pode-se considerar umbom acerto.

4.2 Teste do BronzeadoRetornando ao problema da luminosidade e do brilho na foto, o mesmo pode

acontecer no sentido oposto ao teste do Flash. A foto alvo pode ter sido retirada numambiente com menor luminosidade ou a própria foto do banco de dados pode estar combrilho excessivo. A foto de controle foi escurecida e submetida ao reconhecimento.

Figura 5 – Imagem alvo e sua translação (bronzeado)

Figura 6 – Imagem descomprimida e imagem mais próxima (bronzeado)

O algoritmo respondeu errado. Ele respondeu com uma pessoa que é de fato maismorena que o alvo na vida real. Isso pode indicar que o algoritmo é sensível, mas mantéma fidelidade com a foto. De fato, a menor distância encontrada foi 1, 88.1017 e a distânciapara a resposta correta foi a segunda menor, 1, 94.1017. Sendo a resposta correta o segundopalpite do reconhecimento, com um erro de apenas 3%, pode-se considerar um erro justocom a dificuldade do teste.

Page 18: Álgebra Linear Aplicada a Reconhecimento Facial

Capítulo 4. Discussão 15

4.3 Teste do ZoomEvidentemente que nem toda foto é retirada a uma mesma distância do rosto.

Essa distância causa uma mudança significativa em termos de distância relativa entre asfeições corporais nas fotos. A imagem controle é ampliada na região do rosto para simularuma foto mais próxima e é submetida ao algoritmo de reconhecimento.

Figura 7 – Imagem alvo e sua translação (zoom)

Figura 8 – Imagem descomprimida e imagem mais próxima (zoom)

O algoritmo respondeu errado. A mudança da distância relativa entre as principaisfeições (olhos, nariz, boca, orelhas) fez com que o algoritmo nem sequer tenha colocado aimagem correta entre as três principais candidatas no reconhecimento. A distância entreo alvo e a imagem resposta foi de 6, 59.1016, que é menor que a distância entre o alvo ea imagem correta no teste do bronzeado. Isso mostra que a posição relativa das feições édeterminante no reconhecimento.

4.4 Teste do CabeloPraticamente todas as imagens do banco de treinamento são de pessoas com cabelo

preso ou muito curto. Como não foi feita uma detecção de bordas para eliminar o cabelo,é de se esperar que um cabelo um pouco maior deva ser confundido com o próprio formato

Page 19: Álgebra Linear Aplicada a Reconhecimento Facial

Capítulo 4. Discussão 16

da cabeça do indivíduo e cause um erro grande. A imagem de controle teve seu cabeloincrementado e foi submetida ao algoritmo de reconhecimento.

Figura 9 – Imagem alvo e sua translação (cabelo)

Figura 10 – Imagem descomprimida e imagem mais próxima (cabelo)

O algoritmo respondeu errado. Como era de se esperar, o algoritmo respondeucom um rosto de uma pessoa com mais cabelo e formato do crânio mais condizente coma imagem alvo. Esse teste mostra a dependência do algoritmo de um pré-processamentoque elimine feições mutáveis como o cabelo ou o penteado de uma pessoa.

4.5 Teste do FocoPara testar a influência da qualidade da câmera e da foto provida como alvo, a

imagem controle foi submetida a um embaçamento suave e foi inserida no algoritmo dereconhecimento. Como a posição das feições não foi alterada e os valores na escala decinza dos pixels não foram drasticamente modificados, é de se esperar um acerto.

O algoritmo respondeu corretamente. A distância entre o alvo e a imagem corretafoi de 5, 47.1014, enquanto a distância para o segundo candidato no reconhecimento foide 1, 02.1017. Pode-se considerar que seria necessário uma câmera muito fora de foco paraafetar negativamente o reconhecimento.

Page 20: Álgebra Linear Aplicada a Reconhecimento Facial

Capítulo 4. Discussão 17

Figura 11 – Imagem alvo e sua translação (foco)

Figura 12 – Imagem descomprimida e imagem mais próxima (foco)

4.6 Teste da AlturaAssim como o teste do zoom, outro teste que leva em conta o posicionamento

relativo da câmera para a imagem alvo do reconhecimento é levar em conta se o centroda imagem está mais alto ou mais baixo. Embora a distância relativa das feições nãose altere, a imagem transladada irá diferir significativamente. A imagem de controle foitransladada para baixo e submetida ao reconhecimento.

Figura 13 – Imagem alvo e sua translação (altura)

O algoritmo respondeu errado. A imagem dada como resposta pelo algoritmo está

Page 21: Álgebra Linear Aplicada a Reconhecimento Facial

Capítulo 4. Discussão 18

Figura 14 – Imagem descomprimida e imagem mais próxima (altura)

de acordo com o posicionamento da imagem alvo, enquanto a imagem correta nem estáentre os 3 melhores candidatos. Nota-se claramente que um pré-processamento que cen-tralize uma informação nas imagens é necessário (como a ponta do nariz). Desse modo,o posicionamento deixa de ser um fator de desvio, já que de todo modo a posição dasimagens foi padronizada.

4.7 Teste da rotaçãoOutro problema de posicionamento que pode ser da câmera ou da própria pessoa

é uma leve inclinação do rosto. Embora em fotos de registro normalmente exija-se umapostura ereta, em situações cotidianas isso pode não ser natural. Para analisar essa possi-bilidade, a imagem controle foi rotacionada e submetida ao algoritmo de reconhecimento.

Figura 15 – Imagem alvo e sua translação (rotação)

O algoritmo respondeu corretamente. Este resultado é contraintuitivo, já que con-traria o resultado do teste da altura na relevância da centralização de uma feição. Entre-tanto, as fotos são muito mais propícias a grandes desvios de posicionamento vertical ehorizontal do que as pessoas são propensas a um desvio angular no pescoço. Portanto, oacerto neste caso se depende ao baixo risco do caso e a baixa amplitude de incidência derotação.

Page 22: Álgebra Linear Aplicada a Reconhecimento Facial

Capítulo 4. Discussão 19

Figura 16 – Imagem descomprimida e imagem mais próxima (rotação)

4.8 Teste da SujeiraPara medir a influência de possíveis poluições visuais na imagem, como uma man-

cha na pele ou um curativo na testa, a imagem controle foi intencionalmente borrada emalguns pontos, inclusive no rosto do alvo, e submetida ao algoritmo de reconhecimento.

Figura 17 – Imagem alvo e sua translação (sujeira)

Figura 18 – Imagem descomprimida e imagem mais próxima (sujeira)

O algoritmo respondeu corretamente. Como a imagem diferiu pouco da imagemcontrole do banco de dados e criou padrões que nenhuma outra imagem do banco de

Page 23: Álgebra Linear Aplicada a Reconhecimento Facial

Capítulo 4. Discussão 20

treinamento possuía, as modificações foram perdidas durante a projeção. Dessa forma, ométodo se mostra resistente a padrões anormais em imagens.

4.9 Teste do Tapa OlhoUma variante do teste do cabelo e do teste da sujeira é uma intervenção significativa

na face da pessoa. Isso pode ser representado por um óculos diferente, uma grande cicatrizadquirida ou a simples necessidade de se vestir como um pirata. A imagem controle recebeuum tapa olho e foi submetida ao algoritmo de reconhecimento.

Figura 19 – Imagem alvo e sua translação (tapa olho)

Figura 20 – Imagem descomprimida e imagem mais próxima (tapa olho)

O algoritmo respondeu corretamente. A imagem controle sofreu uma grande in-tervenção gráfica, diferentemente do teste do cabelo, o padrão inserido na imagem não éapresentado por nenhuma imagem do banco de dados. Isso fez com que essa informaçãofosse perdida, como no teste da sujeira. A distância entre alvo e imagem correta foi de1, 23.1016 e o segundo candidato estava a uma distância de 9, 90.1016, quase dez vezesmaior.

Page 24: Álgebra Linear Aplicada a Reconhecimento Facial

Capítulo 4. Discussão 21

4.10 Teste CombinadoAo inverter a imagem de controle horizontalmente é feita uma combinação das

piores situações possíveis. A posição das feições é alterada e a iluminação é invertida(região de sombra troca de lado). A imagem de controle foi espelhada horizontalmente esubmetida ao algoritmo de reconhecimento:

Figura 21 – Imagem alvo e sua translação (combinado)

Figura 22 – Imagem descomprimida e imagem mais próxima (combinado)

O algoritmo respondeu errado. Inverter a imagem horizontalmente causou umefeito semelhante ao teste da altura, visto que a posição inicial do rosto do alvo estavaligeiramente para direita e depois de espelhada, foi jogada para a esquerda. Consequen-temente o algoritmo respondeu com um rosto que estava mais pro lado esquerdo. Assim,fica ressaltada a grande relevância do posicionamento das imagens como etapa de pré-processamento.

Page 25: Álgebra Linear Aplicada a Reconhecimento Facial

22

5 Conclusão

O algoritmo possui um modelo matemático multidisciplinar e pode ser compreen-dido por qualquer aluno do ciclo básico de engenharia. Entretanto, para que funcione comprecisão satisfatória, é necessário envolver outros algoritmos de processamento de ima-gens como detecção de rosto, contornos e centralização de uma informação padronizadaem todas as imagens.

Os testes indicam que um bom controle do posicionamento das feições corporaisé essencial e deverá melhorar significativamente o desempenho do algoritmo, que nãose mostrou tão vulnerável a modificações na imagem exceto no caso de crescimento decabelo. Para esta situação, deve ser utilizado deteção de bordas para eliminar o cabelo efocar nas feições faciais.

Um problema a considerar é no caso de proximidade da câmera, resultando emampliação da imagem. Não há maneira à priori de decidir se uma imagem está com escalacondizente e portanto, seria ideal padronizar a distância entre a câmera e o alvo, inclusivena geração das imagens do banco de treinamento.

Tendo se saído bem nos testes de brilho, foco, rotação e poluição visual, o algoritmorendeu resultados satisfatórios. Sua implementação poderia ter sido muito menos custosa,pois a biblioteca OpenCV inclui a função PCA totalmente pronta. Entretanto, para finsde aprendizado, houve um esforço de usar poucas funções prontas e implementou-se ma-nualmente maior parte do código presente no apêndice A.

Um dos testes mais significativos foi o de poluição visual com um tapa olho. Nesteteste fica evidente o conceito de projeção e a relevância do desvio estatístico em umespaço amostral. Após a descompressão da imagem, não havia sinal específico de nenhumacessório pirata.

Page 26: Álgebra Linear Aplicada a Reconhecimento Facial

23

APÊNDICE A

� �/* ****************************************************************\[ Algoritmo de Reconhecimento Facial baseado em PCA (Eigenfaces) ]

\**************************************************************** */

5 # include " opencv2 /core/core.hpp"# include " opencv2 / highgui / highgui .hpp"# include " opencv2 / contrib / contrib .hpp"# include <iostream ># include <cstring >

10 # include <cstdio ># include <fstream ># include <sstream >

using namespace std;15 using namespace cv;

/* [ Manual de Referenciasl ] */void Ajuda ();

20 /* Imprime o modo de uso do programa (chamada e argumentos

necessarios) */void PrintVec (Mat*,Size ,int ,int ,const char*,bool);

/* Abre uma janela e mostra a k−esima imagem (coluna k) de X

usando WaitKey(s) */void Treinamento ();

/* Primeiro modo de execucao do programa. Apos chamar

CarregarImagensTreinamento()

25 inicia a funcao FazerPCA() */int CarregarImagensTreinamento (Mat*,Size *);

/* Carrega as imagens de data.txt e retorna a quantidade de

imagens carregadas */void FazerPCA (Mat*,Size ,int);

/* Calcula a media, auto−valores e auto−vetores necessarios para

a projecao e

30 inicia a funcao ArmazenarDadosTreinamento */void ArmazenarDadosTreinamento (int ,Size , Mat*, Mat*, Mat*, Mat *);

/* Armazena em um arquivo binario o numero de autovetores,

dimensao das imagens,

a matriz de projecao, os autovalores, o vetor madio e o banco de

dados ja

projetado no arquivo "resultados" */

Page 27: Álgebra Linear Aplicada a Reconhecimento Facial

Capítulo 5. Conclusão 24

35 void Reconhecimento (char *);/*Segundo modo de execucao do programa.

Carrega a imagem com nome dado e itera Metrica pelos dados. */void ObterDadosTreinamento (int*,Size*,Mat*,Mat*,Mat*,Mat *);

/* Le o numero de autovetores, dimensao das imagens, a matriz de

projecao,

40 os autovalores e o vetor madio do arquivo "resultados" */double Metrica (Mat *,int ,Mat *, Mat *);

/* Retorna a distancia entre o i−asimo vetor coluna de Z e o

vetor y

utilizando a matrica de Malhanobis*/int BuscaVizinhos (Mat *, Mat *, Mat *);

45 /* Utiliza Metrica() para varrer o banco de dados projetado e

imprime

as 3 projecoes mais proximas do vetor dado*/

/* [ Implementacao ] */

50 int main(int argc , char ** argv){

if( argc < 2 ) { Ajuda (); return -1; }if( ! strcmp (argv [1]," treinar ") ) Treinamento ();else if ( ! strcmp (argv [1]," reconhecer ") && argv [2]!= NULL )

Reconhecimento (argv [2]);55 else

{cout << " > Comando desconhecido : " << argv [1] << endl;Ajuda ();

}60 return 0;

}

void Ajuda (){ cout << " > Uso: facerec <comando >\n Comandos validos :\n

treinar \n reconhecer <arquivo >" << endl; }65

void PrintVec (Mat *X, Size dimImg , int col , int time , const char *filename ,bool save)

{Mat temp;int i,j;

70 char exemplo [100];FILE *data; data = fopen("Data/data.txt","r");fscanf (data ,"%d %[^\n]" ,&i, exemplo );temp = imread (exemplo ,0); fclose (data);for(i=0;i< dimImg . height ;i++) for(j=0;j< dimImg .width;j++)

Page 28: Álgebra Linear Aplicada a Reconhecimento Facial

Capítulo 5. Conclusão 25

75 temp.data[i*temp.step+j] = fabs(X->at <double >(i* dimImg .width+j,col));

if(time >=0){

namedWindow ( filename );imshow (filename ,temp);

80 waitKey (time);destroyWindow ( filename );

}if(save) imwrite (filename ,temp);

}85

void Treinamento (){

int nFaces ;Size dimImg ;

90 Mat X;

cout << " > Comecando treinamento do algoritmo ..." << endl;nFaces = CarregarImagensTreinamento (&X, & dimImg );

95 FazerPCA (&X,dimImg , nFaces );

cout << " < Treinamento completo , fim da execucao ." << endl;}

100 int CarregarImagensTreinamento (Mat* X, Size* dimImg ){

cout << " >> Carregando imagens do arquivo data.txt ..." << endl;

Mat tempImg ;105 FILE * listaTreino = 0 ;

char nomeImg [100];int i, j, k, ID , nFaces =0;

if( ( listaTreino = fopen("Data/data.txt","r"))== NULL ) { cout <<" >>> Arquivo ’data.txt ’ nao encontrado !" << endl; exit (1) ;}

110

while( fgets(nomeImg ,100 , listaTreino ) ) nFaces ++;rewind ( listaTreino );

if( nFaces < 2)115 {

printf (" >> Treinamento requer mais imagens .\n >>> Foramencontradas %d\n", nFaces );

exit (1);

Page 29: Álgebra Linear Aplicada a Reconhecimento Facial

Capítulo 5. Conclusão 26

}

120 fscanf ( listaTreino ,"%d %[^\n]" ,&ID , nomeImg );tempImg = imread (nomeImg ,0);dimImg -> height = tempImg .rows;dimImg ->width = tempImg .cols;rewind ( listaTreino );

125

X-> create (dimImg -> height *dimImg ->width , nFaces , CV_64FC1 );

namedWindow (" Carregando ...");for(i=0;i< nFaces ;i++)

130 {fscanf ( listaTreino ,"%d %[^\n]" ,&ID , nomeImg );tempImg = imread (nomeImg ,0);imshow (" Carregando ...",tempImg );waitKey (20);

135 for(j=0;j<dimImg -> height ;j++) for(k=0;k<dimImg ->width;k++)X->at <double >(j* tempImg .step+k,i) = tempImg .data[j* tempImg .

step+k];}destroyWindow (" Carregando ...");fclose ( listaTreino );

140 printf (" << Carregamento completo , %d imagens %dx%d obtidas .\n",nFaces , dimImg ->height , dimImg ->width);

PrintVec (X,* dimImg ,0,-1," rosto1 .png",true);PrintVec (X,* dimImg ,1,-1," rosto2 .png",true);

145 return nFaces ;}

void FazerPCA (Mat *X, Size dimImg , int nFaces ){

150 cout << " >> Comecando analise das componentes principais ... "<< endl;

Mat F, Ft , Z, aVal , aVec , xMed , Y;int i,j;double norm;

155

cout << " >>> Calculando rosto madio ...";xMed. create ( dimImg . height * dimImg .width , 1, CV_64FC1 );for(i=0;i< dimImg . height * dimImg .width;i++){

160 xMed.at <double >(i ,0) = 0;

Page 30: Álgebra Linear Aplicada a Reconhecimento Facial

Capítulo 5. Conclusão 27

for(j=0;j< nFaces ;j++) xMed.at <double >(i ,0) += X->at <double >(i,j);

xMed.at <double >(i ,0) /= nFaces ;}cout << " [OK]" << endl;

165 PrintVec (&xMed ,dimImg ,0,0," rostomedio .png",true);

cout << " >>> Calculando matriz transladada ...";Y. create ( dimImg . height * dimImg .width , nFaces , CV_64FC1 );for(i=0;i< dimImg . height * dimImg .width;i++) for(j=0;j< nFaces ;j++)

170 Y.at <double >(i,j) = X->at <double >(i,j) - xMed.at <double >(i ,0);cout << " [OK]" << endl;PrintVec (&Y,dimImg ,0,0," rostotrans1 .png",true);PrintVec (&Y,dimImg ,1,0," rostotrans2 .png",true);

175 cout << " >>> Calculando auxiliar da covariancia ...";Mat CovAux ;mulTransposed (Y,CovAux ,true ,0,1,-1);cout << " [OK]" << endl;

180 cout << " >>> Resolvendo o Autosistema ...";eigen(CovAux ,aVal ,aVec);transpose (aVec ,aVec);F = Y*aVec;PrintVec (&F,dimImg ,0,0," autovetor1 .png",true);

185 PrintVec (&F,dimImg ,1,0," autovetor2 .png",true);cout << " [OK]" << endl;

cout << " >>> Normalizando a base de autovetores ...";for(j=0;j<F.cols;j++)

190 {for(i=0, norm =0;i<F.rows;i++)

if(fabs(F.at <double >(i,j))>norm) norm=fabs(F.at <double >(i,j));

for(i=0;i<F.rows;i++) F.at <double >(i,j)/= norm;for(i=0, norm =0;i<F.rows;i++) norm +=F.at <double >(i,j)*F.at <

double >(i,j);195 for(i=0, norm=sqrt(norm);i<F.rows;i++) F.at <double >(i,j)/= norm;

}cout << " [OK]" << endl;

200 cout << " >>> Projetando as imagens de treinamento ...";transpose (F,Ft);Z = Ft*Y;cout << " [OK]" << endl;

Page 31: Álgebra Linear Aplicada a Reconhecimento Facial

Capítulo 5. Conclusão 28

205 cout << " >>> Imagem para visualizacao da qualidade dacompressao ." << endl;

Mat xbar;xbar = F*Z;for(i=0;i<xbar.rows;i++) for(j=0;j<xbar.cols;j++){

xbar.at <double >(i,j) += xMed.at <double >(i ,0);210 if(xbar.at <double >(i,j) >255) xbar.at <double >(i,j) = 255;

if(xbar.at <double >(i,j) <0) xbar.at <double >(i,j) = 0;}PrintVec (&xbar ,dimImg ,0,0," descompress1 .png",true);PrintVec (&xbar ,dimImg ,1,0," descompress2 .png",true);

215 ArmazenarDadosTreinamento (nFaces ,dimImg ,&Ft ,&aVal ,&xMed ,&Z);cout << " << Fim do PCA" << endl;

}

void ArmazenarDadosTreinamento (int nFaces ,Size dimImg ,Mat *Ft ,Mat *aVal ,Mat* xM ,Mat *Z)

220 {cout <<" >>> Armazenando dados de treinamento ..." << endl;FILE * dadosFinais ;int i,j;if( ( dadosFinais = fopen(" resultados ","wb"))== NULL ) { cout << "

>>>> Falha no arquivo resultados !" << endl; exit (1) ;}225

fwrite (& nFaces , sizeof ( nFaces ) ,1, dadosFinais );fwrite (& dimImg , sizeof (Size) ,1, dadosFinais );for(i=0;i<Ft ->rows;i++) for(j=0;j<Ft ->cols;j++)

fwrite (&Ft ->at <double >(i,j),sizeof ( double ) ,1, dadosFinais );230 for(i=0;i< nFaces ;i++) fwrite (&aVal ->at <double >(i ,0) ,sizeof ( double

) ,1, dadosFinais );for(i=0;i<xM ->rows;i++) fwrite (&xM ->at <double >(i ,0) ,sizeof ( double

) ,1, dadosFinais );for(i=0;i<Z->rows;i++) for(j=0;j<Z->cols;j++)

fwrite (&Z->at <double >(i,j),sizeof ( double ) ,1, dadosFinais );

235 fclose ( dadosFinais );cout << " <<< Dados armazenados em ’resultados ’!" << endl;

}

void ObterDadosTreinamento (int *nFaces ,Size *dimImg ,Mat *Ft ,Mat *aVal ,Mat *xM ,Mat *Z)

240 {cout << " >> Obtendo resultados do ultimo treinamento ..." <<

endl;FILE *dados;int i,j;

Page 32: Álgebra Linear Aplicada a Reconhecimento Facial

Capítulo 5. Conclusão 29

245 if( (dados = fopen(" resultados ","rb"))== NULL ) { cout << " >>>Arquivo ’resultados ’ nao encontrado !" << endl; exit (1) ;}

fread(nFaces , sizeof (int) ,1,dados);fread(dimImg , sizeof (Size) ,1,dados);cout << " << " << * nFaces << " imagens " << * dimImg << "

utilizadas no ultimo treinamento " << endl;250

Ft -> create (* nFaces ,dimImg -> height *dimImg ->width , CV_64FC1 );aVal -> create (* nFaces ,1, CV_64FC1 );xM -> create (Ft ->cols ,1, CV_64FC1 );Z-> create (* nFaces ,* nFaces , CV_64FC1 );

255

for(i=0;i<Ft ->rows;i++) for(j=0;j<Ft ->cols;j++)fread (&Ft ->at <double >(i,j),sizeof ( double ) ,1,dados);

for(i=0;i<* nFaces ;i++) fread (&aVal ->at <double >(i ,0) ,sizeof ( double) ,1,dados);

for(i=0;i<xM ->rows;i++) fread (&xM ->at <double >(i ,0) ,sizeof ( double ),1, dados);

260 for(i=0;i<Z->rows;i++) for(j=0;j<Z->cols;j++)fread (&Z->at <double >(i,j),sizeof ( double ) ,1,dados);

fclose (dados);}

265

void Reconhecimento (char * arquivo ){

cout << " > Iniciando funcao de reconhecimento ... " << endl;int nFaces , i, j;

270 Size dimImg ;Mat Ft ,Z, xMed , aVal , alvo , proj;

alvo = imread (arquivo ,0);dimImg . height = alvo.rows;

275 dimImg .width = alvo.cols;if(! dimImg . height ){ cout << " >> Carregamento da imagem alvo

falhou !" << endl; exit (1) ;}

ObterDadosTreinamento (& nFaces ,& dimImg ,&Ft ,&aVal ,&xMed ,&Z);

280 cout << " >> Projetando alvo ... ";proj. create ( dimImg .width* dimImg .height ,1, CV_64FC1 );for(i=0;i< dimImg . height ;i++) for(j=0;j< dimImg .width;j++)

proj.at <double >(i*alvo.step+j) = alvo.data[i*alvo.step+j];PrintVec (&proj ,dimImg ,0,0,"alvo.png",false);

285 proj = proj -xMed;PrintVec (&proj ,dimImg ,0,0," alvotrans .png",true);

Page 33: Álgebra Linear Aplicada a Reconhecimento Facial

Capítulo 5. Conclusão 30

proj = Ft*proj;cout << " [OK]" << endl;

290 Mat F, desc;transpose (Ft ,F);desc = F*proj;PrintVec (&desc ,dimImg ,0,0," alvodesproj .png",false);desc = desc + xMed;

295 for(i=0;i<desc.rows;i++){if(desc.at <double >(i ,0) >255) desc.at <double >(i ,0) = 255;if(desc.at <double >(i ,0) <0) desc.at <double >(i ,0) = 0;}

PrintVec (&desc ,dimImg ,0,0," alvodescomp .png",true);

300 int rec; Mat imrec(proj.rows ,1, CV_64FC1 );rec = BuscaVizinhos (&Z,&proj ,& aVal);for(i=0;i<imrec.rows;i++) imrec.at <double >(i ,0) = Z.at <double >(i,

rec);imrec = F*imrec + xMed;for(i=0;i<imrec.rows;i++){

305 if(imrec.at <double >(i ,0) >255) imrec.at <double >(i ,0) = 255;if(imrec.at <double >(i ,0) <0) imrec.at <double >(i ,0) = 0;}

PrintVec (& imrec ,dimImg ,0,0," alvorec .png",true);

310 cout << " > Reconhecimento concluido , fim da execucao . " << endl;}

int BuscaVizinhos (Mat *Z, Mat *proj , Mat *aVal){

315 cout << " >> Buscando imagens mais proximas ... " << endl;int i, c1=0, c2=1, c3 =2;double d, min1 , min2 , min3 , aux;

min1 = Metrica (Z,0,proj ,aVal);320 min2 = Metrica (Z,1,proj ,aVal);

min3 = Metrica (Z,2,proj ,aVal);for(i=3;i<Z->cols;i++){

d = Metrica (Z,i,proj ,aVal);325 if(d<min1) {min3=min2; min2=min1; min1=d; c3=c2; c2=c1; c1=i;}

else if(d<min2) {min3=min2; min2=d; c3=c2; c2=i;}else if(d<min3) {min3=d; c3=i;}

}

330 cout << " >>> Primeiro candidato : " << c1 << " ; Distancia : "<< min1 << endl;

Page 34: Álgebra Linear Aplicada a Reconhecimento Facial

Capítulo 5. Conclusão 31

cout << " >>> Segundo candidato : " << c2 << " ; Distancia : "<< min2 << endl;

cout << " >>> Terceiro candidato : " << c3 << " ; Distancia : "<< min3 << endl;

return c1;}

335

double Metrica (Mat *X, int col , Mat *y,Mat *S){

int i;340 double D=0;

for(i=0;i<X->rows;i++) D+= pow(X->at <double >(i,col)-y->at <double>(i ,0) ,2)*S->at <double >(i ,0);

return D;}� �

Page 35: Álgebra Linear Aplicada a Reconhecimento Facial

32

REFERÊNCIAS

LIMA, Elon Lages. Álgebra Linear. 8. ed. Rio de Janeiro: IMPA, 2012.MAGALHÃES, Marco N. Probabilidade e Variáveis Aleatórias. 3. ed. São Paulo:Editora da Universidade de São Paulo, 2013.MOON H., PHILLIPS P.J. Computational and Performance aspects of PCA-based Face Recognition Algorithms. Perception, Vol. 30, 2001, pp. 303-321TURK, M., PENTLANDO A. Eigenfaces for Recognition. Journal of Cognitive Neu-rosicence, Vol. 3, No. 1, 1991, pp. 71-86