de Thalles Silva

Fețele sunt peste tot – de la fotografii și videoclipuri pe site-urile de socializare, până la aplicații de securitate pentru consumatori precum iPhone Xs FaceID.

În acest context, viziunea computerizată, aplicată fețelor, are multe subzone. Acestea includ detectarea feței, recunoașterea și urmărirea. Mai mult, odată cu avansarea Deep Learning, aceste soluții devin mai mature pentru aplicațiile comerciale.

Această postare vă arată, bucată cu bucată, cum să vă proiectați și să vă antrenați propria rețea neuronală convoluțională (CNN) pentru identificarea feței. Aici, vă propunem o implementare Tensorflow Eager a Siamese DenseNets.

Puteți găsi codul complet aici.

Siamese DenseNets

Un CNN siamez este o clasă de rețele neuronale (NN) care conține două sau mai multe instanțe de rețea identice. Termenul identic se referă la faptul că cele două NN-uri au aceeași configurație de proiectare și, cel mai important, greutățile lor.

Pentru a înțelege DenseNets, trebuie să ne concentrăm pe două componente principale ale arhitecturii sale. Acestea sunt bloc dens si strat de tranziție.

Cum sa va antrenati propriul FaceID ConvNet folosind executia TensorFlow

Pe scurt, un DenseNet este un teanc de blocuri dense urmate de straturi de tranziție. Un bloc constă dintr-o serie de unități. Fiecare unitate are două convoluții. Fiecare convoluție este precedată de normalizarea lotului (BN) și unități liniare rectificate (ReLU) activări.

Fiecare unitate produce un număr fix de vectori de caracteristici. Acest număr este controlat de un singur parametru – rata de crestere. În esență, gestionează câte informații noi permite o anumită unitate să treacă la următoarea.

În mod similar, straturile de tranziție sunt componente simple. Acestea sunt concepute pentru a eșantiona vectorii de caracteristici care trec prin rețea. Fiecare strat de tranziție constă dintr-o operație BN, urmată de o 1×1 convoluție plus a 2×2punerea în comun medie.

Diferența mare față de alte CNN obișnuite este că fiecare unitate dintr-un bloc dens este conectată la fiecare altă unitate dinaintea sa. Într-un bloc, a n-a unitatea primește ca intrare vectorii caracteristici învățați de n-1, n-2, … până la prima unitate din conductă. Cu alte cuvinte, designul DenseNets permite partajarea caracteristicilor la nivel înalt între unitățile sale.

1611311710 567 Cum sa va antrenati propriul FaceID ConvNet folosind executia TensorFlow
Prezentare generală DenseBlock. Fiecare unitate scoate K vectori de caracteristici. Următoarele unități primesc vectori de caracteristici de la unitățile anterioare prin concatenare.

În comparație cu ResNets, DenseNets au reutilizarea caracteristicilor prin concatenare în loc de însumare. În consecință, DenseNets tind să fie mai compacte în număr de parametri decât ResNets. Intuitiv, fiecare vector-caracteristică învățat de orice unitate DenseNet dată este reutilizat de toate unitățile următoare dintr-un bloc. Acest lucru minimizează posibilitatea ca diferite straturi ale rețelei să învețe caracteristici redundante.

Atât ResNets, cât și DenseNets utilizează popularul design al stratului de blocaj. Se compune din 2 componente:

  • A 1×1 convoluție pentru a reduce dimensiunile spațiale ale caracteristicilor
  • o convoluție mai largă, în acest caz a 3×3 operație pentru învățarea caracteristicilor

În ceea ce privește eficiența parametrilor și operațiile în virgulă mobilă pe secundă (FLOP), DenseNets depășește ResNets cu o marjă semnificativă. DenseNets nu numai că atinge rate de eroare mai mici pe ImageNets, dar necesită și mai puțini parametri și mai puține FLOP-uri decât ResNets.

1611311710 288 Cum sa va antrenati propriul FaceID ConvNet folosind executia TensorFlow

Un alt truc care îmbunătățește compactitatea modelului este factorul de compresie. Această procedură are loc pe straturile de tranziție și își propune să reducă numărul de vectori de caracteristici care intră în următorul bloc dens. DenseNets implementează acest mecanism prin stabilirea unui factor, θ, între 0 și 1. θ controlează câte dintre caracteristicile curente li se permite să treacă către următorul bloc. Această tehnică permite DenseNets o reducere și mai mare a numărului de vectori de caracteristici și să fie foarte eficientă în parametri.

Învățarea asemănărilor feței

Aceasta nu este o sarcină de clasificare – o facem nu doriți să clasificați imaginile în clase. În schimb, dorim să învățăm o reprezentare care poate descrie individual fiecare intrare.

Mai exact, dorim să găsim similitudini între imaginile de intrare. Pentru a face acest lucru, avem nevoie de o reprezentare capabilă să exprime o relație între două lucruri comparabile.

În practică, dorim să învățăm încorporarea vectorilor pentru a reprezenta relațiile dintre imaginile feței oamenilor. Vrem vectori cu următoarele proprietăți:

  • Dacă două imagini (X1 și X2) sunt similare, vrem ca distanța dintre cei 2 vectori de ieșire să fie cât mai mică posibil
  • Dacă X1 și X2 sunteți nu similar, vrem ca această distanță să fie cât mai mare pe cât o putem face

Mai jos reprezentăm întregul Siamese DenseNets cadru pentru învățarea încorporărilor feței. Următoarele secțiuni trec în revistă blocurile specifice ale acestei arhitecturi.

1611311710 806 Cum sa va antrenati propriul FaceID ConvNet folosind executia TensorFlow

Pierderea contrastivă

Pentru a înțelege cum funcționează pierderea contrastivă, primul lucru pe care trebuie să-l țineți cont este că funcționează pe perechi de imagini.

Luați ca exemplu cele două imagini de mai sus. La un moment dat, dăm perechea (X1, X2) la sistem cu următoarele proprietăți:

  • dacă X1 este considerat a fi similar cu X2 îi dăm o etichetă 0
  • in caz contrar X1 primește o etichetă de 1

Acum, să definim Gw ca funcție parametrică – o rețea neuronală. Rolul său este foarte simplu, Gw mapează intrările de înaltă rezoluție la ieșirile de rezoluție mică.

1611311710 315 Cum sa va antrenati propriul FaceID ConvNet folosind executia TensorFlow
Reducerea intrării dimensionale ridicate la o reprezentare dimensională redusă (D

Vrem să învățăm o funcție de distanță parametrizată Dw, între intrări X1 și X2. Aceasta este distanța euclidiană între ieșirile de Gw.

1611311711 832 Cum sa va antrenati propriul FaceID ConvNet folosind executia TensorFlow

Rețineți că m este marjă. Definește raza din jur Gw. Acesta controlează modul în care imaginile diferite contribuie la funcția de pierdere totală. Adică o pereche de imagini (X1, X2) de la oameni diferiți (clasa) contribuie la pierdere numai dacă distanța dintre ei este în marjă – dacă (m -Dw)> 0.

Cu alte cuvinte, dorim să optimizăm sistemul astfel încât:

  • Dacă perechea de imagini este similară (eticheta 0) reducem la minim funcția de distanță Dw.
  • Dacă perechea de imagini este nu similar (eticheta 1), mărim funcția de distanță Dw.

Funcția de pierdere finală și implementarea acesteia în Tensorflow sunt definite după cum urmează:

1611311711 808 Cum sa va antrenati propriul FaceID ConvNet folosind executia TensorFlow

Este important pentru a observa cum calculăm distanța în linia 2. Deoarece această funcție de pierdere trebuie să fie diferențiat în ceea ce privește greutățile modelului, trebuie să ne asigurăm că nu vor avea loc efecte secundare negative.

Rețineți că în rădăcină pătrată parte a ecuației, adăugăm un mic epsilon înainte de a calcula rădăcina pătrată. Iar motivul este foarte subtil. În cazul în care conținutul din rădăcina pătrată este zero, rădăcina pătrată a lui 0 este, de asemenea, 0 – ceea ce este bine.

Cum sa va antrenati propriul FaceID ConvNet folosind executia TensorFlow
La w = 0, derivata lui sqrt () ope ar avea ca rezultat o împărțire la 0. Acest lucru ar rupe codul dvs. sau ar duce la un NaN în python.

Cu toate acestea, dacă conținutul este 0 și calculăm gradienții, derivata rădăcinii pătrate ar avea o operație de divizare la 0. Este rău.

Ca plată, mereu asigurați-vă că rutinele pe care le utilizați sunt sigure din punct de vedere al calculului.

Mai mult, atunci când minimizați pierderea contrastivă utilizând descinderea gradientului stochastic (SGD), există două scenarii posibile.

În primul rând, dacă perechea de probe de intrare (X1, X2) este din aceeași clasă (eticheta 0), a doua parte a ecuației este redusă la zero. În această situație, minimizăm doar distanța dintre cele două imagini din aceeași clasă. În practică, împingem cele două reprezentări să fie cât mai aproape unele de altele.

1611311711 603 Cum sa va antrenati propriul FaceID ConvNet folosind executia TensorFlow
Pierderea contrastivă grupează fețe similare împreună (în interiorul unei zone date) și împinge eșantioane similare.

În al doilea caz, dacă perechea de intrare (X1, X2) nu este din aceeași clasă (eticheta 1), prima parte a ecuației este anulată. Apoi, în al doilea termen al însumării, pot apărea două situații.

În primul rând, dacă distanța dintre cele două perechi de imagini X1 și X2 este mai mare decât m, nimic nu se intampla. Rețineți că dacă Dw>; m, atunci diferența dintre ele va fi, de asemenea, negativă. Ca rezultat, derivata funcției rămase va fi 0 – niciun gradient nu înseamnă nicio învățare.

Cu toate acestea, dacă distanța Dw între perechea de intrare X1 și X2 e mai puțin decât m, apare situația opusă. Acum semnalul de gradient va acționa ca o forță respingătoare. În practică, va împinge cele două reprezentări mai departe una de alta.

Set de date

Pentru a instrui o CNN siameză pentru similitudinea feței, am folosit popularul Set de date CelebFaces Attributes (CelebA) pe scară largă. Conține peste 200.000 de imagini de vedete din 10.177 de identități diferite. Pentru a ușura prelucrarea prealabilă a datelor, am ales părțile fețelor aliniate și decupate din setul de date. Următoarea imagine arată câteva dintre eșantioanele setului de date.

1611311712 716 Cum sa va antrenati propriul FaceID ConvNet folosind executia TensorFlow
CelebA mostră de imagini.

Pentru a utiliza pierderea contrastivă, trebuie să construim setul de date într-un mod foarte specific. Practic, trebuie să construim un set de date care să conțină o mulțime de perechi de imagini de față. Unii dintre ei de la aceiași oameni, unii dintre ei de la diferiți.

Pentru a o spune simplu, a dat o imagine de intrare Xi trebuie să găsim un set de eșantioane S = {X1, X2,…, Xj} astfel încât Xi și Xj aparțin aceleiași clase. Spune-o într-un alt mod, Xi și Xj sunt imagini de față ale aceleiași persoane.

În același mod, trebuie să găsim un set de imagini D = {S1, S2,…, Sj} astfel încât Sj NU aparține aceleiași clase ca Xi.

În cele din urmă, combinăm imaginea de intrare Xi cu probe din ambele seturi similare și diferite. Pentru fiecare pereche (Xi, Xj) dacă Xj aparține setului de probe similare S, atribuim o etichetă de 0 perechii, în caz contrar, primește o etichetă de 1.

Detalii de antrenament

Am folosit designul DenseNet-121 așa cum este descris în lucrarea originală. Parametrul ratei de creștere (k) a fost setat la 32. În locul stratului 1000D complet conectat la sfârșit, învățăm încorporarea vectorilor de dimensiunea 32.

1611311712 9 Cum sa va antrenati propriul FaceID ConvNet folosind executia TensorFlow

Pentru a optimiza parametrii modelului, am folosit Adam Optimizer cu un program de rată de învățare ciclic. Inspirați de super-convergența fast.ai, am remediat beta2 Parametrul Adam ca 0.99 și a aplicat o politică de ciclu la beta1.

În acest fel, ambii parametri: – rata de învățare și beta1 variază ciclic între o valoare maximă și minimă. Pur și simplu, în timp ce rata de învățare crește beta1 scade într-un interval fix.

1611311712 587 Cum sa va antrenati propriul FaceID ConvNet folosind executia TensorFlow

Rezultate

Rezultatele sunt foarte bune.

Pentru aceste exemple, un singur prag de 1 ar clasifica corect majoritatea eșantioanelor. De asemenea, rețeaua este invariantă pentru multe transformări ale imaginilor de intrare. Aceste transformări includ variații de luminozitate și contrast, dimensiunea feței, poziția și alinierea. Este invariant la mici modificări ale aspectelor oamenilor, cum ar fi vârsta, tunsoarea, pălăriile și ochelarii.

Valoarea similarității de mai jos este mai mică pentru fețele similare și mai mare pentru cele diferite. Etichetele de 0 înseamnă că perechea de imagini provine de la aceeași persoană.

1611311712 685 Cum sa va antrenati propriul FaceID ConvNet folosind executia TensorFlow

Mulțumesc pentru lectură!

Pentru mai multe lucruri interesante despre învățarea profundă, verificați

Scufundați-vă mai întâi în GAN-uri avansate: explorarea atenției de sine și a normelor spectrale
În ultimul timp, modelele generative atrag multă atenție. O mare parte din asta provine din Rețelele Adversare Generative …medium.freecodecamp.orgScufundarea în rețele de segmentare semantică convoluționale profunde și Deeplab_V3
Rețelele neuronale convoluționale profunde (DCNN) au obținut un succes remarcabil în diferite aplicații de viziune computerizată …medium.freecodecamp.org

Cum sa va antrenati propriul FaceID ConvNet folosind executia TensorFlow