Guardando solo questo pixel e i pixel che lo toccano, l’immagine sta diventando più scuro verso l’alto a destra. Se si ripete questo processo per ogni singolo pixel nell’immagine, si finisce con ogni pixel sostituito da una freccia. Queste frecce sono chiamate gradienti e mostrano il flusso dalla luce al buio attraverso l’intera immagine:
Questa potrebbe sembrare una cosa casuale da fare, ma c’è una buona ragione per la sostituzione dei pixel con sfumature. Se analizziamo direttamente i pixel, le immagini veramente scure e le immagini veramente chiare della stessa persona avranno valori di pixel totalmente diversi. Ma considerando solo la direzione in cui cambia la luminosità, sia le immagini veramente scure che le immagini veramente luminose finiranno con la stessa rappresentazione esatta. Questo rende il problema molto più facile da risolvere!
Ma salvare il gradiente per ogni singolo pixel ci dà troppi dettagli. Finiamo per perdere la foresta per gli alberi. Sarebbe meglio se potessimo vedere il flusso di base di leggerezza / oscurità ad un livello più alto in modo da poter vedere il modello di base dell’immagine.
Per fare ciò, suddivideremo l’immagine in piccoli quadrati di 16×16 pixel ciascuno. In ogni quadrato, contiamo quanti gradienti puntano in ogni direzione principale (quanti puntano su, punta su-destra, punta a destra, ecc.). Quindi sostituiremo quel quadrato nell’immagine con le direzioni della freccia che erano le più forti.
Il risultato finale è giriamo l’immagine originale in una rappresentazione molto semplice che cattura la struttura di base di un volto in un modo semplice:
L’immagine originale è trasformato in un MAIALE, rappresentazione, che cattura le caratteristiche principali di questa immagine, a prescindere dalla immagine brightnesss.
Per trovare facce in questo PORCO di immagine, tutto quello che dobbiamo fare è trovare la parte dell’immagine che sembra più simile a un noto PORCO di pattern, che è stata estratta da un mazzo di altri corsi di formazione volti:
l’Utilizzo di questa tecnica, ora siamo in grado di trovare facilmente i volti di qualsiasi immagine:
Se volete provare questo passo fuori di te, usando Python e dlib, ecco il codice che mostra come generare e visualizzare HOG rappresentazioni di immagini.
Passo 2: Posare e proiettare i volti
Whew, abbiamo isolato i volti nella nostra immagine. Ma ora abbiamo a che fare con il problema che facce girate direzioni diverse sembrano totalmente diverso da un computer:
gli esseri Umani possono facilmente riconoscere che entrambe le immagini sono di Will Ferrell, ma i computer che vorresti vedere queste immagini come due persone completamente diverse.
Per tenere conto di questo, cercheremo di deformare ogni immagine in modo che gli occhi e le labbra siano sempre nel posto del campione nell’immagine. Questo renderà molto più facile per noi confrontare i volti nei prossimi passi.
Per fare ciò, useremo un algoritmo chiamato face landmark estimation. Ci sono molti modi per farlo, ma useremo l’approccio inventato nel 2014 da Vahid Kazemi e Josephine Sullivan.
L’idea di base è che troveremo 68 punti specifici (chiamati punti di riferimento) che esistono su ogni faccia: la parte superiore del mento, il bordo esterno di ciascun occhio, il bordo interno di ogni sopracciglio, ecc. Quindi formeremo un algoritmo di apprendimento automatico per essere in grado di trovare questi 68 punti specifici su qualsiasi faccia:
68 punti di riferimento possiamo individuare su ogni viso. Questa immagine è stata creata da Brandon Amos di CMU che lavora su OpenFace.
Ecco il risultato di localizzare il 68 faccia punti di riferimento nella nostra immagine di test:
PROTIP: È inoltre possibile utilizzare questa stessa tecnica per implementare la propria versione di filtri viso 3d in tempo reale di Snapchat!
Ora che sappiamo che gli occhi e la bocca sono, semplicemente ruoteremo, ridimensioneremo e taglieremo l’immagine in modo che gli occhi e la bocca siano centrati nel miglior modo possibile. Non faremo alcun ordito 3d di fantasia perché ciò introdurrebbe distorsioni nell’immagine. Useremo solo trasformazioni di immagini di base come la rotazione e la scala che preservano le linee parallele (chiamate trasformazioni affini):
Ora, non importa come il volto è girato, siamo in grado di centrare la bocca e gli occhi sono all’incirca nella stessa posizione nell’immagine. Questo renderà il nostro prossimo passo molto più preciso.
Se vuoi provare questo passo usando Python e dlib, ecco il codice per trovare i punti di riferimento del viso ed ecco il codice per trasformare l’immagine usando quei punti di riferimento.
Punto 3: Codifica facce
Ora siamo alla carne del problema — in realtà raccontando facce a parte. Questo è dove le cose si fanno davvero interessanti!
L’approccio più semplice per il riconoscimento del volto è quello di confrontare direttamente il volto sconosciuto che abbiamo trovato nel passaggio 2 con tutte le immagini che abbiamo di persone che sono già state taggate. Quando troviamo una faccia precedentemente taggata che sembra molto simile alla nostra faccia sconosciuta, deve essere la stessa persona. Sembra una buona idea, giusto?
C’è in realtà un enorme problema con questo approccio. Un sito come Facebook con miliardi di utenti e un trilione di foto non può scorrere ogni volto precedente per confrontarlo con ogni immagine appena caricata. Ci vorrebbe troppo tempo. Devono essere in grado di riconoscere i volti in millisecondi, non ore.
Quello di cui abbiamo bisogno è un modo per estrarre alcune misurazioni di base da ogni faccia. Quindi potremmo misurare la nostra faccia sconosciuta allo stesso modo e trovare la faccia conosciuta con le misurazioni più vicine. Ad esempio, potremmo misurare le dimensioni di ciascun orecchio, la spaziatura tra gli occhi, la lunghezza del naso, ecc. Se hai mai visto un cattivo crimine mostra come il CSI, sapete di cosa sto parlando:
Proprio come la TV! Così reale! # science
Il modo più affidabile per misurare una faccia
Ok, quindi quali misurazioni dovremmo raccogliere da ogni faccia per costruire il nostro database di volti noti? Taglia orecchie? Lunghezza del naso? Colore degli occhi? Qualcos’altro?
Si scopre che le misurazioni che sembrano ovvie per noi umani (come il colore degli occhi) non hanno davvero senso per un computer che guarda i singoli pixel in un’immagine. I ricercatori hanno scoperto che l’approccio più accurato è quello di lasciare che il computer capire le misurazioni per raccogliere se stesso. L’apprendimento profondo fa un lavoro migliore degli umani nel capire quali parti di un volto sono importanti da misurare.
La soluzione è addestrare una rete neurale convoluzionale profonda (proprio come abbiamo fatto nella Parte 3). Ma invece di addestrare la rete a riconoscere gli oggetti delle immagini come abbiamo fatto l’ultima volta, la addestreremo a generare 128 misurazioni per ogni faccia.
Il processo di formazione alla ricerca, al 3 immagini del volto in un momento:
Caricare un corso di formazione volto immagine di una persona conosciuta
Caricare un’altra foto della stessa persona conosciuta
Carica una foto di una persona totalmente diversa
Allora l’algoritmo esamina le misure attualmente generando per ciascuna di queste tre immagini. Poi gestisce la rete neurale leggermente in modo che si assicura le misure genera #1 e #2 sono leggermente più vicino facendo in modo che le misure per il #2 e #3 sono leggermente più distanti:
Dopo aver ripetuto questo passaggio milioni di volte da milioni di immagini di migliaia di persone diverse, la rete neurale impara in modo affidabile generare 128 misurazioni per ogni persona. Qualsiasi dieci diverse immagini della stessa persona dovrebbe dare più o meno le stesse misure.
Machine learning le persone chiamano le 128 misurazioni di ogni faccia un embedding. L’idea di ridurre i dati grezzi complicati come un’immagine in un elenco di numeri generati dal computer viene fuori molto nell’apprendimento automatico (specialmente nella traduzione linguistica). L’approccio esatto per i volti che stiamo usando è stato inventato nel 2015 dai ricercatori di Google, ma esistono molti approcci simili.
Codifica della nostra immagine del viso
Questo processo di formazione di una rete neurale convoluzionale per l’output di embeddings del viso richiede molti dati e potenza del computer. Anche con una costosa scheda video NVidia Telsa, ci vogliono circa 24 ore di formazione continua per ottenere una buona precisione.
Ma una volta che la rete è stata addestrata, può generare misurazioni per qualsiasi faccia, anche quelle che non ha mai visto prima! Quindi questo passo deve essere fatto solo una volta. Fortunatamente per noi, le belle persone di OpenFace lo hanno già fatto e hanno pubblicato diverse reti addestrate che possiamo utilizzare direttamente. Grazie Brandon Amos e il team!
Quindi tutto quello che dobbiamo fare noi stessi è eseguire le nostre immagini del viso attraverso la loro rete pre-addestrata per ottenere le 128 misurazioni per ogni faccia. Ecco le misure per i nostri test immagine:
Quindi, quali sono le parti del viso sono questi 128 numeri di misurare esattamente? Si scopre che non ne abbiamo idea. A noi non importa. Tutto ciò che ci interessa è che la rete genera quasi gli stessi numeri quando si guardano due immagini diverse della stessa persona.
Se vuoi provare tu stesso questo passaggio, OpenFace fornisce uno script lua che genererà incorporamenti tutte le immagini in una cartella e le scriverà in un file csv. Si esegue in questo modo.
Passaggio 4: Trovare il nome della persona dalla codifica
Quest’ultimo passaggio è in realtà il passaggio più semplice dell’intero processo. Tutto quello che dobbiamo fare è trovare la persona nel nostro database di persone conosciute che ha le misurazioni più vicine alla nostra immagine di prova.
Puoi farlo usando qualsiasi algoritmo di classificazione di apprendimento automatico di base. Non sono necessari trucchi di apprendimento profondo. Useremo un semplice classificatore SVM lineare, ma molti algoritmi di classificazione potrebbero funzionare.
Tutto quello che dobbiamo fare è addestrare un classificatore che possa prendere le misure da una nuova immagine di test e dire quale persona conosciuta è la corrispondenza più vicina. L’esecuzione di questo classificatore richiede millisecondi. Il risultato del classificatore è il nome della persona!
Quindi proviamo il nostro sistema. Per prima cosa, ho addestrato un classificatore con gli incorporamenti di circa 20 immagini ciascuno di Will Ferrell, Chad Smith e Jimmy Falon: