Olá.
Verifiquei e todo o restante do código também está igual ao do professor, segue primeira parte:
import os
import cv2
import numpy as np
import dlib
import matplotlib.pyplot as plt
from scipy.spatial import distance as dist
# Define um alias para o path
diretorio_base = '/home/vivian/Nextcloud/Vivian_Ferreira_Margarido/Codes/Alura/Analise_Classificacao_de_Faces_VC_Alura/'
#Carregar imagem
imagem = cv2.imread(os.path.join(diretorio_base,"px-woman-smilings.jpg")) #BGR
imagem = cv2.cvtColor(imagem, cv2.COLOR_BGR2RGB)
plt.figure(figsize = (20,10))
plt.imshow(imagem)
classificador_dlib_68_path = os.path.join(diretorio_base,"Classificadores/shape_predictor_68_face_landmarks.dat") #contém os parâmetros e configurações do modelo já treinado
#Carregando classificador dentro da biblioteca dlib
classificador_dlib = dlib.shape_predictor(classificador_dlib_68_path) #carregar um modelo treinado para a predição de pontos de referência faciais
#Pegando o face detector do dlib que já está associado ao classificador
detector_face = dlib.get_frontal_face_detector() #função na biblioteca Dlib em Python que retorna um objeto detector de faces.
#Esse detector é treinado para localizar faces em imagens e é especialmente eficiente na detecção de faces frontais.
'''Histogram of Oriented Gradients (HOG) combinada com um classificador linear (normalmente um classificador Support Vector Machine - SVM)'''
#Identificando rostos na imagem
def anotar_rosto(imagem):
retangulos = detector_face(imagem,1) #1 indica que imagem NÃO será redimensionado para detecção de rostos em outras escalas
if len(retangulos) == 0:
return None #nenhum rosto detectado
for k,d in enumerate(retangulos): #k = ínidice do elemento, d = elemento (par de tuplas = retângulo)
print("Identificado rosto " + str(k))
cv2.rectangle(imagem, (d.left(), d.top()),(d.right(), d.bottom()), (255,255,0),2) # Coordenadas dos vértices opostos: (d.left(), d.top()): As coordenadas do canto superior esquerdo do retângulo(d);(d.right(), d.bottom()): As coordenadas do canto inferior direito do retângulo, também obtidas do objeto d.
return imagem
imagem_anotada = imagem.copy()
imagem_anotada = anotar_rosto(imagem_anotada)
plt.figure(figsize = (20,10))
plt.imshow(imagem_anotada)
#Detectando os marcos_faciais de rostos na imagem
def pontos_marcos_faciais(imagem):
retangulos = detector_face(imagem, 1) #1 indica que imagem NÃO será redimensionado para detecção de rostos em outras escalas
if len(retangulos) == 0:
return None #nenhum rosto detectado
marcos_faciais = []
for ret in retangulos:#para cada retângulo identificado (rosto identificado)
marcos_faciais.append(np.matrix([[p.x, p.y] for p in classificador_dlib(imagem, ret).parts()])) #organizando os conjuntos dos pontos dos marcos faciais
return marcos_faciais
#Aplicando a função "pontos_marcos_faciais" em uma imagem
marcos_faciais = pontos_marcos_faciais(imagem)
len(marcos_faciais) #número de rostos detectados na imagem
len(marcos_faciais[0]) #número de marcos_faciais encontrados no rosto de índice 0
#Desenhando os marcos faciais na imagem
def anotar_marcos_faciais(imagem, marcos_faciais):
for marco in marcos_faciais: #cada marco é uma coordenada em formato de matrix, por exemplo: [[245 262]] -> matriz de 1 linha e 2 colunas >> aqui, ponto[0,0] = 245
for idx, ponto in enumerate (marco): #enumerando os pontos (marcos faciais)
centro = (ponto[0,0], ponto[0,1]) #coordenada do ponto a ser plotado >> ponto[0,0] = ponto[linha da matriz, coluna da matriz]
cv2.circle(imagem, centro, 3, (255,255,0), -1) #desenhando círculo: recebe a imagem na qual o círculo será desenhado, 3: raio, (255,255,0): cor, -1: pintar todo o círculo (maior que zero irá pintar apenas o contorno do círculo)
cv2.putText(imagem, str(idx), centro, cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255,255,255), 2) #escrevendo um texto na imagem: str(idx) = o que será escrito, centro = coordenada do texto, cv2.FONT_HERSHEY_SIMPLEX = estilo da fonte do texto, 0.8 = tamanho da fonte, (255,255,255) = cor da fonte (branco), 2 = espessura da linha
return imagem