Baixe o app para aproveitar ainda mais
Prévia do material em texto
UNIVERSIDADE FEDERAL DE SÃO CARLOS Apresentado à disciplina PROJETO ACADÊMICO EM COMPUTAÇÃO – TURMA B Sob docência de Prof. Dr. Wanderley Lopes de Souza Um Estudo Sobre o Algoritmo Viola-Jones para Detecção de Faces em Imagens Relatório Final Isadora Eliziário Gallerani – 726542 Aluna de Bacharelado em Ciência da Computação Universidade Federal de São Carlos Trabalho orientado por Prof. Dr. Alexandre Luis Magalhães Levada Departamento de Computação Universidade Federal de São Carlos São Carlos 2018 1. Resumo Este presente trabalho – o qual visa abordar um estudo sobre o já conhecido e disseminado algoritmo de detecção de faces Viola-Jones (Paul Viola e Michael Jones, 2001) – foi desenvolvido como o projeto final para a disciplina Projeto Acadêmico em Computação, referente ao Departamento de Computação da Universidade Federal de São Carlos (UFSCar), ministrada pelo Prof. Dr. Wanderley Lopes de Souza. Desde o início do desenvolvimento desta pesquisa a mesma consta de orientação e supervisão realizada pelo Prof. Dr. Alexandre Levada, professor adjunto do Departamento de Computação da Universidade Federal de São Carlos (UFSCar), campus São Carlos, o qual possui atuação em áreas correlatas ao tópico abordado neste trabalho: processamento de imagens e sinais e reconhecimento de padrões. O projeto apresentado neste documento tem como foco investigar uma abordagem de reconhecimento de faces, relacionando-a à aplicação do Viola-Jones, acoplado de métodos já conhecidos sobre o assunto para análise de imagens. Também será feito uso da linguagem Python e OpenCV para demonstrar o funcionamento do algoritmo. 2. Introdução O trabalho em questão apresentado à esta disciplina é vinculado aos estudos do algoritmo Viola- Jones (Paul Viola e Michael Jones, 2001), originalmente escrito utilizando as linguagens C/C++, sendo este o primeiro framework amplamente utilizado dentro de assuntos referentes à detecção de objetos em imagens, especialmente, faces humanas. Nesta proposta de pesquisa, será estudado a fundo cada uma das quatro etapas já previamente propostas pelos criadores originais do algoritmo. Cada uma das etapas constará de explicação teórica e uso de imagens para facilitar o entendimento dos tópicos. Ao final, será demonstrada e explicada a implementação do Viola-Jones de acordo com todos os seus requisitos e passos-a-passos. Porém, neste projeto, foi optado por utilizar Python e OpenCV, como fora solicitado e indicado pelo professor orientador. O objetivo é demonstrar que é possível construir um reconhecedor facial de maneira fácil e bastante rápida utilizando esta linguagem e biblioteca. Quanto aos resultados finais obtidos, serão trabalhados de duas maneiras: ● Primeiramente, apresentando os resultados fornecidos de maneira correta pelo algoritmo – ou seja, aquelas imagens nas quais o algoritmo sinalizou corretamente a existência de faces; ● Em segundo, os ditos resultados errôneos, nos quais são classificadas como faces partes da imagem que claramente não são. Também será tratada a motivação que levou o algoritmo ao erro e como é possível “consertar” os classificadores utilizados para tal ação. 3. Trabalhos Correlatos Para este estudo, alguns trabalhos foram previamentes fornecidos pelo professor orientador, Prof. Dr. Alexandre Levada, e outros foram encontrados ao realizar a Revisão Sistemática utilizando o software StArt. Para a realização deste relatório intermediário, alguns foram amplamente utilizados, como o artigo original dos criadores do Viola-Jones, “Robust Real-Time Face Detection” [1]. Este foi bastante útil para realizar todo o embasamento teórico e técnico da pesquisa, justamente por se tratar do artigo original, o qual documenta todas as seções necessárias para a formulação das primeiras linhas de código do Viola-Jones. Porém, artigos como o “Rapid Object Detection Using a Boosted Cascade of Simple Features” [3], advindo do trabalho dos mesmos autores citados anteriormente, também foi utilizado para o pleno entendimento de outras etapas do algoritmo. Este artigo citado foi utilizado para aprofundamento no caso do uso da arquitetura em cascata de classificadores. Vale ressaltar que cascatas de classificadores são uma parte muito importante do concebimento do Viola-Jones e seu funcionamento correto, como será relatado na Fundamentação Teórica e Técnica, mais precisamente, no quarto passo. O artigo “Implementing the Viola-Jones Face Detection Algorithm” [2] trata-se de um estudo do Viola-Jones, um pouco mais simplificado do que o artigo originalmente exposto. Este foi utilizado para entendimento nas partes em que o original [1] não refinou tanto, por aparentemente, contar com o conhecimento técnico do leitor. Neste também podemos analisar um modo de implementação do algoritmo, tornando interessante e bastante útil para a etapa final de conclusão de resultados do projeto, por necessitar de uma implementação em código e seu entendimento. Já quanto ao “A Survey on Face Detection in the Wild: Past, Present and Future” [4], foi feito uso para entendimento genérico do assunto-base do algoritmo, quanto à Computação Visual e o entendimento e análise de imagens de maneira computacional, o que auxiliou ao explicar alguns tópicos referentes à este tema, os quais serão amplamente analisados na Seção 4, mais precisamente, passos um e dois. 4. Fundamentação Teórica e Técnica O algoritmo Viola-Jones é um framework que atua sobre imagens, fazendo uso de diversas etapas e procedimentos de análise, os quais serão citados e desenvolvidos neste estudo. Por ser o primeiro desta área, é amplamente replicado em diversas outras técnicas que visam o mesmo objetivo ou similar. Sua aplicação dá-se na detecção dentro de diversas classes de objetos, porém, com maior motivação de uso dentro da busca por faces humanas. Afim de alcançar este objetivo, alguns passos são impostos. 3.1 Primeiro Passo: Seleção de Recursos de Haar Esta etapa é baseada na busca por propriedades similares às características faciais, as quais podem ser combinadas ao utilizar os Recursos de Haar. Como toda face humana compartilha algumas características, será feita uma procura pelos chamados matches, que são as combinações encontradas entre as características da imagem e as características bases faciais, realizando uma análise por coloração de pixels em determinadas áreas. Algumas propriedades analisadas, são: ● Localização e tamanho de olhos, boca, nariz; ● Tipo de coloração de pixels de determinadas áreas (por exemplo, a região dos olhos são mais escuras do que a região das bochechas superiores, assim como a região da ponte nasal é mais brilhante do que a dos olhos). Em uma primeira etapa, transforma-se uma imagem normal em integral, e isso é feito alterando o valor de cada pixel de acordo com a soma dos demais adjacentes. Figura 1 – À esquerda, a imagem de entrada e à direita, o que seria a imagem integral dela. Assim, conforme as características correspondidas – chamadas de features – possíveis neste algoritmo, estas são procuradas dentro da imagem integral da enviada para análise. Nesta parte, será realizado o trabalho sobre as tais features em formatos do tipo retangular. Figura 2 – Tipos de retângulos que podem ser trabalhados dentro das imagens. Com estes tipos de retângulos e variantes em mãos, eles são expostos em imagens à procura das features. Figura 3 – Exemplo de posicionamento dos retângulos em um rosto.Com estes retângulos em mãos, é possível abordá-los de maneira matemática, utilizando estas informações extraídas para etapas futuras do processamento da imagem. 3.2 Segundo Passo: Análise da Área Somada Nesta etapa realiza-se a análise das áreas retangulares de cada característica facial encontrada dentro da imagem integral. Como as áreas retangulares de cada característica acabam por serem adjacentes a pelo menos mais um destes retângulos, quaisquer dois retângulos podem ser calculados em seis referências de matriz, e segue-se que três retângulos calculados em oito e quatro retângulos calculados em nove, e assim por diante. Figura 4 – Representação de uma área somada de quadrado. 3.3 Terceiro Passo: Aplicação de Algoritmo de Aprendizado Devido à alta complexidade e ao grande número de features retangulares encontradas e que devem ser avaliadas - sendo este um número superior até mesmo ao número de pixels na área em trabalho -, torna-se um tanto quanto inviável avaliar cada uma por si só - não apenas pelo tempo empenhado nesta única tarefa, mas também pelo custo/preço. Ao invés de trabalhar com o número completo de features, pode-se optar por utilizar um número muito pequeno destas ao combiná-las para montar um classificador. A dificuldade está em encontrar as features corretas. Por conta deste fato, torna-se de grande utilidade o uso de algum algoritmo de aprendizado. Mais especificamente, será tratado o uso do AdaBoost modificado, o qual é capaz de realizar a seleção das melhores features possíveis encontradas em fases anteriores, podendo, então, construir um classificador forte através de uma combinação ponderada dos classificadores tidos como fracos. Porém, sua modificação permitirá a seleção apenas das melhores features possíveis. Diante desta condição, é feito uso de um método simples de força bruta: a determinação de cada novo classificador fraco envolve a avaliação de desempenho de cada feature em todos os treinamentos realizados, tendo como base o seu erro ponderado, procurando encontrar o de melhor desempenho. Assim, diminui-se o peso de um exemplo corretamente avaliado e os que forem incorretamente classificados, mantém-se. 3.4 Quarto Passo: Arquitetura em Cascata O princípio básico deste algoritmo em estudo força-o a varrer o detector diversas vezes na imagem em estudo. Mesmo que a imagem contenha uma ou mais faces - ou até mesmo nenhuma -, inúmeras sub janelas seriam negativas, justamente por não conterem nenhum match facial, ou seja, não contendo uma face humana em determinada área avaliada. Por conta desse fato, o Viola-Jones é levado a descartar não-faces ao invés de ficar incessantemente procurando por faces por conta da rapidez empregada nesta tarefa: é mais rápido descartar uma área que não possui rosto do que propriamente encontrar um. Assim, o uso de um único classificador forte torna-se inviável e custoso, e devido à isso, surge a necessidade de um classificador em cascata, sendo este composto por diversos estágios, cada qual fazendo uso de um classificador forte. Cada estágio irá dizer se determinada área não possui face ou se ficou em dúvida. Não sendo face, é automaticamente descartada. Em caso de dúvida, esta sub janela é levada para avaliação no próximo estágio. Assim, quanto mais estágios uma área passa, maior a chance dela, de fato, conter um rosto. Pelo andamento dos estágios, é normal e esperado que no início da avaliação o algoritmo aceite diversos falso-positivos, mas este fato não é tratado como um problema, pois espera-se que os estágios seguintes o classifiquem corretamente, até chegar ao último estágio e esse fornecer realmente as faces encontradas. 5. Descrição do Projeto e Principais Resultados Obtidos Após realizado o estudo sobre as principais características propostas, torna-se evidente a sua complexidade. Porém, neste projeto, será demonstrado como essa implementação pode-se tornar simples e rápida ao fazer uso da linguagem Python e a biblioteca OpenCV. 5.1 Biblioteca OpenCV A OpenCV trata-se da mais popular e mais utilizada biblioteca dentro dos tópicos relacionados à visão computacional. Previamente, esta é original nas linguagens C e C++, e apenas atualmente foi remodelada para atender também à linguagem Python, a qual vem crescendo diariamente quanto ao seu número de adeptos. O uso desta biblioteca em específico foi feito por um motivo crucial: ela utiliza algoritmos de aprendizado de máquina justamente para procurar faces dentro de imagens. Este fato eliminaria a necessidade de implementar o AdaBoost, utilizado no algoritmo original do Viola-Jones. Como já fora tratado anteriormente, volta-se a reafirmar: não é uma tarefa simples detectar faces em imagens, ou seja, não existem testes fáceis e rápidos. Para que seja possível realizar essa detecção, é fundamental a existência de diversos padrões e recursos que busquem correspondência nas imagens. O algoritmo irá “quebrar” a tarefa principal – encontrar faces, de fato – em “mini tarefas”: nestas etapas, temos o uso dos classificadores. Infelizmente, para se calcular um rosto humano, há uma taxa de seis mil ou mais classificadores existentes para fornecer um resultado positivo quanto à busca. O algoritmo dá-se início no canto superior esquerdo e assim prossegue por pequenos blocos de dados. Ao final deste caminho, milhões de cálculos teriam que ser realizados e o computador, provavelmente, travaria. Assim, o OpenCV utiliza o método de cascata para quebrar os milhões de cálculos que podem existir dentro de uma única imagem: para cada bloco de dado, faz-se um teste rápido de comprovação. A face somente será finalmente detectada caso todos os blocos de dados sejam aprovados ao final. Este método cascata, dentro da OpenCV, é o conjunto de vários arquivos do tipo XML que contém os dados da própria biblioteca para realizar a detecção de objetos. Dentre estes arquivos, constam alguns relacionados à detecção de olhos, mãos, pernas, partes não humanas, etc. Assim, ao selecionar os recursos certos, torna-se fácil detectar um rosto. 5.2 O Algoritmo O algoritmo final, escrito em Python, funciona da seguinte maneira: ● O usuário pode inserir a imagem que desejar para fazer o teste; ● Primeiramente, faz-se uso da cascata padrão para detecção de restos (um arquivo XML), fornecida já pela OpenCV; ● Carrega-se a cascata para a memória para depois inicializá-la com a imagem desejada; ● Por fim, uma função é utilizada para detectar a face real: ○ Previamente, ela é apenas uma “função geral” utilizada para detectar objetos; ○ Em segundo, uma subfunção é utilizada para avaliar a aproximação do rosto à câmera. É utilizado um fato para compensar este fato; ○ Por fim, é realizada a contagem dos objetos detectados e dos encontrado ao seu redor, antes de afirmar se são ou não faces; ○ Ao ter certeza, depois de aplicar os arquivos XML referentes à detecção de rosto, retorna-se uma lista de retângulos nas áreas em que o algoritmo acredita ter detectado corretamente uma face humana. Vale ressaltar que, infelizmente, não são em todos os casos que o algoritmo apresenta um resultado coerente. Para este problema, é necessário fazer uma revisão de alguns parâmetros, como por exemplo, os fatores de escala da imagem. Ao realizar alterações nessa variável, pode-se encontrar uma acurácia maior, dependendo da necessidade da imagem (i.e, imagens com faces pequenas, ou faces muito próximas da câmera, ou até mesmo traços da imagem que possam confundir os classificadores). 5.1 Resultados Obtidos com Imagens Algumas imagens foram escolhidas aleatoriamente da Internet para serem realizados os testes. Estas figuras foram aplicadas aocódigo e geraram resultados passíveis de análise. Diversas imagens foram submetidas aos testes, mas para este projeto, serão relatadas apenas algumas que demonstram características relevantes a serem comentadas. Figura 5 – Imagem da Seleção do Brasil, constando de onze faces humanas. Quanto à Figura 5, o algoritmo foi capaz de alcançar seu objetivo com êxito: sem ser necessário qualquer tipo de alteração de parâmetros, ele foi capaz de detectar as onze faces humanas presentes. Figura 6 – Imagem contendo cinco faces humanas, porém, somente uma reconhecida. Já na Figura 6, o algoritmo não foi capaz de realizar o reconhecimento de modo correto. Este fato pode ter ocorrido pelo fato da imagem ser muito pequena e de pouca qualidade, o que dificultou a análise precisa de seus classificadores. Figura 7 – Imagem contendo uma face humana, a qual não foi identificada. Quanto à Figura 7, o algoritmo não foi capaz de realizar qualquer reconhecimento facial pelo fato de certas limitações quanto ao código construído, o qual não realiza o tratamento para reconhecer faces em que a mesma não se encontre numa posição “muito” vertical. Até alguns graus de inclinação, o algoritmo é tolerante, mas como na inclinação demonstrada na imagem, ele já passa a não reconhecer e não aciona qualquer indicativo de detecção. Figura 8 – Imagem com quatro faces, na qual o algoritmo reconhece seis. Na Figura 8, contendo apenas quatro faces claras e visíveis, o algoritmo retorna que foram encontradas seis. Claramente, aos olhos humanos de um usuário, existe algum problema quanto à esta constatação. Para consertar este caso, é necessário alterar o código quanto à acurácia de parâmetros, pois o mesmo pode estar “se confundindo” em meio às suas cascatas de padrões. Figura 9 – Imagem com quatro faces, na qual o algoritmo acusa encontrar cinco. Aumentando o parâmetro de escala em algumas unidades, o algoritmo demonstrou ter aumentado sua eficiência, mas ainda assim, não de maneira satisfatória: na imagem, a qual contém quatro faces, ele ainda detecta uma a mais. Ainda é necessário aumentar um pouco mais as unidades de escala para alcançar um resultado coerente. Assim, fica claro que o algoritmo não está perfeito para trabalhar por si só, ainda demandando de aperfeiçoamentos manuais mesmo após finalizar a análise da imagem. Figura 10 – Imagem constando de quatro faces. Após aumentar a escala em mais algumas unidades, o algoritmo finalmente realiza a detecção correta de faces, retornando o resultado esperado pelo usuário. 6. Conclusão e Trabalhos Futuros Após meses de pesquisa quanto ao algoritmo Viola-Jones e suas diversas etapas e características, foi possível realizar a visualização da implementação do mesmo ao optar por uma maneira diferente de realizá-la, empregando Python e OpenCV em conjunto. Esta dupla permitiu que fosse encontrada uma implementação muito mais rápida e fácil em comparação à original, viável para o tempo disponibilizado para a realização desta pesquisa. Como já fora previamente demonstrado nos resultados, o algoritmo não é perfeito e apresenta falhas. Porém, essas falhas podem ser corrigidas com alteração de variáveis de escala dentro do código, aumentando a sua acurácia. Mas esse fato só pode ser realizado de acordo com cada imagem, em específico – não são todas que apresentam resultados coerentes ao elevar ou diminuir o valor da taxa. Porém, quanto à sua ideia base, o algoritmo demonstra-se suficiente na maioria dos casos, apresentando resultados interessantes e corretos. Quanto aos trabalhos futuros, seria interessante implementar neste código uma funcionalidade referente a rotação de faces em imagens, um problema relatado em um dos resultados apresentados. Como o algoritmo só consegue reconhecer rostos em posição vertical ou levemente inclinados, tornaria- o mais completo uma função que analisasse os graus de rotação em relação às cascatas de classificadores. Ademais, este projeto tornou-se uma experiência intrigante e foi capaz de apresentar um estudo mais minucioso da técnica em análise. 7. Referências [1] Paul Viola, Michael J. Jones, Robust Real-Time Face Detection, International Journal of Computer Vision, 2004. [2] Ole Helvig Jensen, Implementing the Viola-Jones Face Detection Algorithm, Kongens Lyngby, 2008. [3] Paul Viola, Michael J. Jones, Rapid Object Detection Using a Boosted Cascade of Simple Features, Accepted Conference of Computer Vision and Pattern Recognition, 2001. [4] Stefanos Zafeiriou, Cha Zhang, Zhengyou Zhang, A Survey on Face Detection in the Wild: Past, Present and Future, Computer Vision and Image Understanding, 2015.
Compartilhar