Detectando faces com PHP e OpenCV

Como detectar faces numa imagem usando PHP e OpenCV

Adjamilton Junior
Jaguaribe Tech
5 min readAug 15, 2019

--

Reconhecimento facial é a buzzword da vez. Admiração e polêmica cercam a expressão por todos os lados. Governos, universidades, empresas e indivíduos se debruçam sobre essa novidade — já nem tão nova assim — para discutir sua aplicação, uns são claramente a favor, enquanto outros nem tanto.

O cerne da polêmica é a privacidade — ou melhor, a falta dela. Além da ideia assustadora de viver em um verdadeiro Big Brother, tem algumas perguntas que precisam de respostas, como: “quem tem acesso a essas imagens”, “o que é feito com elas” e “o sistema será usado para segurança ou vigilância”.

Agora, polêmicas a parte, vamos entender como a tecnologia funciona em um contexto geral. O processo tem 4 etapas básicas, fundamentadas no processamento digital de imagem (PDI), sendo: (1) detecção facial na imagem; (2) normalização dos pontos faciais; (3) extração das características faciais; (4) reconhecimento facial — verificação e identificação.

1 — Rosto é detectado; 2 — Rosto é caracterizado; 3 — Características são extraídas; 4— Rosto é identificado.

Resumindo, algoritmos são aplicados na imagem para detectar a presença de rosto(s). Em seguida, pontos são marcados em localidades específicas do rosto para definir seus traços, assim pode-se extrair características como distância entre os olhos, bochechas, orelhas, da testa para o queixo etc, medidas que diferenciam a fisionomia das pessoas. Por último, uma base de dados com rostos previamente cadastrados é consultada em busca de imagens que correspondam as mesmas características do rosto em análise para proceder a identificação.

Nesse artigo vou focar apenas na primeira etapa, que é detectar faces numa imagem e, para isso, vou utilizar a OpenCV e a linguagem PHP. Para quem não conhece, a OpenCV é uma renomada biblioteca de visão computacional e aprendizado de máquina, inicialmente desenvolvida pela Intel e, posteriormente, liberada como projeto open source.

Essa biblioteca tem mais de 2500 algoritmos otimizados que pode nos auxiliar em tarefas como: detectar e reconhecer faces, identificar objetos, classificar ações humanas em vídeos, extrair modelos 3D de objetos, procurar imagens similares em uma base de dados de imagens, remover olhos vermelhos em uma imagem retirada com uso de flash, seguir movimentos dos olhos etc.

PHP-OpenCV

A OpenCV é desenvolvida em C++, então, para que outras linguagens de programação possam usar a biblioteca é preciso desenvolver uma interface (binding) que faça a comunicação entre elas. É isso que o projeto PHP-OpenCV faz. Dessa forma, os usuários da linguagem PHP não precisam aprender outra linguagem para usar a biblioteca.

Instalando PHP-OpenCV

Por questões práticas, vou considerar apenas a instalação na plataforma GNU/Linux, uma vez que usei a distribuição Ubuntu 18.04 LTS para este experimento.

Antes de prosseguir, é preciso que se tenha a biblioteca OpenCV 3.3 prontamente instalada. Se ainda não tiver, veja como proceder no repositório oficial do GitHub.

No terminal, execute os comandos abaixo. E atente-se para incluir o path do seu arquivo de configuração do PHP quando for executar o comando ./configure.

No arquivo php.ini, inclua a seguinte linha: extension=”opencv.so path”.

Detectando faces

Vamos ver na prática como a detecção de faces é realizada. Para facilitar, você pode clonar o repositório que eu criei contendo o código, o classificador e a imagem necessária para executar o teste.

Como exemplo, usaremos a imagem abaixo, que está localizada na pasta images.

Imagem que será usada no processo de detecção de face.

Código

O código necessário para fazer nosso “hello world” da detecção de faces é bem simples. A execução deve ser feita diretamente no terminal.

Código para detecção de faces usando PHP e OpenCV.

Resumindo, o código instância um classificador (linha 8) e carrega o classificador que será usado (linha 9). Na linha 12 a imagem que vai ser processada é carregada. Em seguida, a imagem é convertida para escala de cinza (linha 15). A linha 16 faz a detecção em si, usando a imagem em escala de cinza e salvando a(s) face(s) encontrada(s) na variável $faces. Se alguma face for encontrada, seguimos para a marcação do rosto na imagem (linha 19 a 24). Por último, na linha 27, a imagem que contém o resultado é salva na pasta results.

Nesse caso usaremos o classificador LBP, que está disponível no repositório da OpenCV. No README, dentro da pasta models, tem o link para o classificador. O classificador contém as informações básicas das características universais que todas as faces tem, sendo usado para encontrar esses pontos.

A conversão da foto de RGB para escala de cinza (Grayscale) acontece porque é mais fácil detectar faces nesse padrão de cor.

Resultado

A execução do código listado acima resulta na imagem contendo a marcação do rosto. A imagem está salva na pasta results.

Imagem com rosto detectado.

Conclusão

PHP é uma linguagem subestimada, porém, é muito poderosa. Já vem mostrando sua força na web a muitos anos, mas se dá muito bem em outras áreas também, como foi mostrado aqui. E, o uso da biblioteca OpenCV torna a manipulação de imagens numa tarefa ridiculamente simples mas altamente eficiente.

Este foi um exemplo bem simples — de fato, um pequeno hello world — para mostrar que é possível usar PHP para trabalhar com manipulação de imagens. Espero que tenha sido o suficiente para incentivar os programadores PHP a prosseguir os estudos sobre a OpenCV usando sua linguagem favorita.

--

--