Detectando Faces (ou outros objetos) com PHP e OpenCV

Escrever extensões para PHP é legal (apesar da pouca documentação existente). Quer uma prova? Clique aqui.

Este aplicativozinho (tradução oficial de applet) foi feito apenas demonstrar o funcionamento de uma extensão em C++ para PHP, que detecta objetos em imagens utilizando a biblioteca OpenCV. Extensão que também foi feita apenas a título de demonstrar algo: a possibilidade de integração com PHP, C++ e OpenCV. Com um nome profundamente criativo, a extensão FaceDetectionForPHP utiliza uma classe de detecção de objetos em imagens presentes no OpenCV.

O OpenCV oferece uma série de métodos e possibilidades de detecção de objetos de imagens. É possível utilizar, por exemplo, descritores de características locais de imagens, detectores já existentes que utilizam aprendizado de máquina ou então fazer um utilizando suas próprias características visuais. Essa extensão usa uma abordagem com aprendizado de máquina. Apesar de antiga, essa abordagem (que utiliza classificadores adaboost com árvores de decisão e características Haar para os classificadores) é funcional para detectar objetos que tem uma forma relativamente estática (como…  rostos!).

Detecção de faces

Próximo passo: desenhar retângulos verdes para pessoas bonitas e retângulos vermelhos para pessoas feias.

A maior dificuldade com essa abordagem consiste no treinamento. Para isso, é necessário uma boa dose de TEMPO e muitos bons exemplos de imagens dos objetos que precisam ser detectados. E os resultados, obviamente, variam de objeto para objeto. Por sorte, o OpenCV já vem com alguns bons classificadores treinados que podem ser utilizados como exemplos. Dentre eles, alguns para detecção de faces. Um deles está sendo utilizado no supra-citado aplicativozinho para detecção de faces.

Outra (boa) característica desse método de detecção de objetos é sua velocidade e custo computacional. Arvores de decisão e características Haar foram criadas de tal forma que são simples e consequentemente rápidas! Essa velocidade, então, é ampliada pelo fato de que o algoritmo do OpenCV está escrito em C. Aliás, um dos melhores argumentos pró-extensões PHP reside no fato de que códigos em C e C++ são muito mais rápidos que seus equivalentes em PHP. A relação que se tem com o código que o programador escreve em C/C++ e com o código-máquina gerado é muito maior que a relação que se tem com o código PHP e o código-máquina gerado. Isso gera overhead na escrita do código em C/C++, mas dá um controle maior do código gerado ao programador, o que facilita sua otimização.

Enfim, como já dito, caso alguém tenha interesse para o aprendizado, o código da extensão está disponível no GitHub. O código ainda precisa ser lapidado, mas ele utiliza diversos conceitos interessantes sobre extensões de PHP (namespaces, exceções, configurações do arquivo php.ini etc) e também os já citados do OpenCV.



Modelo de currículo em Latex

Bom, o título é quase auto-explicativo: andei refazendo meu currículo e achei um modelo bem bacana, aqui. Dei uma fuçada nele e o adaptei para minhas necessidades (suporte a acentos, tradução etc). E então resolvi compartilhar o que havia feito.

O modelo em .tex está aqui. O resultado da compilação desse modelo pode ser encontrado neste link.