Face Recognition and Tracking con OpenCV e face_recognition (terza parte)

AI, INTELLIGENZA ARTIFICIALE

Eccoci alla fine di questi tre articoli sul face recognition & tracking.

Nei precedenti due articoli ho analizzato una via semplice per effettuare riconoscimento di immagini  attraverso opencv e face_recognition. Cerchiamo di capire, adesso, come sia possibile effettuare anche il tracking di un volto.

Nell’ultimo articolo, avevo spiegato, con un esempio,  come fosse possibile gestire in real time il face recognition su un video catturato da webcam; per completezza riporto l’esempio, anche qui perchè lavoreremo partendo da quest’ultimo.

import cv2
import face_recognition
video = cv2.VideoCapture(0)
volto_noto=face_recognition.load_image_file("volto_noto.jpg")
volto_noto_features=face_recognition.face_encodings(volto_noto)[0]


while True:
	#estraggo il singolo frame dal video
	ret, frame = video.read()
	posizione_del_volto_sconosciuto_nel_frame = face_recognition.face_locations(frame,model='hog')
	#estraggo le features dal frames in cui c'è il volto
	if len(posizione_del_volto_sconosciuto_nel_frame) > 0 :
	   volto_sconosciuto_in_video_features = face_recognition.face_encodings(frame)[0]
	   #confronto il volto trovato nel frame con il volto di confronto
	   confronta=face_recognition.compare_faces([volto_sconosciuto_in_video_features], volto_noto_features)
           if confronta:
	     print ('Riconosciuto') 
           else : 
             print ('Sconosciuto')
	else :
	   print ('Sconosciuto')

Quello che faremo,duqnue , è tracciare un quadrato intorno al volto di una persona e successivamente proveremo ad inserire anche un’etichetta, ovvero il nome se il volto della persona è noto. Per far ciò dobbiamo riprendere un concetto già introdotto nel primo articolo ovvero come tracciare delle curve su una foto/video usando opencv.

import cv2
video = cv2.VideoCapture(0)
left=10
top=10
right=110
bottom=110
while(1):
    ret, frame = video.read()
    cv2.rectangle(frame, (left, top), (right, bottom), (0,0, 255), 3)
    cv2.imshow('Video Modificato',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
       break
video.release()
cv2.destroyAllWindows()

in altri termini fissate le cordinate (left,top,right,bottom) si tratta semplicemente di utilizzare il metodo  rectangle di opencv per disegnare il quadrato sul frame.

Il problema dunque, in definitiva, è capire come sia possibile calcolare in real time le cordinate (left,top,right,bottom).  A tal proposito,  continua a venirci in aiuto la lib face_recognition che ci mette a disposzione un metodo che ci fornisce, appunto, queste informazioni.

posizione_del_volto_nel_frame = face_recognition.face_locations(frame,model='hog') 

Proviamo ad utilizzare questo metodo applicandolo al nostro esempio :

import cv2
import face_recognition
video = cv2.VideoCapture(0)
volto_noto=face_recognition.load_image_file("volto_da_riconoscere.jpg")
volto_noto_features=face_recognition.face_encodings(volto_noto)[0]


while True:
	#estraggo il singolo frame dal video
	ret, frame = video.read()
	posizione_del_volto_nel_frame = face_recognition.face_locations(frame,model='hog')
	

	#estraggo le features dal frames in cui c'è il volto
	if len(posizione_del_volto_nel_frame) > 0 :
		(top, right, bottom, left) = posizione_del_volto_nel_frame[0]
		#FATTORE DI SCALA
		top *= 1
		right *= 1
		bottom *= 1
		left *= 1
		volto_sconosciuto_in_video_features = face_recognition.face_encodings(frame)[0]	
		cv2.rectangle(frame, (left, top), (right, bottom), (0,0, 255), 3)
		cv2.imshow('Riconoscimento facciale',frame)
		#confronto il volto trovato nel frame con il volto di confronto
		confronta=face_recognition.compare_faces([volto_sconosciuto_in_video_features], volto_noto_features)
                if confronta: 
                  print ('Riconosciuto') 
                else : 
                  print ('Sconosciuto')
	else :
		print ('Sconosciuto') 
	if cv2.waitKey(1) & 0xFF == ord('q'):
		break
video.release()
cv2.destroyAllWindows()

Come si potrà forse, verificare, le performace non sono delle migliori se non si dispone di una macchina con buone prestazioni.

Per ottimizzare un pò le cose e redendere il nostro codice un pò più performante potremmo tentare di ottimizzare / abbassare la qualità del frame su cui lavorare per fare tracking & face recognition.

In tal senso prima di effettuare le operazione sui frame facciamone una preliminare di scalatura ad esempio ridimensionando il frame originale del 50%:

frame_ridimensionato = cv2.resize(frame, (0, 0), fx=0.5, fy=0.5)

Sostituiamo le operazione fatte inizialmente sul frame orginale -> sul frame ridimensionato ed ecco il nostro esempio funzionante.

import cv2
import face_recognition
video = cv2.VideoCapture(0)
volto_noto=face_recognition.load_image_file("volto_da_riconoscere.jpg")
volto_noto_features=face_recognition.face_encodings(volto_noto)[0]


while True:
	#estraggo il singolo frame dal video
	ret, frame = video.read()

	#frame ridimensionato
	frame_ridimensionato = cv2.resize(frame, (0, 0), fx=0.5, fy=0.5)

	posizione_del_volto_nel_frame = face_recognition.face_locations(frame_ridimensionato,model='hog')
	

	#estraggo le features dal frames in cui c'è il volto
	if len(posizione_del_volto_nel_frame) > 0 :
		(top, right, bottom, left) = posizione_del_volto_nel_frame[0]
		#FATTORE DI SCALA
		top *= 1
		right *= 1
		bottom *= 1
		left *= 1
		volto_sconosciuto_in_video_features = face_recognition.face_encodings(frame_ridimensionato)[0]	
		cv2.rectangle(frame_ridimensionato, (left, top), (right, bottom), (0,0, 255), 3)
		cv2.imshow('Riconoscimento facciale',frame_ridimensionato)
		#confronto il volto trovato nel frame con il volto di confronto
		confronta=face_recognition.compare_faces([volto_sconosciuto_in_video_features], volto_noto_features)
		print ('Riconosciuto') 
	else :
		print ('Sconosciuto') 
	if cv2.waitKey(1) & 0xFF == ord('q'):
		break
video.release()
cv2.destroyAllWindows()

 

<< seconda parte

Se vuoi farmi qualche richiesta o contattarmi per un aiuto riempi il seguente form

    Comments