Licenta Acs Roxandra (1) [626881]

UNIVERSITATEA POLITE HNICA TIMIȘOARA
FACULTATEA DE AUTOMA TICĂ ȘI CALCULATOARE
SPECIALIZAREA INGINE RIA SISTEMELOR

Sistem de detecție și
recunoaștere facială
Lucrare de diplomă

Conducător științific:
Ș.l.dr.ing.Iercan Daniel

Student: [anonimizat]

2
Cuprins

1. Introducere ………………………….. ………………………….. …………….. 4
1.1 Context ………………………….. ………………………….. ………………. 4
1.2 Funcționalitate ………………………….. ………………………….. …….. 5
1.3 Aplica bilitate ………………………….. ………………………….. ……….. 5
2. Analiza stadiului actual în domeniul problemei ……………………… 7
3. Fundamentare teoretică ………………………….. ……………………….. 9
3.1 Echipamente hardware ………………………….. …………………….. 9
3.2 Tehnologii folosite ………………………….. ………………………….. . 11
4. Specificații ………………………….. ………………………….. ……………. 16
4.1 Scurtă descriere a sistemului ………………………….. …………… 16
4.2 Schema bloc a sistemului ………………………….. ………………… 16
4.3 Funcțiile sistemului ………………………….. …………………………. 17
4.3 Interfața cu utilizatorul ………………………….. …………………….. 19
4.5 Structuri de baze de date ………………………….. ………………… 21
5. Proiectarea de detaliu ………………………….. ………………………… 23
5.1 Arhitectura sistemului ………………………….. ……………………… 23

Sistem de detecție și recunoaștere facială

3
5.2 Descrierea componentelor ………………………….. ………………. 24
5.3 Descrierea comunicării între module ………………………….. …. 25
5.4 Principalele structuri de date ………………………….. ……………. 26
6. Realizarea programului ………………………….. ……………………….. 28
6.1 Implementare ………………………….. ………………………….. ……. 28
6.2 Probleme întȃmpinate ………………………….. …………………….. 37
6.3 Rezultate experimentale – comparație CPU – GPU …………. 38
7. Concluzii și direcții de continuare a dezvoltării ……………………. 40
8. Referințe ………………………….. ………………………….. ……………… 42

Sistem de detecție și recunoaștere facială

4
1. Introducere
1.1 Context
Progresele făcute în ultimii ani în domeniul detecției și recunoașterii faciale au fost
considerabile . Astfel, sistemele care folosesc detecția și recunoașterea facială au a juns să fie
folosite într -o gamă largă de domenii, începȃnd de la securitate, investigații criminale și pȃnă la
publicitate.
Sistemul de detecție și recunoaștere facială care urmează a fi dezvoltat va fi folosit în
domeniul publicității. Mai e xact, el constituie o parte importantă din realizarea unui robot, a cărui
scop va fi atragerea de noi potențiali angajați sau clienți. Robotul va fi folosit de o firmă din
domeniul IT, la tȃrguri de joburi sau diferite convenții pentru a atrage un număr cȃ t mai mare de
oameni la standul firmei. Sarcina robotului este de a împărț i pliante oamenilor din apropiere,
evitȃnd pe cȃt posibil înmȃnarea unui pliant de mai multe ori aceleiași persoane.
Detecția faci ală este o caracteristică importantă a multor siste me automate care
interacționează cu omul și constă în procesul de găsire al fețelor umane într -o imagine. După
efectuarea detecției, fețele umane detectate pot fi folosite apoi pentru recunoaștere facia lă.
Recunoașterea facială constă în determinarea sau v erificarea identității unei persoane detectate
anterior într -o imagine.
Sistemul de detecție și recunoaștere facială funcționează în timp real și în momentul în
care detectează o persoană nouă returnează diferite informații despre respectiva persoană
precum poziția acesteia față de cameră. Informațiile returnate de sistem vor fi folosite de robot,
pentru comandarea mișcării în direcția persoanei detectate. De asemenea, datele oferite de
sistemul de detecție și recunoaștere facială vor putea fi vizualizate într-o pagină web, care are
ca scop prezentarea funcționalității sistemului.
Pentru realizarea sistemului folosesc mediul de dezvoltare Nsight Eclipse Edition oferit
de Nvidia si librăriile OpenCv (Open Source Computer Vision), librării dedicate procesări i
imaginilor în timp real. Ca și componenete hardware, folosesc placa de dezvoltare Jetson TK1
și camera web See3CAM_80. Ambele au fost alese, în așa fel încât perfomanța sistemul să nu
fie una scăzută.

Sistem de detecție și recunoaștere facială

5
1.2 Func ționalitate
Sistemul preia imaginile surprin se de camera web și le prelucrează cu sco pul de a
determina mai întȃ i dacă există o persoană în cadru. Apoi, d acă se detectează o persoană, se
încearcă recunoașterea acesteia . Dacă persoana nu este recunoscută, lucru ce înseamnă că
nu a mai fost detectată, atunci se salvează imaginea feței acesteia. De asemenea , sistemul
calculează și poziția persoanei față de cameră, mai exact distanța dintre cameră și persoană și
direcția(unghiul) la care aceasta se afl ă.
Toate datele oferite de sistem sunt afișate într -o aplicație web, pentru a avea o imagine
mai bună a funcționalită ții sistemului. Dacă se dorește folosirea informațiilor și în alte sis teme,
acestea pot fi transmise ș i pe portul serial. În acest caz întregul sistem poate fi considerat un
modu l dintr -un sistem mai complex.

1.3 Aplicabilitate
Datele oferite de sistemul de detecție și recunoaștere facială pot fi folosite în diferite
maniere. De exemplu, pe baza acestui modul se poate construi un sistem de securitate, în care
accesul în diferite zone să fie condiț ionat de recuno așterea persoanelor.
În realitate, modulul de detecție ș i recunoaștere facială prez entat în această lucrare
urmează să fie folosit pentru dezvoltarea unui robot , a cărui sarcină este împărț irea de pliante.
Robotul va fi folosit la târguri de joburi de către o firmă de IT pentru impresi onarea publicului și
atragerea de noi posibili angajați.
Robotul are în componență, pe lângă modulul de detecție si recunoaștere facială:
 Un modul de control al miș carii care primește poziția persoanei detectate
(distanța in centimet rii si unghiul față de cameră) ș i execută practic mișcarea
către persoana detectată ;
 Un modul de proximitate care verifică constant valorile sen zorilor de proximitate
pentru evitarea obst acolelor ;

Sistem de detecție și recunoaștere facială

6
 Un modul de control la distanța a robotului, care per mite printre altele si oprirea
în siguranță a robotului;
 Un modul de poziționare a robotului care asigură re venirea acestuia în poziția
inițială prin folosirea unor transmițătoare de tip beacon ;
 Și cel mai important, modulul de comandă, care este practic creierul ce unește
toate modulele și asigură o comunicare ef icientă între acestea .
Robotul va folosi datele trimise de modulul de detecție pentru a detecta oamenii din
încăpere, a se indrepta în direcția lor și a le oferi un pliant. De asemenea, se încearca pe cât
posibil evitarea oferirii unui pliant ace leiasi persoane. Pentru aceasta, se verifică identitatea
fiecarei persoane cu datele exi stente în baza de date. Dacă în urma procesului de recu noaștere
facială se consideră că persoana detectată este necunoscută, atunci se estimeaza distanța
până la aceasta și unghiul față de camera, urmând ca datele acestea să fie folosite de modulul
de cont rol pentru îndreptarea robotului în direcția persoanei. Pentru controlul mișcării, robotul
folosește un microcontroler Arduino, care interpretează datele transmise pe portul seri al de
către modulul de detecț ie.

Sistem de detecție și recunoaștere facială

7
2. Analiza stadiului actual în domeniul problemei
Pe măsură ce tehnologia avansează, procesările grafice, detecția și recunoașterea
facială devin tot mai performante și calitative. Se încearcă constant optimizarea acestora,
urmărindu -se obținerea de rezultate cât mai exacte într-un timp cât mai scurt. Progresele făcute
în acest domeniu, în ultimii ani au fost semnificative. Acest lucru și faptul că disponibilitatea unei
puteri de procesare este ridicată , a dus la integrarea detecției și recunoașterii faciale î ntr-o
sumedenie de aplicații și sisteme. Modul în care sistemele aplică aceasta caracteristica, poate
să difere în funcție de intrările în sistem. Astfel că prelucrările grafice, detecția și recunoașterea
facială pot fi aplicate pe imagini statice(poze), pe imagini video sau pe captu ri live de la camere
web sau de supraveghere .

Facebook
Una din aplicațiile folosite destul de mult în
prezente si care fol osește detecția facială este
Facebook , o rețea de socializare, care conectează,
în principal, oamenii cu prietenii lor. Facebook
folosește această caracteristic ă pentru etichetarea
oamenilor î n poze. Pozele uploadate sunt
prelucrate, iar fețele detectate în acestea sunt
încadrate într -un pătrat . În funcție de setările de
confidențialitate, Facebook folosește recunoașterea
facială pentru a oferi sugestii utilizatorului legate de
identitatea persoanei detectate in poză. În figura 2.1
este prezentat pasul de etichetare în care fețele detectate sunt încadrate într -un dreptunghi și
pentru unele din acestea se afisează sugestii privind identitatea persoanei detectate.
Dupa cum am mai spus, datele rezultate în urma detecție i și recunoașterii faciale pot fi
folosite în tr-o gama largă de domenii, începand de la securitate, medicină până la divertisment
sau publicitate. Facebook -ul folosește ac eastă caracteristică pentru a face site -ul mai ușor de
utilizat, acțiunea de etichetare a oamenilor în poze devenind mai ușoară și mai rapidă.
Fig. 2.1 Detectarea fețelor în pasul de etichetare

Sistem de detecție și recunoaștere facială

8
NEC NeoFace
NeoFace este un pachet de aplicaț ii, care of eră posibilitatea de a efectua detecție și
recunoaștere facială atât din imagini captura te în timp real de la camere de supraveghere sau
camere web, cât ș i din poze sau imagini video. Produsele oferite de pachetul de recunoaștere
facială NeoFace su nt:
 NeoFace®Reveal – folosit pentru investigații criminale,
 NeoFace® Watch – folosit în sisteme de securitate,
 NeoFace® Smart – un produs sub forma unei aplicaț ii mobile
 NeoFace® Match – un produs destinat pentru integrarea în alte sisteme
Ceea ce diferențiaza acest produs, față de restul produselor de pe p iață, este faptul că
poate lucra chiar și cu imagini de foarte proastă calitate. Este folosit în principal în domeniul
securității și al investigaț iilor criminale.
În figura 2.2 este prezentată o imagine rezultată în urma detecției și recunoașterii faciale
NeoFace. Fețele detectate sunt încadrate și pentru fiecare persoană recunoscută sunt afișate
informații relevante.

Fig. 2.2 Identificarea persoanelor în programul NeoFace [1]

Sistem de detecție și recunoaștere facială

9
3. Fundamentare teoretică
3.1 Echipamente hardware
Jetson tk1
Pentru dezvoltarea aplicației am ales să folosesc placa de dezvoltare NVIDIA Jetson
TK1, prezentată în figura 3.1. Aceasta se pretează perfect pentru crearea de sisteme
încorporate sau mobile de pe rfomață ridicată. Datorită perfomanței pe care o poate oferi, Jetson
Tk1 este folosit în prezent pentru dezvoltarea de soluții în domenii precum autom atică, robotică,
securitate, medicină și altele.

Fig. 3.1 Placa de dezvoltare Jetson TK1
Platforma de dezv oltare Jetson TK1 folosește procesorul Tegra K1 SOC, acesta fiind
primul procesor mobil creat de NVIDIA, care prezintă aceeași putere de procesare ca și o
unitate de sktop de procesare grafică . Procesorul conț ine un Kepler GPU cu 192 de nuclee
CUDA (Compute Unified Device Architecture ), un ARM Cortex -A15 CPU. [2 ] De asemenea
oferă suport pentru codare/decodarea video și pentru procesarea imaginilor sau semnalelor.
Pe lângă procesorul Tegra K1, placa de dezvoltare Jetson TK1 mai conține 2GB memorie
RAM, 16GB memorie eMMC v4.41 (embedded MMC= flash memory + flash memory controller).
[2] De asemenea sunt disponibile urmatoarele porturi si periferice:
 mini-PCIE slot

Sistem de detecție și recunoaștere facială

10

 conector SD/MMC
 Port HDMI 1.4
 USB 2.0, 3.0
 Port pentru comunicații seriale RS232
 Realtek A udio codec, Mic in/Line out
 Gigabit Ethernet
Pe placa de dezvoltare Jetson Tk1 ruleaza Linux For Tegra 21.3 (L4T) , care este de fapt o
versiune modificată de Ubuntu oferită de NVIDIA.

See3CAM
Pentru capturarea imaginilor video, voi folosi camera
See3Cam_80, o camera performantă de 8 Mega Pixeli, cu
autofocus. Camera See3Cam_80 este prezentată în figura
3.2. Camerele din familia See3Cam sunt foarte des folosite
în sistemele din domeniul industrial și medical.
Camera See3Cam_80 este conformă cu UVC (USB
Video Class), adică permite streamingul v ideo prin USB fără
a fi necesară instalarea de driver e speciale pe placa de
dezvoltare.

Camera are re zultate bune cand este conectată prin USB 3.0, mai exact:
 HD (720p) – 30 fps (frames per second)
 Full HD (1080p) – 30 fps
 8MP – 11 fps

Senzorul folosit de cameră este OmniVision OV8825 si are dimensiunea pixelului de 1.4 µm . [3] Fig. 3. 2 Camera See3Cam_80

Sistem de detecție și recunoaștere facială

11
3.2 Tehnologii folosite
NVIDIA® Nsight™ Eclipse Edition
Ca și mediu de dezvoltare am ales să folosesc Nsight Eclipse , un produs oferit de Nvidia
în special pentru editarea, dezvoltarea și depanarea aplicațiilor CUDA. CUDA este un model de
programare inventat de Nvidia care mărește considerabil puterea de calcul prin valorificarea
puterii unității grafice de procesare GPU. [4] Nsight permite dezvoltarea aplicațiilor C/C++ și
optimizarea performanței unității centrale de procesare (CPU) și a unității grafice de procesare
(GPU), fiind perfect pentru dezvoltarea de aplicații în timp real în care perfor manța este o
prioritate.
Un alt motiv pentru care am ales să folosesc mediul de dezvoltare oferit de NVIDIA, este
faptul că permite scrierea codului pe un calculator și sincronizarea acestuia cu un .git repository
de pe placa de dezvoltare Jetson. Mai apo i Nsight compilează codul, creând un executabil
direct pe placa de dezvoltare Jetson.

Limbaje de programare
Pentru dezvoltarea sistemului de detecție și recunoaștere facială folosesc ca limbaj de
programare C ++, un limbaj care suportă programarea procedurală și programarea orientată pe
obiecte. Pentru aplicația web în care sunt prezentate datele oferite de sistem, folosesc pe
partea de server PHP , iar pe partea de client Javascript și desigur HTML și CSS.

OpenC v
La implementarea propriu -zisă a si stemului de detecție si recunoaștere facială folosesc
funcțiile oferite de librăria OpenCv. OpenCv (Open Source Computer Vision) este o librărie
gratis, independentă de platformă și orientată în principal pe procesarea grafică a imaginilor în
timp real.
Funcțiile oferite de OpenCv sunt folosite în diferite domenii precum recunoașterea
gesturilor, recunoașterea facială, detectarea obiectelor, urmărirea mișcării, întelegerea mișcării,

Sistem de detecție și recunoaștere facială

12

interacțiunea om -computer , realitate augmentata unde realul se îmbină cu virtualul și multe
altele. OpenCv a fost scris in C++, însă au fost dezvoltate interfețe și pentru alte limbaje
(Phyton, Java, Matlab, C#, Perl, Ruby).
Foarte important de menționat este faptul că OpenCv oferă algoritmi care se folosesc de
toată puterea oferită de unitatea grafică de procesare (GPU). Multe din funcțiile oferite de
OpenCv care folosesc unitatea centrală de procesare(CPU) au și o funcție co respond entă care
folosește unitatea grafică de procesare GPU și care oferă o performanță mai bună. Aceste
funcții se găsesc în modulul GPU oferit de OpenCv si de obicei au o signatură similară cu
funcțiile care folosesc CPU.
Modulul GPU oferit de OpenCv este un set de clase și funcții care folosesc capabilitățile
computaționale ale unității grafice de procesare. Acesta este implementat folosind CUDA și
poate fi folosit doar pe unități grafice de procesare de la NVIDIA. Modulul GPU este un
instrument ușor de folosit, care nu necesită cunoștiințe de CUDA. Este eficient în
implementarea algoritmilor care folosesc accelerarea GPU.
Pentru detecția fețelor am pornit de la metoda descrisă de Paul Viola si Michael Jones în
lucrarea "Rapid Object Detection using a Boosted Cascade of Simple Features". M etoda are la
bază caracteristici le Haar, acestea fiind caracteristici ale imaginilor digitale relevante în
recunoașterea obiectelor. Pentru determinarea caracteristicilor Haar, se cons ideră regiuni
dreptunghiulare adiacente , albe și negre (figura 3.3 ) într-o anumită zonă a imaginii supuse
detecției, se însumeaza intensitatea pixelilor din fiecare regiune și apoi se face diferența între
aceste sume. [5]
Fig. 3.3 Caracteristici Haar

Sistem de detecție și recunoaștere facială

13
Rezultatul este folosit pentru a categ orisi subsecțiunii ale imaginii, având ca bază
caracteristici bine cunoscute ale obiectului cautat. D e exemplu , la detecția facială se cunoaște
faptul că regiunea care cuprinde ochii este mai închisă decât regiunea frunții sau că între cei doi
ochi(r egiuni mai î nchise ) este o regiune mai deschisă la culoare și anume partea superioară a
nasului.
Pentru a îmbunătății procesul de detecție, a fost introdus conceptul de Cascade of
Classifiers, care în loc să aplice toate cele 6000 de caracteristici Haar d isponibile pe imagine, le
împarte în grupuri și le aplică in etape. [5] Dacă imaginea nu trece de prima etapă, nu se trece la
următoarele. O imagine care trece prin toate etapele, se consideră a fi o imagine care contine o
trăsatura căutată . Un clasificator este practic un fișier xml care conține toate etapele și
caracteristicile corespunzătoare, dar și o valoare (threshold) în funcție de care se trece la etapa
următoare. Fișierul se poate crea manual, însă pentru aceasta este nevoie de o număr mare de
imag ini pozitive (care conțin o față) și negative (care nu conțin fețe umane). O altă opțiune este
folosirea unui clasificator oferit de OpenCv, care asigură o acuratețe dar și o performanță
ridicată. OpenCv ofera clasificatori pentru detecția feței atât din f rontal cât și din lateral, detecția
ochilor, detecția zâmbetului si detecția corpului uman.
În ceea ce privește detecția facială, OpenCv ofera următorii clasificatori:
 haarcascade_frontalface_alt.xml,
 haarcascade_frontalface_alt2.xml,
 haarcascade_frontalface_alt_tree.xml,
 haarcascade_frontalface_default.xml.
Diferențele între acești clasificatori constă în acuratețe dar și în timpul necesar efectuării
detecției.
OpenCv oferă un start și pentru recunoașterea facială. Algoritmii disponi bili in prezent
sunt:
 EigenFaces
 FisherFaces
 Local Binary Pattern

Sistem de detecție și recunoaștere facială

14

Algoritmii constă în extragerea trăsaturilor relevante dintr -o imagine și transformarea
acestora într -o formă, pe care mai apoi o putem folosi pentru categorisirea imaginii și asocierea
acesteia cu un nume.
EigenFaces si FisherFaces sunt algoritmi ce abordeaza recunoașterea facială într -o
maniera holistică. Ambii trateaza informa ția (setul de imagini pentru o persoană) ca un vector
într-un spațiu multidimensional. Algoritmul EigenFaces are la baza PCA (Principal component
analysis) care este o procedura care folosește transformarea ortogonală pentru a transforma o
serie de variabile corelate într -un set de variabile nec orelate numite componente principale. [6]
EigenFaces are rezultate cu atât mai bune cu cât numărul imaginile de intrare este mai mare.
Acuratețea recunoașterii în cazul algoritmului EigenFaces ține de numărul pozelor și mai ales
de gradul acestora de lumino zitate. FisherFaces este un algoritm care rezolvă unele din
neajusurile a lgoritmului EigenFaces. Totuși și acesta prezintă un dezavantaj în ceea ce privește
luminozitatea imaginilor. Șansele ca o imagine bine iluminata să fie identificată într -un set de
imagini prost iluminate sau invers , o imagine prost iluminata într -un set de imagini bine
iluminate, sunt destul de mici.
Se poate observa în figura 3.4 că rezultatele algoritmilor Eigenfaces si Fisherfaces
depind foarte mult de numărul de imagini pentru o persoană.

Fig. 3.4 Comparatie între alogritmul EigenF aces si algorimul FisherFaces [6]

Sistem de detecție și recunoaștere facială

15
Algoritmul Local Binary Patterns Histograms (LBPH) își are bazele în analiza 2D a
imaginilor și se concentrează pe extragerea trăsă turilor locale din imagine. Principiul după care
funcționează algoritmul este rezumarea structurii locale dintr -o imagine prin compararea
fiecarui pixel cu pixelii învecinați. [6] Se ia un pixel ca centru și apoi se verifică intensitatea
fiecarui pixel din jurul acestuia. Dacă intensitatea pixelului din centru este mai mare decȃt a
pixelului vecin atunci acesta va fi marcat cu 1. În caz contrar, va fi notat cu 0. Fiecare pixel are 8
pixeli vecini, astfel rezultă un numarul în binar pentru fiecare pixel, ace sta reprezentȃnd codul
LBP (codul ș ablonului binar local). Un exemplu este prezentat în figura 3. 5.

Fig. 3.5 Maparea intesității pixelilor vecini [6]
Dacă se folosește un număr fix de vecini, atunci algoritmul va eșua să codifice detalile
care diferă ca dimensiune. Pentru a împiedica acest lucru se folosește un număr variabil de
vecini pe o rază variabila. Atȃt numărul de vecini, cȃt și dimensiunea raze i pot fi personalizate
din cod. Următorul pas este divizarea imaginii în mai mult regiuni, extrag erea unei histograme
pentru fiecare din acestea și apoi concatenarea histogramelor rezultate obținȃndu -se un vector
de caracteristici. [6]
Algoritmul LBPH are r ezultate considerabil mai bune față de algoritmii EigenFaces și
FisherFaces în situațiile în care dispunem de un număr mic de imagini per persoana și
dimensiunea acestora diferă.
Mjpeg-streame r
Mjpeg -streamer este o aplicație în linie de comandă pe care o folosesc pentru a putea
vizualiza cadrele rezultate în urma prelucrăriilor î ntr-o pagină web. Aceasta primeș te ca
parametru de intrare un fișier de tipul .mjpeg și trimite informațiile conținute de acesta printr -o
sesiune HTTP. Este destin în special sistemelor încorporate care au mai puține resurse în ceea
ce priveste memoria RAM și puterea CPU -ului, oferind un streaming rapid și performant.

Sistem de detecție și recunoaștere facială

16

4. Specificați i
4.1 Scurtă descriere a sistemului
Sistemul trebuie să captureze și să anal izeze imagini din mediul inconjurător pentru a
determina existența unei persoane în apropiere. Se încearcă identificarea persoanei de tectate.
Dacă persoana este considerată necunoscută atunci se determină poziția acesteia. Se
calculează unghiul și distanța la care persoana se află față de cameră și î n cazul în care
persoana este identificată atunci se va afișa numele acesteia .
Imaginile capturate de cameră vor putea fi vizualizate local într -o aplicație web. De
asemenea, apl icația web va afișa informații despre persoanele detectate, precum numele și o
scurtă descriere și va oferi posibilitatea de editare a acestora. Va fi disponibil și un istoric care
să precizeze momentul în care a fost detectată o persoană necunoscută și detalii despre poziția
acesteia fața pe cameră în acel moment.
În momentul în care o persoana necunoscută apare în cadru, distanța și unghiul la care
se află persoana față de cameră se trimit și pe portul serial. Trimiterea informațiilor și pe portul
serial face ca sistemul să poată fi folosit sub forma unui modul într -un sistem mai complex. În
ceea ce privește robotul care va folosi sistemul de detecție și recunoaștere facială, datele legate
de poziția persoanei necunoscute vor fi folosite de modulul de co ntrol al mișcării pentru a
deplasa robotul în direcția persoanei .
4.2 Schema bloc a sistemului
În figura 4.1 este prezentată schema bloc a sistemului.

Fig. 4.1 Schema bloc a sistemului

Sistem de detecție și recunoaștere facială

17

Imaginile captate de cameră sunt preluate modulul de detecție și recunoaștere facială.
Acesta procesează imaginile, salveză rezultatele în baza de date și le trimite pe portul serial
pentru a putea fi folosite de alte sisteme. Aplicația web afișează atȃt i maginile rezultate în urma
procesului de detecție și recunoaștere cȃt și informații relevante din baza de date.
În figura 4.2 este prezentat mai amănunțit procesul de detecție și recunoaștere facială.
Mai întȃi se captează o imagine de la camera web. Aceas ta este supusă a poi procesului de
detecție. Dacă rezultatul procesului de detecție este unul negativ, adică nicio persoană nu a fost
detectată atunci imaginea este transmisă aplicației web și pe portul serial se trimite un mesaj
corespunzător. Dacă rezulta tul este pozitiv, adică s -a detectat cel puțin o persoană, se trece la
recunoașterea acesteia, prin compararea cu un set de imagini existent. În urma procesului de
recunoaștere, se salvează rezultatele în baza de date, se trimite imaginea către aplicația w eb și
în situația în care persoana este neidentificată, se trimite poziția acesteia pe portul serial către
alte sisteme.

Fig. 4.2 Schema detaliata a sistemului
4.3 Funcțiile sistemului
Principalele funcții pe care sistemul trebuie să le îndeplinească sunt următoarele:
 Captarea imaginilor de la camera web
 Detecția de persoane
 Recunoașterea facială

Sistem de detecție și recunoaștere facială

18
 Determinarea poziției unei persoane
 Salvarea persoanelor noi
 Vizualizarea și editarea informațiilor existente într -o pagină web
 Streaming web
 Transmiterea de date pe portul serial
Captarea imaginilor de la camera web – Sistemul trebuie să capteze în timp real imaginile
transmise de camera web. În cazul în care camera web nu mai transmite imagini sau este
deconectată, sistemul se va opri.
Detecția de persoane – Una din funcțiile de bază ale sistemului este detecția de persoane
în timp real. După captarea unei imagini de la camera web, sistemul trebuie să detecteze
prezența unor persoane la o distanța de maxim 2 metri de cameră.
Recunoașterea facial ă – în situația în care s -au detectat persoane în apropiere, se alege
persoana care se află la distanța cea mai mică și se încearcă recunoașterea ei, prin
compararea cu un set existente de imagini.
Determinarea poziției unei person e – Dacă persoana detect ată anterior nu este
identificată, atunci sistemul va calcula distanța pȃnă la această în centimetrii și unghiul la care
se află față de cameră.
Salvarea persoanelor noi – Toate persoanele neidentificate, vor fi salvate atȃt local cȃt și
în baza de date cu un nume generic și învățate, astfel încȃt în viitor să fie cunoscut faptul că au
fost detectate la un moment dat de sistem.
Vizualizarea și editarea informațiilor existente într -o pagină web – Datele oferite de
sistem trebuie să fie vizibile într -o pagină web. Pentru o persoană considerată nouă se vor afișa
date privind poziția ei.
Streaming web – Imaginile rezultate în urma prelucrărilor și proceselor de detecție și
recunoaștere vor putea fi vizionate în timp real în pagina web menționată anterior.
Trans miterea de date pe portul serial – Dacă nu se detectează nicio persoană, atunci se
va trimite pe portul serial un mesaj corespunzător. De asemenea, se va trimite poziția,

Sistem de detecție și recunoaștere facială

19
însemnȃnd unghiul și distanta la care se află o persoană, atunci cȃnd sistemul detect ează o
persoană necunoscută în apropiere. Această funcție este necesa ră pentru integrarea sistemului
de detecție și recunoaștere facială într -un sistem mai complex. După cum am mai spus,
sistemul urmează să fie integrat într -un robot a cărui sarcină este împărțirea de pliante. Robotul
va folosi datele transmise pe portul serial pentru a -și planifica următoarea mișcare. Acesta se va
deplasa în dir ecția persoanei detectate sau îș i va schimba orientarea în cazul în care nu este
detectată nicio persoană în cȃm pul vizual.
4.3 Interfața cu utilizatorul
Aplicația web este folosită pentru a prezenta funcționalitatea modulului de detecț ie și
recunoa ștere. Prin intermediul acesteia, utilizatorul poate viziona în timp real at ȃt imaginile
captate de camera web c ȃt și rezultatele ob ținute de s istem.
Aplica ția web are 3 pagini : Live, Istoric si Demo.
Pagina de start, pagina Live (figura 4.3), este împărțită în două secț iuni, o sec țiune în
care se face transmisia imaginilor, și o sec țiune în care sunt prezentate d atele existente in baza
de date.

4.3 Prima pagină a aplicației web

Sistem de detecție și recunoaștere facială

20
În sec țiunea aferent ă streaming -ului video, imaginile sunt prezentate în urma
prelucr ărilor efectuate de s istem, astfel fe țele persoanelor detectate apar încadrate într-un
dreptunghi și pentru fețele recunoscute se afi șează deasupra dreptunghiului numele aferent din
baza de date.
În sec țiunea din partea dreapt ă, sunt prezentate datele existente în baza de date
precum numele si descrierea persoanei și o list ă cu persoanele ‘ învățate’ din baza de date. În
partea de sus se afi șează imaginea ultimei persoane necunoscute detectate precum ș i pozi ția
acesteia. Aceasta por țiune se actualizeaz ă periodic în func ție de evenimentele ap ărute în baza
de date. La selectarea unei poze din lista de persoane cuno scute, în partea de detalii (poza,
nume , prenume) vor aparea datele aferente persoanei selectate. Acestea pot fi editate si
salvate.
În pagina istoric (figura 4.4) e ste prezentat ă o listă cu momentele în care a fost detectat ă
o persoan ă necunoscut ă, fiind precizate și numele generic asociat persoanei, pozi ția acesteia
(distanta si unghi) și calea c ătre poza asociata persoanei. În cazul integr ării modului de detec ție
în sistemul cu robot care împarte pliante, firma poate folosi informa țiile din aceas ta sec țiune
pentru a urm ări evolu ția și compor tamentul robotului.

Fig. 4.4 Pagina Istoric

Sistem de detecție și recunoaștere facială

21
Pagina demo va conține un clip video cu o scurtă demonstrație a funcționalității oferite
de si stem.
4.5 Structuri de baze de date
Pentru gestionarea datelor, se folosește o baza de date creată î n MySql, care conține 3
tabele: Persons, Pictures și Events.
În figura 4.5 este descrisă structura bazei de date .

4.5 Structura bazei de date

Tabela Persons este folosită pentru stocarea informațiilor despre persoane precum
numele si o scurta descriere.
Cȃmpuri:
 Person_id – id-ul persoanei

Sistem de detecție și recunoaștere facială

22
 Person_name – numele persoane
 Person_description – o scurtă descriere a persoanei
În tabela Pictures se salvează calea pe ntru fiecare poză salvată de sistem și id -ul
persoanei căreia îi apartine.
Cȃmpuri:
 Picture_id – id-ul pozei
 Picture_path – locația pozei
 Picture_person_id – id-ul persoanei din poza

Tabela Events este folosită pentru salvarea evenimentelor precum detecta rea și
salvarea unei persoane necunoscute.
Cȃmpuri:
 Event_id – id-ul evenimentului
 Event_person_id –id-ul persoanei asociate cu evenimentul
 Event_ datetime – timpul la care a avut loc evenimentul
 Event_distance – distanța la care se afla persoana față de ca meră
 Event_angle – unghiul la care se afla persoana față de cameră

Sistem de detecție și recunoaștere facială

23
5. Proiectarea de detaliu
5.1 Arhitectura sistemului
În ansamblu sistemul poate fi descris de figura 5.1 :

Fig. 5 .1 Arhitectura sistemului
Sistemul de detecție și recunoaștere facială prelucrează și analizează imaginile captate
de camera Web. Rezultatele obținute sunt vizibile într -o aplicație web, prin care utilizatorul
interacționează cu sistemul.

Sistem de detecție și recunoaștere facială

24
Structura internă a sistemului poate fi descrisă prin figura 5. 2.

Fig. 5. 2 Structura s istemului

5.2 Descrierea componentelor
Sistemul are la bază trei componente:
 aplicația dezvoltată în c++ care cuprinde modulul de streaming, managerul de
mesaje, procesatorul de cadre, modulul de analiza al imaginii, managerul de
comunicare seriala si managerul conexiunii cu baza de date
 aplicatia web dezolvată în Php, Javascript, Html, Css
 baza de date – MySql – accesibila atȃt aplicației web cȃt și aplicației c++.

Sistem de detecție și recunoaștere facială

25
Aplicația web are rolul de a prezenta imaginile și rezultatele obținute de sistem în timp
real precum și datele existente în baza de date.
Aplicația dezvoltată în c++ constituie nucleul sistemului și are ca scop principal
procesarea grafică a imaginilor, detecția și recunoașterea facială și transmiterea rezultatelor
obținute către celelalt e componente.
Modulul de streaming – se ocupă cu captarea imaginilor de la camera web, transmiterea
către managerul de mesaje, efectuarea modificărilor necesare asupra imaginilor (în cazul
detecției se desenează un dreptunghi care încadrează fața detectată ) și mai apoi transmiterea
lor către serverul web.
Modulul pentru procesarea cadrelor – asteaptă primirea unei imagini de la managerul de
mesaje pentru procesare după care apelează modulul pentru analiza imaginilor în fundal. De
asemenea, trimite rezultate le analizei imaginilor către managerul de mesaje.
Modulul de analiză al imaginilor se ocupă cu procesarea grafică a imaginilor, detectarea
și recunoașterea facilă. Rezultatele sunt salvate trimise modului care manageriază conexiunea
cu baza de date, modulu i de comunicare serială și modu lui pentru procesarea cadrelor.
Modulele “Manager comunicare serială”, “Manager BD” și modulul “Manager de mesaje”
facilitează comunicarea între componentele sistemului și vor fi descrise în subcapitolul următor.

5.3 Descrierea comunicării între module
Modulul de streaming comunică cu modulul pentru procesarea cadrelor printr -un
manager de mesaje. maiAcesta este realizat dupa modelul de comunicare bazat pe cozi de
mesaje și are ca scop evitarea supraîncărcării procesatorului de c adre prin trimiterea continuă
de cadre. Astfel că, procesatorul de cadre nu primește un cadru nou decȃt după ce l -a terminat
de procesat pe cel din urmă. Un alt scop al managerului de mesaje, este captarea rezultatelor
obținute în urma procesării și trimit erea către modu lul de streaming pentru a fi afișate.
Managerul de comunicare serială este un modul ce face posibilă transmiterea datelor și
pe portul serial, astfel încȃt acestea să poa tă fi folosite de un alt sistem.

Sistem de detecție și recunoaștere facială

26

Modulul “Manager BD” facilitează comu nicarea între modulul de analiză al imaginii cu
baza de date. Acesta realizează conexiunea cu baza de date și se ocupă cu inserarea și
extragerea datelor relevante.
5.4 Principalele structuri de date
Pentru fiecare modul al programului C++ se va defini o c lasă care să înglobeze
caracteristicile și f uncționalitatea acestuia.
În figura 5. 3 este prezentată diagrama de clase pentru cele mai importante module alea
programului și anume modulul Streaming (Stream) , modulul procesator de cadre
(FrameProcessor) și managerul de mesaje (MsgManager) . Modulele de streaming si procesare
de cadre sunt independente și nu stiu unul de celalalt. Ele comunică doar prin clasa statică
MsgManager, care conține și cozile facesInfoQueue și framesQueue. Prin coada framesQueue,
modu lul de streaming trimite cȃte un cadru modulul de procesare, însă doar dacă acesta din
urmă a finalizat procesarea cadrului anterior și coada este goală. Prin coada facesInfoQueue,
modulul de procesare, trimite către modulul de streaming detaliile obținute , precum poziția unei
fețe detectate și numele persoanei (în cazul în care persoana este recunoscută). Modulul de
streaming trebuie să afișeze corespunzător datele primite de la modulul de procesare prin
coada faceInfoQueue.

Fig. 5.3 Diagrama de clase pentru modulul de streaming, procesare de cadre și manager de mesaje
Motivul pentru care este necesară separarea celor doua module, este încercarea
obținerii unei viteze de streaming (cadre pe secundă/fps) cȃt mai mare. Astfel modulul de

Sistem de detecție și recunoaștere facială

27

streaming rulează independent și afișeaz ă cadrele primite de la cameră și, dacă este necesar
(adică coada facesInfoQueue nu este goală) execută modificări pe acestea. Modulul de
procesare de cadre pornește procesul de detecție și recunoaștere în fundal și cȃnd acesta este
finalizat trimite rezultatele prin managerul de mesaje (coada faceInfoQueue) modulului de
streaming pentru a fi afișate.
Deoarece procesul de detecție și recunoaș tere nu este instantan eu, dacă cele două
modu le nu ar fi independente, atunc i modulul de streaming ar trebui sa aștepte mereu după
modulul de detecție, rezultatul fiind un streaming sacadat.
După cum se observă în figura 5.4 modulul de procesare de cadre este legat de modulul
de analiză al imaginii reprezentat prin clasele Image A nalyzer și Recognizer.

Fig. 5.4 Diagrama de clase

Sistem de detecție și recunoaștere facială

28
6. Realizarea programului
6.1 Implementare
Modulul de streaming
Funcțiile asociate modulului de streaming sunt implementate în clasa Stream. Cele mai
importante metode ale clasei Stream sunt Start(), Render(), S endFrame() și StreamFrame ().
Metoda Start() are rolul de a capta imaginile de la camera web si de a le trimite mai
departe funcțiilor care se ocupă de prelucrarea și transmiterea acestora către serverul web. Tot
aici se calculeaz ă numărul de cadre transmise pe secundă (fps), mai exact viteza cu care se
face streaming. Metoda funcționează după următorul principiu: se face legătura cu camera web,
apoi se extrag pe rȃnd cadrele captate de cameră, într-o buclă while atȃta timp cȃt cadrele nu
sunt goale. Dacă cadrele extrase sunt goale, cel mai probabil camera web nu este conectată si
programul îsi incheie execuț ia. Dacă cadrul curent nu este g ol, atunci se apelează funcțiile
sendFrame(), render() și stream(), exact în această ordin e. Un cadru este memorat într -o
variabilă de tipul Mat, o clasă de bază oferită de librăria OpenCV folosită pentru stocarea de
vectori, matrici, imagini, histograme și altele.
Metoda S endFrame() trimite cadr ul curent managerului de mesaje, apelȃnd metoda
tryPushFrame a managerului de mesaje.
Metoda R ender() primește ca paramentru un cadru și are sarcina de a pregăti cadrul
pentru pasul următor. Pentru aceasta mai întȃi se redimensioneaza c adrul la dimensiunea de
640×480. Apoi se verifică conținutul cozii de mesaje facesInfoQueue din managerul de mesaje
care conține rezultatele procesului de detecție și recunoaștere , mai exact dreptunghiul care
încadrează fața care a fost detectată și numele persoanei recunoscute, în cazul în care
recunoașterea a returnat u n rezultat pozitiv . Dacă aceasta coadă nu este goală, adică există
rezultate ce trebuie afișate, atunci se extrag informațiile din coadă, si se fac modificările
necesare asupra cadrului. Astfel, în funcție de informaț ile existente în coadă, se va desena un
dreptunghi albastru care încadrează fața ș i deasup ra acestuia se va scrie numele asociat
persoanei detectate și recunoscute.

Sistem de detecție și recunoaștere facială

29
Metoda S tream Frame () este o funcție vitală în ceea ce privește comunicarea aplicației
dezvoltate în c++ cu aplicația web. Aceasta primește ca parametru un obiect de tip Mat
reprezentȃnd cadrul captat de cameră si procesat de funcția render și îl scrie într -un fișier de
tipul MJPG. Cadrele scrise în fișierul MJPG sunt folosite de programul MJPEG -STREAMER, un
program care extrage cadr ele din fișierul MJPG primit ca parametru și le trimite serverului web
local pe portul 8080.

Managerul de mesaje
Managerul de mesaje este implementat folosind cozi de mesaje. Una din cozi,
facesInfoQueue, este folosită pentru comunicarea unidirecțională între procesatorul de cadre si
modulul de streaming. Are elementele de tipul facesInfo, o structură formată dintr -un obiect de
tipul Rect , un obiect de tipul string și stochează rezultatele obținute în urma procesării cadrelor.
Coada framesQueue este folo sită pentru comunicarea unidirecțională între modulul de
streaming și procesatorul de mesaje.
Managerul de mesaje mai conține și metoda TryPushFrame() c are are ca scop
gestionarea cadrelor trimise de modulul de streaming. Această metodă verifică mai întȃ i dacă
coada de cadre, framesQueue, este goală. Dacă coada nu conține niciun element înseamnă că
toate cadrele trimise au fost procesate deci se poate trimite un nou cadru procesatorului. În
acest caz, se face o copie a cadrului primit care se inserează în coadă și se apelează funcția
pthread_cond_signal( canProcess ), o funcție care deblocheaz ă threadurile care sunt blocat e la
variabila canProcess . Astfel, prin apelarea funcției pthread_cond_signal se deblochează
threadul din modulul de procesare de cadre care se ocupă în fundal cu procesarea efectivă a
imaginilor. Practic, se semnalează faptul că un nou cadru a fost introdus în coadă și că threadul
poate să înceapă procesarea propriu -zisă.

Modulul de procesare de cadre
Funcționalitatea oferită de modulu l de procesare de cadre este implementată în clasa
FrameProcessor. Sarcina acestui modul este de a gestiona procesul de analiză al imaginii.

Sistem de detecție și recunoaștere facială

30
Pentru aceasta în constructorul clasei se inițializează un obiect de tipul ImgAnalyzer(clasa care
implementează mod ulul de analiză al imaginii) și se creează un thread care va rula în fundal
funcția de analiză a imaginii atunci cȃnd este posibil.
Funcția asociată threadului conține o buclă infinită, în care threadul se blochează în
așteptarea validării condiției canPr ocess. În momentul în care prin condiția canProcess se
semnalează că un nou frame este disponibil pentru procesare, funcția trece la următorul pas și
anume verificarea conținutului cozii de cadre. Dacă coada nu este goală, se extrage primul
element și se efectuează detecția pe acesta. Se verifică rezultatul detecției și dacă este valid
atunci se pune în coada facesInfoQueue, coada din managerul de mesaje din care modulul de
streaming extrage rezultatele pentru a fi afișate.
lock mutex

while framesQueue is empty
wait canProcess
if framesQueue is not empty
cpuFrame = framesQueue.front
info = i mgAnalyzer ->detectGPU cpuF rame
if info is valid
facesInfoQueue push info
framesQueue pop

unlock( mutex);

Modulul de analiză al imaginii
Funcțiile modulului de analiză sunt implementate prin clasele ImageAnalyzer,
Recognizer și ImageProcessor. Clasa ImageProcessor conține funcții de prelucrare a imaginii în
urma cărora rezultă o imaginea pregătită pentru a fi supusă proceselor de detecție ș i
recunoaștere. Clasa Recognizer se ocupă cu încarcarea algoritmului de recunoaștere facială cu
fețele existente în setul de bază inițial, învațarea fețelor noi și execuția recunoașterii propriu –
zise.
Pentru detecție persoanelor folosesc clasificatorul H aar, pentru fețe capturate din față ,
numit haarcascade_frontalface_alt și reprezentat prin fișierul haarcascade_frontalface_alt.xml.
Am ales acest clasificator dintre cei 4 oferiți de OpenCV ( haarcascade_frontalface_alt,

Sistem de detecție și recunoaștere facială

31
haarcascade_frontalface_alt2, haar cascade_frontalface_alt_tree și clasificatorul implicit
haarcascade_frontalface_default) deoarece am considerat că raportul dintre viteza de detecție
și acuratețea pe care o oferă este mai potrivit pentru cazul curent. Ceilalți clasificatori ofereau
fie re zultate mai precise, dar un timp prea mare pentru detecție, fie o viteză mai bună de
detecție însă și un număr mare de rezultate eronate. Fișierul xml asociat clasificatorului Haar se
încarcă în constructorul clasei ImageAnalyzer. Tot aici se inițializează si număratoarele ce vor fi
folosite de metodele clasei.
Cele mai importante cȃmpuri ale clasei ImageAnalyzer sunt:
 faceCascade – un obiect de tipul gpu::CascadeClassifier_GPU , o clasă de clasificator
secvențial folosită pentru detecția de obiecte. În acesta se încarcă clasificatorul Haar, stocat în
unitatea grafică de procesare GPU și nu în unitatea centrală de procesare CPU
 unknownCounter – o variabilă privată care se incrementează de fiecare dată cȃnd o
persoană este considerată necunoscută și se res etează cȃnd o persoană este identificată. Are
rolul de a elimina o parte din rezultatele eronate, astfel o persoană se va considera
nouă(neidentificată) doar dacă va fi considerată necunoscută de mai multe ori consecutiv.
 picturesTaken – o variabilă privat ă care se incremenetează pentru fiecare poză facută
unei persoane noi. Este folosită doar dacă persoana este considerată necunoscută și are rolul
de a limita numărul de poze făcute pentru învațarea persoanei.
Cele mai importante metode ale clasei ImageAna lyzer sunt metodele de determinare a
poziției persoanei detectate, getDistance() și getAngle(), și metoda care efectuează analiza
asupra imaginii cu ajutorul unității grafice de procesare, numită detectGPU().
Metoda detectGpu() este funcția apelată de thr eadul din modulul de procesare de cadre
care rulează în fundal. Aceasta primește ca parametru un cadru care este un obiect de tipul Mat
și returnează un obiect de tipul faceInfo , o structură ce conține datele obținute în urma analizei
imaginii.
Modul de funcționare al metodei detectGpu():
Mai întȃi s e transformă parametrul primit de tipul Mat într -un obiect de tipul
gpu::GpuMat, alocȃndu -i-se astfel memorie în unitatea grafică de procesare.

Sistem de detecție și recunoaștere facială

32
Apoi s e efectuează detecția folosind metoda detectMultiScale a ob iectului faceCascade .
detectMultiScale este o metodă care folosește caracteristicile Haar încărcate în obiectul
faceCascade pentru determina existența unor persoane în imaginea primită ca parametru.
Practic se aplică secvențial caracteristicile Haar și la fiecare etapă se decide dacă imaginea
poate trece la următoarea etapă sau nu. Astfel, o imagine care trece și de ultima etapă, se
consideră o imagine care conține o faț a umană . Metoda primește ca parametrii imaginea sub
forma unui obiect de tipul GpuMat, alocat în GPU, un buffer de obiecte tot de tipul GpuMat în
care se vor memora fețele detectate, factorul de scalare(cȃt de mult se reduce imaginea la
fiecare scalare), numărul minin de vecini (parametru care afectează calitatea fețelor detectate, o
valoare mai mare rezultă în mai puține fețe dectate însă cu o calitate mai mare) și dimensiunea
minimă a feței care poate fi detectată(fețele cu o dimensiune mai mică vor fi ignorate). Funcția
returnează numărul de persoane detectate. Bufferul de obiecte în care m etoda detectMultiScale
a memorat fețele detectate se descarcă într-un vector de dreptunghiuri (obiecte de tipul Rect).
Dacă nu s -a detectat nicio fața, metoda îsi incheie execuția, fiind apelată pentru
următorul cadru.
Dacă numărul de fețe detectate este mai mare ca 0, atunci metoda are două posibilităti
de continuare în funcție de parametru unknownCounter, fie va învăța fața curentă fie va trece
mai departe la încercarea de identificare a persoanei detectate.
Dacă se detectează consecutiv fețe care se co nsideră a fi necunoscute, variabila
unknownCounter se incrementează și cȃnd aceasta ajunge la o limită stabilita anterior
(MAX_UNKNOWN) se consideră ca persoana detectată este într -adevar o persoană nouă. În
acest caz, atȃta timp cȃt variabila unknownCount er este la limită, se va apela metoda train() din
clasa Recognizer care va învața fața detectată. După ce fața a fost învațată, numărătorul
unknownCounter se resetează.
În cazul în care metoda nu trebuie să învețe fața detectată (unknownCounter == 0), se
verifică setul de imagini disponibil pentru executarea recunoașterii faciale. Dacă setul inițial de
imagini este gol, atunci este clar că persoana detectată nu are un corespondent în bază de
date. Aceasta este considerată necunoscută, așa că se va învăța imaginea asociată persoanei
detectate, se va seta unknownCounter la valoarea maxima, pentru ca la următorul apel al
funcției să aibă din nou loc învățarea imaginii detectate . Pentru fiecare persoană se învață(se

Sistem de detecție și recunoaștere facială

33
asociază) mai multe imagini pentru ca rezulta te recunoașterii sa fie mai exacte. Cu cȃt unei
persoane i se asociază un număr cȃt mai mare de imagini, în diferite ipostaze sau condiții (de
exemplu: luminozitate) cu atȃt crește probabilitatea identificării persoanei. În cazul în care setul
de imagini i nițial nu este gol, se apelează metoda recognize() al clasei Recognizer, care va
returna id -ul din baza de date a persoanei recunoscute sau în cazul în care persoana nu este
identificată, va returna -1. În situația în care persoana este neidentificată se i ncrementeaza
counterul unknownCounter, și cȃnd ajunge la valoarea limită (MAX_UNKNOWN) se va învața
fața detectată și se salvează imaginea în baza de date , se adaugă persoana nouă în baza de
date și de asemenea se va calcula pentru aceasta poziția la care se află (unghiul și distanța).
Variabila unknownCounter rămȃne setată la valoare MAX_UNKNOWN pentru ca la următoarele
5 apeluri ale funcției să aibă din nou loc asocierea feței detectate cu persoana nou învăț ate.
Astfel crește numărul de imagini asociate unei persoane.
În situația în care persoana este identificată, se extrage din baz a de date numele
acesteia și alături de dreptunghi asociat unei fețe i detectate se memorează într-o structură de
tipul faceInfo . Această structură urmează să fie returnată în final de metoda detectGpu() și
transmisă prin coada de mesaje facesInfoQueue modulului de streaming, care va afisă
informațiile conținute de structura pe cadrul curent.

Determinarea pozitiei
Pentru fiecare persoană nou detectată se calcu lează poziția aproximativă față de
cameră însemnȃnd distanța de la obiectiv la fața persoanei și unghiul la care persoana se află
față de obiectivul camerei.
Pentru aproximarea distanței , am considerat că majoritatea fețelor umane pot fi
încadrate într -un pătrat de latura de 15 cm. Fețele persoanelor detectate sunt încadrate într -un
dreptunghi a cărui dimensiune variază în funcție de cȃt de aproape sunt persoanele de cameră.
Cu cȃt o persoană este mai aproape de cameră, cu atȃt dimensiunea dreptunghiului c are îi
încadrează faț a este mai mare. Determinȃnd faptul că la 100 de cm (D), o față este încadrată
într-un dreptunghi cu o lățime de 80 de pixeli (P) și considerȃnd dimensiunea reală a unei fețe

Sistem de detecție și recunoaștere facială

34
ca fiind în general 15 cm (L), putem să determinăm distanța focală perceput ă, mai exact cȃt
înseamnă 15 cm reali în pixeli, după formula:
F = P * D / L
Determinȃnd distanța focală percepută ca fiind de 533.3 pixeli și considerȃnd că fața
unei persoane are în general o dimensiune de 15 cm, distanța dintre obiectiv și persoană se
poate calcula după formula:
D = 15 * 533.3 / L
unde L este lațimea în pixeli a dreptunghiului care încadrează fața detectată .
Determinarea unghiului la care se află persoana față de cameră este importantă pentru
sistemul robotului care va împarți pliante. În funcție de rezultatul ac estei metode, robotul va
comandă o mișcare de rotaț ie cu x grade spre dreapta sau spre stȃnga în funcție de semnul
variabilei x , unde x este rezultatul metodei de calcul al directiei getAngle() . Astfel un rezu ltatul
de forma -24.5, va fi interpretat de robot ca o miș care de rotație la stȃnga cu 24.5 grade. Dacă
rezultatul este unul pozitiv, mișcarea robotul ui se va face spre dreapta. După mișcarea de
rotație, robotul folosește distanța calculată pentru a se dep lasa în direcția persoanei.
Pentru calc ularea
unghiului la care se află
persoana față de cameră ,
calculez unghiul dintre axa
centrală (mijlocu lui cadrului)
și dreapta ce unește
origine a (punctul O în figura
6.1) ș i mijloc cadranului
care încadrează fața
(punctul M î n figura 6.1),
folosind formula de calcu l al
tangentei : tg c = a / b .
Fig. 6.1 Calculul unghiului

Sistem de detecție și recunoaștere facială

35
Clasa Recognizer înglobeaz ă funcțiile și caracteristicile asociate recunoașterii faciale.
Un obie ct de tipul Recognizer este iniț ializat în con structorul clasei ImageAnalyzer și este folosit
mai apoi pentru apelarea metodelor de recunoaștere (recognize()) , încărcare a algoritmului
(loadRecognizer()) și de învațare a noilor persoane (trainFace()) .
Metoda loadRecognizer încarcă imaginil e găsite în directorul în care sunt stocate
seturile de imagini cunoscute și extrage din denumirea imaginii id -ul persoanei căreia îi este
asociată. Prin funcția createLBPHFaceRecognizer se cre eaza un model al algoritmului LBPH ,
un obiect de tipul FaceReco gnizer . FaceRecognizer este o clasă specială pentru recunoașterea
facială oferită de OpenCv. Dacă au fost încarcate imagini, atunci modelul învață aceste imagini,
adică asociază fiecare imagine cu id -ul corespunzător.
Prin metoda trainFace () se actualizeaz ă modelul de recunoaștere, adaugȃndu -se noi
poze. Pentru aceasta, metoda primește ca parametrii cadrul în care se află fața detectată,
dreptunghiul care încadrează fața și un id al persoanei cu care trebuie asociată fața. Cadrul
este procesat prin metoda g etProcessedFrame care aplică o serie de prelucări grafice menite
să îmbunătățească procesul de recunoaștere. După procesare, imaginea rezultată este salvată
local în directorul în care se stochează seturile de imagini cu un nume de forma “tf_x_y.jpg”
unde x reprezintă id -ul persoanei căreia îi aparține poza, și y reprezintă numărul pozei făcute.
După ce cadrul este procesat și imaginea rezultată este salvată, se actualizeaz ă setul de
imagini al modelului.
Metoda recognize() efectuează și analizează rezultat ele recunoașterii propriu -zise.
Primește ca parametrii cadrul ce conține fața detectată și dreptunghiul care o încadrează.
Cadrul este supus unei procesării prin aceeași metodă prin care se procesează cadrele în etapa
de învățare, metoda getProcessedFrame( ). Pentru a verifica similaritatea dintre imaginea
rezultată în urma procesării și imaginile învățate de model, se folosește metoda predict a clasei
FaceRecognizer. Aceasta primeș te ca parametrii imaginea procesată, o variabila prediction și o
variabilă confidence. Metoda determină imaginea cea mai apropiată de imaginea primită ca
parametru și memorează în variabila prediction id -ul asociat imaginii prezise. În variabila
confidence se stochează înc rederea cu care s -a făcut predicția. Această variabilă depinde și de
dimensiunea imagini care conține fața ce trebuie recunoscută, astfel pentru determina

Sistem de detecție și recunoaștere facială

36
similaritatea între imaginea primită ca parametru și imaginea prezisă folosesc următoarea
formul ele:
D = C/W; S = 1.0 – min(max(D, 0.0), 1.0);
S – similaritatea, D -diferența relativă, C – încrederea predicției,
W-lățimea dreptunghiului care încadrează fața
Astfel dacă în urma predicției obțin o similaritate egală cu 0, consider persoana ca fiind
necun oscută, altfel consider că persoana a fost identificată cu success ca persoana din baza de
date cu id -ul din variabila prediction.

Pentru ca rezultatele recunoașterii faciale să fie cȃt mai exacte , imaginile care conțin
fețe detectate trebuie supuse unu i proces de prelucrare, atȃt înainte de învățarea lor cȃt și
înainte de recunoașterea lor. Acesta are scopul de a înlătura detaliile nesemnificative din cadre
prin următorii pași:
1. se decupează imaginea, rămȃnand doar dreptunghiul care încadrează fața
2. se în lătură culorile din imaginea rezultată, rămȃnȃnd o imagine în tonuri de gri
3. se ajustează contrastul imaginii rezultate în pasul 2, prin egalizare histogramei
4. se aplică o mască care încadrează fața într -un cerc
În urma procesării, rezultă o imagine precum c ele din figura 6.2.

Fig. 6.2 Exemple de imagini rezultate în urma procesării

Sistem de detecție și recunoaștere facială

37
6.2 Probleme întȃmpinate
Pe parcusul dezvoltării sistemului de detecție și recunoaștere facială am întȃmpinat o
serie de dificultăți pe de -o parte în încercarea de a îmbunătăți acuratețea datelor rezultate și pe
de altă parte în încercarea de a îmbunătăți timpul de răspuns al sistemului și viteza cu care sunt
afișate imaginile.
Inițial, timpul de răspuns al sistemului era destul de mare, imaginile erau trimise cu
întȃrziere, rezul tȃnd o transmisie sacadată. Acesta problemă se datora în mare parte procesului
de detecție care dura foarte mult și bloca streamingul pȃnă la finalizarea lui. Pentru ca sistemul
să funcționeze în timp real și streamingul să fie fluid, fără întreruperi am încercat mai întȃi să
îmbunătățesc procesul de detecție. Pentru aceasta am trecut la folosirea funcțiilor oferite de
modulul GPU al OpenCV. Aceste funcții folosesc capabilit ățile computaționale ale unității grafice
de proces are oferind o performanță ridicată. De asemenea, am mărit dimensiunea minimă a
feței ce poate fi detectă. Clasificatorul Haar, efectuează detecția secvențial, astfel că prin
mărirea dimensiunii minime a obiectului ce poate fi detectat, scade numărul de eta pe prin care
imaginea trebuie să treacă. Chiar și așa, transmisia mai prezenta unele întȃrzieri. Pentru a
elimina această problemă, am decis să tratez procesul de transmisie al imaginilor și procesul de
analiză al imaginilor ca două module independente. Pr ocesul de analiză rulează independent în
fundal și pune rezultatele obținute într -o coadă accesibilă și modulului de streaming. Acesta din
urmă, face transmisia de imagini independent de modulul de procesare, aplicȃnd pe imagini,
cȃnd este cazul, rezultate le existente în coadă.
În ceea ce privește acuratețea datelor rezultate, una din probleme a fost perceperea de
către sistem a unor porțiuni de ima gini care nu conțin o față umana ca un rezultat pozitiv al
detecției. Acest lucru se întampla pentru porțiuni mai mici de imagini care conțineau foarte multe
detalii. Pentru a preveni falsele detecții, am ales ca pentru un cadru, să iau în considerare doar
fața cu dimensiunea cea mai mare. O altă problemă legată de acuratețea datelor au fost
rezultatele eronate fu rnizate de procesul de recunoaștere. O cauză a acestei probleme, este
faptul că unele imagini captate de cameră sunt în ceață datorită mișcarii persoanei sau camerei
sau datorită procesului de autofocus. Astfel, o persoană de și este învățată și înregistrat ă în
baza de date p oate fi considerată necunoscută sau invers o persoană necunoscută poate fi
considerate cunoscută. Pentru a micșo ara numărul de falsuri positive, am incercat să identific

Sistem de detecție și recunoaștere facială

38
cadrele blurate și să le ignor(să nu le trimit mai departe procesul ui de detecție și recunoaștere)
și am modificat programul în așa fel încȃt, o persoană este considerată necunoscută doar dacă
este neidenfic ată de mai multe ori consecutive . De asemenea, acuratețea datelor este
influențată și de nivelul de luminozitate din cameră. Am încercat să reduc influența luminozității
prin editarea în prealabil a imaginilor și aplicarea unui constrat mai ridicat. Chiar și asa
luminozitatea joacă un rol important în recunoașterea cu succes a persoanelor.
6.3 Rezultate experimentale – comparație CPU – GPU
Rezultate obținute în ceea ce priveș te transmisia de date au fost inț ial destul de sl abe,
deoarece procesul de detecț ie folosea o mare parte din puterea uni tății centrale de procesare
CPU. Pentru a crește numă rul de cadre transmise pe secundă, am ales să folosesc
capabilitățile computaț ionale ale unitatii grafi ce de procesare GPU. Astfel numă rul de cadre
transmise pe secundă s-a triplat , după cum se poate obs erva în figura 6.3. Cu albas tru sunt
prezentate valorile obținute ințial, cȃnd foloseam doar puterea u nității centrale de procesare, iar
cu roșu sunt prezentate valorile obț inute cu folosirea unității grafice de procesare.

Fig. 6.3 Rezultate opținute pe parcurs
Prin folosirea puterii unității grafice de procesare, timpul necesar d etecției scade
considerabil. A ccelerarea GPU ofera perfomanță ridicată aplicaților prin rularea pe unitatea 024681012
10 20 30 40 50 60 70 80 90 100 110 120Cadre pe secunda
Timp (secunde)Comparatie rezultate CPU -GPU
detectie – CPU detectie – GPU

Sistem de detecție și recunoaștere facială

39
grafică de procesare GPU a funcților care necesită o putere mai mare de calcul, lăsȃnd restul
codului să ruleze pe CPU.

Sistemul trebuie să funcți oneze în timp real, astfel că și datele obținute trebuie
prezentate cu prom ptitudine. De aceea , am incercat să cresc și mai mult numărul de cadre
transmise pe secundă, prin separarea modului de streaming de cel de procesare. Am reuș it să
obțin o medie de 24 de cadre transmise pe secund ă. în figura 6. 4 sunt prezentate mediile
numărului de cadre transmise pe secundă obținut pe parcursul dezvoltării. Coloana albastră
prezintă media în cazul inițial, coloana roșie media în cazul utilizării accelerării GPU și c oloana
verde prezintă valoare medie actuală a numărului de cadre transmis, obținută prin atȃt prin
utilizarea accelerării GPU cȃt și prin separarea modulelor și folosirea unui thread care să
execute analiza imaginilor în fundal.

Fig. 6.4 Numărul de cad re pe secundă obținut prin metode diferite

În ceea privește rezultate obținute în urma pr ocesului de detecție am reușit să obțin un
număr maxim de 11 detecții pe secun dă. Recunoașterea facială este un pr oces influențat de
luminozitate și în condiții de luminozitate bun ă am obținut o acuratețe de 66.7% . 051015202530
CPU GPU GPU + Threads

Sistem de detecție și recunoaștere facială

40
7. Concluzii și direcții de continuare a dezvoltării
Sistemul dezvoltat oferă în timp real informații legate de identitatea persoanelor
detectate. Mai exact, sistemul detectează persoana cea mai aproapiata, după care începe
procesul de recunoaștere. Dacă acesta nu se încheie cu succes, însem nȃnd că persoana este
necunoscută, atunci se determină poziția persoanei și aceasta este învațată/memorată fii ndu-i
asociat un nume generic.
Procesul de de tecție și recunoaștere facială est e un proces complex a cărui rezultate
depind mult de calitatea imaginilor primite. Pentru obținerea de informații cȃt mai acurate
imaginile trebuie procesate atȃt înainte de de tecție și recunoaștere cȃt și în procesul de învățare
a persoanelor noi. Acuratețea rezultatelor recunoașterii este influențată de luminozitatea
imaginilor, claritatea acestora dar și de cantitatea de informații nerelevantă din imagine
(fundalul). Pentru î mbunătățirea rezultatelor, am extras din cadre informația strict necesar ă, am
mărit gradul de luminozitate al imaginilor și am ales să ignor cadrele nefocusate sau blurate.
Sistemul de detecție și recunoaștere facială a fost proiectat în asa maniera încȃt
rezultatele să fie returnate cu promptitudine și rapiditate. Funcțiile pe care sistemul trebuie să le
îndeplineasc ă au fost tratate ca module mai mult sau mai puțin independente ale sistemului.
Componentele de bază ale sistemului sunt modulul de streaming si modulul de procesare al
imaginilor. Aceste doua module lucrează în paralel și comunică folosind cozi de mesaje. O altă
componentă importantă a sistemului de detecție și recunoaștere facială este aplicația web, care
are scopul de a prezenta funcționalita tea sistemului, afișȃnd în timp real imaginile rezultate în
urma prelucrărilor și datele existente în baza de date.
Rezultatele procesului de detecție sunt afiș ate cu promptitudine, imaginile rezultate în
urma procesului de detecție și recunoaștere sunt tr ansmise cu o medie de 24 de cadre pe
secundă. Numărul maxim de detecții pe secundă este de 11 iar procesul de recunoaștere are o
acuratețe de 66.7%.
Informațiile returnate de sistem urmează sa fie folosite de sistemul unui robot a cărui
sarcină este împarț irea de pliante. Ro botul va folosi datele oferite de sistem pentru a comanda
deplasarea în direcția unei persoane pentru a -i oferi acesteia un pliant. Datorită caracteristicii de

Sistem de detecție și recunoaștere facială

41
recunoaștere, robotul va putea evita pe cȃt posibil înmȃnarea unui pliant de mai multe ori
aceleia și persoane . Robotul are ca scop atragerea de noi potențiali clienți sau angajați .
În viitor sistemul poate fi îmbunătățit prin adăugarea de noi funcționalități precum ar fi
analiza expresiei faciale. În momentul înmȃnării pliantului unei persoane s -ar putea încerca
detectarea zȃmbetului pentru a se urmări în timp reacția persoanelor la tipul acesta de
publicitate. O altă caracteristică care ar putea fi adaugată în viitor ar fi detectarea persoanelor
din profil și folosirea unei camera FishEye, o cameră care surprinde imagini într -un unghi de
180⁰. Prin folosirea unei astfel de camere, se extinde cȃmpul vizual al robotului. De asemenea,
o cameră mai performantă, ar putea face posibilă detecția și recunoașterea chiar și la distanțe
mai mari de 2 metri.

Sistem de detecție și recunoaștere facială

42
8. Referin țe

[1] http://www.nec.com/en/global/solutions/safety/face_recognition/index.html
[2] http://devblogs.nvidia.com/parallelforall/jetson -tk1-mobile -embedded –
supercomputer -cuda -everywhere/
[3] http://www.e -consystems.com/8MP -USB3 -Autofocus -Camera.asp
[4] http://www.nvidia.com/object/cuda_home_new.html
[5] http://docs.opencv.org/master/d7/d8b/tutorial_py_face_detection.html
[6] http://docs.opencv.org/modules/contrib/doc/facerec/facerec_tutorial.html#local –
binary -patterns -histograms

Similar Posts