DACOSTALONDEROMARÇAL2008Relatório

De Wiki DAINF
(Diferença entre revisões)
(Nova página: <center>UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ</center> <center>CAMPUS CURITIBA</center> <center>CURSO DE ENGENHARIA DE COMPUTAÇÃO</center> <center>RICARDO FANTIN DA COSTA<...)
 
Linha 207: Linha 207:
 
== ESTRUTURA ==
 
== ESTRUTURA ==
 
Este texto é composto por seis capítulos. Este primeiro caracteriza uma introdução ao tema e à nossa proposta de implementação de um sistema de reconhecimento de expressões. Definimos também o porquê nós estamos fazendo esse projeto, onde queremos chegar e o método de estudo que estamos adotando. No próximo capítulo serão apresentados os conceitos que definem a área de Visão Computacional e de Processamento de Imagens, bem como sua teoria e seus conceitos matemáticos de manipulação de matrizes de imagens, tais como: operações aritméticas e lógicas entre matrizes, operações de convolução com operadores matriciais (denominados máscaras), histogramas que indicam percentagens de tons de cor em uma imagem e os diversos tipos de operadores diferentes que produzem matrizes distintas para posterior tratamento. O terceiro capítulo trata de programas produzidos por terceiros que realizam algum tipo de processamento de imagens. Faremos a análise destes programas e mostraremos se os resultados que eles produziram para nós foram satisfatórios ou não. Já no quinto capítulo, demonstraremos tudo sobre o que foi feito por nós em termos práticos e tudo o que ainda pretendemos ainda construir no nosso projeto. No sexto capítulo deixaremos à mostra os resultados obtidos da nossa implementação e a análise destes resultados. Por fim, no sétimo capítulo refletiremos qualitativamente sobre o projeto realizado, tanto sobre suas partes quantitativas como, também, suas partes qualitativas.
 
Este texto é composto por seis capítulos. Este primeiro caracteriza uma introdução ao tema e à nossa proposta de implementação de um sistema de reconhecimento de expressões. Definimos também o porquê nós estamos fazendo esse projeto, onde queremos chegar e o método de estudo que estamos adotando. No próximo capítulo serão apresentados os conceitos que definem a área de Visão Computacional e de Processamento de Imagens, bem como sua teoria e seus conceitos matemáticos de manipulação de matrizes de imagens, tais como: operações aritméticas e lógicas entre matrizes, operações de convolução com operadores matriciais (denominados máscaras), histogramas que indicam percentagens de tons de cor em uma imagem e os diversos tipos de operadores diferentes que produzem matrizes distintas para posterior tratamento. O terceiro capítulo trata de programas produzidos por terceiros que realizam algum tipo de processamento de imagens. Faremos a análise destes programas e mostraremos se os resultados que eles produziram para nós foram satisfatórios ou não. Já no quinto capítulo, demonstraremos tudo sobre o que foi feito por nós em termos práticos e tudo o que ainda pretendemos ainda construir no nosso projeto. No sexto capítulo deixaremos à mostra os resultados obtidos da nossa implementação e a análise destes resultados. Por fim, no sétimo capítulo refletiremos qualitativamente sobre o projeto realizado, tanto sobre suas partes quantitativas como, também, suas partes qualitativas.
 +
 +
= PROCESSAMENTO DE IMAGENS PARA RECONHECIMENTO DE EXPRESSÕES =
 +
== Visão Computacional ==
 +
Conforme os sistemas de aquisição analógica de imagens (que basicamente convertem uma imagem real em uma seqüência de binários para interpretação computacional) foram se desenvolvendo nas últimas décadas surgiu-se a necessidade de processar logicamente os atributos e as características dessas imagens. Isso se deu pela incrível possibilidade de atribuir tarefas enfadonhas de análise de situações do meio e de objetos específicos, por parte dos seres humanos, a uma máquina que faz operações lógicas ótimas em termos de segurança e velocidade. No mundo industrial, por exemplo, é interessante a idéia de automatizar procedimentos referentes a controle de qualidade dos produtos e de montagem destes. Na vida cotidiana, seria conveniente possuir um sistema robótico locomotivo que transportasse objetos quaisquer de um ponto a outro e que evitasse obstáculos a tempo real. Criar robôs eficientes em explorar ambientes diversos, especialmente aqueles que oferecem dificuldade de acesso humano, também é uma das propostas ocorrentes. Enfim, investir intelectualmente na área de visão computacional pode facilitar a vida humana nas mais diversas tarefas.
 +
 +
Como foi mencionado na secção anterior, o desenvolvimento de um sistema automático de reconhecimento de expressões faciais pode inovar muito na área de interação entre ser humano e máquina, podendo tornar esta interação mais intuitiva, natural e acessível para as pessoas. Em termos práticos, pelo fato de as expressões faciais desempenharem um papel fundamental na comunicação e na transmissão de valores e de conhecimento, seria interessante integrar sistemas inteligentes de reconhecimento de expressões a softwares de comunicação e de relacionamento via internet. Isso melhoraria muito a expressividade das mensagens enviadas pelas pessoas que os utilizam.
 +
 +
Para otimizar o desenvolvimento de um sistema de reconhecimento de expressões é comum separar esta proposta em partes, a fim de que se possa melhor entender o processo daquilo se quer projetar. A primeira etapa é a aquisição da imagem que se deseja analisar, partindo da imagem do mundo real. Para fins de simplicidade, consideraremos apenas imagens que contenham rostos normalizados, isto é, que não estejam rotacionados demasiadamente em relação ao plano da imagem, e que a iluminação sobre o rosto não seja heterogênea. A segunda etapa é a de pré-processamento, na qual são aplicados filtros de eliminação de ruído na imagem. Feito isso é realizada a etapa de segmentação, em que é realizada a análise dos níveis de cor da imagem com a finalidade de detectar os componentes do rosto. Após a detecção, são extraídas sub-imagens da imagem em questão que contenham os elementos faciais detectados. Por fim, na quarta e última etapa que é denominada classificação, uma identificação automática de cada nova imagem extraída é realizada, produzindo saídas textuais que referentes às imagens correspondentes.
 +
 +
[[Image:]]
 +
 +
<center>Figura 1: ''Etapas do processo de reconhecimento de imagens''</center>
 +
 +
Um sistema como esse emprega conceitos e definições oriundas da área de Visão Computacional e de Processamento de Imagens. Demonstraremos inicialmente qual os atributos de uma imagem digital e, depois, como ela é manipulada a fim de extrair dela características e detalhes que nos convém.
 +
 +
Primeiramente, uma imagem digital é uma tabela de números. Esta tabela é denominada de matriz de imagem, e os elementos contidos nela são definidos como pixels, cuja termologia em inglês é picture element (em português, elemento de imagem). A matriz e seus elementos determinam apenas o tamanho da imagem e sua resolução, que é a quantidade de pixels que compõem a imagem. O que determina o conteúdo da imagem são os valores numéricos de intensidade luminosa que os pixels assumem, e estes valores estão inseridos em um intervalo chamado banda ou faixa de pixels. Conforme o tipo de imagem que se queira trabalhar são utilizados diferentes tipos de valores representativos de intensidade luminosa. Se é desejado trabalhar com imagens coloridas é conveniente adotar três números para cada pixel, cada um referindo-se ao nível de intensidade de vermelho, verde ou azul (tipo de dado RGB para cor). Mas como queremos manipular apenas imagens compostas de tons de cinza (monocromáticas), já que o seu uso é suficiente para detecção de bordas e aquisição de componentes de interesse da imagem, é viável atribuir apenas um número que relaciona determinados níveis de cinza para cada elemento da matriz de imagem. O processo analógico de determinação do tamanho da matriz e da quantidade de elementos que ela contém é chamado de discretização espacial, enquanto que o processo de definição de números aos elementos da matriz é chamado de discretização em amplitude. Após a conclusão de ambos os processos, a imagem, ou melhor, a matriz de pixels, poderá então ser armazenada, possibilitando ser posteriormente manipulada e analisada. Para o armazenamento são utilizadas ferramentas eletrônicas usuais de armazenamento de dados binários, tais como: fitas magnéticas (disco rígido ou disquete), discos ópticos (cd ou dvd), cartões de memória e pen drives. Para manipulação e análise dos dados referentes à imagem são utilizados os recursos computacionais que as linguagens de programação oferecem, tais como C / C++, Pascal e Java por exemplo.
 +
 +
Os algoritmos de tratamento de imagens são baseados em estruturas de repetição e de decisão que as linguagens de programação oferecem. Para tratar todos os valores de intensidade luminosa que os elementos da matriz de imagem assumem basta percorrer os elementos com comandos de repetição (que em C / C++ e em Java são invocados com as palavras-chave for, while e do-while), e, se necessário, realizar ações que estejam em função do valor encontrado, utilizando comandos de decisão (que em C / C++ e em Java são invocados com a palavra-chave if e switch, que realizam testes lógicos de verdadeiro ou falso).
 +
 +
O primeiro passo de projeto de um programa que manipule imagens é escrever um código que realize a aquisição da imagem (que pode ser a imagem real ou a digital) e que crie uma tabela de números, matriz de imagem, que corresponda a essa imagem adquirida. Como já foi dito, esse processo possui duas etapas que são chamadas de discretização espacial (criação da matriz bidimensional) e de discretização em amplitude (atribuição de valores numéricos aos elementos da matriz). Com isso, podem ser realizadas operações a esta matriz ou entre esta matriz e uma outra, ou ainda, entre esta matriz e um número escalar, produzindo uma nova imagem, cuja matriz é denominada matriz destino. As operações que podem ser realizadas são divididas em dois grupos: o de operações aritméticas e o de operações lógicas. Operar aritmeticamente duas matrizes significa realizar alguma das quatro operações básicas (adição, subtração, multiplicação ou divisão) entre duas matrizes, calculando com os elementos correspondentes de uma matriz e outra, implementando um devido mecanismo de tratamento de valores que excedem a banda de luminosidade adotada. Operações lógicas são realizadas em imagens binárias, que podem ser adquiridas a partir da conversão de matrizes de valores numéricos de cor em matrizes binárias. Elas são fundamentadas por quatro operadores: AND (“e”), OR (“ou”), XOR (“ou exclusivo”) e NOT (“negação, complementar”); e elas são implementadas de acordo com as leis da Lógica Proposicional. A seguir são apresentadas figuras que demonstram os resultados de operações lógicas entre dois elementos de duas matrizes binárias e de uma operação lógica em apenas um elemento de uma matriz binária:
 +
 +
[[Image:]]
 +
 +
Após a aquisição da imagem é realizada a etapa de pré-processamento. Esta tem como função melhorar a qualidade da imagem, filtrando parte dos dados e mantendo parte da estrutura original para os processos seguintes. A imagem capturada pode ter diversas fontes de imperfeições tais como contraste e brilho inadequados devido à iluminação do ambiente ou devido à má qualidade do dispositivo de aquisição analógica da imagem. Antes de estudar esta etapa, faz-se necessário apresentar um pouco do conhecimento de histogramas e de operações de convolução de máscaras sobre uma imagem.
 +
 +
Freqüentemente quando se processa uma imagem a fim de extrair algum elemento importante dela é preciso tomar a decisão de rejeitar alguns tons de cor pertencentes a uma certa faixa de intensidade luminosa e manter outros. A análise da percentagem que cada nível de cor assume em uma determinada imagem, a qual é facilitada através de um gráfico chamado histograma, é um jeito de estimar o nível de cor que definirá um “degrau”. Este “degrau”, cuja técnica de obtê-lo chama-se thresholding (que em português significa: determinar o nível em que algo começa a acontecer), é muito útil em criar matrizes binárias da imagem além de proporcionar tecnicamente a possibilidade de detecção de bordas. Na figura abaixo é apresentada uma imagem com vários tons de cor e na página seguinte está sua correspondente quando é aplicada a técnica de thresholding, ainda nesta página é mostrado o histograma da imagem de valores diversos.
 +
 +
[[Image:]]
 +
 +
 +
[[Image:]]
 +
 +
Para que se possam detectar as bordas de um objeto ou passar filtros na imagem com o objetivo melhorar sua qualidade são utilizados operadores matriciais chamados máscaras. As máscaras são, como as matrizes de imagem, tabelas de números, cujo tamanho deve ser menor que o da matriz de imagem em que se deseja manusear. Para aplicá-las devemos antes espelhar os seus valores com relação aos eixos horizontal e vertical (tomando como a origem o elemento central da tabela de números que identifica a máscara), o que significa apenas mudar os valores numéricos de posição de maneira simétrica a ambos os eixos. Na imagem em que queiramos usar as máscaras devemos calcular o resultado da operação da máscara espelhada para cada elemento da matriz de imagem. A operação que é feita entre a máscara espelhada e um elemento da matriz de imagem é efetivada tomando-se como referência uma correspondência entre o elemento central da máscara (origem dos eixos já mencionados) e o elemento da matriz de imagem que se está realizando a operação. Depois de esclarecida esta correspondência, podemos afirmar que a operação é o somatório da multiplicação de cada elemento da matriz da máscara com cada elemento correspondente da matriz de imagem, sendo que estes elementos podem compor o próprio elemento representativo da origem e seus vizinhos ou, conforme o número de valores no qual a máscara é composta (tamanho da matriz que identifica a máscara), o próprio elemento representativo da origem unido com seus vizinhos e com os elementos adjacentes a estes. Partindo deste processo é produzido um novo elemento, que será atribuído a uma matriz destino, cujo valor indica algum tipo de gradiente evidenciador de um ponto, uma linha ou uma borda pertencentes a um determinado objeto (este tipo de gradiente depende do tipo de máscara que se adota). Para os casos em que um elemento da máscara não corresponde a um elemento da matriz de imagem pode-se adotar um valor nulo ou um valor que é igual ao do elemento adjacente que define o limite ou a borda da imagem. A seguir, apresentaremos alguns operadores e suas utilidades.
 +
 +
Os filtros passa-alta são operadores de convolução (máscaras) que realçam as bordas. Este filtro percorre a imagem original aplicando a seus elementos a seguinte matriz:
 +
 +
[[Image:]]
 +
 +
Assim a intensidade da cor do pixel central será a média entre ele mesmo e seus 8-vizinhos, mas se a diferença entre seu velho valor e seu novo valor for mais alta que um valor fixo, podemos decidir não mudar o valor, atenuando assim as bordas e suavizando as demais regiões.
 +
 +
Um método para destacar as bordas é adquirir gradientes indicadores de mudanças bruscas de intensidade luminosa ou de tons de cor. Pode-se fazer isso utilizando os seguinte operadores de convolução que compõem o chamado filtro de Sobel:
 +
 +
[[Image:]]
 +
 +
[[Image:]]
 +
 +
Depois de analisar a diferença de intensidade em uma linha nós precisamos saber o ponto onde a variação de intensidade é máximo. O gráfico a seguir representa a variação de intensidade de cores em uma região da imagem:[[Image:]]
 +
 +
 +
Nós estamos procurando exatamente o ponto em que a variação de intensidade é máximo, esse ponto é o zero da segunda derivada da função:[[Image:]]O Filtro de Laplace procura diretamente por essa segunda derivada. O funcionamento é mais simples que o Filtro de Sobel, pois só passa uma máscara.
 +
 +
<center>[[Image:]][[Image:]]</center>
 +
 +
<center>[[Image:]][[Image:]]</center>
 +
 +
<center>Filtro de Laplace implementado no GIMP.</center>
 +
 +
 +
Com uma boa calibração do valor de degrau (threshold) que define a partir de qual intensidade um ponto é definido como uma borda. O Filtro funciona bem para imagens de alta definição, mas não encontra as bordas bem para outras imagens, porque é muito sensível a ruídos.
 +
 +
O filtro de Gauss é uma máscara de convolução com o objetivo de remover ruídos. Neste sentido seu funcionamento é muito parecido com o Filtro da Média mas com uma matriz representando uma distribuição Gaussiana.
 +
 +
A Gaussiana é a função que melhor representa a distribuição de um evento e é útil pois pode ser usada para tratamento de eventos paralelos e outras operações estatísticas e pode ser manipulada com matemática simples porque é uma função exponencial. A fórmula da equação gaussiana  média zero e desvio padrão σ é definida como em uma dimensão como:
 +
 +
<center>[[Image:]]</center>
 +
 +
<center>Já em duas dimensões é definida como:</center>
 +
 +
<center>[[Image:]]</center>
 +
 +
Em tese a curva é positiva em qualquer ponto, então nossa matriz para considerar até mesmo os pontos mais distantes, mas na prática após três ou quatro desvios padrão o valor do ponto da mascará se torna zero o que nos permite deixar a mascará com tamanho limitada a esse tamanho. Uma mascará com o sigma da função sendo 1,4 é:
 +
 +
[[Image:]]
 +
 +
Canny Edge Detection é o algoritmo que é usado no reconhecimento de bordas do OpenCV, devido a sua grande complexidade não poderíamos apresenta-lo sem antes ter mostrado algoritmos mais fáceis. Esse processo é dividido em 5 etapas:
 +
 +
Primeiro usa-se o Filtro Gaussiano para minimizar o ruído.
 +
 +
Depois de diminuir o ruído aplica-se o Filtro de Sobel para saber a direção e a magnitude de todos os pixels da imagem. A direção dos pixels nesse algoritmo é arredondado para uma das quatro direções 0°, 45°, 90° ou 135°.
 +
 +
O Canny Edge precisa de dois valores de degrau (threshold)  obtidos estatisticamente um para classificar um vértice e um para classificar borda. Os vértices tem uma diferença de intensidade muito grande, as bordas tem uma diferença de intensidade intermediária, mas pontos apenas são classificados como bordas se estiverem ligando dois vértices.
 +
 +
A direção da intensidade sempre é perpendicular à borda, entre todas os pixels que compõem uma borda é encontrado o com maior diferença de intensidade em relação aos vizinhos.
 +
 +
Combinando varias técnicas esse filtro consegue encontrar muito bem os vértices sem acursar muitos falsos negativos, além da precisão da localização destes vértices. Cada vértice só separa duas regiões, os vértices nunca são classificados como o encontro de três bordas, por exemplo.
 +
 +
[http://www.pages.drexel.edu/%7Eweg22/can_tut.html http://www.pages.drexel.edu/~weg22/can_tut.html]
 +
 +
Neste processo que encontra rotação do Rosto, mas não faremos isto.
 +
 +
Segmentação: A segmentação encontra as regiões de interesse na imagem e depois subdivide essas regiões em outras partes mais específicas. Esta etapa é a mais difícil porque tem que lidar diretamente com diversas fontes de variabilidade como a diferença de iluminação e a rotação do objeto procurado e ela se comunica com todas as outras etapas seguintes, se essa etapa falhar o processo inteiro falha.
 +
 +
Modelo de Hidden Markov (HMM): O modelo de hidden makov propõem um método para encontrar padrões. Já existiu uma implementação deste algoritmo no OpenCV, mas foi abandonada. O HMM é usado em sistemas de reconhecimento de voz atuais. Pode-se usar essa técnica para dividir o rosto em diversas regiões.
 +
 +
As características faciais apresentam um elevado grau de variabilidade de pessoa a pessoa, ou até mesmo na mesma pessoa que pode deixar de se barbear.Na imagem isso se refletirá em forma, cor, movimento, textura e configuração espacial. A técnica Cascade Haar Wavelets tenta resolver todos esses problemas e pode ser usada tanto na segmentação quanto na classificação de imagens.
 +
 +
== Extração de Características ==
 +
A extração de características esta fortemente ligada à etapa de classificação, aqui apresentamos duas técnicas, a primeira é a análise de um contorno que pode ser usada para encontrar pontos e distâncias entre pontos importantes da região destacada pela segmentação e a segunda é voltada para reconhecimento de objetos. Depois de retirar o contorno com algum filtro (ver tópico 2.2) podemos analisá-lo para obter o pixel em algum extremo, ou achar a inclinação da curva em algum ponto ou podemos achar a reta que melhor represente alguma parte da curva ou ainda poligonalizar alguma região.
 +
 +
Pixels conectados: Diversos algorítimos de processamento de baixo nível usam o valor de seus pixels vizinhos, os dois modelos mais usados de vizinhos são os 4-vizinhos e 8-vizinhos.
 +
 +
<div align="right">[[Image:]]</div>
 +
 +
O pixels em cinxa são os 4 vizinhos do pixel do meio, o conjunto formado pelos pixels em cinza e os em preto formam os 8 vizinhos do pixel central.
 +
 +
Representação de contornos de Freeman: Ao invés de representarmos algum contorno como uma matriz booleana onde o contorno são os valores true e os outros são false, como na imagem da esquerda, podemos fazer a representação como uma lista de números que representam a direção do próximo pixel.
 +
 +
<center>[[Image:]][[Image:]] </center>
 +
 +
Deste modo o contorno exibido anteriormente seria representado por um array de bytes com os seguintes dados 34445690007654443. Com o contorno no modelo de Freeman a derivada e outras operações são definidas e podem ser usadas para analisar a imagem.
 +
 +
Haar Cascade Wavelets: Paul Viola e Michael Jones desenvolveram essa técnica para reconhecimento de objetos em tempo real. Originalmente era usado um SVM como última etapa do reconhecimento, hoje ela foi melhorada e usa o algoritmo adaboost para obter uma melhor classificação. Em comparação com as outras técnicas está não detecta objetos parcialmente fora da imagem ou rotacionados. No reconhecimento de objetos é necessário percorrer toda a imagem e verificar se uma região é o objeto procurado. Para fazer a pesquisa de maneira eficiente deve-se usar o classificador que elimine o maior número de regiões primeiro, para depois checar pontos mais específicos. Depois de converter a imagem para tons de cinza, compara a diferença de intensidade de regiões adjacentes seguindo um classificador gerado usando fourier e wavelets, se passar pela classificador a região é um objeto procurado.
 +
 +
Cascata de Haar: É buscado regiões em toda a imagem e com diversos tamanhos. Para calcula a diferença de intensidade de retângulos adjacentes calcula-se a integral de imagem, que permite verificar a soma da intensidade de uma região com apenas quatro acessos a memória, uma soma, e duas diferenças. Se quisermos verificar a diferença de intensidade de duas regiões adjacentes não precisamos calcular a intensidade das duas e depois subtrair, é possível conseguir isso com apenas seis referências à memória.
 +
 +
Integral de Imagem: Para fazer a soma das intensidades de forma rápida utiliza-se de uma representação intermediária da imagem. O ponto genérico (x,y) desta imagem esta definido como a soma das intensidades das cores de todos os pixels acima e a esquerda do ponto (x,y). Então para calcular a soma das intensidades de uma área qualquer usa-se a fórmula:
 +
 +
<center>[[Image:]]</center>
 +
 +
<center>'''Setor D = D – B – C + A'''</center>
 +
 +
 +
Haar: Haar é uma função definida como:
 +
 +
<center><nowiki>f(x) = {1, se 0 <= x < 0,5</nowiki> <nowiki>-1, se 0,5 <= x < 1,</nowiki></center>
 +
 +
<center>0, para outros valores de x}</center>
 +
 +
A transformada de Haar é um caso particular da transformada discreta de wavelets. Na análise da imagem o haar representa diferença de intensidade de regiões.
 +
 +
<center>[[Image:]]</center>
 +
 +
Tilted Haar: Lienhart e Maydt propuseram uma integral de imagem para calcular a diferença de intensidade de retângulos rotacionados 45°.
 +
 +
Cascade: Depois de percorrer todas as regiões em x e y, aumenta-se o tamanho da região procurada e percorre toda a imagem novamente. O redimensionamento da imagem é demorado, então usa-se a representação da integral de imagem para analisar retângulos maiores, já que nesta representação o tamanho do retângulo analisado não varia o tempo de processamento.
 +
 +
Wavelets: A transformada de Fourier é usada para determinar um padrão adaptando uma curva à um modelo. Com o surgimento dos computadores e o uso das séries de fourier, notou-se que não é necessário analisar todas as freqüências para obter um resultado satisfatório, wavelets é a técnica que classifica as freqüências mais importantes para a análise em questão.
 +
 +
AdaBoost: AdaBoost é o algoritmo usado no classificador para verificar se um conjunto de diferenças de intensidade está dentro do padrão ou não. O criador Michael Kerns acreditava que é possível criar um classificador preciso a partir de muitos classificadores menos eficientes. O classificador é dividido em diversos estágios que são os classificadores menores. Em cada estágio tem-se uma seqüência de análises. Estas, por sua vez, verificam a diferença de intensidade de retângulos valorados e compara essa diferença com a propriedade threshold. Se a diferença de intensidades for maior que o threshold então ao valor do estágio é somado a propriedade right_value, se a diferença for menor adiciona-se ao valor do estágio o left_value. No final de cada estágio compara-se o valor acumulado com a propriedade stage_threshold. Se o valor acumulado for maior, então o algoritmo vai para o próximo estágio. Os primeiros estágios devem remover o maior número possível de candidatos a imagens e cada estágio subseqüente eliminar cada vez menos para o sistemas ser eficiente.
 +
 +
== Classificação ==
 +
O significado das expressões faciais mudam de cultura para cultura. Um trabalho para construção um dicionário de expressões para culturas distintas baseado em pesquisas caracterizou apenas sete expressões faciais universais: felicidade, tristeza, surpresa, raiva, medo, desprezo e desaprovação. No trabalho de Ekman é proposto um método de descrever o rosto e o segundo trabalho selecionou os pontos mais importantes para o reconhecimento das expressões faciais e usou uma rede neural para classificar os dados retirados nas expressões faciais universais.
 +
 +
Paul Ekman e W. V. Friesen desenvolveram em 1970 um método para análise e descrição do rosto chamado Sistema de Código de Ações Faciais (Facial Action Coding System - FACS). Eles examinaram como a contração de cada músculo mudam a aparência da face para identificar o melhor método de diferencia-los. O FACS usa as unidades de ação (action units - AU) e não músculos, por dois motivos: primeiro porque a mudança de alguns músculos não podia ser facialmente distinguida, então alguns músculos foram combinados em apenas um AU e, segundo, devido a diferença de comportamento de um mesmo músculo que é portanto representado por várias unidades de ação. O modelo retorna um valor de magnitude para cada uma das 44 unidades de ação e estas são descritas pela sua anatomia e não pelo seu teor psicológico, essa característica torna o modelo mais abrangente para outras áreas como atores e desenvolvedores de animações gráficas.
 +
 +
O método de Kobayashi e Hara utiliza o pontos característicos da face  (Facial Caracteristic Points - FCP) que são uma simplificação do FACS, pois considera apenas pontos relativos aos olhos, sobrancelhas e a boca. As outras regiões do FACS que são os pontos da orelha, da testa e do queixo não são levados em consideração porque segundo os pesquisadores as pessoas só levam em consideração a posição e a abertura dos olhos, sobrancelhas e da boca para classificar as expressões faciais.
 +
 +
 +
<center>[[Image:]]</center>
 +
 +
<center>'''Os 30 pontos característicos selecionados Kobayashi e Hara e as linhas de Hara.'''</center>
 +
 +
Na figura da página anterior com os 30 pontos característicos da face. As linhas verticais são chamadas linhas de Hara (haralines). A posição na coordenada x de todos os pontos são baseados nos pontos a1, a2, a3, a4 (cantos dos olhos), a19 e a20 (cantos internos das sobrancelhas) que determinam as linhas de Hara. Esta propriedade faz o posicionamento dos FCP semi-automático.
 +
 +
= SOFTWARES DE VISÃO COMPUTACIONAL =
 +
A pesquisa de softwares se concentrou em softwares que implementam reconhecimento de expressões faciais.Como não existe nenhum software livre (OSS - Open Source Software) que implemente esta função, utilizamos o sistema de pesquisa do SourceForge - um site que oferece serviços para desenvolvimento de software livre - para encontrar softwares com funções sobre visão computacional de código aberto. Os softwares Ares e Faint são softwares de origem alemã, então a pesquisa se expandiu para o BerliOS - um sistema para auxílio de projetos OSS alemão similiar ao SourceForge. Com isso a pesquisa abrangeu a grande maioria dos softwares livres e provavelmente encontrou todos os softwares livres relevantes sobre visão computacional.
 +
 +
Nenhum softwares livre implementa a função de reconhecimento de expressões faciais, a maioria deles faz o reconhecimento de pessoas. O modelo proposto de análise dos softwares permite encontrar quais partes de cada software podem ser reaproveitados e escolher de maneira ampla o melhor caminho.
 +
 +
O Ares e o Malic implementam reconhecimento de pessoas, o primeiro armazena em um banco de dados as informações para reconhecer grupos de pessoas e o segundo é para permitir acesso ao computador para apenas pessoas autorizadas. O Java OpenCV Match e o OpenCV Java API são uma interface para acessar as funções do OpenCV do java, em anexo no final da monografia há uma explicação de como implementar o JNI para fazer essa interface. Os softwares com funções mais próximas do nosso objetivo são o Visage, o Faint e o OpenCV.
 +
 +
O Visage é distribuído para uso apenas acadêmico e usa muitos softwares não livres, entre eles o Java Media Framework e um pacote de análise geometria analítica que precisou ser refeito apartir do arquivo ".jar" distribuído para poder compilar o software. Além disso não funcionou quando testado, mas podemos analisar a implementação do software já que o código e a monografia do trabalho de conclusão de curso estão disponíveis no SourceForge. O software encontra o rosto em quatro etapas: eliminação de regiões negativas com Haar, encontro da pupila nas regiões filtradas no estágio anterior, encontra os vértices dos olhos para com uma SVM verificar se a região representa um rosto e por último segue os vértices dos olhos para conseguir acompanhar a rotação do rosto.
 +
 +
<center>[[Image:]]</center>
 +
 +
<center>'''Figura1: Os quadrados usados pelo haar do software visage.'''</center>
 +
 +
Os olhos da imagem analisada ficam sobre as superfícies S1 e S3, a intesidade de cor da superfície S1 deve ser menor que a das superfícies S2 e S4 e a intensidade da região S3 deve ser menor que a da região S2 e S6 para a região passar da primeira etapa. Para passar da segunda etapa deve ser encontrado uma pupila nas regiões S1 e S3. A próxima etapa é encontrar os vértices dos olhos e verificar com a SVM se são olhos realmente, uma SVM pode ser treinada para dividir entradas em grupos de entradas certas ou erradas. Aproveitando ainda a posição dos vértices o quarto estágio segue esses vértices para verificar a rotação do rosto nos próximos quadros.
 +
 +
A Interface de Anotações de Rostos (The Face Annotation Inteface – FAINT) usa o opencv ou um webservice para determinar a posição dos rostos e depois cria uma base de dados dos rostos conhecidos. A apresentação do software foi feita com muito cuidado e cada função do programa pode ser configurada de diferentes maneiras. A interface com o OpenCV usa o método exposto no apêndice, então não precisa instalar nenhuma biblioteca. O reconhecimento dos rostos tem como principal argumento de entrada o tamanho mínimo do rosto procurado e se usará um filtro adicional que leva em consideração as cores do rosto para o reconhecimento. Um webservice é um protocolo de comunicação de programas pela internet baseado principalmente em arquivos XML, o FAINT usava um webservice não mais disponível que podia detectar a rotação do rosto com apenas uma imagem. A última função implementada é o reconhecimento de rostos usando o algorítmo EigenFace-Recognition. O diferencial do FAINT é a implementação do filtro adicional de reconhecimento de rostos baseados na cor e não apenas na forma.
 +
 +
== OpenCV ==
 +
A Biblioteca Aberta de Visão Computacional (OpenCV – Open Computer Vision Library) é uma coleção de mais de trezentas funções que implementão os algoritimos mais comuns e populares sobre visão computacional. O OpenCV foi feito pela Intel e usa a licença Intel License Agreement que é compatível com a licença FreeBSD. O código usa a biblioteca fechada licenciada pela Intel chamada Princípios Integrados de Performance (Intel® Integrated Performance Primitives – IPP) quando o sistema esta rodando com Chips Intel e Windows, se ele não estiver, existe uma implementação livre. A maioria dos programas analisados usa essa biblioteca e ela tem muita documentação, por isso a escolhemos para o desenvolvimento do nosso software. Os artigos e trabalhos sobre reconhecimento de expressões faciais não abordam etapas de baixo nível do funcionamento de seus softwares, aqui descreveremos o necessário sobre a organização e as convenções utilizadas no OpenCV para depois apresentar uma explicação detalhada de como foi implementado o algoritmo Haar Cascade Wavelets em nível de código.
 +
 +
As funções do OpenCV estão divididas em quatro bibliotecas: cxcore, cv, highgui e cvcam. O higgui e o cvcam são responsáveis por obter imagens do sistema de arquivos do computador ou da camera e para isso devem ter uma implementação em sistemas Unix e outra em Windows. Em cxcore estão definidos as estruturas de dados e funções primitivas de processamento de imagem. E na biblioteca cv estão implementadas as funções de alto nível para análise de imagens.
 +
 +
Algumas siglas são colocadas no nome das funções indicando alguma característica normalmente de classificação. As funções internas do arquivo tem o prefixo icv, já as funções externas usam o prefixo cv. Algumas funções apresentam a palavra hid indicando que a função é um algoritimo voltado para melhor performance.
 +
 +
== CVHaarClassifier ==
 +
A primeira função chamada é a cvHaarDetectObjects que recebe principalmente uma imagem, um arquivo XML que é o classificador, uma flag indicando se deve usar o CannyEdge para eliminiar regiões com muitos ou poucos vértices, um fator de escala, o menor tamanho de objeto à procurar e o número da visinhança mínima. Depois de muitas verificações para evitar argumentos negativos e tentar abrir a imagem e o classificador XML, a função cvSetImagesForHaarClassifierCascade é chamada e tem como objetivo criar as estruturas para processar a imagem. Depois disso três loop's varem a imagem com diversos retângulos de tamanhos cada vez maiores em diversas coordenadas (X,Y) e em cada coordenada chama a função cvRunHaarClassifierCascade. Esta função analisa se o trecho de imagem se adapta ao classificador XML.
 +
 +
== Estrutura do classificador Haar XML ==
 +
<nowiki>A características dos objetos reconhecidos ficam armazenados em um arquivo xml. Arquivos xml são um modelo de guardar dados de modo que seja fácil implementar um algoritmo para lê-los depois. O formato dos dados são definidos por etiquetas entre os sinais de menor e maior - "<etiqueta>" - agrupados em uma estrutura de árvore. Como o classificador consiste de vários estágios e cada estágio é composto por várias análises e cada análise faz a verificação com vários retângulos, então o formato se encaixa muito bem para representar o classificador. </nowiki>
 +
 +
 +
<nowiki><treinamento></nowiki><nowiki>    <tamanho></tamanho></nowiki><nowiki>        <estágios></nowiki><nowiki>            <estágio></nowiki><nowiki>                <análise></nowiki><nowiki>                    <retângulo></retângulo></nowiki><nowiki>                    <retângulo></retângulo></nowiki><nowiki>                    <retângulo></retângulo></nowiki><nowiki>                    <degrau></degrau></nowiki><nowiki>                    <valorDaEsquerda></valorDaEsquerda></nowiki><nowiki>                    <valorDaDireita></valorDaDiretia></nowiki><nowiki>                </análise></nowiki><nowiki>                <análise></nowiki><nowiki>                    <retângulo></retângulo></nowiki><nowiki>                    <retângulo></retângulo></nowiki><nowiki>                    <retângulo></retângulo></nowiki><nowiki>                    <degrau></degrau></nowiki><nowiki>                    <valorDaEsquerda></valorDaEsquerda></nowiki><nowiki>                    <valorDaDireita></valorDaDiretia></nowiki><nowiki>                </análise></nowiki><nowiki>                <degrauDoEstágio></degrauDoEstágio></nowiki><nowiki>            </estágio></nowiki><nowiki>        </estágios></nowiki><nowiki></treinamento></nowiki>Exemplo simplificado e traduzido para o português da estrutura do classificador
 +
 +
Nesse arquivo tem a propriedade tamanho do classificador que é o tamanho do retângulo analisado, no classificador do rosto, por exemplo, ele sempre encontra analisa retângulo 20x20, então a região encontrada será sempre um quadrado. Na seqüência do arquivo tem diversos estágios, se a região passar por todos os estágios, então é o objeto procurado. Em cada estágio tem-se uma seqüência de análises que verificam a soma de intensidade de retângulos valorados e compara essa soma com a propriedade degrau (threshold). Se a diferença de intensidades for maior que o threshold então ao valor do estágio é somado a propriedade  valorDaDireita (right_value) , se a diferença for menor adiciona-se ao valor do estágio o valorDaEsquerda (left_value). No final de cada estágio compara-se o valor acumulado com a propriedade degrauDoEstágio (stage_threshold), se o valor acumulado for maior, então o algoritmo vai para o próximo estágio, senão a região não representa um objeto procurado.
 +
 +
As propriedades retângulo  são compostas por cinco inteiros, os dois primeiros são a coordenada do retângulo, o terceiro inteiro é a largura do retângulo, o quarto é a altura do retângulo e o quinto é a valoração que pode ser positiva ou negativa.

Edição de 23h04min de 7 de novembro de 2008

UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ
CAMPUS CURITIBA
CURSO DE ENGENHARIA DE COMPUTAÇÃO


RICARDO FANTIN DA COSTA
MARLON SUBTIL MARÇAL
DJONANTAM LONDERO


RECONHECIMENTO AUTOMÁTICO DE EXPRESSÕES FACIAIS


MONOGRAFIA – OFICINA DE INTEGRAÇÃO I


CURITIBA
2008
RICARDO FANTIN DA COSTA
MARLON SUBTIL MARÇAL
DJONANTAM LONDERO


RECONHECIMENTO AUTOMÁTICO DE EXPRESSÕES FACIAIS


Monografia apresentada à disciplina Oficina de Integração I do Curso de Engenharia de Computação da Universidade Tecnológica Federal do Paraná como requisito parcial para obtenção de nota.


Orientador: Professor Gustavo Alberto Gimenéz Lugo


CURITIBA
2008
TERMO DE APROVAÇÃO
Projeto
Reconhecimento Automático de Expressões Faciais
por
Ricardo Fantin da Costa
Marlon Subtil Marçal
Djonantam Londero


Esta monografia foi apresentada às_____________________________ do dia 29 de outubro de 2008 como requisito parcial para obtenção de nota, Disciplina Oficina de Integração I, Curso de Engenharia de Computação, Universidade Tecnológica Federal do Paraná. A equipe foi avaliada pelos professores abaixo assinados. Após deliberação, a Banca Examinadora considerou o trabalho________________________ ________________.

(aprovado, aprovado com restrições, ou reprovado)


________________________________ ________________________ Professor Arandi Ginane Bezerra Junior Professor Luiz Ernesto Merkle (UTFPR) (UTFPR)


_________________________________

Professor Gustavo Alberto Gimenéz Lugo

(UTFPR)
Orientador


_________________________________


CONCEITO FINAL:___________

RESUMO

DA COSTA, Ricardo Fantin; MARÇAL, Marlon Subtil; LONDERO, Djonantam. Reconhecimento automático de expressões faciais. 2008. Cc p. Monografia (Oficina de Integração I) – Universidade Tecnológica Federal do Paraná, Curitiba, 2008.


Esta pesquisa apresenta uma abordagem teórico-conceitual da questão do reconhecimento automático de expressões faciais, com foco na implementação de um software capaz de realizar a classificação de expressões faciais básicas. Discute os conceitos de reconhecimento de objetos e suas possíveis aplicações, bem como sua relação com o reconhecimento de expressões faciais e com o tratamento de imagens necessário. Apresenta conceitos de aquisição de imagem, pré-processamento, extração de características, classificação e pós-processamento. Discute os obstáculos ao reconhecimento efetivo em condições de ambiente normais e abordagens afim de superá-los, com base na documentação pertinente ao tema. Baseado numa extensa livraria, com código fonte aberto, sobre tópicos de visão computacional, o estudo verificou, por meio da adaptação de algoritmos, como ocorre o reconhecimento de objetos por meio do treinamento a partir de banco de imagens. Traz como resultado do estudo um panorama das possibilidades do reconhecimento de expressões faciais no incipiente ramo da visão computacional.


Palavras-chave:Reconhecimento. Expressão Facial. Automático. Reconhecimento Automático de Expressões Faciais.

ABSTRACT


DA COSTA, Ricardo Fantin; MARÇAL, Marlon Subtil; LONDERO, Djonantam. Automatic facial expressions recognition. 2008. Cc p. Monografia (Oficina de Integração I) – Universidade Tecnológica Federal do Paraná, Curitiba, 2008.


It presents a theoretician-conceptual boarding of the question of the automatic facial expressions recognition, with focus in the implementation of a software capable to performing the classification of basic facial expressions. It argues the concept of object recognition and its possible aplications, as well as its relation with the facial expression recognition and the needed image treatment. It presents the concepts of image aquisition, pre-processing, feature extration, classification and post-processing. It argues the obstacles to the effective recognition in a normal environment and approaches in order to overcome them, based on the documentation concerning to the subject. Based on large library, with open source code, about topics of computer vision, the study verified, through the adaptation of algorithms, as is the recognition of objects by means of training from banks of images. As resulted of the study, it brings a panorama of the possibilities of facial expressions recognition on the incipient branch of computer vision.


Key-words:Recognition. Facial Expression. Automatic. Automatic Facial Expressions Recognition.

LISTA DE SIGLAS E ABREVIATURAS

Action Units: Na classificação do rosto usa-se os action units ao invés de diretamente a contração dos músculos.Bash: Linguagem de Scripts usada nesta monografia para copiar ou converter muitos arquivos segundo uma expressão regular.Expressão Regular: as expressões regulares são um método flexível de identificar padrões de palavras em uma lista.FACS: Facial Action Coding System, é um modelo que caracteriza a expressão facial baseado em diversos músculos do rosto.GIMP: GNU Image Manipulation Program, programa de manipulação de imagem usado para modificar algumas imagens do trabalho.JNI: Java Native Interface, é a interface que permite o java chamar funções escritas em outras linguagens ou acessar bibliotecas do sistema operacional.OpenCV: Open Computer Vision Library, é uma biblioteca para análise de imagens, esta melhor explicada no item 3.4.OSS: Open Source Software.ROI: Region of Interest, normalmente um classificador retorna diversas regiões prováveis de ser a região procurada.

SVM: Support Vector Machine, dados muitos dados de entrada positivos e negativos, o SVM encontra o limite que classifica uma entrada como positiva ou negativa.

Web Service: é um sistema de software desenvolvido para suportar interação entre computadores pela internet.

XML: eXtensible Markup Language, é um modelo para guardas os dados de modo que seja fácil implementar um algoritmo para ler os dados depois.


Table of Contents1INTRODUÇÃO9

1.1DELIMITAÇÃO DO TEMA10

1.2PROBLEMA A SER PESQUISADO11

1.3OBJETIVOS11

1.3.1Objetivo geral12

1.3.2Objetivos específicos12

1.4JUSTIFICATIVA12

1.5METODOLOGIA13

1.6ESTRUTURA14

2PROCESSAMENTO DE IMAGENS PARA RECONHECIMENTO DE EXPRESSÕES15

2.1Visão Computacional15

2.2Extração de Características27

2.3Classificação31

3SOFTWARES DE VISÃO COMPUTACIONAL34

3.1OpenCV36

3.2CVHaarClassifier37

3.3Estrutura do classificador Haar XML37

4IMPLEMENTAÇÃO DE UM SISTEMA DE RECONHECIMENTO DE EXPRESSÕES40

4.1AQUISIÇÃO DA BASE DE DADOS40

4.2MODELO PROPOSTO DE ANÁLISE DE IMAGENS42

5IMPLEMENTAÇÃO DO SOFTWARE45

5.1TREINAMENTO46

6RESULTADOS E ANÁLISES48

7CONSIDERAÇÕES FINAIS50

8REFERÊNCIAS51

9Anexos53

9.1Uso de programas nativos no Java53

9.2Compilar o código em C++ no Linux55

9.3Ponteiros em C56

9.4Diagrama UML do software56= INTRODUÇÃO = Um dos maiores desafios da atualidade para os pesquisadores na área de computação em geral é a tentativa de imitar o mais refinado dos sentidos humanos, a visão. Poder-se-ia então indagar: “Mas porque iríamos querer imitar a visão?”. Para responder a essa pergunta com um pouco mais de critério, pensemos no quanto seria vantajoso se pudéssemos realizar operações num computador, sem ao menos precisarmos tocá-los, o quanto de tempo isso nos salvaria. É difícil não concordar que a nossa interação com o computador poderia ser bem mais eficiente e, conseqüentemente, bem mais produtiva se simplesmente dispuséssemos de um meio de comunicação mais natural com ele, principalmente numa época em que os computadores “tomaram de assalto” os lares e escritórios em todo o mundo. Com certeza, alternativas aos tradicionais mouse e teclado hoje em dia é o que não faltam. O mouse e o teclado, apesar de servirem muito bem aos seus propósitos, serão gradualmente substituídos, pois a tendência das interações entre humanos e máquinas caminha para tecnologias que automatizem tarefas repetitivas e que visem a reduzir ao máximo qualquer esforço físico [1]. Aí, nós poderíamos incluir o reconhecimento de gestos faciais, como o movimento dos olhos, por exemplo, para substituir a função do mouse.

Outra possibilidade seria a aplicação não só do reconhecimento, mas de todos os complexos caminhos seguidos pelo nosso cérebro para processar informações visuais, na geração de robôs autônomos, os quais poderiam desempenhar trabalhos que não exijam inteligência humana abstrata ou interpretações subjetivas. Além disso, também poderíamos empregar processos automatizados de processamento de imagens nas mais variadas áreas, como a prática clínica ou a ciência comportamental para citar algumas, visto que a informática se desenvolve continuamente e devido à sua relativa exatidão, pode ser conveniente delegarmos às máquinas atividades que exijam extrema perícia.

Para isso se concretizar, no entanto, seria necessário, em primeiro lugar, que um dispositivo realizando adequadamente o reconhecimento estivesse presente. Esta monografia expõe alguns dos problemas enfrentados por quem se propôs e obteve êxito em solucionar alguns dos obstáculos pertinentes ao tema do reconhecimento de expressões faciais, bem como apresenta as variadas soluções para um mesmo problema.

Os capítulos seguintes irão fornecer uma visão geral dos trabalhos existentes nessa área (visão computacional). Além disso, possibilitarão um contato aprofundado com os trabalhos que lidam especificamente com reconhecimento de expressões faciais e apresentarão as ferramentas existentes para consecução do reconhecimento, além de uma exposição detalhada das ferramentas escolhidas para este projeto, e sua aplicação.

Tabela de conteúdo

DELIMITAÇÃO DO TEMA

Durante a introdução, o tema reconhecimento de expressões faciais foi abordado de maneira genérica. Esse item pretende delimitar o tema no qual nós nos concentraremos daqui em diante, ou seja, do que exatamente trata o reconhecimento automático de expressões faciais.

Dentro do universo de possibilidades derivadas diretamente da ‘Visão Computacional’, existe uma que particularmente nos interessa: reconhecer emoções expressas pela face. Um ser humano pode, e faz isso freqüentemente e com relativa facilidade. No entanto, quando se espera que um computador o faça, precisamos traduzir o caminho seguido pelo nosso cérebro, que muitas vezes não conhecemos totalmente, em algoritmos racionais e palpáveis, e é aí que se instala o desafio. É claro que nós, seres humanos, iremos emprestar conceitos de emoções à máquina e mais do que isso, iremos estabelecer um limiar para eles.

Assim, todo o processo de reconhecimento se concentra basicamente em cinco processos: 1) obter uma imagem contendo um objeto de interesse (nesse caso, uma face), processo a que chamamos ‘aquisição de imagem’. 2) Identificar e isolar o objeto almejado de outros que não são úteis, além de algumas vezes corrigir ‘defeitos’ como ruídos, ou posição desfavorável, processo esse chamado ‘pré-processamento’. 3) Uma vez que o objeto foi isolado e corrigido, extrair dele os elementos que serão analisados para enquadrá-lo numa das categorias pré-definidas, essa etapa é chamada ‘extração de características’. 4) A partir dos elementos obtidos, processar e produzir uma saída, um rótulo para o objeto, essa é a etapa conhecida como ‘classificação’. 5) Finalmente, se a saída do processo anterior necessitar de um processamento adicional para se chegar à saída definitiva, ou seja, à classificação efetiva, pode-se implementar uma quinta etapa chamada de ‘pós-processamento’. Todos esses processos serão vistos com mais detalhes no capítulo seguinte.

PROBLEMA A SER PESQUISADO

Como devem ter percebido, o problema aqui diz mais respeito à parte lógica do reconhecimento de expressões faciais do que à sua contraparte, relativa ao estudo teórico de emoções humanas. Isso se deve, principalmente ao foco deste projeto, que não pretende teorizar sobre a idéia ou origem de emoções, mas apenas identificar as principais e mais notórias delas que podem ser percebidas pela face.

Logo, o problema a ser pesquisado nesse projeto trata basicamente das técnicas de implementação possíveis para o desenvolvimento de um software capaz de reconhecer expressões faciais. Para isso, precisaremos pesquisar, dentre outros, métodos para processar a imagem de uma dada pessoa, fazendo com que seja submetida a um teste para classificação da respectiva expressão facial observada. Além disso, mostra-se necessário um aprofundamento teórico com relação a algoritmos para classificação do tipo de expressão, fazendo o julgamento com uma precisão adequada para obter resultados satisfatórios.

OBJETIVOS

Objetivo geral

O objetivo geral deste projeto é ser uma via pioneira para futuros pesquisadores que se interessem pelo tema do reconhecimento automático de expressões faciais, visto que atualmente o assunto carece de trabalhos documentados que abordem diretamente o processo de análise de expressões faciais. Não temos a pretensão de realizar qualquer inovação nessa área de pesquisa, mas apenas fornecer material para introduzir quem se interessar por ela, e, por acaso, quiser se aprofundar, a partir das referências fornecidas.

Objetivos específicos

Enquanto o objetivo geral é a provisão de material para iniciar novatos no assunto, os objetivos específicos são mais voltados para a aquisição de conhecimentos envolvendo áreas que abrangem o Curso de Engenharia de Computação. Com isso, queremos dizer que todo o processo de pesquisa já é um objetivo em si, pois nos possibilita termos contato com temas que possivelmente seremos confrontados no futuro, pois envolvem a área de atuação do curso. Além disso, a disciplina de Oficinas de Integração I permite nos familiarizar com o trabalho por detrás da realização de um projeto, o que nos será de significante utilidade futuramente.

JUSTIFICATIVA

A justificativa para o tema “Reconhecimento Automático de Expressões Faciais” é um tanto polêmica, porém aqui vamos abordar apenas argumentos favoráveis à expansão desse recurso relativamente novo. Um argumento favorável já foi, inclusive, mencionado: é uma área relativamente recente e que está amplamente em aberto para desenvolvedores se aventurarem. Junte a isso, o fato de muitas indústrias estarem interessadas nessa nova tecnologia, entre elas está a indústria de máquinas fotográficas. Agora abordando menos o potencial econômico do assunto e focalizando no aspecto social: uma ferramenta de reconhecimento de expressões faciais teria um valor didático inestimável, no momento em que, se um aluno, ou um usuário de computador demonstrasse dúvidas em relação a algo sendo apresentado na tela, um algoritmo de busca poderia varrer a rede, contatar outros usuários ou o mesmo professor, tudo feito automaticamente em prol da dissolução de qualquer dúvida mediante a apresentação de informações relevantes em relação ao tema que originou o problema. Esse é apenas um exemplo das possibilidades de aplicação dessa ferramenta. Um argumento com um caráter um pouco mais prático em prol do reconhecimento automático de expressões faciais é o fato de que não haver nenhum software livre ou algum documento que aborde diretamente o processo de análise de expressões faciais. O trabalho pretende contribuir na área em três tarefas principais: documentar a função de detecção de objetos do OpenCV, mostrar as soluções existentes e apresentar uma nova maneira para automatizar a criação de base de imagens.

METODOLOGIA

O nosso método de trabalho consistiu em pesquisar artigos e livros, na internet e na biblioteca de pós-graduação da UTFPR, referentes à visão computacional, a tratamento de imagens e a reconhecimento de expressões faciais. Possuindo certa base de conhecimento do assunto, partimos para a implementação do projeto que se deu em conjunto com a estrutura do software OpenCV, a qual nos ajudou muito a entender como funciona, em termos de construção de código em linguagem de programação, os algoritmos de suavização e de detecção de bordas de objetos contidos na imagem. A fase final da implementação prática certamente funcionará com base nos algoritmos que estão contidos no código-fonte do OpenCV, porém temos o foco de com isso entender o funcionamento de um programa processador de imagens além de compreender, dentro do que nos é possível, a teoria de tratamento e de extração de características de matrizes que caracterizam as imagens de interesse.


ESTRUTURA

Este texto é composto por seis capítulos. Este primeiro caracteriza uma introdução ao tema e à nossa proposta de implementação de um sistema de reconhecimento de expressões. Definimos também o porquê nós estamos fazendo esse projeto, onde queremos chegar e o método de estudo que estamos adotando. No próximo capítulo serão apresentados os conceitos que definem a área de Visão Computacional e de Processamento de Imagens, bem como sua teoria e seus conceitos matemáticos de manipulação de matrizes de imagens, tais como: operações aritméticas e lógicas entre matrizes, operações de convolução com operadores matriciais (denominados máscaras), histogramas que indicam percentagens de tons de cor em uma imagem e os diversos tipos de operadores diferentes que produzem matrizes distintas para posterior tratamento. O terceiro capítulo trata de programas produzidos por terceiros que realizam algum tipo de processamento de imagens. Faremos a análise destes programas e mostraremos se os resultados que eles produziram para nós foram satisfatórios ou não. Já no quinto capítulo, demonstraremos tudo sobre o que foi feito por nós em termos práticos e tudo o que ainda pretendemos ainda construir no nosso projeto. No sexto capítulo deixaremos à mostra os resultados obtidos da nossa implementação e a análise destes resultados. Por fim, no sétimo capítulo refletiremos qualitativamente sobre o projeto realizado, tanto sobre suas partes quantitativas como, também, suas partes qualitativas.

PROCESSAMENTO DE IMAGENS PARA RECONHECIMENTO DE EXPRESSÕES

Visão Computacional

Conforme os sistemas de aquisição analógica de imagens (que basicamente convertem uma imagem real em uma seqüência de binários para interpretação computacional) foram se desenvolvendo nas últimas décadas surgiu-se a necessidade de processar logicamente os atributos e as características dessas imagens. Isso se deu pela incrível possibilidade de atribuir tarefas enfadonhas de análise de situações do meio e de objetos específicos, por parte dos seres humanos, a uma máquina que faz operações lógicas ótimas em termos de segurança e velocidade. No mundo industrial, por exemplo, é interessante a idéia de automatizar procedimentos referentes a controle de qualidade dos produtos e de montagem destes. Na vida cotidiana, seria conveniente possuir um sistema robótico locomotivo que transportasse objetos quaisquer de um ponto a outro e que evitasse obstáculos a tempo real. Criar robôs eficientes em explorar ambientes diversos, especialmente aqueles que oferecem dificuldade de acesso humano, também é uma das propostas ocorrentes. Enfim, investir intelectualmente na área de visão computacional pode facilitar a vida humana nas mais diversas tarefas.

Como foi mencionado na secção anterior, o desenvolvimento de um sistema automático de reconhecimento de expressões faciais pode inovar muito na área de interação entre ser humano e máquina, podendo tornar esta interação mais intuitiva, natural e acessível para as pessoas. Em termos práticos, pelo fato de as expressões faciais desempenharem um papel fundamental na comunicação e na transmissão de valores e de conhecimento, seria interessante integrar sistemas inteligentes de reconhecimento de expressões a softwares de comunicação e de relacionamento via internet. Isso melhoraria muito a expressividade das mensagens enviadas pelas pessoas que os utilizam.

Para otimizar o desenvolvimento de um sistema de reconhecimento de expressões é comum separar esta proposta em partes, a fim de que se possa melhor entender o processo daquilo se quer projetar. A primeira etapa é a aquisição da imagem que se deseja analisar, partindo da imagem do mundo real. Para fins de simplicidade, consideraremos apenas imagens que contenham rostos normalizados, isto é, que não estejam rotacionados demasiadamente em relação ao plano da imagem, e que a iluminação sobre o rosto não seja heterogênea. A segunda etapa é a de pré-processamento, na qual são aplicados filtros de eliminação de ruído na imagem. Feito isso é realizada a etapa de segmentação, em que é realizada a análise dos níveis de cor da imagem com a finalidade de detectar os componentes do rosto. Após a detecção, são extraídas sub-imagens da imagem em questão que contenham os elementos faciais detectados. Por fim, na quarta e última etapa que é denominada classificação, uma identificação automática de cada nova imagem extraída é realizada, produzindo saídas textuais que referentes às imagens correspondentes.

[[Image:]]

Figura 1: Etapas do processo de reconhecimento de imagens

Um sistema como esse emprega conceitos e definições oriundas da área de Visão Computacional e de Processamento de Imagens. Demonstraremos inicialmente qual os atributos de uma imagem digital e, depois, como ela é manipulada a fim de extrair dela características e detalhes que nos convém.

Primeiramente, uma imagem digital é uma tabela de números. Esta tabela é denominada de matriz de imagem, e os elementos contidos nela são definidos como pixels, cuja termologia em inglês é picture element (em português, elemento de imagem). A matriz e seus elementos determinam apenas o tamanho da imagem e sua resolução, que é a quantidade de pixels que compõem a imagem. O que determina o conteúdo da imagem são os valores numéricos de intensidade luminosa que os pixels assumem, e estes valores estão inseridos em um intervalo chamado banda ou faixa de pixels. Conforme o tipo de imagem que se queira trabalhar são utilizados diferentes tipos de valores representativos de intensidade luminosa. Se é desejado trabalhar com imagens coloridas é conveniente adotar três números para cada pixel, cada um referindo-se ao nível de intensidade de vermelho, verde ou azul (tipo de dado RGB para cor). Mas como queremos manipular apenas imagens compostas de tons de cinza (monocromáticas), já que o seu uso é suficiente para detecção de bordas e aquisição de componentes de interesse da imagem, é viável atribuir apenas um número que relaciona determinados níveis de cinza para cada elemento da matriz de imagem. O processo analógico de determinação do tamanho da matriz e da quantidade de elementos que ela contém é chamado de discretização espacial, enquanto que o processo de definição de números aos elementos da matriz é chamado de discretização em amplitude. Após a conclusão de ambos os processos, a imagem, ou melhor, a matriz de pixels, poderá então ser armazenada, possibilitando ser posteriormente manipulada e analisada. Para o armazenamento são utilizadas ferramentas eletrônicas usuais de armazenamento de dados binários, tais como: fitas magnéticas (disco rígido ou disquete), discos ópticos (cd ou dvd), cartões de memória e pen drives. Para manipulação e análise dos dados referentes à imagem são utilizados os recursos computacionais que as linguagens de programação oferecem, tais como C / C++, Pascal e Java por exemplo.

Os algoritmos de tratamento de imagens são baseados em estruturas de repetição e de decisão que as linguagens de programação oferecem. Para tratar todos os valores de intensidade luminosa que os elementos da matriz de imagem assumem basta percorrer os elementos com comandos de repetição (que em C / C++ e em Java são invocados com as palavras-chave for, while e do-while), e, se necessário, realizar ações que estejam em função do valor encontrado, utilizando comandos de decisão (que em C / C++ e em Java são invocados com a palavra-chave if e switch, que realizam testes lógicos de verdadeiro ou falso).

O primeiro passo de projeto de um programa que manipule imagens é escrever um código que realize a aquisição da imagem (que pode ser a imagem real ou a digital) e que crie uma tabela de números, matriz de imagem, que corresponda a essa imagem adquirida. Como já foi dito, esse processo possui duas etapas que são chamadas de discretização espacial (criação da matriz bidimensional) e de discretização em amplitude (atribuição de valores numéricos aos elementos da matriz). Com isso, podem ser realizadas operações a esta matriz ou entre esta matriz e uma outra, ou ainda, entre esta matriz e um número escalar, produzindo uma nova imagem, cuja matriz é denominada matriz destino. As operações que podem ser realizadas são divididas em dois grupos: o de operações aritméticas e o de operações lógicas. Operar aritmeticamente duas matrizes significa realizar alguma das quatro operações básicas (adição, subtração, multiplicação ou divisão) entre duas matrizes, calculando com os elementos correspondentes de uma matriz e outra, implementando um devido mecanismo de tratamento de valores que excedem a banda de luminosidade adotada. Operações lógicas são realizadas em imagens binárias, que podem ser adquiridas a partir da conversão de matrizes de valores numéricos de cor em matrizes binárias. Elas são fundamentadas por quatro operadores: AND (“e”), OR (“ou”), XOR (“ou exclusivo”) e NOT (“negação, complementar”); e elas são implementadas de acordo com as leis da Lógica Proposicional. A seguir são apresentadas figuras que demonstram os resultados de operações lógicas entre dois elementos de duas matrizes binárias e de uma operação lógica em apenas um elemento de uma matriz binária:

[[Image:]]

Após a aquisição da imagem é realizada a etapa de pré-processamento. Esta tem como função melhorar a qualidade da imagem, filtrando parte dos dados e mantendo parte da estrutura original para os processos seguintes. A imagem capturada pode ter diversas fontes de imperfeições tais como contraste e brilho inadequados devido à iluminação do ambiente ou devido à má qualidade do dispositivo de aquisição analógica da imagem. Antes de estudar esta etapa, faz-se necessário apresentar um pouco do conhecimento de histogramas e de operações de convolução de máscaras sobre uma imagem.

Freqüentemente quando se processa uma imagem a fim de extrair algum elemento importante dela é preciso tomar a decisão de rejeitar alguns tons de cor pertencentes a uma certa faixa de intensidade luminosa e manter outros. A análise da percentagem que cada nível de cor assume em uma determinada imagem, a qual é facilitada através de um gráfico chamado histograma, é um jeito de estimar o nível de cor que definirá um “degrau”. Este “degrau”, cuja técnica de obtê-lo chama-se thresholding (que em português significa: determinar o nível em que algo começa a acontecer), é muito útil em criar matrizes binárias da imagem além de proporcionar tecnicamente a possibilidade de detecção de bordas. Na figura abaixo é apresentada uma imagem com vários tons de cor e na página seguinte está sua correspondente quando é aplicada a técnica de thresholding, ainda nesta página é mostrado o histograma da imagem de valores diversos.

[[Image:]]


[[Image:]]

Para que se possam detectar as bordas de um objeto ou passar filtros na imagem com o objetivo melhorar sua qualidade são utilizados operadores matriciais chamados máscaras. As máscaras são, como as matrizes de imagem, tabelas de números, cujo tamanho deve ser menor que o da matriz de imagem em que se deseja manusear. Para aplicá-las devemos antes espelhar os seus valores com relação aos eixos horizontal e vertical (tomando como a origem o elemento central da tabela de números que identifica a máscara), o que significa apenas mudar os valores numéricos de posição de maneira simétrica a ambos os eixos. Na imagem em que queiramos usar as máscaras devemos calcular o resultado da operação da máscara espelhada para cada elemento da matriz de imagem. A operação que é feita entre a máscara espelhada e um elemento da matriz de imagem é efetivada tomando-se como referência uma correspondência entre o elemento central da máscara (origem dos eixos já mencionados) e o elemento da matriz de imagem que se está realizando a operação. Depois de esclarecida esta correspondência, podemos afirmar que a operação é o somatório da multiplicação de cada elemento da matriz da máscara com cada elemento correspondente da matriz de imagem, sendo que estes elementos podem compor o próprio elemento representativo da origem e seus vizinhos ou, conforme o número de valores no qual a máscara é composta (tamanho da matriz que identifica a máscara), o próprio elemento representativo da origem unido com seus vizinhos e com os elementos adjacentes a estes. Partindo deste processo é produzido um novo elemento, que será atribuído a uma matriz destino, cujo valor indica algum tipo de gradiente evidenciador de um ponto, uma linha ou uma borda pertencentes a um determinado objeto (este tipo de gradiente depende do tipo de máscara que se adota). Para os casos em que um elemento da máscara não corresponde a um elemento da matriz de imagem pode-se adotar um valor nulo ou um valor que é igual ao do elemento adjacente que define o limite ou a borda da imagem. A seguir, apresentaremos alguns operadores e suas utilidades.

Os filtros passa-alta são operadores de convolução (máscaras) que realçam as bordas. Este filtro percorre a imagem original aplicando a seus elementos a seguinte matriz:

[[Image:]]

Assim a intensidade da cor do pixel central será a média entre ele mesmo e seus 8-vizinhos, mas se a diferença entre seu velho valor e seu novo valor for mais alta que um valor fixo, podemos decidir não mudar o valor, atenuando assim as bordas e suavizando as demais regiões.

Um método para destacar as bordas é adquirir gradientes indicadores de mudanças bruscas de intensidade luminosa ou de tons de cor. Pode-se fazer isso utilizando os seguinte operadores de convolução que compõem o chamado filtro de Sobel:

[[Image:]]

[[Image:]]

Depois de analisar a diferença de intensidade em uma linha nós precisamos saber o ponto onde a variação de intensidade é máximo. O gráfico a seguir representa a variação de intensidade de cores em uma região da imagem:[[Image:]]


Nós estamos procurando exatamente o ponto em que a variação de intensidade é máximo, esse ponto é o zero da segunda derivada da função:[[Image:]]O Filtro de Laplace procura diretamente por essa segunda derivada. O funcionamento é mais simples que o Filtro de Sobel, pois só passa uma máscara.

[[Image:]][[Image:]]
[[Image:]][[Image:]]
Filtro de Laplace implementado no GIMP.


Com uma boa calibração do valor de degrau (threshold) que define a partir de qual intensidade um ponto é definido como uma borda. O Filtro funciona bem para imagens de alta definição, mas não encontra as bordas bem para outras imagens, porque é muito sensível a ruídos.

O filtro de Gauss é uma máscara de convolução com o objetivo de remover ruídos. Neste sentido seu funcionamento é muito parecido com o Filtro da Média mas com uma matriz representando uma distribuição Gaussiana.

A Gaussiana é a função que melhor representa a distribuição de um evento e é útil pois pode ser usada para tratamento de eventos paralelos e outras operações estatísticas e pode ser manipulada com matemática simples porque é uma função exponencial. A fórmula da equação gaussiana média zero e desvio padrão σ é definida como em uma dimensão como:

[[Image:]]
Já em duas dimensões é definida como:
[[Image:]]

Em tese a curva é positiva em qualquer ponto, então nossa matriz para considerar até mesmo os pontos mais distantes, mas na prática após três ou quatro desvios padrão o valor do ponto da mascará se torna zero o que nos permite deixar a mascará com tamanho limitada a esse tamanho. Uma mascará com o sigma da função sendo 1,4 é:

[[Image:]]

Canny Edge Detection é o algoritmo que é usado no reconhecimento de bordas do OpenCV, devido a sua grande complexidade não poderíamos apresenta-lo sem antes ter mostrado algoritmos mais fáceis. Esse processo é dividido em 5 etapas:

Primeiro usa-se o Filtro Gaussiano para minimizar o ruído.

Depois de diminuir o ruído aplica-se o Filtro de Sobel para saber a direção e a magnitude de todos os pixels da imagem. A direção dos pixels nesse algoritmo é arredondado para uma das quatro direções 0°, 45°, 90° ou 135°.

O Canny Edge precisa de dois valores de degrau (threshold) obtidos estatisticamente um para classificar um vértice e um para classificar borda. Os vértices tem uma diferença de intensidade muito grande, as bordas tem uma diferença de intensidade intermediária, mas pontos apenas são classificados como bordas se estiverem ligando dois vértices.

A direção da intensidade sempre é perpendicular à borda, entre todas os pixels que compõem uma borda é encontrado o com maior diferença de intensidade em relação aos vizinhos.

Combinando varias técnicas esse filtro consegue encontrar muito bem os vértices sem acursar muitos falsos negativos, além da precisão da localização destes vértices. Cada vértice só separa duas regiões, os vértices nunca são classificados como o encontro de três bordas, por exemplo.

http://www.pages.drexel.edu/~weg22/can_tut.html

Neste processo que encontra rotação do Rosto, mas não faremos isto.

Segmentação: A segmentação encontra as regiões de interesse na imagem e depois subdivide essas regiões em outras partes mais específicas. Esta etapa é a mais difícil porque tem que lidar diretamente com diversas fontes de variabilidade como a diferença de iluminação e a rotação do objeto procurado e ela se comunica com todas as outras etapas seguintes, se essa etapa falhar o processo inteiro falha.

Modelo de Hidden Markov (HMM): O modelo de hidden makov propõem um método para encontrar padrões. Já existiu uma implementação deste algoritmo no OpenCV, mas foi abandonada. O HMM é usado em sistemas de reconhecimento de voz atuais. Pode-se usar essa técnica para dividir o rosto em diversas regiões.

As características faciais apresentam um elevado grau de variabilidade de pessoa a pessoa, ou até mesmo na mesma pessoa que pode deixar de se barbear.Na imagem isso se refletirá em forma, cor, movimento, textura e configuração espacial. A técnica Cascade Haar Wavelets tenta resolver todos esses problemas e pode ser usada tanto na segmentação quanto na classificação de imagens.

Extração de Características

A extração de características esta fortemente ligada à etapa de classificação, aqui apresentamos duas técnicas, a primeira é a análise de um contorno que pode ser usada para encontrar pontos e distâncias entre pontos importantes da região destacada pela segmentação e a segunda é voltada para reconhecimento de objetos. Depois de retirar o contorno com algum filtro (ver tópico 2.2) podemos analisá-lo para obter o pixel em algum extremo, ou achar a inclinação da curva em algum ponto ou podemos achar a reta que melhor represente alguma parte da curva ou ainda poligonalizar alguma região.

Pixels conectados: Diversos algorítimos de processamento de baixo nível usam o valor de seus pixels vizinhos, os dois modelos mais usados de vizinhos são os 4-vizinhos e 8-vizinhos.

[[Image:]]

O pixels em cinxa são os 4 vizinhos do pixel do meio, o conjunto formado pelos pixels em cinza e os em preto formam os 8 vizinhos do pixel central.

Representação de contornos de Freeman: Ao invés de representarmos algum contorno como uma matriz booleana onde o contorno são os valores true e os outros são false, como na imagem da esquerda, podemos fazer a representação como uma lista de números que representam a direção do próximo pixel.

[[Image:]][[Image:]]

Deste modo o contorno exibido anteriormente seria representado por um array de bytes com os seguintes dados 34445690007654443. Com o contorno no modelo de Freeman a derivada e outras operações são definidas e podem ser usadas para analisar a imagem.

Haar Cascade Wavelets: Paul Viola e Michael Jones desenvolveram essa técnica para reconhecimento de objetos em tempo real. Originalmente era usado um SVM como última etapa do reconhecimento, hoje ela foi melhorada e usa o algoritmo adaboost para obter uma melhor classificação. Em comparação com as outras técnicas está não detecta objetos parcialmente fora da imagem ou rotacionados. No reconhecimento de objetos é necessário percorrer toda a imagem e verificar se uma região é o objeto procurado. Para fazer a pesquisa de maneira eficiente deve-se usar o classificador que elimine o maior número de regiões primeiro, para depois checar pontos mais específicos. Depois de converter a imagem para tons de cinza, compara a diferença de intensidade de regiões adjacentes seguindo um classificador gerado usando fourier e wavelets, se passar pela classificador a região é um objeto procurado.

Cascata de Haar: É buscado regiões em toda a imagem e com diversos tamanhos. Para calcula a diferença de intensidade de retângulos adjacentes calcula-se a integral de imagem, que permite verificar a soma da intensidade de uma região com apenas quatro acessos a memória, uma soma, e duas diferenças. Se quisermos verificar a diferença de intensidade de duas regiões adjacentes não precisamos calcular a intensidade das duas e depois subtrair, é possível conseguir isso com apenas seis referências à memória.

Integral de Imagem: Para fazer a soma das intensidades de forma rápida utiliza-se de uma representação intermediária da imagem. O ponto genérico (x,y) desta imagem esta definido como a soma das intensidades das cores de todos os pixels acima e a esquerda do ponto (x,y). Então para calcular a soma das intensidades de uma área qualquer usa-se a fórmula:

[[Image:]]
Setor D = D – B – C + A


Haar: Haar é uma função definida como:

f(x) = {1, se 0 <= x < 0,5 -1, se 0,5 <= x < 1,
0, para outros valores de x}

A transformada de Haar é um caso particular da transformada discreta de wavelets. Na análise da imagem o haar representa diferença de intensidade de regiões.

[[Image:]]

Tilted Haar: Lienhart e Maydt propuseram uma integral de imagem para calcular a diferença de intensidade de retângulos rotacionados 45°.

Cascade: Depois de percorrer todas as regiões em x e y, aumenta-se o tamanho da região procurada e percorre toda a imagem novamente. O redimensionamento da imagem é demorado, então usa-se a representação da integral de imagem para analisar retângulos maiores, já que nesta representação o tamanho do retângulo analisado não varia o tempo de processamento.

Wavelets: A transformada de Fourier é usada para determinar um padrão adaptando uma curva à um modelo. Com o surgimento dos computadores e o uso das séries de fourier, notou-se que não é necessário analisar todas as freqüências para obter um resultado satisfatório, wavelets é a técnica que classifica as freqüências mais importantes para a análise em questão.

AdaBoost: AdaBoost é o algoritmo usado no classificador para verificar se um conjunto de diferenças de intensidade está dentro do padrão ou não. O criador Michael Kerns acreditava que é possível criar um classificador preciso a partir de muitos classificadores menos eficientes. O classificador é dividido em diversos estágios que são os classificadores menores. Em cada estágio tem-se uma seqüência de análises. Estas, por sua vez, verificam a diferença de intensidade de retângulos valorados e compara essa diferença com a propriedade threshold. Se a diferença de intensidades for maior que o threshold então ao valor do estágio é somado a propriedade right_value, se a diferença for menor adiciona-se ao valor do estágio o left_value. No final de cada estágio compara-se o valor acumulado com a propriedade stage_threshold. Se o valor acumulado for maior, então o algoritmo vai para o próximo estágio. Os primeiros estágios devem remover o maior número possível de candidatos a imagens e cada estágio subseqüente eliminar cada vez menos para o sistemas ser eficiente.

Classificação

O significado das expressões faciais mudam de cultura para cultura. Um trabalho para construção um dicionário de expressões para culturas distintas baseado em pesquisas caracterizou apenas sete expressões faciais universais: felicidade, tristeza, surpresa, raiva, medo, desprezo e desaprovação. No trabalho de Ekman é proposto um método de descrever o rosto e o segundo trabalho selecionou os pontos mais importantes para o reconhecimento das expressões faciais e usou uma rede neural para classificar os dados retirados nas expressões faciais universais.

Paul Ekman e W. V. Friesen desenvolveram em 1970 um método para análise e descrição do rosto chamado Sistema de Código de Ações Faciais (Facial Action Coding System - FACS). Eles examinaram como a contração de cada músculo mudam a aparência da face para identificar o melhor método de diferencia-los. O FACS usa as unidades de ação (action units - AU) e não músculos, por dois motivos: primeiro porque a mudança de alguns músculos não podia ser facialmente distinguida, então alguns músculos foram combinados em apenas um AU e, segundo, devido a diferença de comportamento de um mesmo músculo que é portanto representado por várias unidades de ação. O modelo retorna um valor de magnitude para cada uma das 44 unidades de ação e estas são descritas pela sua anatomia e não pelo seu teor psicológico, essa característica torna o modelo mais abrangente para outras áreas como atores e desenvolvedores de animações gráficas.

O método de Kobayashi e Hara utiliza o pontos característicos da face (Facial Caracteristic Points - FCP) que são uma simplificação do FACS, pois considera apenas pontos relativos aos olhos, sobrancelhas e a boca. As outras regiões do FACS que são os pontos da orelha, da testa e do queixo não são levados em consideração porque segundo os pesquisadores as pessoas só levam em consideração a posição e a abertura dos olhos, sobrancelhas e da boca para classificar as expressões faciais.


[[Image:]]
Os 30 pontos característicos selecionados Kobayashi e Hara e as linhas de Hara.

Na figura da página anterior com os 30 pontos característicos da face. As linhas verticais são chamadas linhas de Hara (haralines). A posição na coordenada x de todos os pontos são baseados nos pontos a1, a2, a3, a4 (cantos dos olhos), a19 e a20 (cantos internos das sobrancelhas) que determinam as linhas de Hara. Esta propriedade faz o posicionamento dos FCP semi-automático.

SOFTWARES DE VISÃO COMPUTACIONAL

A pesquisa de softwares se concentrou em softwares que implementam reconhecimento de expressões faciais.Como não existe nenhum software livre (OSS - Open Source Software) que implemente esta função, utilizamos o sistema de pesquisa do SourceForge - um site que oferece serviços para desenvolvimento de software livre - para encontrar softwares com funções sobre visão computacional de código aberto. Os softwares Ares e Faint são softwares de origem alemã, então a pesquisa se expandiu para o BerliOS - um sistema para auxílio de projetos OSS alemão similiar ao SourceForge. Com isso a pesquisa abrangeu a grande maioria dos softwares livres e provavelmente encontrou todos os softwares livres relevantes sobre visão computacional.

Nenhum softwares livre implementa a função de reconhecimento de expressões faciais, a maioria deles faz o reconhecimento de pessoas. O modelo proposto de análise dos softwares permite encontrar quais partes de cada software podem ser reaproveitados e escolher de maneira ampla o melhor caminho.

O Ares e o Malic implementam reconhecimento de pessoas, o primeiro armazena em um banco de dados as informações para reconhecer grupos de pessoas e o segundo é para permitir acesso ao computador para apenas pessoas autorizadas. O Java OpenCV Match e o OpenCV Java API são uma interface para acessar as funções do OpenCV do java, em anexo no final da monografia há uma explicação de como implementar o JNI para fazer essa interface. Os softwares com funções mais próximas do nosso objetivo são o Visage, o Faint e o OpenCV.

O Visage é distribuído para uso apenas acadêmico e usa muitos softwares não livres, entre eles o Java Media Framework e um pacote de análise geometria analítica que precisou ser refeito apartir do arquivo ".jar" distribuído para poder compilar o software. Além disso não funcionou quando testado, mas podemos analisar a implementação do software já que o código e a monografia do trabalho de conclusão de curso estão disponíveis no SourceForge. O software encontra o rosto em quatro etapas: eliminação de regiões negativas com Haar, encontro da pupila nas regiões filtradas no estágio anterior, encontra os vértices dos olhos para com uma SVM verificar se a região representa um rosto e por último segue os vértices dos olhos para conseguir acompanhar a rotação do rosto.

[[Image:]]
Figura1: Os quadrados usados pelo haar do software visage.

Os olhos da imagem analisada ficam sobre as superfícies S1 e S3, a intesidade de cor da superfície S1 deve ser menor que a das superfícies S2 e S4 e a intensidade da região S3 deve ser menor que a da região S2 e S6 para a região passar da primeira etapa. Para passar da segunda etapa deve ser encontrado uma pupila nas regiões S1 e S3. A próxima etapa é encontrar os vértices dos olhos e verificar com a SVM se são olhos realmente, uma SVM pode ser treinada para dividir entradas em grupos de entradas certas ou erradas. Aproveitando ainda a posição dos vértices o quarto estágio segue esses vértices para verificar a rotação do rosto nos próximos quadros.

A Interface de Anotações de Rostos (The Face Annotation Inteface – FAINT) usa o opencv ou um webservice para determinar a posição dos rostos e depois cria uma base de dados dos rostos conhecidos. A apresentação do software foi feita com muito cuidado e cada função do programa pode ser configurada de diferentes maneiras. A interface com o OpenCV usa o método exposto no apêndice, então não precisa instalar nenhuma biblioteca. O reconhecimento dos rostos tem como principal argumento de entrada o tamanho mínimo do rosto procurado e se usará um filtro adicional que leva em consideração as cores do rosto para o reconhecimento. Um webservice é um protocolo de comunicação de programas pela internet baseado principalmente em arquivos XML, o FAINT usava um webservice não mais disponível que podia detectar a rotação do rosto com apenas uma imagem. A última função implementada é o reconhecimento de rostos usando o algorítmo EigenFace-Recognition. O diferencial do FAINT é a implementação do filtro adicional de reconhecimento de rostos baseados na cor e não apenas na forma.

OpenCV

A Biblioteca Aberta de Visão Computacional (OpenCV – Open Computer Vision Library) é uma coleção de mais de trezentas funções que implementão os algoritimos mais comuns e populares sobre visão computacional. O OpenCV foi feito pela Intel e usa a licença Intel License Agreement que é compatível com a licença FreeBSD. O código usa a biblioteca fechada licenciada pela Intel chamada Princípios Integrados de Performance (Intel® Integrated Performance Primitives – IPP) quando o sistema esta rodando com Chips Intel e Windows, se ele não estiver, existe uma implementação livre. A maioria dos programas analisados usa essa biblioteca e ela tem muita documentação, por isso a escolhemos para o desenvolvimento do nosso software. Os artigos e trabalhos sobre reconhecimento de expressões faciais não abordam etapas de baixo nível do funcionamento de seus softwares, aqui descreveremos o necessário sobre a organização e as convenções utilizadas no OpenCV para depois apresentar uma explicação detalhada de como foi implementado o algoritmo Haar Cascade Wavelets em nível de código.

As funções do OpenCV estão divididas em quatro bibliotecas: cxcore, cv, highgui e cvcam. O higgui e o cvcam são responsáveis por obter imagens do sistema de arquivos do computador ou da camera e para isso devem ter uma implementação em sistemas Unix e outra em Windows. Em cxcore estão definidos as estruturas de dados e funções primitivas de processamento de imagem. E na biblioteca cv estão implementadas as funções de alto nível para análise de imagens.

Algumas siglas são colocadas no nome das funções indicando alguma característica normalmente de classificação. As funções internas do arquivo tem o prefixo icv, já as funções externas usam o prefixo cv. Algumas funções apresentam a palavra hid indicando que a função é um algoritimo voltado para melhor performance.

CVHaarClassifier

A primeira função chamada é a cvHaarDetectObjects que recebe principalmente uma imagem, um arquivo XML que é o classificador, uma flag indicando se deve usar o CannyEdge para eliminiar regiões com muitos ou poucos vértices, um fator de escala, o menor tamanho de objeto à procurar e o número da visinhança mínima. Depois de muitas verificações para evitar argumentos negativos e tentar abrir a imagem e o classificador XML, a função cvSetImagesForHaarClassifierCascade é chamada e tem como objetivo criar as estruturas para processar a imagem. Depois disso três loop's varem a imagem com diversos retângulos de tamanhos cada vez maiores em diversas coordenadas (X,Y) e em cada coordenada chama a função cvRunHaarClassifierCascade. Esta função analisa se o trecho de imagem se adapta ao classificador XML.

Estrutura do classificador Haar XML

A características dos objetos reconhecidos ficam armazenados em um arquivo xml. Arquivos xml são um modelo de guardar dados de modo que seja fácil implementar um algoritmo para lê-los depois. O formato dos dados são definidos por etiquetas entre os sinais de menor e maior - "<etiqueta>" - agrupados em uma estrutura de árvore. Como o classificador consiste de vários estágios e cada estágio é composto por várias análises e cada análise faz a verificação com vários retângulos, então o formato se encaixa muito bem para representar o classificador.


<treinamento> <tamanho></tamanho> <estágios> <estágio> <análise> <retângulo></retângulo> <retângulo></retângulo> <retângulo></retângulo> <degrau></degrau> <valorDaEsquerda></valorDaEsquerda> <valorDaDireita></valorDaDiretia> </análise> <análise> <retângulo></retângulo> <retângulo></retângulo> <retângulo></retângulo> <degrau></degrau> <valorDaEsquerda></valorDaEsquerda> <valorDaDireita></valorDaDiretia> </análise> <degrauDoEstágio></degrauDoEstágio> </estágio> </estágios></treinamento>Exemplo simplificado e traduzido para o português da estrutura do classificador

Nesse arquivo tem a propriedade tamanho do classificador que é o tamanho do retângulo analisado, no classificador do rosto, por exemplo, ele sempre encontra analisa retângulo 20x20, então a região encontrada será sempre um quadrado. Na seqüência do arquivo tem diversos estágios, se a região passar por todos os estágios, então é o objeto procurado. Em cada estágio tem-se uma seqüência de análises que verificam a soma de intensidade de retângulos valorados e compara essa soma com a propriedade degrau (threshold). Se a diferença de intensidades for maior que o threshold então ao valor do estágio é somado a propriedade valorDaDireita (right_value) , se a diferença for menor adiciona-se ao valor do estágio o valorDaEsquerda (left_value). No final de cada estágio compara-se o valor acumulado com a propriedade degrauDoEstágio (stage_threshold), se o valor acumulado for maior, então o algoritmo vai para o próximo estágio, senão a região não representa um objeto procurado.

As propriedades retângulo são compostas por cinco inteiros, os dois primeiros são a coordenada do retângulo, o terceiro inteiro é a largura do retângulo, o quarto é a altura do retângulo e o quinto é a valoração que pode ser positiva ou negativa.

Ferramentas pessoais