Face Recognition and Tracking con OpenCV e face_recognition (terza parte)
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()
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 ricopro le cariche di :
– CTO MareGroup
– CTO Innoida
– Co-CEO in Techintouch s.r.l.
– Board member in StepFund GP SA
Manager ed imprenditore dal 2000 sono stato,
CEO e founder di Eclettica S.r.l. , Società specializzata in sviluppo software e System Integration
Partner per la Campania di Digital Magics S.p.A.
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“.
Comments