Face Recognition and Tracking con OpenCV e face_recognition (seconda parte)
Eccoci qua, di nuovo, pronti a capire come sia possibile creare un semplice software per riconoscere dei volti.
Nel precedente articolo abbiamo visto come gestire la webcam e trattare video ed immagini in real time, adesso cerchiamo di capire come estrarre delle features dalla immagini per usarle quali “firme” ai fini della comparazione. Per fare ciò, in questo primo esempio, utilizzeremo una libreria python che ci semplificherà la vita: face_recognition.
Per poterla utilizzare basterà, banalmente, installare la lib:
pip3 install face_recognition
ed importarla nello nostro codice
import face_recognition
Cosa serve, dunque, per implementare il nostro classificatore?
per poter effettuare il riconoscimento di un volto basterà fare, ancora, alcuni semplici passaggi.
1) Carichiamo l’immagine del volto che vogliamo sottopporre al confronto
volto_noto=face_recognition.load_image_file("volto_noto.jpg")
2) estraiamo da questa ultima le informazioni (features) che utilizzeremo per il confronto:
volto_noto_features=face_recognition.face_encodings(volto_noto)[0]
3) carichiamo il file del volto sconosciuto da verificare
volto_sconosciuto=face_recognition.load_image_file("volto_sconosciuto.jpg")
4) estraiamo da questo ultimo le informazioni che utilizzeremo per il confronto:
volto_sconosciuto_features=face_recognition.face_encodings(volto_sconosciuto)[0]
5) compariamo i due volti
confronta=face_recognition.compare_faces([volto_sconosciuto_features], volto_noto_features)
Se il confronto è positivo il risultato sarà True altrimenti il metodo restituirà valore False.
Tutto qua.
Ma come funziona la lib face_recognition? In generale la face recognition viene fatta attraverso due possibili approcci, che è possibile scegliere a piacimento a seconda delle esigenze e delle risorse a disposizione.
In linea di massima è possibile, in fase di analisi dell’immagine, scegliere l’algoritmo da usare attraverso il seguente metodo:
volti_nella_img = face_recognition.face_locations(image,number_of_times_to_upsample=1,model='hog')
il metodo face_location ci consente di individuare i volti all’interno di una foto ed attraverso il parametro model si può definire l’algoritmo da usare; esso può assumere due valori hog (Histogram of Oriented Gradients) e cnn (Convolutional Neural Network)
HOG (Histogram of Oriented Gradients)
E’ un algoritmo basato sul calcolo di gradienti dell’immagine orientati e del primo ordine.
Gli algoritmi che implementano questo filtro sono ingegnerizzati a mano e fissi, pertanto non prevedono meccanismi di apprendimento o di adattamento. Il vantaggio di questo approccio è che si utilizzano poche risorse in fase di classificazione/comparazione.
CNN(Convolutional Neural Network)
Si tratta di una rete neurale convoluzionale basata su un’architettura deep learning gerarchica. Una CCN è, dunque, una rete neurale che opera su più livelli che filtrano ripetutamente l’immagine target fino alla fase di classificazione. I filtri sono “allenabili” e sono in grado pertanto di adattarsi durante l’apprendimento.
Le CNN, di conseguenza, possono raggiungere livelli di alta precisione, perchè i vari livelli possono essere “addestrati” ad hoc e possono apprendere caratteristiche di basso livello simili a quelle previste nel metodo HOG ma esse riescono a farlo operando autonomamente.
Il parametro number_of_times_to_upsample=1 invece ci consente di decidere quante volte sia necessario analizzare l’imagine per ricercare volti. Maggiore è il numero di sample maggiore sarà la possibilità di individuare nell’immagine target volti più piccoli.
Per concludere questo articolo di seguito lascio un piccolo esempio su come sia possibile analizzare i frames di un video in realtime catturato dalla webcam per effettuare face recognition su un video.
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')
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