Lab14 - Detector haar Cascade
Objetivos da aula:
- apresentar uma introdução sobre aprendizado de máquina
- apresentar e aplicar o haar cascade para detecção de face
- apresentar uma intuição do algoritimo de Viola Jones
Como fazer a deteção de faces?
O nosso objetivo hoje é compreender a essencia de algoritimos para detecção facial, apenas reforçando que já sabemos, esses algoritmos são utilizados para diversas aplicações, desde a lendaria camera tekpix, passando por smartphones e o google fotos para classificador na organização de pastas por pessoas, por exemplo.
Aprendizado de máquina
Antes de entrar em tecnicas mais avançadas de Deep Learning em visão computacional, vamos introduzir este tema estudando e aplicando o método muito clássico de classificação em cascata de faces desenvolvido por Viola e Jones, na OpenCV temos exemplares pré-treinados para detecção de faces e de olhos.
**Classificador Haar-Cascade **
Você vai ver em todo e qualquer curso ou livro de visão computacional o detector de face de Viola-Jones sendo mencionado. Inventado em 2001, foi disruptivo no campo da visão computacional, por que finalmente permitiu a detecção e o reconhecimento de rostos em tempo real.
Muito obrigado Viola e Jones :)
ref: https://www.cs.cmu.edu/~efros/courses/LBMV07/Papers/viola-cvpr-01.pdf https://docs.opencv.org/master/db/d28/tutorial_cascade_classifier.html
Para apresentar uma intuição de como funciona, vamos imaginar o seguinte:
Algumas caracteristicas do rosto são bem definidas e conseguimos correlacionar tais como bochecha com olhos, testa com nariz.... Para encontrar essas correlações usamos a ideia de feature e convolução que ja estudamos. Podemos visualizar essa técnica no gif da Lena.
## Vou fazer o download das imagens do laboratório diretamente do repositório para usar no colab mais facil....
import requests
# Definie o modulo e o laboratório
modulo ='PDI/'
laboratorio = 'lab14'
# URL da API do GitHub para a pasta do repositório
api_url = "https://api.github.com/repos/arnaldojr/cognitivecomputing/contents/material/aulas/"
# Monta a URL completa
url_completa = api_url + modulo + laboratorio
print(f"Fazendo o download de: {url_completa}")
# Requisição para obter a lista de arquivos na pasta
response = requests.get(url_completa)
files = response.json()
# Fazer o download de cada arquivo de imagem
for file in files:
file_name = file['name']
if file_name.endswith(('.png', '.jpg', '.jpeg', '.mp4')): # Adicione mais extensões se necessário
file_url = file['download_url']
print(f"Baixando {file_name}...")
!wget -q {file_url} -P /content
print("Download concluído.")
Fazendo o download de: https://api.github.com/repos/arnaldojr/cognitivecomputing/contents/material/aulas/PDI/lab14 Baixando acumulador.jpg... Baixando lena-eye-face.png... Baixando lena.png... Download concluído.
Implementação na OpenCV¶
Vamos implementar um detector de face baseado em haar cascade, como essa técnica é baseada em machine learning, vamos utilizar uma rede com os pesos do classificador treinado e dispoiniblizado pela OpenCV.
Já temos esses arquivos com os pesos das redes quando instalamos a OpenCV, o que temos que fazer é carregar esses pesos.
%matplotlib inline
import cv2
from matplotlib import pyplot as plt
import numpy as np
#caminho onde estão os pesos
path = cv2.data.haarcascades + "haarcascade_frontalface_default.xml"
# Inicializa o classificador cascade
face = cv2.CascadeClassifier(path)
print("Os pesos estão no diretorio: ", path)
Os pesos estão no diretorio: /usr/local/lib/python3.10/dist-packages/cv2/data/haarcascade_frontalface_default.xml
Desafio 1¶
Se não estiver usando o google coclab
¶
Pode acontecer de não encontrar o caminho do diretorio com os pesos. Como sugetão, verifique se ja possui os arquivos de pesos. Caso não encontre, será necessário fazer o download desses pesos. Para facilitar a vida, na pasta cascade já estão os pesos note que são varios arquivos. Faça os ajustes necessários para carregar os pesos da rede.
vamos usar o "haarcascade_frontalface_default.xml".
# Faça aqui os ajustes que forem necessários.....
O método detectMultiScale() realiza o processo de varredura que vimos no gif acima e retorna uma lista com as faces encontrardas.
Este possui 3 parametros principais;
gray image – Imagem de entrada na escala de cinza.
scaleFactor – Parametro para ajustar a escala, em uma imagem pode conter rostos maiores e menores. Esse parametro tenta corrigir isso.
minNeighbors – Este parâmetro especifica o número de vizinhos que uma janela deve ter para ser chamado de face.
Você pode ler mais sobre isso aqui. https://docs.opencv.org/2.4.13.2/modules/objdetect/doc/cascade_classification.html#cv2.CascadeClassifier.detectMultiScale
img = cv2.imread('lena.png')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# O método detectMultiScale() realiza o processo de varredura que vimos no gif acima e retorna uma lista com as faces encontrardas.
faces_return = face.detectMultiScale(img_gray, scaleFactor = 1.2, minNeighbors = 5)
print('Faces encontradas: ', len(faces_return),type(faces_return), faces_return)
print("")
print("x:", faces_return[0][0])
print("y:", faces_return[0][0])
print("x e y, representam a coodenada top esquerda da face detectada")
print("")
print("Largura :", faces_return[0][0])
print("Altura:", faces_return[0][0])
Faces encontradas: 1 <class 'numpy.ndarray'> [[224 210 156 156]] x: 224 y: 224 x e y, representam a coodenada top esquerda da face detectada Largura : 224 Altura: 224
## Dica rápida de python
#Podemos iterar varias listas ao mesmo tempo dentro de um unico *for* de forma simultanea usando o python
# Exemplo, vamos criar uma lista qualquer
a = np.array([["x", "y", "largura", "altura"]])
print (a)
for (x,y,w,h) in a:
print("posição (x,y): ", x,y, "largura: ", w, "altura",h)
[['x' 'y' 'largura' 'altura']] posição (x,y): x y largura: largura altura altura
Desafio 2¶
Usando as posições da lista face_return
. Implemente uma função que desenha um um retangulo sobre a face detectada.
# Implemente sua solução aqui.....
Desafio 3¶
Vamos aproveitar que temos as coodenadas da face e vamos lembrar como faz um crop (recorte ) desta imagem.
# Implemente sua solução aqui.....
Desafio 4¶
Faça a deteção dos olhos
da Lena, carrege os pesos que correspodem a detecção de olhos e implemente sua solução.
Escolha um modelo haarcascade coerente para realizar essa tarefa.
Dica: Os olhos fazem parte da face, nesse sentido, não é necessário fazer a varredura em toda a imagem, basta fazer a varredura dentro dos limites onde está contida a face, concorda???
# implemente aqui sua sulução.............
Desafio 5¶
No inicio da aula falamos que o método de Viola-Jones foi desruptivo por que tornou capaz a detecção de faces em tempo real. Implemente um código .py que realiza a deteção em tempo real, capturando a imagem da sua webcam.