Quello dell'autenticazione non invasiva mediante tecniche biometriche è uno dei topic caldi degli ultimi anni. Infatti, il tentativo è quello di svincolare l'utente dalle tediose operazioni di inserimento di password e nome utente, ormai destinate a diventare macchinosi retaggi di epoche passate. In tal senso, una delle tecniche più semplici, ma anche efficaci, è quella del riconoscimento facciale: in questo articolo, vedremo come la libreria DeepFace ci permette di fare in modo che anche il nostro fido Raspberry Pi sia in grado di imparare a riconoscere il nostro volto.
Introduzione
Abbiamo visto in passato come sia possibile utilizzare il nostro Raspberry Pi per diverse applicazioni legate all'ambito della videosorveglianza. Tuttavia, non abbiamo approfondito il suo utilizzo in un altro ambito, ovvero quello dell'autenticazione mediante riconoscimento facciale. Per questo, andiamo alla scoperta della libreria DeepFace, che ci permetterà di utilizzare le tecniche di face recognition e face detection per permettere al nostro fido Raspberry Pi di riconoscere il nostro volto.
Face recognition e face detection
Per face recognition si intende dell’identità di un individuo mediante l’uso del suo volto. In quanto tematica di interesse per molte applicazioni, tra cui sorveglianza, biometria, marketing, e molto altro, è uno degli argomenti più studiati nella visione artificiale. In particolare, possiamo effettuare il riconoscimento facciale sia su singole immagini, sia su intere sequenze video; inoltre, non è strettamente necessario che il volto sia acquisito tenendo conto di vincoli specifici, quali ad esempio posa o condizioni di illuminazione. In tal senso, la face recognition si distingue da un altro topic molto studiato, quale quello della object classification, ovvero della determinazione di quali oggetti sono presenti all’interno di un’immagine. Ciò è legato soprattutto a causa della particolarità dei volti: infatti, il riconoscimento facciale prevede che vi sia un gran numero di classi (ovvero, possibili utenti) con poche variazioni inter-classe (ovvero, differenze tra i volti di diversi utenti) e molte intra-classe (ovvero, differenze tra diverse immagini dello stesso utente). Pensiamo, ad esempio, ai volti di due parenti: è probabile che si assomiglino, nonostante non appartengano, come ovvio, alla stessa persona, comportando una bassa variazione inter-classe. Allo stesso tempo, due immagini di uno stesso individuo prese con pose ed angolazioni differenti possono apparire molto dissimili tra loro, causando un’elevata variazione intra-classe.
Le tecniche di face recognition sono, ovviamente, strettamente correlate a quelle di face detection, le quali sono usate per localizzare ed “isolare” la regione dell’immagine contenente il volto dal background, in maniera tale da migliorare le performance dell’algoritmo. In particolare, data un’immagine, l’obiettivo della face detection è quello di determinare se all’interno della stessa ci sono dei volti, restituendo una “bounding box” (ovvero quel “rettangolo” che vediamo spesso apparire sul nostro smartphone durante i selfie) per ogni volto individuato. Ovviamente, l’algoritmo di face detection ignorerà tutti gli altri oggetti presenti nell’immagine, come ad esempio alberi, costruzioni, o anche gli stessi corpi degli individui. In analogia con la face recognition, la face detection è un caso particolare della object detection, il cui compito è quello di individuare la posizione e le dimensioni di tutti gli oggetti appartenenti ad una certa tipologia all’interno di un’immagine. Ovviamente, la face detection precede la face recognition.
Riconoscimento facciale e Deep Learning
Sia le tecniche di face detection sia quelle di face recognition si avvalgono dell’utilizzo delle tecniche di Deep Learning, dimostratesi negli ultimi anni in grado di migliorare significativamente le performance degli algoritmi utilizzati. In particolare, l’uso delle Convolutional Neural Network, che abbiamo trattato in questo articolo, ha permesso di migliorare notevolmente i risultati ottenuti in precedenza, arrivando in molti casi ad ottenere performance superiori a quelle degli esseri umani. Vediamo quindi alcuni dei modelli di rete neurale maggiormente utilizzati per la face detection e recognition.
Modelli per la face detection
E’ importante premettere che non tutti i modelli attualmente utilizzati per la face detection sfruttano il Deep Learning. Infatti, il primo modello “storicamente” utilizzato è quello proposto dalla libreria OpenCV, che utilizza il cosiddetto algoritmo di Viola - Jones. Questo, in realtà, non è basato su tecniche di Deep Learning, ma di template matching. Infatti, viene fatta “scorrere” lungo l’intera immagine una serie di detector, definiti solitamente all’interno di un file XML, che permettono di individuare tutte le parti di un’immagine la cui struttura è simile a quella di un volto, e quindi comprendente occhi, naso e bocca. Un algoritmo di questo tipo è mediamente più veloce di uno che sfrutta il Deep Learning; tuttavia, ha alcune limitazioni indotte dal fatto che è necessario utilizzare immagini frontali, in quanto altrimenti non sarebbe possibile individuare le parti salienti del volto dell’individuo. Un altro esempio di algoritmo per la face detection ancora in uso e che non utilizza il Deep Learning è quello usato dalla libreria dlib, che si basa su delle caratteristiche legate al colore dell’immagine chiamate histogram of oriented gradient (HOG). Interessante comunque sottolineare come il detector della dlib abbia performance generalmente superiori a quelle usate dalla OpenCV.
Il primo vero approccio alla face detection basato sul Deep Learning è quello proposto dal cosiddetto Single-Shot Detector. In questo tipo di approccio, infatti, viene utilizzata una rete neurale composta da due componenti: il primo, detto backbone, estrae le features dell’immagine, mentre il secondo, detto head, estrae le bounding box con l’oggetto individuato. In particolare, ciò avviene suddividendo l’immagine in una griglia, ed assegnando un punteggio a ciascuna parte della stessa a seconda del fatto che siano presenti o meno features proprie degli oggetti ricercati. Un altro approccio è quello seguito dai two-stage detectors, di cui il più utilizzato in ambito di face detection è MTCNN. In particolare, questo tipo di architetture è composto da due reti neurali: una, chiamata generalmente Region Proposal Network (RPN), svolge un compito simile all’head degli SSD, ovvero individuare delle regioni in cui può essere presente l’oggetto. La seconda rete, invece, serve principalmente ad evitare i falsi positivi provenienti dalla RPN, e calibrare al meglio le bounding box. Rispetto ai classici two-stage detectors, MTCNN prevede un terzo step, che è quello nel quale sono estratte le parti salienti del volto dell’individuo. Volendo comparare le diverse tecniche, i risultati migliori si ottengono con MTCNN ed SSD; tuttavia, il primo è estremamente costoso dal punto di vista computazionale, soprattutto a causa dei diversi step richiesti per estrarre la bounding box, per cui in applicazioni real time si tende a preferire il secondo.
Modelli per la face recognition
Esistono diversi modelli per la face recognition, ma, come già accennato in precedenza, quelli che permettono di ottenere performance ottimali sono principalmente basati su algoritmi di Deep Learning. Vediamo i più importanti:
- VGGFace: basata sulla stessa architettura di VGGNet, una delle reti più importanti ed utilizzate in ambito di classificazione delle immagini, ed in grado di ottenere performance elevate sul dataset ImageNet. In tal senso, VGGFace viene addestrata sul dataset Labeled Faces in the Wild (LFW), ottenendo un’accuratezza del 97.78 %, quasi al livello degli esseri umani.
- FaceNet: questo modello è stato sviluppato dai ricercatori di Google, ed è considerato essere allo stato dell’arte. FaceNet è stato usato anche per il clustering (ovvero, per raggruppare varie foto di persone aventi la stessa identità), e vanta un’accuratezza del 99.63 % sul dataset LFW, e del 95.12 % sul dataset YouTube Faces.
- OpenFace: il modello OpenFace è stato ideato dai ricercatori della Carnegie Mellon University ispirandosi al progetto FaceNet. Rispetto alla sua fonte di ispirazione, OpenFace risulta essere più snello, e con un tipo di licenza più “aperto”, che lo rende utilizzabile quindi in un maggior numero di ambiti. Tuttavia, OpenFace non riesce a raggiungere le performance di FaceNet, ottenendo un’accuratezza del 93.80 % sull'LFW.
- DeepFace: questo modello è stato sviluppato da Facebook, ed inizialmente addestrato su un dataset privato contenente quattro milioni di volti appartenenti ad oltre 4000 individui. Quando valutato su LFW, DeepFace ottiene, al momento, un’accuratezza del 97.35 %, quasi pari alle performance degli esseri umani (che sono del 97.53 %).
- DeepID: il modello DeepID è uno tra i maggiormente collaudati in ambito Deep Learning per face recognition. DeepID è stato sviluppato da un gruppo di ricercatori della Chinese University di Honk Kong, ed è in grado di ottenere delle performance pari al 99.15 % su LFW.
- Dlib: il modello Dlib, che afferma di essere il “più semplice al mondo per la face recognition in Python”, non è stato sviluppato da un gruppo di ricerca, ma introdotto dallo sviluppatore responsabile per l’omonima libreria, ovvero Davis King. Il modello riesce ad ottenere delle performance molto buone su LFW, ottenendo un’accuratezza del 99.38 %.
- ArcFace: questo modello è stato sviluppato congiuntamente dall’Imperial College di Londra e dalla compagnia InsightFace, ed è in grado di ottenere un’accuratezza del 99.40 % su LFW.
Come è evidente, quindi, esistono diverse combinazioni possibili di modelli per la face detection e recognition; tuttavia, come raccomandazione generale, si tende ad utilizzare un modello “leggero” per la detection, come quello proposto da OpenCV o, nel caso si intenda usare un approccio basato sul Deep Learning, SSD, mentre si usa la rete neurale più appropriata in termini di licenza d’uso ed efficienza computazionale per quello che riguarda la face recognition.
Sì, ma… DeepFace?
DeepFace è una tra le librerie più semplici da utilizzare per creare una completa pipeline di elaborazione facciale usando il linguaggio Python. In particolare, la libreria è completamente open source, e rilasciata sotto la permissiva licenza MIT, che ci permette di utilizzarla a piacimento nei nostri progetti; inoltre, all’interno di DeepFace sono già integrati la maggior parte degli algoritmi di face detection e recognition elencati in precedenza, e risultano essere richiamabili in poche righe di codice. In altre parole, DeepFace ci permette di astrarci dalle onerose operazioni di implementazione e, soprattutto, training dei modelli per la face detection e recognition, offrendoci un wrapper cui passare semplicemente l’immagine (o il video) da elaborare. Interessante sottolineare come DeepFace ci offra anche funzionalità di analisi degli attributi facciali, estraendo informazioni come età, genere, emozioni ed etnia dei volti individuati. Vediamo quindi come utilizzare questa libreria sul nostro Raspberry. Nel prosieguo, supporremo di aver già configurato il nostro fido Pi, ed avervi collegato una webcam (va bene anche una qualsiasi camera USB compatibile).
Come usare DeepFace?
DeepFace viene distribuito sotto forma di package Python, liberamente disponibile sul Python Package Index (PyPI). Di conseguenza, potremo installare la libreria usando pip, non prima però di aver creato un ambiente virtuale:
ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2547 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.