Detecção facial com OpenCV
Detecção facial é uma das aplicações mais importantes de visão computacional. Ela também é uma das populares e, por isso, conta com várias opções. Uma das opções mais amigáveis para quem deseja realizar a detecção facial para criar aplicações inteligentes rapidamente é através do uso de modelos pré-treinados. Já apresentamos vários (aqui, aqui e aqui). Todos têm vantagens e desvantagens. Portanto, a decisão sobre qual usar num aplicativo deve ser analisada caso a caso. Exatamente por essa razão, quanto mais opções você conhecer, melhor será sua capacidade de fazer uma escolha bem informada. Neste post, o foco será num modelo famoso e bem eficiente: dnn face detection disponível através do OpenCV.
O modelo de deep learning
Este é um modelo Caffe baseado no Single Shot-Multibox Detector (SSD). Ele possui a arquitetura ResNet-10 como seu centro. ResNet-10 é uma rede neural consagrada para tarefas de visão computacional. O modelo Caffe dnn foi introduzido após o OpenCV 3.3 em seu módulo de rede neural profunda (dnn). Há também uma versão quantizada (reduzida) do Tensorflow, mas usaremos o modelo Caffe já disponível com OpenCV.
Requerimentos
Detecção facial em código
Num código Python, primeiro importamos os pacotes necessários, carregamos o modelo e seus pesos e abrimos uma imagem para a detecção facial:
import cv2
import numpy as np
modelFile = "res10_300x300_ssd_iter_140000.caffemodel"
configFile = "deploy.prototxt.txt"
net = cv2.dnn.readNetFromCaffe(configFile, modelFile)
img = cv2.imread('SUA IMAGEM AQUI')
Depois, criamos um blob a partir da imagem usando a função blobFromImage. Para conhecer mais sobre essa função, clique aqui. Ela subtrai valores próximos a valores médios dos canais. Mas é descrito na literatura que subtrair 117 do canal de verde gera melhor resultados. O mesmo vale para os outros valores usados na função. Ou seja, esses valores são obtidos por tentativa e erro:
h, w = img.shape[:2]
blob = cv2.dnn.blobFromImage(cv2.resize(img, (300, 300)), 1.0,
(300, 300), (104.0, 117.0, 123.0))
Em seguida, as funções net.setInput(blob) e net.forward() são usadas para detectar rostos na imagem:
net.setInput(blob)
faces = net.forward()
Por fim, usamos um loop para desenhar caixas delimitadoras em cada rosto detectado desde que a confiança obtida seja maior do que 0.5:
for i in range(faces.shape[2]):
confidence = faces[0, 0, i, 2]
if confidence > 0.5:
box = faces[0, 0, i, 3:7] * np.array([w, h, w, h])
(x, y, x1, y1) = box.astype("int")
cv2.rectangle(img, (x, y), (x1, y1), (0, 0, 255), 2)
Alguns resultados são mostrados abaixo: