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

Sono amante della tecnologia e delle tante sfumature del mondo IT, ho partecipato, sin dai primi anni di università ad importanti progetti in ambito Internet proseguendo, negli anni, allo startup, sviluppo e  direzione di diverse aziende; Nei primi anni di carriera ho lavorato come consulente nel mondo dell’IT italiano, partecipando attivamente a progetti nazionali ed internazionali per realtà quali Ericsson, Telecom, Tin.it, Accenture, Tiscali, CNR. Dal 2010 mi occupo di startup mediante una delle mie società techintouch S.r.l che grazie alla collaborazione con la  Digital Magics SpA, di cui sono Partner la Campania, mi occupo di supportare ed accelerare aziende del territorio .

Attualmente sono :

  • CEO e founder di Eclettica S.r.l. , Società specializzata in sviluppo software e System Integration
  • Co-CEO in Techintouch s.r.l. e partner per la Campania di Digital Magics S.p.A.

Manager ed imprenditore dal  2000  sono stato, CTO e co-founder di Nexsoft S.p.A, società specializzata nella Consulenza di Servizi in ambito Informatico e sviluppo di soluzioni di System Integration, CTO della ITsys S.r.l. Società specializzata nella gestione di sistemi IT per la quale ho partecipato attivamente alla fase di startup.

Sognatore da sempre, curioso di novità ed alla ricerca di “nuovi mondi da esplorare“.

Please follow and like us:

Commenti

Privacy Preference Center

Close your account?

Your account will be closed and all data will be permanently deleted and cannot be recovered. Are you sure?