Reconhecendo landmarks em faces com dlib + Python

Um dos problemas clássicos na área de Visão Computacional é o reconhecimento de rostos. Nos anos 2000, os pesquisadores Viola e Jones abriram o caminho e foram pioneiros em oferecer uma solução eficiente e de baixo custo computacional.

A solução destes dois cientistas hoje é conhecida como a biblioteca OpenCV e serviu de ponto de partida para inúmeros projetos de Visão Computacional.

O reconhecimento do OpenCV é eficiente na maior parte das vezes, mas não é capaz de detectar expressões faciais, por exemplo. Além de frequentemente detectar falsos positivos, ou seja, encontra rostos em locais que não existem, dependendo das condições de luminosidade do ambiente.

Portanto, após termos alcançado a conquista de encontrar rostos, surgiu a necessidade de explorar os pontos deste rosto como cantos dos olhos, sobrancelhas, boca e ponta do nariz. A partir dai surge o conceito de Landmarks, existem algumas bibliotecas que detectam landmarks, a Dlib é capaz de encontrar 68 landkmarks na face.

A idéia básica é encontrar 68 pontos específicos que existem em cada face: o topo do queixo, a borda externa de cada olho, a borda interna de cada sobrancelha, etc. Então vamos treinar um algoritmo de machine learning para encontrar esses 68 landmarks em qualquer face:

A biblioteca Dlib trabalha com Aprendizado de Máquinas, Visão Computacional, Processamento de Imagem e Álgebra Linear. A biblioteca originalmente foi desenvolvida em C++, mas também existe uma API em Python.

Vamos aqui implementar um código que detecte em tempo real os nossos 68 landmarks.

Instalando as bibliotecas necessárias:

É fortemente indicado que você instale o Anaconda, para facilitar todo o processo. Você pode fazer o download aqui.

Vamos precisar de apenas duas bibliotecas OpenCV e dlib. Após instalar o conda em seu computador, abra seu prompt de comando e instale utilizando os comandos:

OpenCV:

conda install -c menpo opencv

Dlib:

conda install -c menpo dlib

Pronto, agora vamos ao código!

O código:

Utilizamos OpenCV para abrir a webcam e oferecer imagens em tempo real para a biblioteca dlib.

IMPORTANTE: Estamos utilizando o modelo já pronto presente no arquivo shape_predictor_68_face_landmarks.dat este arquivo deve estar na mesma pasta que seu código python.

#Code adapted from van Gent, P. (2016).
# Emotion Recognition Using Facial Landmarks, Python, DLib and OpenCV. A tech blog about fun things with Python and embedded electronics.
# Retrieved from: http://www.paulvangent.com/2016/08/05/emotion-recognition-using-facial-landmarks/
#Adapted by @SuzanaMota
#Import required modules
import cv2
import dlib

#Dlib positions
#  ("mouth", (48, 68)),
#	("right_eyebrow", (17, 22)),
#	("left_eyebrow", (22, 27)),
#	("right_eye", (36, 42)),
#	("left_eye", (42, 48)),
#	("nose", (27, 35)),
#	("jaw", (0, 17))

#Set up some required objects
video_capture = cv2.VideoCapture(0) #Webcam object
#Change Frame Rate
video_capture.set(cv2.cv.CV_CAP_PROP_FPS, 30)
#Change Resolution
video_capture.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, 320);
video_capture.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, 130);
detector = dlib.get_frontal_face_detector() #Face detector
#Landmark identifier. Set the filename to whatever you named the downloaded file
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") 


while True:
    ret, frame = video_capture.read()
    frame = cv2.flip(frame,180) 
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
    clahe_image = clahe.apply(gray)

    detections = detector(clahe_image, 1) #Detect the faces in the image

    for k,d in enumerate(detections): #For each detected face  
        shape = predictor(clahe_image, d) #Get coordinates
        for i in range(1,68): #There are 68 landmark points on each face
            cv2.circle(frame, (shape.part(i).x, shape.part(i).y), 1, (0,255,0), thickness=-1) #For each point, draw a red circle with thickness2 on the original frame
            #cv2.putText(frame, str(i), (shape.part(i).x,shape.part(i).y),
            #        fontFace=cv2.FONT_HERSHEY_SCRIPT_SIMPLEX,
            #        fontScale=0.3,
            #        color=(0, 0, 255))
    cv2.imshow("image", frame) #Display the frame

    if cv2.waitKey(1) & 0xFF == ord('q'): #Exit program when the user presses 'q'
        break
    
cv2.destroyAllWindows()

Você também pode baixar os arquivos já prontos para serem rodados no meu github abaixo:

https://github.com/suzanasvm/DlibProject

O resultado pode ser visto aqui:

Deixe uma resposta

O seu endereço de e-mail não será publicado.