Você já se perguntou como o Snapchat aplica com precisão vários filtros em seu rosto? Seu smartphone está fazendo mágica quando é desbloqueado usando seus recursos faciais? Não, você está apenas assistindo a detecção de rosto em ação.

Face Detection é uma tecnologia de Inteligência Artificial que pode identificar rostos humanos em uma imagem ou vídeo digital. Descubra como você pode criar um programa de detecção facial em tempo real em menos de 25 linhas de código com o lendário algoritmo Haar Cascade.

O que é a Cascata Haar?

Haar Cascade é um algoritmo de detecção de objetos introduzido por Paul Viola e Michael Jones para detectar rostos em imagens ou vídeos. Uma função em cascata é treinada usando muitas imagens positivas e negativas que podem ser usadas posteriormente para identificar qualquer objeto ou rosto em outras mídias. Esses arquivos treinados estão disponíveis no Repositório OpenCV GitHub.

Usando uma abordagem de janela deslizante, uma janela de tamanho fixo itera sobre uma imagem da esquerda para a direita, de cima para baixo. A cada fase, a janela para e classifica se a área contém um rosto ou não.

O OpenCV, uma ferramenta de visão computacional, trabalha com um modelo Haar Cascade pré-treinado para classificar os recursos. Cada fase verifica cinco recursos: dois recursos de borda, dois recursos de linha e um recurso de quatro retângulos.

Na observação, a área dos olhos parece mais escura do que a área das bochechas, enquanto a área do nariz parece mais clara do que a área dos olhos. Você pode visualizar esses recursos da maneira abaixo.

Usando esses recursos e a computação de pixels, o algoritmo identifica mais de 100.000 pontos de dados. Você pode usar um algoritmo Adaboost para melhorar a precisão e descartar recursos irrelevantes. Ao longo de muitas iterações, essa abordagem minimiza a taxa de erro e aumenta o peso do recurso até atingir uma precisão aceitável.

No entanto, a técnica de janela deslizante para se um caso de teste específico falhar e é computacionalmente caro. Para resolver isso, você pode aplicar o conceito da Cascata de Classificadores. Em vez de aplicar todos os recursos em uma única janela, essa abordagem os agrupa e os aplica em etapas.

Se a janela falhar no primeiro estágio, o processo a descarta, caso contrário, ela continua. Isso leva a uma diminuição drástica no número de operações a serem executadas e torna viável o uso para aplicações em tempo real.

Fluxo de Trabalho de Detecção de Rosto

Siga este algoritmo para criar seu programa de detecção facial:

  1. Carregue o algoritmo Haar Cascade Frontal Face.
  2. Inicialize a câmera.
  3. Leia os quadros da câmera.
  4. Converta imagens coloridas em tons de cinza.
  5. Obtenha as coordenadas faciais.
  6. Desenhe um retângulo e coloque a mensagem apropriada.
  7. Exibir a saída.

O que é o OpenCV?

OpenCV é uma biblioteca de visão computacional e aprendizado de máquina de código aberto. Possui mais de 2.500 algoritmos otimizados para diversas aplicações. Isso inclui detecção de face/objeto, reconhecimento, classificação e muito mais.

Privacidade dos seus dados faciais é uma preocupação à parte. Centenas de empresas proeminentes, como Google, IBM e Yahoo, usam o OpenCV em seus aplicativos. Algumas pessoas que pretendem manter seus dados privados demonstraram existem maneiras de evitar o reconhecimento facial.

Para instalar o OpenCV em Python, use o comando:

pip instalar opencv-python

Como construir um programa de detecção facial usando Python

Siga estas etapas para criar o detector facial:

Este código de exemplo, juntamente com o arquivo de algoritmo Haar Cascade, está disponível em um Repositório GitHub e é gratuito para você usar sob a licença MIT.

  1. Faça o download do Haar Cascade Face frontal XML padrão arquivo e coloque-o no mesmo local que seu programa Python.
  2. Importe a biblioteca OpenCV.
    # importando as bibliotecas necessárias
    importar cv2
  3. Armazene o arquivo do algoritmo Haar Cascade Frontal Face para fácil referência.
    # carregando o arquivo de algoritmo de caso haar na variável alg
    alg = "haarcascade_frontalface_default.xml"
  4. Use a classe CascadeClassifier para carregar um arquivo XML no OpenCV.
    # passando o algoritmo para o OpenCV
    haar_cascade = cv2.CascadeClassifier (alg)
  5. Capture o vídeo da câmera. Passe 0 para o Captura de vídeo() função para usar sua câmera principal. Se você conectou uma câmera externa, pode usar os números sucessivos 1, 2 e assim por diante para usá-la.
    # capturando o feed de vídeo da câmera
    cam = cv2.VideoCapture (0)
  6. Configure um loop infinito para ler a entrada da câmera quadro a quadro. O ler() função retorna dois parâmetros. O primeiro valor é do tipo booleano indicando se a operação foi bem-sucedida ou não. O segundo parâmetro contém o quadro real com o qual você trabalhará. Armazene este quadro no img variável.
    enquantoVerdadeiro:
    _, img = cam.read()
  7. Defina o texto padrão para aparecer como Rosto não detectado. Quando detectado, atualize o valor desta variável.
     texto = "Rosto não detectado"
  8. A entrada recebida do mundo real é colorida, no formato BGR. BGR significa azul, verde e vermelho. Isso cria muito processamento para aplicativos de visão computacional. Para reduzir isso, use um formato em tons de cinza.
    # converte cada quadro de BGR para tons de cinza
    grayImg = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY)
    Passe o formato do quadro e do código de conversão, COLOR_BGR2GRAY, para cvtColor() para alterar cada quadro do vídeo de colorido para escala de cinza.
  9. Usar detectMultiScale() para detectar rostos. Este método usa três parâmetros como entrada. Primeiro é a imagem de origem, grayImg. O segundo parâmetro é o scaleFactor. Isso especifica quanto você precisa reduzir o tamanho da imagem em cada escala de imagem. Use o valor padrão 1,3 como fator de escala. Quanto maior o fator de escala, menos etapas e mais rápida a execução. No entanto, também há uma maior probabilidade de faltar rostos. O terceiro parâmetro é minNeighbours. Isso especifica quantos vizinhos cada retângulo candidato deve ter para retê-lo. Quanto maior o valor, menor a chance de um falso positivo, mas também significa perder traços faciais pouco claros.
    # detectar rostos usando Haar Cascade 
    face = haar_cascade.detectMultiScale (grayImg, 1.3, 4)
  10. Quando você detecta um rosto, obtém quatro coordenadas. x representa a coordenada x, y representa a coordenada y, w representa a largura e h representa a altura. Atualize o texto para Rosto detectado e desenhe um retângulo usando essas coordenadas. A cor do retângulo é o formato verde (BGR) com uma espessura de dois pixels.
    # desenhe um retângulo ao redor da face e atualize o texto para Face Detectada
    para (x, y, w, h) na face:
    texto = "Rosto detectado"
    cv2.retângulo(img, (x, y), (x + c, y + h), (0, 255, 0), 2)
  11. Opcionalmente, imprima o texto no console de saída. Exiba o texto na tela usando o quadro capturado como fonte, texto obtido no texto acima, fonte estilo de FONT_HERSHEY_SIMPLEX, fator de escala de fonte de 1, cor azul, espessura de dois pixels e tipo de linha de AA.
    # exibe o texto na imagem
    imprimir(texto)
    imagem = cv2.putText (img, texto, (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2, cv2.LINE_AA)
  12. Exibir a janela com o título Detecção de rosto e a imagem. Use o waitkey() para exibir a janela por 10 milissegundos e verificar o pressionamento de uma tecla. Se um usuário pressionar o botão Esc chave (valor ASCII 27), saia do loop.
    # exibe a janela de saída e pressione a tecla escape para sair
    cv2.imshow("Detecção de rosto", imagem)
    chave = cv2.waitKey (10)

    se chave == 27:
    quebrar

  13. Por fim, libere o objeto da câmera do programa python e feche todas as janelas.
    câmera.liberar()
    cv2.destroyAllWindows()

Detecção facial usando Python em ação

Quando uma face está em exibição, você deve ver uma saída como esta:

Quando nenhum rosto estiver presente, você verá uma mensagem como esta:

Limitações da Detecção de Faces Usando o Algoritmo Haar Cascade

Embora esse algoritmo seja leve, com um tamanho de modelo pequeno e funcione rápido, existem algumas limitações:

  • Em um vídeo em tempo real, o rosto precisa estar na linha de visão da câmera. Se a face estiver muito longe, muito perto ou muito inclinada, o algoritmo não consegue captar as feições.
  • É um algoritmo de face frontal, então você não pode detectar visualizações laterais.
  • Altos resultados falsos positivos. Muitas vezes, ele detecta áreas como rostos, mesmo que não haja um rosto presente.
  • Precisa ter ótimas condições de iluminação. Iluminação excessiva ou fraca dificulta a precisão do algoritmo.

As muitas aplicações da detecção facial

A detecção facial tem uma ampla gama de aplicações no mundo de hoje. Você pode usá-lo para reconhecimento facial em smartphones, residências, veículos e postos de controle de imigração. A detecção facial já é comum em vigilância CCTV, filtros de mídia social e rastreamento automático de rosto em cinematografia.

É apenas o começo dessa tecnologia maravilhosa. Com os avanços, poderemos identificar crianças desaparecidas, capturar criminosos e prevenir crimes como roubo de identidade.