Sunteți pe pagina 1din 18

Un sistem de recunoaștere facială poate identifica fețe automat, având ca materiale pe care se

lucreaza imagini și surse video. În prezenta lucrare, se va vorbi despre aplicarea metodelor de
recunoaștere în imagini.
Sistemele de recunoaștere facială sunt folosite în doua scopuri majore: fie pentru a verifica o
persoană (autentificare), fie pentru a identifica o persoană (recunoaștere). (sursa carte..).
Sitemele de recunoaștere facială au evoluat significativ, în zilele noastre fiind posibile a fi
executate în timp real: detectarea, extragerea trăsăturilor faciale si recunoașterea (imagini
capturate in conditii favorabile). Bineînțeles, acest lucru este posibil doar daca imaginile au fost
capturale în condiții favorabile, căci există factori precum luminozitatea, unghiul din care este
efectuată poza,... care au un rol important în acuratețea rezultatului.

Detectarea facială
 Primul pas în recunoașterea facială; are o importanță majora în recunoașterea facială.
 Ideal: identificarea facială indiferent de pozitie, scara, orientare, varsta, expresie
 Detectarea facială poate să țină de: culoarea pielii, miscare (video-uri), forma
feței/capului sau o combinație între toate
 Procesul: se decide dacă dacă pattern-ul din cadrul ferestrei este față sau non-față.
Clasificatorul față/non-față este invățat din training-ul pe exemple față și non-față,
folosind metode de învățare bazate pe statistică.

I. Appearance-Based and Learning Based Approaches -> metodă bazată pe înfățisare


În cadrul acestei metode, detectarea facială e văzută ca o clasificare a fiecărei sub-ferestre ca
aparțând unei fețe/non-fațe.
 Sunt bune în modelare structurilor 3D – iau în considerare posibile
„face appearcances” sub varii condițitii => evită dificultățile
 Pixelii unei fețe sunt corelați (multe similitudini), pe când cei dintr-o fereastră non-față
prezintă mult mai puține regularități.
 Această clasificare față/non-față devine foarte complexă când intră în dicuție factori
precum: aspectul facial, luminozitatea și expresiile faciale. Situația se complică dacă
luam în considerare și poziția capului.
 Viteza este un alt factor care trebuie luat o considerare => se vrea în timp real…dupa
1990 s-a depus efort în această direcție.

a) Turk and Pentland – PCA (pg 14)


 PCA sau ,,Principal Component Analysis”(subspace/eigenface)
 Doar probabilitatea într-un subspațiu PCA este luată în considerare
b) Moghaddam and Pentland – PCA
 Au luat în considerare și probabilitatea într-un subspațiu complementar ortogonal
 O estimare mai bună a probabilității de detectare facială îmbinând cele 2 metode
c) Sung and Poggio
 Prima data, împart imaginea in clustere de fețe și non-fețe
 Descompun fiecare cluster în subspații PCA și null-e.
 Plicată estimarea Bayesian-ă pentru a obține rezultate statistice folositoare.
d) Rowley et al.’s
 Foloseșste rețele neurale conectate retinal
e) Osuna et al.
 Antrenează un vector suport non-liniar pentru a clasifica în funcție de pattern-urile
față/non-față
f) Yang et al.
 Folosește arhitectura SNOW (Sparse Network of Winnows) de învătare pentru detectarea
facial
!! Pt toate aceste sisteme se foloșește un algoritm bootstrap pentru a colecta exemple relevante
(ex: exemple non-face din imagini care nu conțin nicio față)
g) Scnhneiderman and Kanade
 față/non-față
 AdaBoost learning
 Pt imagini de 320x240 ii ia un minut sa detecteze fețe

h) Viola and Jones


 Au contruit un sistem de detecție rapid in care ,,AdaBoost learning” e folosit ca să
construiască clasificatori non-liniari.
 AdaBoost e folosit ca sa rezolve următoarele 3 probleme esențiale:
- Învățarea eficientă a trăsăturilor dintr-un set vast de trăsături
- Construirea clasificatorilo slabi, fiecare bazându-se pe una dintre trăsăturile alese
- Stimularea (boosting) clasificatorilor slabi pentru a construi un clasificator puternic
 Clasificatorii slabi sunt
Primul pas în recunoașterea facială, așa cum se vede și în imaginea prezentată mai sus, îl
reprezintă detectarea facială. Acesta este poate și cel mai important pentru că el stă la baza
întregului process de recunoaștere. Cu cât precizia/acuratețea cu care sunt detectate fețele este
mai mare și timpul mai mic, cu atât crește calitatea întregii aplicații.
Bineînțeles, aceștia sunt doar 2 dintre factorii care intervin în acest process. (Alti factori…)
În prezenta lucrare, vor fi analizați trei algoritmi de detectare: algoritmul lui Viola și Jones,
HOGs (Histogram of Oriented Gradients) și detectare prin Deep Learning (OpenCV).

Viola—Jones -> OpenCV


Framework-ul dezvoltat de Paul Viola și Michael J Jones are la bază un algoritm de detectare al
obiectelor, destinația lui principală fiind aceea de detectare a fețelor. Deși algorimul efectuează
procesul de detectare în timp real, acesta se aplică doar în cazul fețelor frontale. Potrivit
articlolului ,,Robust Real-Time Face Detection” [2], Viola și Jones oferă un exemplu al
performanței detectării fețelor: aplicat pe o imagine de 384 x 288 pixeli, acesta detectează fețele
din 15 cadre pe secundă (pentru un 700 MHz Intel Pentium III).
Algoritmul constă în 4 etape:

 Selectarea trăsăturilor de tip Haar


 Crearea unei imagini integrale
 Antrenarea cu Ada-boost
 Clasificatorii în cascadă (Cascading classifiers) [3]

Selectarea trăsăturilor de tip Haar (Haar features/Haar wavelet)


Pentru detectarea fețelor se va lucra cu extragerea trăsăturilor. Încercarea de detectare bazându-
se direct pe pixeli nu este eficientă, fiind mai lentă decât cea bazată pe trăsături. Astfel, se
selectează trăsăturile cele mai importante, cum ar fi: ochi, nas, gura, frunte, sprâncene, etc.
Algoritmul a fost propus de Alfred Haar în anul 1909 și se aseamană cu “convolutional kernels”.
Fiecărei trăsături îi va fi asociată o trăsătura Haar.
Ele se împart în:

 ,,edge features” – detecteaza marginile eficient (A și B)


 ,,line features” – detecteaza liniile efficient (C)
 ,,center surrounding features” – detectează linii înclinate (D) [4]
## Imagine cu haar – ia-o din articolo
## Imagine cu o față și cu haar pe ia ca in video: https://www.youtube.com/watch?v=F5rysk51txQ

Algoritmul de selectare a trăsăturilor este diferit de cel propus de Papageorgiou et al. (1998). Se
folosesc trei tipuri de trăsături: (A,B) trăsături corespunzătoare a două dreptunghiuri alb-negru de
dimensiuni egale (,,two-rectagle features”) care pot fi orizontale sau verticale, (C) trăsături
corespunzătoare a 3 dreptunghiuri egale, cel din mijloc de diferit ca non-culoare de cele din părti
(,,three-rectangle features”) și cel din urmă (D) format din perechi de dreptunghiuri pe diagonală
(,,four-rectangle features”). Se calculează suma dreptunghiului/dreptunghiurilor de culoare
neagră și apoi celor de culoare albă și se face diferența dintre sume. [2]
## Imagine cu cum se calculează tot ca in video sau mai vezi prin carti + explicație ca în video

Imagine integrală (,,Integral image”)


Trăsăturile de tip Haar au două mari avantaje și anume faptul că pot fi calculate eficient utilizând
o imagine integrală (,,integral image”) și faptul că un clasificator puternic de tip față/non-față
poate fi construit pe baza acestor trăsături selectate. [1]
Se definește imaginea integrală II(x,y):

II(x,y) = ∑ I ( x , y)
' '
x ≤ x, y ≤ y

În punctul (x,y) se află suma pixelilor de deasupra și din stânga lui (x,y).
Pentru obținerea imaginii integrale, se calculează recurent pe imaginea inițială, folosind
următoarele formule:
S(x,y) = S(x,y-1) + I(x,y)
II(x,y) = II(x-1,y) + S(x,y),
unde S(x,y) reprezintă suma unui rând, iar S(x,-1) = 0 și II(-1,y) = 0. [2]
Cu ajutorul noii imagini obținute, extragerea trăsăturilor se execută mult mai rapid pentru
imagini la diferite scări. Orice sumă corespunzătoare unui dreptunghi poate fi calculată în funcție
de patru matrice. Așa cum se poate vedea în Fig..., valoarea imaginii integrale în punctul 1 este
suma pixelilor din dreptunghiul A. Valoarea din punctul 2 este suma pixelilor A+B, în punctul 3
este A+C, iar în 4 este A+B+C+D.
## Imagine din carte
Fig. .. Suma pixelilor din dreptunghiul D poate fi calculată raportându-se la cele patru matrice.
Astfel, suma pixelilor din D este rezultatul (4+1) – (2+3). [2]
Prin imaginea nou obținută, variația intensității într-un dreptunghi D poate fi calculată foarte
rapid indiferent de locația acestuia și de scară. Pentru D variația este V D=√ V∗V , unde V =
(4+1) – (2+3) este suma pixelilor din D, iar o normalizare a intensității poate fi făcută prin
împărtirea tuturor valorilor pixelilor din sub-fereastră cu variația calculată. [1]
# TO DO: uita-te si pe cap cu “Feature Discussion”

Antrenarea cu AdaBoost
O dată ce trăsăturile de tip Haar sunt disponibile, urmează pasul de antrenare pe un set care
conține atât imagini pozitive, cât și imagini negative. În fiecare imagine se selectează subferestre
cu dimensiunea de 24x24 pixeli. Fiecărei subferestre îi sunt associate peste 160 000 de valori ale
caracteristicilor, ceea ce depășește cu mult numărul pixelilor dintr-o subfereastră. Astfel, se va
încerca a se lua în considerare doar acele caracteristici care sunt importante.
AdaBoost (Adaptive Boosting), dezvoltat de Yoav Freund și Robert Schapire, este algoritmul
care va fi aplicat pentru a extrage doar trăsăturile relevante în determinarea rezultatului final (față
sau non-față) . Procedura de învățare presupune obținerea unui clasificator puternic, F(x), prin
combinarea unor clasificatori slabi și simplu de construit, f(x). În acest caz, clasificatorii slabi se
constituie din caracteristicile alese.
Algoritmul începe prin atribuirea fiecărui element o pondere egală, urmând ca aceasta să se
modifice la fiecare pas. Cu cât ponderea este mai mare, cu atât clasificatorul este mai puternic.
Dacă toate ponderile caracteristicilor pozitive însumate depășesc un anumit prag -care se
modifică la rândul lui pe măsura derulării antrenamentului-, atunci se decide că imaginea conține
o față. Orice caracteristică care reușește să detecteze în mai mult de jumătate din cazuri
-corespunzătoare detecției aleatoare- este luată în considerare în calculul clasificatorului
puternic.
/*O dată ce aceste trăsături sunt găsite, se folosește o combinare de ponderi pentru a evalua și a
decide dacă o fereastră data conține o față sau nu. Orice caracteristică care reușește să detecteze
în mai mult de jumătate din cazuri -corespunzătoare detecției aleatoare- este luată în considerare
în calculul clasificatorului puternic.*/
F(x) = α1 f1(x) + α2 f2(x) + α3 f3(x) + …
// TO DO: trebuie completare…eventual cum functionează AdaBoost + pseudocod cu
sursa?
// despre detectarea fetelor folosind doar 2 trasaturi
/* [5]
M

∑ α mhm
m=1
HM = M ,
∑ αm
m=1

unde x – un ,,pattern” dat spre a fi clasificat, h m(x) ∈ {-1,1} – cei M clasificatori slabi, α m ≥ 0 –
M
coeficienții de combinare în ℝ și ∑ α m – factorul de normalizare.*/
m=1

Clasificatorii în cascadă

HOGs (Histogram of Oriented Gradients) -> dlib


HOGs sau ,,Histogram of Oriented Gradients” este o altă metodă de detectare facială dezvoltată
de Dalal și Triggs, prezentată în 2005 în cadrul unuei conferințe. Ideea de bază a descriptorilor
HOG constă în folosirea distribuției intensității gradienților și distribuția orientării muchiilor
pentru a descrie un obiect. Astfel, trăsăturile de tip HOG sunt reprezentate sub forma unui vector
de dimensiune n. Acestea sunt date mai departe unui clasificator liniar SVM (,,Support Vector
Machine”) care va decide dacă în imagine exită vreo față sau nu.

Procesul de detectarea al fețelor prin această metodă constă în următorii pași:

 Pre-procesarea imaginii
 Calculul gradienților orientați
 Histograma gradienților în celule
 Normalizare blocurilor
 Calcularea vectorului de caracteristici HOG

Pre-procesarea imaginii
Primul pas constă în croparea și redimensionarea imaginilor care se vor da clasificatorului,
întrucât acestea trebuie să aibă dimensiune egală. În studiul lui Dalal și Triggs, aceștia folosesc,
pentru detectarea oamenilor, doar imagini de dimeniuni 64 x 128 x 3 (rație de 1:2). [5]
În cazul antrenării detectorului facial, datele de intrare vor consta în imagini cu fețe (exemple
pozitive) la dimensiuni de 36 x 36 pixeli (respectând o rație de 1:1) și în imagini fără fețe
(exemple negative), unde dimensiunile nu contează din moment ce fiecare pătrat cu aceste
dimensiuni este un exemplu de non-față. Imaginile pe care se va lucra, vor fi monocrome.

# pune tu o imagine - https://www.learnopencv.com/histogram-of-oriented-gradients/

Calculul gradientului
Pentru fiecare pixel din imagine se analizează vecinii sai (pe direcțiile verticală și orizontală).
Scopul este să se determine cât de întunecat este pixelul curent comparativ cu vecinii săi și să se
cunoască direcția în care imaginea tinde să scadă în luminozitate (histograma orientarii
muchiilor).

Calculul gradientului pentru obținerea HOG presupune aplicarea următoarelor formule pentru
fiecare pixel în parte:
Gx = H(x+1, y) - H(x-1, y), Gx – gradientul pixelului pe direcția orizontală
Gy = H(x, y+1) - H(x, y-1), Gy – gradientul pixelului pe direcția verticală
H (x,y) – valoare pixelului
De aici obținem magnitudinea (G) și orientarea (Θ) gradientului:

|G| = √ G2x +G 2y

Gy
Θ = arctan
Gx

101
Gx = 50
|G| = = 70.72
91 41 Gy = 50

61
Θ ia valori în intervalul [-π, π]. Valorile orientării vor fi prelucrate pentru a lua valori în
intervalul [0,360] astfel: [6]
Θ, daca Θ ≥ 0
Θ’ =
Θ + 360, daca Θ < 0

Această reprezentare reușește o simplificare a descrierii obiectului. Practic s-a găsit o modalitate
comună de caracterizare a pixelilor cu valori diferite. Astfel, indiferent de luminozitatea dintr-o
imagine, conținutul este afișat în același mod.

Histograma gradienților în celule


Următorul pas presupune construirea histogramei gradienților.
Imaginea obținută la pasul anterior, va fi împarțită în celule de 6 x 6 pixeli. Scopul este de a mai
elimina din detaliile, de sintetizare a informațiilor obținute până în acest moment. Fiecare astfel
de celulă va conține date despre valorile orientarii gradienților în funcție de numărul de poziții
alese, pentru a afla valoare cea mai mare (cea mai des întâlnită orientare) care va reprezenta
întreaga celulă. Dalal și Triggs propun 9 poziții pentru histogramă. Pentru a încadra într-o
anumită poziție rezultatul de la pasul precedent al unui pixel, se va împărți cu 40 valoarea
orientării gradientului (care ia valori între 0și 360 de grade).
În alte cuvinte, se adună magnitudinile pixelilor la poziția la care se încadrează din cele 9 poziții,
iar poziția cu cea mai mare sumă devine reprezentantă pentru întreaga celulă.
Rezultatul astfel obținut constă într-o imagine simplificată, în care se observă clar structura
obiectului - în cazul lucrării, al feței.

Normalizare blocurilor 3 x 3 celule


Normalizarea este procesul prin care se schimbă intervalul în care intensitatea pixelilor ia valori.
În cazul metodei HOGs, vom aplica normalizarea la nivelul blocurilor – grile pătrate compuse
din: numărul celulelor din bloc, numărul pixelilor dintr-o celulă și numărul de poziții alese în
histograma fiecărei celule.
Folosindu-se o copie a matricei originale, pentru fiecare bloc în parte se execute următorii pași:
- se concatenează toți vectorii din toate celulele blocului curent într-un vector v de
dimensiune rezultată din numărul pozițiilor dintr-o celulă x numărul celulelor din
bloc (ex: 9 * (3*3) = 81);
- normalizarea vectorului presupune calculul k = sqrt(v[0]^2 + v[1]^2 + ... + v[n]^2 +
eps^2), unde eps ia o valoare dată. După ce se calculează k se împarte fiecare valoare
din vector cu k pentru a obține normalizarea.

Calcularea vectorului de caracteristici HOG


După ce am obținut câte un vector se separat pentru ficare bloc în parte, se concatenează toti,
rezultând vectorul de caracteristici HOG.
Viola-Jones
[1] Stan Z. Li și Anil K. Jain, Handbook of Face Recognition, 2004, ed. Springer
[2] Paul Viola și Michael J Jones, Robust Real-Time Face Detection. International Journal of
Computer Vision, 2004, 137–154
[3] https://en.wikipedia.org/wiki/Viola%E2%80%93Jones_object_detection_framework
[4] https://towardsdatascience.com/whats-the-difference-between-haar-feature-classifiers-and-
convolutional-neural-networks-ce6828343aeb
/*[5] Y. Freud și R. Shapire, A decision-theoretic generalization of on-line learning and an
application to boosting. Journal of Computer and System Science, 119-139, August 1997*/

HOGs
[5] Navneet Dalal și Bill Triggs, Histograms of Oriented Gradients for Human Detection,
[6] http://users.utcluj.ro/~rdanescu/srf/lab_03_04r.pdf

[7] https://www.learnopencv.com/image-recognition-and-object-detection-part1/
[8]

TO DO:

Vezi la linkuri cu site-uri de prin ce cărți/articole sunt luate

Convoluţia
Este un proces matematic care permite combinarea celor două intrări

 setul de pixeli din imaginea sursă;


 matricea nucleu;
pentru obţinerea valoarii unui pixel din imaginea destinaţie.
Antrenarea HOG

 colectarea imaginilor pentru antrenare


 notarea locației obiectului în imaginile date spre învățare
 antrenarea detectorului de obiecte cu regiuni din obiecte
 salvarea si testarea detectorului antrenat
The contrast normalization is achieved by normalization of each block's local histogram.

The whole HOG extraction process is well explained


here: http://www.geocities.ws/talh_davidc/#cst_extract
When you normalize the block histogram, you actually normalize the contrast in this block, if your
histogram really contains the sum of magnitudes for each direction.

The term "histogram" is confusing here, because you do not count how many pixels has direction k,
but instead you sum the magnitudes of such pixels. Thus you can normalize the contrast after
computing the block's vector, or even after you computed the whole vector, assuming that you know
in which indices in the vector a block starts and a block ends.
The steps of the algorithm due to my understanding - worked for me with 95% success rate:

1. Define the following parameters (In this example, the parameters are like HOG for Human
Detection paper):
 A cell size in pixels (e.g. 6x6)
 A block size in cells (e.g. 3x3 ==> Means that in pixels it is 18x18)
 Block overlapping rate (e.g. 50% ==> Means that both block width and block height
in pixels have to be even. It is satisfied in this example, because the cell width and cell
height are even (6 pixels), making the block width and height also even)
 Detection window size. The size must be dividable by a half of the block size without
remainder (so it is possible to exactly place the blocks within with 50% overlapping). For
example, the block width is 18 pixels, so the windows width must be a multiplication of 9
(e.g. 9, 18, 27, 36, ...). Same for the window height. In our example, the window width is
63 pixels, and the window height is 126 pixels.
2. Calculate gradient:
 Compute the X difference using convolution with the vector [-1 0 1]
 Compute the Y difference using convolution with the transpose of the above vector
 Compute the gradient magnitude in each pixel using sqrt(diffX^2 + diffY^2)
 Compute the gradient direction in each pixel using atan(diffY / diffX). Note
that atan will return values between -90 and 90, while you will probably want the values
between 0 and 180. So just flip all the negative values by adding to them +180 degrees.
Note that in HOG for Human Detection, they use unsigned directions (between 0 and 180).
If you want to use signed directions, you should make a little more effort: If diffX and
diffY are positive, your atan value will be between 0 and 90 - leave it as is. If diffX and
diffY are negative, again, you'll get the same range of possible values - here, add +180, so
the direction is flipped to the other side. If diffX is positive and diffY is negative, you'll get
values between -90 and 0 - leave them the same (You can add +360 if you want it positive).
If diffY is positive and diffX is negative, you'll again get the same range, so add +180, to
flip the direction to the other side.
 "Bin" the directions. For example, 9 unsigned bins: 0-20, 20-40, ..., 160-180. You can
easily achieve that by dividing each value by 20 and flooring the result. Your new binned
directions will be between 0 and 8.
3. Do for each block separately, using copies of the original matrix (because some blocks are
overlapping and we do not want to destroy their data):
 Split to cells
 For each cell, create a vector with 9 members (one for each bin). For each index in
the bin, set the sum of all the magnitudes of all the pixels with that direction. We have
totally 6x6 pixels in a cell. So for example, if 2 pixels have direction 0 while the magnitude
of the first one is 0.231 and the magnitude of the second one is 0.13, you should write in
index 0 in your vector the value 0.361 (= 0.231 + 0.13).
 Concatenate all the vectors of all the cells in the block into a large vector. This vector
size should of course be NUMBER_OF_BINS * NUMBER_OF_CELLS_IN_BLOCK.
In our example, it is 9 * (3 * 3) = 81.
 Now, normalize this vector. Use k = sqrt(v[0]^2 + v[1]^2 + ... + v[n]^2 + eps^2) (I
used eps = 1). After you computed k, divide each value in the vector by k - thus your
vector will be normalized.
4. Create final vector:
 Concatenate all the vectors of all the blocks into 1 large vector. In my example, the
size of this vector was 6318

 matricea nucleu;
pentru obţinerea valoarii unui pixel din imaginea destinaţie.
Antrenarea HOG

 colectarea imaginilor pentru antrenare


 notarea locației obiectului în imaginile date spre învățare
 antrenarea detectorului de obiecte cu regiuni din obiecte
 salvarea si testarea detectorului antrenat

Descrierea arh aplicatiei -> arhitectura, use cases, fotografii, diagrame relationale, etc
Implementare -> limbaj, tehnologii
De ce am folosit limbajul respectiv? (nu descrierea lui)
Frontend, Backend -descrieri, poze

S-ar putea să vă placă și