Detecção e rastreamento de faces em vídeos – Como detectar faces em vídeos?

VN:RO [1.9.11_1134]
segunda-feira, 21 d fevereiro d 2011
Por Filipe M. S. de Campos, Coop10. Siga no Twitter

.

Dando continuidade à nossa série de artigos, nesse explicarei sobre a teoria responsável pela detecção facial e também a aplicação dela no projeto de iniciação científica.

..

Teoria envolvida

Durante essa fase do projeto foi desenvolvida a parte do sistema responsável pela detecção de faces em um vídeo, sendo utilizado o algoritmo de Viola e Jones [1], baseado em filtros de Haar em cascata.

Segundo Viola e Jones, seu método possui três contribuições principais que o distingue de outros algoritmos e o torna computacionalmente mais eficiente, elas são: a imagem integral, o algoritmo de aprendizado baseado em AdaBoost e um método para combinar classificadores de complexidade crescente baseados em Haar-like features para criar um filtro em cascata eficiente.

Figura 1 - O valor da imagem integral na posição 1 é a soma dos pixels do retângulo A. O valor referente à posição 2 é igual a soma de A+B, para a posição 3 é A+C e para a posição 4 é A+B+C+D. Logo, a soma dos valores dos pixels do retângulo D pode ser calculada por 4+1-(2+3)

A técnica da imagem integral foi utilizada para que fosse possível computar de forma eficiente a presença ou não de uma Haar-like feature em cada uma das diversas posições e escalas que uma janela de observação pode ser colocada na imagem em que se quer detectar um objeto. Para isso, como o termo integral pode sugerir, é feita a soma dos valores de todos os pixels presentes acima e a esquerda de um pixel em específico podendo esse ser representado por um ponto (x,y) da imagem. Após a integração, obtém-se para cada pixel da imagem o valor da soma dos pixels do retângulo formado pelo canto da origem da imagem (canto superior esquerdo) e pela localização do pixel em questão, assim, para descobrir o valor médio dessa região, basta dividir o valor obtido pela área do retângulo. É importante notar que para calcular o valor médio de uma área que não tem um de seus cantos na origem da imagem, o processo necessário torna-se computacionalmente simples, necessitando de quatro etapas como pode ser visto na figura 1 retirada de [1].

Essa técnica torna eficiente o cálculo para avaliar a presença ou não de uma haar-like feature em determinada posição na imagem, pois utiliza exatamente os resultados obtidos com a imagem integral. Isso ocorre porque a presença é determinada pela subtração da média dos valores dos pixels da região considerada escura com a região clara. Se a diferença estiver acima de um limiar, ou seja, realmente existe uma região mais clara e outra mais escura, então pode ser verificada a existência da feature. Ao lado, pode-se observar o que seriam as haar-like feature na figura 2 retirada de [2] e a sobreposição delas em uma imagem para avaliar sua presença na figura 3 retirada de [1].

Figura 2 - Exemplos de haar-like fetures.

Figura 3 - Exemplo de sobreposição de fetures em uma face.

O algoritmo de aprendizado baseado em AdaBoost é utilizado para definir quais das diversas features existentes serão utilizadas e também os valores dos limiares a que estarão sujeitas. O que Viola e Jones observaram foi que um número pequeno de features combinadas podem formar bons classificadores, sendo o principal problema escolher quais features são as mais adequadas. Para isso, a etapa de aprendizado realizada por uma variante do AdaBoost é responsável pela escolha de uma feature para treinar cada classificador para que ele consiga separar, da melhor maneira possível, amostras positivas e negativas. Assim, para cada feature, o algoritmo determina um limiar que minimize o número de amostras classificadas erroneamente. Na prática, segundo [1], nenhuma feature consegue uma baixa taxa de erro nesse processo de classificação. Para cada ciclo do processo de boosting, que deve escolher uma feature dentre 180000 possíveis, as selecionadas nos primeiros ciclos possuem taxa de erro de 0,1 a 0,3, já as selecionadas durante os ciclos finais chegam a taxas de erro de 0,4 e 0,5.

Figura 4 - Estrutura que representa o detector em cascata.

O produto do processo anterior, os classificadores fracos, cada um contendo uma feature e um limiar, são então combinados com o auxílio de pesos para formar um classificador forte com o intuito de criar uma estrutura que possa minimizar a ocorrência de falsos negativos. Esses são organizados no formato de uma árvore de decisão degenerada que consiste no detector em cascata.

O funcionamento básico de uma estrutura como essa ocorre pela passagem de todas as sub janelas de uma imagem por diversos classificadores, sendo os primeiros mais simples que os seguintes. Se é obtido um resultado positivo pela análise do primeiro classificador, a janela segue para o seguinte, que se também for aprovada, continua pelos próximos classificadores até ser rejeitada ou então chegar ao final da cascata. Em qualquer uma das etapas, uma janela pode ser rejeitada, isso quer dizer que o detector entende que ali uma face não está presente. A cascata descrita pode ser observada na figura 4 ao lado também retirada de [1].

A estrutura dessa cascata reflete uma característica particular de um processo de detecção que consiste na existência de uma quantidade muito maior de sub janelas negativas em uma imagem do que sub janelas positivas, ou seja, que contenham faces. Assim, tem-se como objetivo rejeitar o maior número de janelas negativas logo nas primeiras etapas fazendo com que apenas janelas positivas continuem pelo processo de detecção. Isso é interessante, pois quanto mais se caminha pela estrutura em cascata, passa-se por classificadores mais complexos, e que portanto, exigem um custo maior de processamento. Logo, quanto antes uma janela negativa é rejeitada mais eficiente se torna o processo, pois requisita que apenas janelas positivas, que é um evento raro, passem por toda a árvore.

Em cada etapa os classificadores se tornam mais custosos, pois a medida que se percorre a árvore eles são treinados usando os exemplos que passaram por todas as etapas anteriores. Consequentemente, os classificadores que surgem posteriormente se deparam com uma tarefa de classificação mais difícil.

Como é salientado por Vila e Jones, o treino de uma cascata envolve um dilema entre a eficiência computacional e desempenho do detector. Isso ocorre porque, em geral, classificadores com mais features alcançam taxas maiores para detecção e menores para falsos positivos. Entretanto, classificadores como esses requisitam maior tempo de processamento. Chega-se a conclusão que para otimizar um processo como esse, deve-se atentar para o número de etapas de classificadores, o número de features e o limiar em cada uma dessas etapas. Como essa otimização é um processo extremamente complicado, na prática, o que se faz é criar uma cascata que a cada etapa reduza a taxa de falsos positivos e a taxa de detecção. Para cada etapa, define-se uma meta para o valor mínimo de redução de falsos positivos e para o valor máximo de redução para a detecção. Então, acrescentam-se features até que se atinja as metas estabelecidas para cada etapa e etapas são adicionadas até que se alcance uma taxa de falso positivos e de detecção desejadas para a cascata.

O vídeo abaixo foi retirado do projeto chamado CV Dazzle (mais detalhes sobre esse projeto podem ser vistos aqui e aqui ) e ilustra de forma muito interessante e visual o comportamento do algoritmo para a detecção da face.

 

.

Aplicação no projeto

A biblioteca utilizada nesse projeto, OpenCV, já possui uma implementação do método explicado, bem como um filtro em cascata treinado para detectar faces. Para a manipulação e ajuste desse método, a função responsável do OpenCV possui alguns parâmetros que devem ser passados, entre eles encontram-se: fator de escala para a janela, o número mínimos de vizinhos, o menor tamanho possível para cada face e a opção de procurar faces em áreas que provavelmente elas não existem.

Figura 5 - Detecção de faces com o parâmetro de vizinhos em zero.

O fator de escala da janela é responsável pelo crescimento que a janela recebe em cada ciclo de passagem pela imagem, assim, para um valor de 1,1, a janela cresce dez porcento em cada ciclo. Para um valor de 1,2 cresceria vinte porcento o que resultaria em menos janelas a serem verificadas e que resulta em um menor tempo de processamento porém uma maior chance de se perderem faces.

O número mínimo de vizinhos serve para resolvermos o problema apontado pela figura 5 retirada de [3]. Neste caso, o valor adotado foi zero, o que mostrou todas as regiões da imagem que o detector julgou serem faces. Normalmente, o local onde realmente existe uma face recebe diversas marcações que se sobrepõem. Então, para obtermos um resultado mais adequado, utiliza-se esse parâmetro para definir o número mínimo de regiões sobrepostas necessárias para que uma face seja retornada.

O parâmetro do menor tamanho possível para cada face é utilizado para definirmos um tamanho mínimo para a face ser encontrada diferente do padrão pelo qual o filtro em cascata foi treinado, que em geral é de 20×20 ou 24×24 pixels. Assim, podemos determinar que apenas faces de tamanhos maiores sejam encontradas com a intenção de que não se perca tempo de processamento tentando detectar faces que não interessam para a aplicação que o sistema esteja sendo desenvolvido.

O último parâmetro permite evitar a procura de faces em áreas que provavelmente elas não existem. Isso também é útil para evitar que se perca tempo de processamento em áreas que, após a passagem de um detetor de bordas na imagem, acredita-se que não existam faces.

Após implementar o método, diversos ajustes foram necessários para maximizar seu desempenho.  Os parâmetros da função do OpenCV do algoritmo de Viola e Jones foram variados e também combinou-se essa função com outras etapas de processamento da imagem antes de sua detecção, como o aumento e a diminuição da imagem, equalização de histograma e smoothing. Na tentativa de aumentar o número de faces detectadas, o parâmetro de número mínimos de vizinhos foi diminuído, o que também resultou no aumento do número de falsos positivos, o que era esperado. Entretanto, isso não causou problemas para o projeto, pois, posteriormente, os falsos positivos foram tratados e puderam ser retirados do conjunto de faces encontradas. Verificou-se que a melhor combinação ocorreu para uma imagem de setenta e sete por cento da original, com um fator de escala para a janela de dez porcento, número mínimo de vizinhos igual a quatro, sem busca em regiões que provavelmente não existem faces e gaussian blur 3×3.

Ao final, o detector mostrou bons resultados. Como era esperado, faces frontais foram bem identificadas contanto que não estivessem rotacionadas, já que essa característica é uma limitação do método utilizado. Apenas faces levemente rotacionadas ainda eram identificadas. Sobre invariância a escala, o método se mostrou adequado. O único fato que pode ser percebido foi sua restrição ao tamanho mínimo da face presente no vídeo, que decorre da limitação existente no detector em cascata utilizada pelo método. Isso limita a identificação de faces muito pequenas presentes em vídeos, mas não comprometeu o projeto, já que faces desse tamanho não são tão frequentes e quando presentes, normalmente não fazem parte da ação principal da tomada. Ainda pode ser citado, que, apesar do filtro em cascata ter sido criado para detectar faces frontais, percebeu-se que, em alguns casos, faces quase laterais foram identificadas, beneficiando-nos com um maior número de faces encontradas no vídeo.

Seguem exemplos de detecção facial realizadas nessa etapa do projeto nas figuras 6, 7 e 8 abaixo:

Figura 6 - Exemplo de detecção de face.

Figura 7 - Exemplo de detecção de múltiplas faces.

Figura 8 - Exemplo de detecção em face não frontal

.

Referências

[1] P. Viola and M. Jones. Rapid object detection using a boosted cascade of simple features. In CVPR 2001 – IEEE Conference on Computer Vision and Pattern Recognition, 2001.

[2] A. Kuranov, R. Lienhart, and V. Pisarevsky. An empirical analysis of boosting algorithms for rapid objects with an extended set of haar-like features. Intel Technical Report MRL-TR-July02-01, 2002.

[3] Robin Hewitt. Seeing with opencv – part2 – Finding faces in images, SERVO, 2007.

(http://www.cognotics.com/opencv/servo_2007_series/index.html)

.

.

Artigos da série:

Próximo: Como rastrear faces em vídeos?

Anterior: Detecção e rastreamento de faces em vídeos

.


VN:F [1.9.11_1134]
Rating: 5.0/5 (1 vote cast)
Detecção e rastreamento de faces em vídeos - Como detectar faces em vídeos?, 5.0 out of 5 based on 1 rating
Related Posts with Thumbnails

Filipe Morgado Simões de Campos
Filipe Morgado Simões de Campos

Mestrando em Ciência da Computação no tema de Visão Computacional e formado em Engenharia de Computação (2010). Atualmente, além de ser um dos administradores do Bit a Bit, alia seu mestrado ao empreendedorismo. Ainda, foi cofundador do Amo DinDin (2007) e desenvolveu parceria e produtos de busca com o BuscaPé, sendo um dos idealizadores do Pé Direito (2009).

Tags: , , , , , , , , , , ,

5 Comentários para “Detecção e rastreamento de faces em vídeos – Como detectar faces em vídeos?”

  1. Valeu cara, ótimo post!
    melhor explicação que eu achei desde que comecei meu projeto final.

    VA:F [1.9.11_1134]
    Rating: +2 (from 2 votes)
    #524
  2. Anderson

    Retornei depois de um tempo, por falta de paciência mesmo, pedindo ajuda e ninguém dá, a única coisa que quero criar aqui é um detector de faces ou objetos, qualquer um que utilize web, servo e Arduíno, só que montar é fácil, o difícil é programar, já tentei procedimentos do Open CV e nada…..Obrigado.

    VA:F [1.9.11_1134]
    Rating: 0 (from 0 votes)
    #1279
  3. Adalberto Filipe

    Obrigado Filipe!
    Gostaria de saber qual foi IDE usado para desenvolver o projeto.

    Abraços.

    VA:F [1.9.11_1134]
    Rating: 0 (from 0 votes)
    #1518
    • Filipe M. S. de Campos

      Olá, Adalberto!

      O projeto foi feito na época em Linux, Ubuntu se não me engano. Se não me falha a memória, nessa época o projeto foi feito com o editor de texto padrão do Ubuntu. Hoje, creio que começaria o projeto usando o Sublime Text.

      Abraços

      VN:F [1.9.11_1134]
      Rating: 0 (from 0 votes)
      #1520

Deixe um Comentário

Spam Protection by WP-SpamFree

Get Adobe Flash playerPlugin by wpburn.com wordpress themes