Documente Academic
Documente Profesional
Documente Cultură
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ă.
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
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ă
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.
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.
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:
Convoluţia
Este un proces matematic care permite combinarea celor două intrări
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
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