Atualmente vivemos numa era marcada por avanços impressionantes no campo da inteligência artificial. A visão computacional é uma aplicação de deep learning que está no centro desta revolução. Ela permite que os computadores extraiam informações a partir de dados visuais como imagens e arquivos de vídeo. Exemplos de aplicações de visão computacional incluem detecção facial, reconhecimento facial, estimativa de pose humana, detecção e reconhecimento de objetos e detecção de obstáculos.
As aplicações comerciais de técnicas de visão computacional são inúmeras e incluem aplicativos de segurança e vigilância, aplicativos para o setor de comércio, veículos autônomos, entre outras.
Neste post, exploraremos como realizar a detecção facial com a biblioteca OpenCV.
OpenCV
OpenCV é uma biblioteca de código aberto de computação visual que oferece suporte a linguagens de programação como Python, C++ e Java. Ela possui mais de 2.500 algoritmos para realizar tarefas como reconhecimento facial e detecção de objetos.
O uso da biblioteca OpenCV permite que desenvolvedores criem aplicativos de visão computacional sem precisar codificá-los do zero.
Detecção de faces com openCV
A detecção de faces envolve identificar o rosto de uma pessoa em uma imagem ou vídeo. Isso é feito analisando a entrada visual para determinar se características faciais estão presentes.
Como os rostos humanos são diversos, modelos de detecção facial normalmente precisam ser treinados em grandes quantidades de dados diversificados para serem precisos. Felizmente, o pacote OpenCV conta com alguns modelos pré-treinados para detecção facial. Consequentemente, é possível usá-los para fazer detecção facial sem precisar treinar um algoritmo do zero.
O classificador usado para detecção de faces com openCV
Para detectar faces, o openCV usa o classificador Haar Cascade. Essa técnica emprega uma cascata de classificadores para detectar diferentes características em uma imagem. Esses classificadores são então combinados em um classificador robusto capaz de distinguir com precisão amostras que contêm rostos humanos daquelas que não contêm.
O classificador Haar Cascade integrado ao OpenCV já foi treinado em um grande conjunto de dados de rostos humanos. Isso significa que podemos usá-lo sem nenhum treinamento adicional.
Detecção de faces com openCV na prática
O primeiro passo para fazer a detecção de faces com openCV é instalar a biblioteca. Abaixo segue o comando para instalação com pip:
pip install opencv-python
Para instalar através do Anaconda:
conda install -c conda-forge opencv
Também é necessário fazer o download do modelo pré-treinado que será usado. O link para a página está aqui, o arquivo que deve ser selecionado é o haarcascade_frontalface_default.xml. Ele deve ser colocado na mesma pasta que o código que será desenvolvido.
Detecção de faces em imagens
Para começar, crie um arquivo chamado detector_faces.py. O primeiro passo nesse arquivo é importar a biblioteca e o modelo pré-treinado.
import cv2
face_classifier = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
Depois, é preciso ler uma imagem no nosso código para que o algoritmo detecte se ela contém ou não rostos humanos. Nas linhas de código abaixo, a imagem se chama img_teste. Você pode usar a imagem que quiser e deve trocar o nome no código conforme o nome de sua imagem.
img = cv2.imread('img_teste.jpg')
Essa é a imagem que iremos testar.
Para detectar faces, primeiro é preciso converter as cores da imagem para uma escala de cinzas.
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Depois o classificador é aplicado sobre ela.
O classificador
Esse é o comando do classificador que precisa ser adicionado ao código.
face = face_classifier.detectMultiScale(
gray_image, scaleFactor=1.1, minNeighbors=5, minSize=(40, 40)
)
Nele, o método detectMultiScale() é usado para identificar faces de diferentes tamanhos numa imagem. Seu primeiro parâmetro é a imagem em escala de cinzas criada previamente.
O parâmetro scaleFactor é usado para reduzir o tamanho da imagem para tornar mais fácil para o algoritmo detectar rostos grandes. No nosso código, ele foi definido como 1.1, o que significa uma redução de 10% na imagem original.
O classificador em cascata aplica uma sliding window através da imagem para detectar rostos nela. Inicialmente, ele captura vários falsos positivos. Porém, eles são eliminados usando o parâmetro minNeighbors, que especifica o número de retângulos vizinhos que precisam ser identificados para que um objeto seja considerado uma detecção válida. Esse parâmetro influencia bastante o desempenho do classificador. É preciso testar vários valores para evitar que ele tenha inúmeros falsos positivos sem perder muitos resultados positivos.
O parâmetro minSize determina o tamanho mínimo dos objetos que serão detectados.
Criando retângulos nos rostos detectados
Em seguida, iremos criar retângulos em todos os rostos que nosso classificador identificar. O comando para isso é mostrado abaixo.
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
Por fim, salvamos a nova imagem.
cv2.imwrite('img_face_detected.png', img)
Esse é o nosso resultado.
Conclusão
Neste post, mostramos como é simples fazer detecção facial com a biblioteca openCV. O código mostrado aqui pode ser facilmente modificado para detectar faces em vídeos. Também é possível usá-lo para fazer reconhecimento facial. Portanto, para quem tiver interesse, existem várias possibilidades de expansão.