O rápido desenvolvimento na área de aprendizado de máquina e tecnologias de IA trouxe progressos significativos em visão computacional para detecção e reconhecimento de objetos. No entanto, criar um sistema capaz de reconhecer humor e diversão em pessoas continua sendo um desafio para programadores, já que comédia e entretenimento são subjetivos e baseados em gostos pessoais e contexto cultural. Portanto, é complicado criar um sistema que possa determinar com precisão o que as pessoas acham engraçado ou agradável.
Entretanto, a visão computacional no reconhecimento facial e identificação fez grandes progressos, sendo amplamente utilizada em várias aplicações como segurança, vigilância e biometria. A tecnologia de reconhecimento facial identifica indivíduos analisando e comparando seus traços faciais com uma base de dados de rostos conhecidos. Identificação facial envolve a correspondência do rosto de uma pessoa com sua identidade. Ela emprega algoritmos para extrair características faciais, como a distância entre os olhos, curvas do nariz e o ângulo da mandíbula, para gerar uma assinatura facial única.
Técnicas de Reconhecimento e Identificação Facial
Existem várias maneiras de reconhecer e identificar rostos, mas este tutorial se concentrará em três técnicas e apresentará seus benefícios e desvantagens.
1. Abordagem Baseada em Modelo
Primeiramente, a abordagem baseada em template compara os traços faciais de um rosto alvo com aqueles em uma imagem de template ou de referência. A imagem de template inclui vários traços faciais, como a posição dos olhos, nariz, boca e as distâncias entre eles. A técnica então compara o rosto alvo com a imagem de template para determinar se há um match. As eigenfaces são um dos métodos baseados em template mais comuns que utilizam a análise de componentes principais (PCA) para reduzir a dimensionalidade das imagens faciais e extrair os traços mais relevantes.
Vantagens
- São muito precisas com templates de alta qualidade
- Lida com variações na iluminação e expressões faciais
Desvantagens
- Requer templates de alta qualidade para resultados precisos
- Pode ser computacionalmente dispendioso
2. Abordagem Baseada em Características
Em segundo lugar, a técnica baseada em características extrai características do rosto, como a forma dos olhos, a distância entre as sobrancelhas e a curvatura dos lábios. A abordagem então compara essas características com aquelas em um banco de dados de rostos conhecidos para identificar o rosto alvo. Exemplos de técnicas típicas baseadas em características incluem o Padrão Binário Local (LBP) e a Transformação de Características Invariantes à Escala (SIFT).
Vantagens
- Relativamenta rápida e eficiente
- Funciona com imagens de baixa resolução
Desvantagens
- Pode não funcionar bem com condições de iluminação variáveis
- Pode não ser robusto a mudanças em expressões faciais ou poses
3. Abordagem Baseada em Aprendizado Profundo
Por último, uma abordagem baseada em aprendizado profundo utiliza redes neurais profundas para aprender características diretamente de imagens faciais. As redes são treinadas em grandes conjuntos de dados de imagens faciais para identificar padrões e características relevantes para reconhecimento facial. Exemplos de métodos típicos baseados em aprendizado profundo incluem Redes Neurais Convolucionais (CNN) e Redes Siamese.
Vantagens
- Alcança alta precisão com grandes conjuntos de dados
- Lida com variações em expressões faciais e poses
Desvantagens
- Requer uma grande quantidade de dados de treinamento
- Computacionalmente caro
OBSERVAÇÃO: Existem várias técnicas para reconhecimento e identificação facial.
Reconhecimento e Identificação Facial Usando Python e OpenCV
Com a disponibilidade de bibliotecas poderosas como o OpenCV e os avanços nas algoritmos de aprendizado de máquina, tornou-se mais fácil do que nunca desenvolver sistemas de reconhecimento e identificação facial usando Python. O OpenCV fornece um rico conjunto de funções e ferramentas para processamento de imagens, particularmente úteis em tarefas de reconhecimento facial como detecção facial, extração de características e correspondência. Também possui modelos pré-fabricados como o classificador Haar Cascades para detecção facial e VGG ou ResNet para rotular os rostos detectados.
O OpenCV disponibiliza vários modelos para rotulação facial, como Eigenfaces, Fisherfaces e Histogramas de Padrões Binários Locais (LBPH). Treinamos esses modelos para identificar indivíduos específicos apresentando-lhes imagens dos indivíduos que desejamos reconhecer. O Eigenfaces utiliza a Análise de Componente Principal (PCA) para construir uma imagem facial a partir de partes menores, enquanto o Fisherfaces emprega a Análise Discriminante Linear (LDA) para distinguir entre rostos. O LBPH compara a textura dos rostos com rostos conhecidos.
Identificação Facial
Importar Dependências
Importe as bibliotecas necessárias.
import numpy as np
import cv2
import matplotlib.pyplot as plt
from IPython.display import Image
from google.colab import drive
drive.mount('/content/drive')
Carregar Modelos Pré-Treinados e Imagem
O OpenCV disponibiliza um conjunto de classificadores pré-treinados `Haar Cascade` para detectar vários objetos, incluindo faces. `cv2.CascadeClassifier` é uma classe que representa o classificador Haar Cascade. O cv2.data.haarcascades é um caminho para o diretório contendo os modelos pré-treinados. `haarcascade_frontalface_default.xml` é o arquivo contendo o modelo pré-treinado de detecção facial. O modelo está disponível para download gratuito no GitHub.
# Carregar o modelo pré-treinado de detecção facial
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
Carregar a imagem de entrada `image1.jpg`, que pode ser uma imagem à sua escolha, usando a função `imread()` do OpenCV. Em seguida, converte a imagem para escala de cinza usando a função `cvtColor()` do OpenCV. A imagem em escala de cinza é necessária para o algoritmo de detecção facial.
# Carregar a imagem e convertê-la para escala de cinza
img = cv2.imread('/content/drive/MyDrive/Face Detection/image1.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Mostrar a imagem
plt.imshow(gray)
A linha abaixo detecta faces na imagem em escala de cinza usando o método detectMultiScale() da classe CascadeClassifier. O método detectMultiScale() recebe os seguintes argumentos:
`gray`: a imagem em escala de cinza
`scaleFactor`: é um parâmetro que especifica quanto o tamanho da imagem é minimizado a cada escala da imagem. Um valor de 1.3 significa que a imagem é reduzida em 30% a cada escala.
`minNeighbors`: é um parâmetro que especifica quantos vizinhos cada retângulo candidato deve ter para mantê-lo, um valor mais alto resulta em menos detecções, mas com maior confiança.
`O método detectMultiScale()` retorna uma lista de retângulos onde faces são detectadas. Cada retângulo representa uma tupla de quatro inteiros `(x,y,w,h)` representando as coordenadas do canto superior esquerdo `(x,y)` do retângulo e sua largura `w` e altura `h`.
# Detectar faces na imagem em escala de cinza
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
Desenhar Retângulo na Região da Face
Vamos criar um loop que desenha retângulos em torno das faces detectadas na imagem original. A função cv2.rectangle() recebe os seguintes argumentos:
`img`: a imagem original.
`(x,y)`: as coordenadas do canto superior esquerdo do retângulo.
`(x+w,y+h)`: as coordenadas do canto inferior direito do retângulo.
`(255,0,0)`: representa a cor binária do retângulo desenhado em formato RGB. (255,0,0) representa azul.
`5`: a espessura da borda do retângulo em pixels.
# Desenhar retângulos em torno das faces detectadas
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),5)
#Mostrar a imagem após construir o retângulo.
# Exibir a imagem com as faces detectadas
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
# Salvar a imagem detectada com um nome
cv2.imwrite('detected_image.jpg', img)
# Confirmar se a imagem salva existe.
detected_image=cv2.imread("detected_image.jpg", 1)
gray_channels_reversed = detected_image[:, :, ::-1]
plt.imshow(gray_channels_reversed)
Reconhecimento Facial
Não entraremos em uma explicação como a acima, mas usaremos a imagem detectada salva para confirmar se o modelo funciona para identificação, fornecendo imagens diferentes para detecção.
Importar Dependências
import numpy as np
import cv2
import matplotlib.pyplot as plt
import dlib
from imutils import face_utils
from scipy.spatial.distance import cosine
from sklearn.metrics.pairwise import cosine_similarity
Carregar Modelo de Detecção de Rosto e Detector de Pontos Chave Faciais
A função `dlib.get_frontal_face_detector()` retorna um modelo de detecção de rosto pré-treinado capaz de detectar rostos humanos em imagens. Para mais informações, verifique as funções em dlib.net. Além disso, baixe o detector de pontos chave.
# Carregar o modelo de detecção de rosto e o detector de pontos chave faciais
face_detector = dlib.get_frontal_face_detector()
landmark_detector = dlib.shape_predictor('/content/drive/MyDrive/Face Detection/shape_predictor_68_face_landmarks_GTX.dat')
# Carregar a imagem detectada de
img1 = cv2.imread('/content/drive/MyDrive/Face Detection/detected_image.jpg')
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
# Detectar o rosto e os pontos chave faciais da imagem
rects1 = face_detector(gray1, 1)
landmarks1 = landmark_detector(gray1, rects1[0])
landmarks1 = face_utils.shape_to_np(landmarks1)
# Carregar outra imagem para comparar com a imagem carregada anteriormente
img2 = cv2.imread('/content/drive/MyDrive/Face Detection/001_d3323f3c.jpg')
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
### Definir parâmetros do modelo
# Detectar o rosto e os pontos faciais da segunda imagem
rects2 = face_detector(gray2, 1)
landmarks2 = landmark_detector(gray2, rects2[0])
landmarks2 = face_utils.shape_to_np(landmarks2)
# Extrair os recursos das duas imagens calculando as distâncias euclidianas entre os pontos faciais
features1 = np.zeros(68)
features2 = np.zeros(68)
for i in range(68):
features1[i] = np.linalg.norm(landmarks1[i] - landmarks1[0])
features2[i] = np.linalg.norm(landmarks2[i] - landmarks2[0])
#### Treinar com similaridades
# Calcular a similaridade cosseno entre os dois vetores de características
score = cosine(features1, features2)
# Verificar se a pontuação está abaixo de um certo limite (por exemplo, 0.5) para determinar se os dois rostos coincidem
if score < 0.5:
print("The model did not recognize Joseph in one or both of the images..")
else:
print("The model recognized Joseph in both images.")
Conclusão
Neste tutorial, você aprendeu sobre reconhecimento e identificação facial usando Python OpenCV, como funciona, seus usos e como pode ser implementado. O código deste projeto pode ser acessado a partir do Repositório GitHub.
Source:
https://dzone.com/articles/facial-recognition-and-identification-in-computer