Imulare Si Analiza a Detectarii Caracteristicilor Faciale Folosind Algoritmul Viola Jones

Imulare și analiză a detectării caracteristicilor faciale folosind algoritmul viola-jones

CUPRINS

INTRODUCERE 1

1. INSTRUMENTELE ŞI MEDIUL DE IMPLEMENTARE ŞI TESTARE 2

1.1 LIMBAJUL PYTHON 2

1.1.1 NumPy 3

1.1.2 OpenCV 3

1.2 IMAGINEA DIGITALA 4

1.2.1 Ce este un pixel? 4

1.2.2 Prezentare generală a sistemului de coordonate 5

1.2.3 Accesarea și manipularea pixelilor 6

1.3 VEDERE ARTIFICIALĂ (COMPUTER VISION) 8

1.3.1 Sarcini tipice pentru vederea artificiala 9

2. DESCRIEREA METODEI ȘI ALGORITMILOR PENTRU DETECTAREA FEȚELOR 11

2.1 ABORDĂRI ȘI SOLUȚII ÎN CADRUL DETECTĂRII AUTOMATE A FEȚELOR 11

2.1.1 Abordarea bazată pe cunoștințe 12

2.1.2 Metoda bazată pe trăsaturi invariante 13

2.1.3 Sistemul bazat pe șabloane 13

2.1.4 Abordarea bazată pe înfățișare 14

2.2 STRUCTURA VIOLA-JONES PENTRU DETECTAREA OBIECTELOR 14

2.2.1 Prezentare generală 14

2.2.2 Caracteristici de tip Haar 14

2.2.3 Imagine integrală 16

2.2.4 Algoritmul Adaboost 17

2.2.5 Cascada de clasificatori Viola-Jones 19

3. STUDIU DE CAZ: DETECTAREA FEȚELOR ÎN PYTHON FOLOSIND OPENCV 23

3.1 Prezentarea aplicației 23

3.2 Codul sursă 27

CONCLUZII 30

BIBLIOGRAFIE 33

Vederea artificiala este o parte din ce in ce mai importanta in Inteligenta Artificiala. Tinta ei este sa faca aparatele electronica sa „vada” si sa „inteleaga” lumea vizuala intr-un mod inteligent si semnificativ, asemanator oamenilor. Obiectivele din domeniu includ abilitatea de a reconstrui automat geometria 3-D a unei scene din imagini si secvente video, capacitatea de a recunoaste obiecte si categorii de obiecte, si de a identifica oameni si de a le intelege actiunile si interactiunile cu alti oameni sau obiecte.

Problema clasică în vederea artificiala, procesarea imaginii și vederea mașinilor este cea a stabili dacă datele de imagine conțin sau nu unele obiecte specifice, anumite caracteristici, sau o activitate.

In istorie s-au dezvoltat diferite procedee, tehnici și s-au abordat diferiti algoritmi, pentru găsirea unor soluții optime, fiabile, performante și eficiente, de rezolvare a problemei detectării caracteristicilor umane în imagini digitale. Desi in anii '70 s-a dezvoltat primul sistem de detectare faciala, abia la începutul anilor '90, dezvoltarea tehnicilor de recunoaștere a fețelor a necesitat și dezvoltarea unor algoritmi mai eficienti pentru detectarea acestora, ca prim pas în recunoașterea automată. Detectarea fețelor in imaginile digitale poate fi privită ca un caz particular al detectării claselor de obiecte, presupunând ca acestea pot exista oriunde intr-o imagine, indiferent de orientare, iluminare, scalare, particularități (ochelari, barba, mustata, etc.) și expresie facială. Domeniului s-a dezvoltat in mod deosebit în ultimii 15 ani, în principal datorită creșterii numărului de aplicații comerciale, din motive de securitate care necesită autentificarea personală (de exemplu, identificarea teroristilor in aeroporturi, supravegherea spațiilor publice aglomerate etc.) pe de o parte și, pe de altă parte, dezvoltarea unui număr mare de camere foto si telefoane cu camera foto foarte ieftine.

1. INSTRUMENTELE ŞI MEDIUL DE IMPLEMENTARE ŞI TESTARE

1.1 LIMBAJUL PYTHON

Python este printre cele mai populare limbaje de programare care permite atat programarea structurala cat si cea orientata pe obiecte. Codul sursa se nu se compileaza ci se interpreteaza, fiind un limbaj de scripting, drept consecinta se reduc timpii de depanare si procesul de dezvoltare. Python este un limbaj cu scop general, adica se poate folosi cu usurinta in diferite domenii, de exemplu pentru procesarea sirurilor de caractere, citirea/scrierea fisierlor, socket-uri, site-uri web, baze de date, interfete grafice, procesarea unor seturi mare de date etc. Din acest motiv a fost adoptat de foarte multi oameni si pentru o gamă largă de sarcini.

Usurinta cu care se foloseste face limbajul Python sa fie foarte potrivit pentru educație. De asemenea este un avantaj pentru stiinta, unde oamenii de stiinta au nevoie sa incarce seturi de date, sa le vizualizeze si, eventual, sa le controleze printr-o interfata grafica. Are si avantaje in aplicatiile comerciale unde se pot economisi bani si timp.

Fiind un limbaj dimanic inseamna ca se pot executa instructiuni noi la runtime fara limtari. Acest aspect este foarte important in aplicatii stiintifice si in domeniul ingineriei, mai ales in lucrul cu algoritmi complecși. Inseamna ca programatorul nu trebuie sa treaca prin ciclul compilare-rulare-depanare de fiecare data cand modifica ceva in codul sursa. In schimb, o portiune din cod (de exemplu o functie a unui algoritm) se poate modifica si executa in mod repetat folosind acelasi interpret. Asta face mediul de dezvoltare foarte interactiv si reduce timpul de executie al aplicatiei (premite crearea unui prototip rapid).

Python este proiectat sa fie usor de citit, punand accentul pe simplitatea si curatenia codului. Acest lucru este foarte important pentru ca o problema comuna in software este gradul de dificultate mai ridicat pentru a citi si intelege codul decat cel de a il scrie. Pe masura ce algoritmii devin mai complecși (cum se intampla des in domeniul stiintei) este bine sa existe posibilitatea de a ne concentra pe algoritm fara a fi nevoie sa scriem un cod complex pentru a realiza lucruri simple. De asemenea este evident ca in educatie lizibilitatea codului conteaza.

Python foloseste indentarea pentru a da structura codului. Programatorii obisnuiti cu alte limbaje se plang de obicei de lipsa parantezelor de inceput si sfarsit a secventelor de cod, dar acesta este unul din principalele avantaje ale Python. In alte limbaje se folosesc acoladele pentru a spune programului ce inseamna secventa de cod si se foloseste indentarea pentru a face codul lizibil pentru alti programatori, dar nu toata lumea are acelasi stil si se creeaza o ambiguitate intre cele doua. In Python exista o singura cale pentru a reprezenta structura intr-un mod usor de inteles atat pentru program cat si pentru oameni.

In Python totul este un obiect si aceste obiecte sunt foarte „deschise”, adica nu exista variabile private. In schimb, exista o conventie care spune ca o variabila care incepe cu underscore se presupune ca este privata. Acest lucru ajuta mult in procesul de depanare pentru ca orice obiect poate fi accesat si inspectat. Aceasta libertate ofera posibilitatea de a scrie programe „murdare” sau de a aplica hack-uri pentru a rezolva rapid o anumita problema. Acest lucru este acceptat la testarea unui software dar este responsabilitatea programatorului sa evite astfel de situatii sau sa refactorizeze codul cat mai curand posibil.

Librariile Python oferă module pentru o gamă variata de funcționalități, de la cele de bază pentru lucrul cu șiruri de caractere sau numere și fișiere, până la cele pentru lucrul cu sockets, procese, threaduri etc. Pentru grafice și calcul numeric există librariile NumPy, SciPy și Matplotlib.

1.1.1 NumPy

NumPy este o librarie pentru limbajul de programare Python care, pe langa alte lucruri, ofera suport pentru lucrul cu matrici multi-dimensionale de dimensiuni mari. Acest lucru este important pentru ca folosind NumPy putem reprezenta imaginile ca matrici multi-dimensionale. Utilizarea acestei librarii pentru reprezentarea imaginilor ca matrici este atat de eficienta din punct de vedere computational incat alte librarii de procesare a imaginilor sau de invatare automata (machine learning) o folosesc pentru a reprezenta datele. Mai mult, libraria ofera functii matematice predefinite pentru analizarea numerica a imaginilor.

1.1.2 OpenCV

Daca tinta librariei NumPy este reprezentarea imaginilor ca matrici de dimensiuni mari intr-un mod eficient, tinta librariei OpenCV este procesarea in timp real a imaginilor. Prima versiune a fost lansata acum 15 ani, dar abia in 2009 cu versiunea 2.0 a fost adus sprijinul matricilor NumPy. Cea mai recenta versiune (3.0) a fost lansata pe 4 iunie 2015. Libraria a fost initial dezvoltata de centrul de cercetare Intel din Rusia dar acum este mentinuta de compania Itseez si este scrisa in C/C++, oferind o punte pentru limbajul Python.

Aria de aplicatii a OpenCV include recunoasterea obiectelor, realitate augumentata, recuoasterea gesturilor si interactiunii intre oameni, robotica, segmentare si recunoastere, detectarea miscarii, interactiune om-masina etc., iar in sprijinul acestor domenii libraria include o serie de algoritmi de invatare automata (machine learning) precum Boosting, support vector machine (SVM), arbori de clasificare si decizie, retele neurale, etc.

1.2 IMAGINEA DIGITALA

1.2.1 Ce este un pixel?

Fiecare imagine este formata dintr-un set de pixeli. Pixelii sunt piatra de temelie a imaginilor digitale. Nu exista o subdiviziune a pixelului.

In mod obisnuit ne gandim la pixel ca fiind culoarea sau intensitatea luminii care apare intr-un spatiu din imagine. Daca ne gandim la imagine ca fiind o grila, fiecare patrat din grila este un singur pixel.

De exemplu, sa pretindem ca avem o imagine cu o rezolutie de 400 × 200 pixeli, inseamna ca imaginea noastra poate fi reprezentata ca o grila cu 400 de randuri si 200 de coloane. In total sunt 400 × 200 = 80.000 de pixeli in imaginea noastra.

Majoritatea pixelilor sunt reprezentati in 2 feluri: tonuri de gri si color. Intr-o imagine grayscale fiecare pixel are o valoare intre 0 si 255, unde 0 reprezinta „negru” si 255 reprezinta „alb”. Valorile dintre 0 si 255 sunt tonuri de gri, unde valorile care tind spre 0 sunt mai inchise iar valorile apropiate de 255 sunt mai deschise.

Pixelii color sunt de obieci reprezentati in spatiul de culori RGB – o valoare pentru componenta rosie, una pentru cea verde si una pentru albastru. Exista si alte spatii de culoare, precum CMYK, HSV, HSL etc.

Fiecare dintre cele 3 culori este reprezentata de un intreg intre 0 si 255 care indica intensitatea culorii. In mod normal se foloseste un unsigned integer de 8 biti pentru reprezentarea fiecarei intensitati.

Cand combinam aceste valori intr-un tuplu RGB de forma (rosu, verde, albastru) acest tuplu reprezinta culoarea pixelului.

Pentru culoarea alba am construi un tuplu unde cele 3 valori sunt maxime, astfel (255, 255, 255). Pentru negru golim cele 3 spatii (0, 0, 0). Pentru a crea rosu pur folosim valoarea maxima in primul spatiu (255, 0, 0). Urmand modelul, acestea sunt cele mai comune culori reprezentate sub forma de tuplu RGB:

Negru: (0,0,0)

Alb: (255,255,255)

Roșu: (255,0,0)

Verde: (0,255,0)

Albastru: (0,0,255)

Turcoaz: (0,255,255)

Magenta: (255,0,255)

Maro: (128,0,0)

Bleumarin: (0,0,128)

Mov: (128,0,128)

Galben: (255,255,0)

1.2.2 Prezentare generală a sistemului de coordonate

Cum am mentionat anterior o imagine este reprezentata ca o grila de pixeli. Daca ne imaginam aceasta grila pe o bucata de hartie milimetrica punctul (0, 0) corespunde coltului din stanga sus. Pe masura ce miscam punctul catre coltul din dreapta jos atat x cat si y cresc in valoare.

Să aruncăm o privire la imaginea din figura 1.1 pentru a face acest punct mai clar. Aici avem litera „D” pe o bucata de hartie milimetrica. Observam ca avem o grila de 8 × 8 pixeli.

Punctul (0, 0) corespunde pixelului din stanga sus iar punctul (7, 7) corespunde pixelului din dreapta jos a imaginii.

Punctul (5, 4) este pixelul cinci coloane la dreapta si 4 randuri in jos, este important de mentionat faptul ca in limbajul Python indexarea listelor incepe de la 0 deci incepem numaratoarea de la 0 in loc de 1.

Figura 1.1 – Litera “D” pe o bucată de hârtie milimetrică. Pixelii sunt accesați prin coordonata lor (x, y), însemnând x coloane la dreapta și y rânduri in jos, numărătoarea începând de la 0.

1.2.3 Accesarea și manipularea pixelilor

Mai jos este prezentat un exemplu concret de accesare si manipulare a pixelilor in limbajul Python.

Listing 1.1

accessing_and_manipulating.py

In prima parte a programului se importa librariile necesare si se seteaza interpretorul de argumente (linile 1-6). Avem nevoie de un singur parametru pentru linia de comanda: calea catre imaginea pe care urmeaza sa o manipulam.

La liniile 8 si 10 incarcam si afisam imaginea.

Acum ca imaginea este incarcata putem accesa pixelii. In OpenCV imaginea este reprezentata ca o matrice, asa cum a fost prezentat la sectiunea 1.2.2. Pentru a accesa un pixel trebuie doar sa furnizam coordonatele x si y pentru pixelul de care suntem interesati. Valoarea returnata este un tuplu reprezentand valorile rosu, verde si albastru ale pixelului.

Mai trebuie mentionat ca in OpenCV ordinea spatiului de culori RGB este stocata invers, astfel tuplul (R, G, B) devine (B, G, R).

Listing 1.2

accessing_and_manipulating.py

La linia 12 salvam valoarea pixelului aflat la pozitia (0, 0) – coltul din stanga sus a imaginii. Acesta este reprezentat ca un tuplu (B, G, R) ale carui elemente sunt afisate in consola la linia 13.

Dupa cum se poate vedea, complexitatea accesarii unui pixel se rezuma la a furniza coordonate x si y unei matrici datorita librariei NumPy.

Manipularea valorilor unui pixel se face la fel de simplu. La linia 14 modificam pixelul din stanga sus, aflat la pozitia (0, 0), sa aiba valoarea (0, 0, 255).

Dupa ce modificam pixelul din stanga sus sa aiba culoarea rosie salvam noua valoare si o afisam in consola (liniile 16-17).

Putem sa ne folosim de puterea librariei NumPy pentru a accesa portiuni mai mari dintr-o imagine.

Listing 1.3

accessing_and_manipulating.py

La linia 19 salvam o regiune de 100 × 100 de pixel din imagine si o afisam la linia 20. Aceasta reprezinta coltul din stanga sus a imaginii si pentru salvare s-au folosit patru coordonate:

Inceput y: Prima valoare este coordonata y de inceput, de unde incepem sa taiem imaginea. In exemplul de mai sus incepe la y = 0.

Sfarsit y: Este valoarea de sfarsit pentru axa y. In imaginea exemplu ne oprim cand y = 100.

Inceput x: A treia valoare pe care trebuie sa o furnizam este coordonata x de inceput. Pentru a taia coltul din stanga sus incepem la x = 0.

Sfarsit x: In cele din urma furnizam si valoare se sfarsit a axei x. Ne oprim cand x = 100.

Metoda prezentata pentru citirea unei regiuni se poate folosi si pentru manipularea mai multor pixel intr-o singura comanda. La linia 22 accesam din nou regiunea din stanga sus si ii asociem culoarea verde – tuplu-ul (0, 255, 0). La linia 23 afisam imaginea modificata.

Figura 1.2 – Stânga sus: Imaginea originală. Dreapta sus: Imaginea modificată. Dreapta jos: Imaginea decupată

1.3 VEDERE ARTIFICIALĂ (COMPUTER VISION)

Computer Vision este o parte din ce in ce mai importanta in Inteligenta Artificiala. Tinta ei este sa faca aparatele electronica sa „vada” si sa „inteleaga” lumea vizuala intr-un mod inteligent si semnificativ, asemanator oamenilor. Obiectivele din domeniu includ abilitatea de a reconstrui automat geometria 3-D a unei scene din imagini si secvente video, capacitatea de a recunoaste obiecte si categorii de obiecte, si de a identifica oameni si de a le intelege actiunile si interactiunile cu alti oameni sau obiecte.

Daca am compara performantele calculatoarelor cu cele umane vazul este probabil cea mai slaba calitate a lor. Chiar daca suntem capabili sa construi senzori mai sensibili decat organele de simt, puterea computationala dedicata de creier pentru aceasta activitate nu a fost inca egalata. Din nefericire nu cunoastem multe detalii despre felul in care proceseaza creierul datele vizuale si nu putem reproduce metoda sa. Nu putem decat sa admiram puterea incredibila a acestuia precum si adaptabilitatea la conditii extrem de variate.

Pentru a invata un calculator sa recunoasca obiecte, se incepe de la un set de esantioane ale obiectelor. Cand sistemul este intampinat de imagine care trebuie analizata aceste esantione se folosesc pentru a determina care sunt obiectele din imagine. Problemele care apar insa sunt dificil de rezolvat. Pentru a identifica un singur obiect într-o imagine, ar trebui să cunoastem cum arată obiectul văzut si iluminat din orice cadru. Aceasta necesitate este aproape imposibil de realizat in practica. Algoritmul de recunoastere calculeaza care este pozitia si iluminarea cea mai satisfacatoare pentru a „interpreta” imaginea.

Lista aplicatiilor in CV creste exponential si domeniul incepe sa se maturizeze cu un impact vizibil asupra industriei si oamenilor. Au fost dezvoltate masini fara sofer care se bazeaza pe metode de „vedere automata”, jocuri care pot sa recunoasca actiunile umane sunt deja pe piata, programe care detecteaza si recunosc caracteristicile faciale umane fac parte din aproape orice camera foto moderna.

Acest domeniu combina rezultate teoretice si practice din mai multe discipline, precum Matematica, Statistica, Tehnologia Informatiei, Inteligenta Artificiala.

1.3.1 Sarcini tipice pentru vederea artificiala

Problema clasică în vederea artificiala, procesarea imaginii și vederea mașinilor este cea a stabili dacă datele de imagine conțin sau nu unele obiecte specifice, anumite caracteristici, sau o activitate. Diferite tipuri de probleme de recunoaștere sunt descrise în literatura de specialitate:

Recunoașterea obiectelor (numită și clasificarea obiectelor) – unul sau mai multe obiecte sau clase de obiecte pre-învățate pot fi recunoscute, de obicei, împreună cu pozițiile 2-D sau 3-D în imagini respectiv scene.

Identificarea – un exemplu individual al unui obiect este recunoscute. Exemplele includ identificarea feței sau amprentei unei persoane specifice, identificarea cifrelor scrise de mână, sau identificarea unui anumit vehicul.

Detectarea – datele de imagine sunt scanate pentru o condiție specifică. Exemplele includ detectarea posibilelor celule sau țesuturi anormale în imagini medicale sau de detectare a unui vehicul într-un sistem automat de taxare rutieră. Detectarea bazata pe calcule relativ simple si rapide este uneori folosita pentru identificarea regiunilor mai mici de date de imagine interesante care pot fi analizate în continuare prin tehnici mai exigente din punct de vedere computational pentru a produce o interpretare corectă.

În prezent, cei mai buni algoritmi pentru astfel de sarcini se bazează pe rețele neuronale convoluționale. Dar chiar si cei mai buni algoritmi intampina dificultati in identificarea obiectelor mici sau subțiri, cum ar fi furnică mic pe o tulpina de o floare sau o persoană care ține o pană în mână. Au de asemenea probleme cu imaginile care au fost deformate folosind filtre (o problema din ce in ce mai comuna cu dezvoltarea masiva a aplicatiilor de „infrumusetare” a fotografiilor). Prin comparatie, acele tipuri de imagini rar cauzeaza probleme de indentificare oamenilor. Oamenii, însă, tind să aibă alte probleme, precum clasificarea obiectelor în clase cu granulatie fina, cum ar fi rasele de câini sau speciile de păsări, în timp ce rețelele neuronale convoluționale se ocupa de acest lucru cu ușurință.

Există câteva sarcini specializate bazate pe recunoaștere, cum ar fi:

Identificarea imaginilor pe bază de conținut – gasirea tuturor imaginilor dintr-un set mai mare de imagini care au un conținut specific. Conținutul poate fi specificat în diferite moduri, de exemplu, în ceea ce privește similitudinea relativă cu o imagine țintă (returneaza imaginile similare imaginii X), folosind cuvinte cheie (returneaza imaginile care conțin case, sau sunt luate în timpul iernii, sau nu au mașinile în ele).

Estimarea poziției sau orientarea unui anumit obiect în raport cu aparatul de fotografiat. Un exemplu pentru această tehnică ar fi asistarea unui braț robotizat în preluarea de obiecte dintr-o linie de asamblare.

Recunoaștere optică a caracterelor (OCR) – identificarea caracterelor în imagini cu text tipărit sau scris de mână, cu scopul de a codifica textul într-un format care poate fi editat sau indexat.

Recunoaștere facială, de exemplu in cazul aparatelor foto pentru focalizare automata pe subiect.

Mai multe sarcini legate de estimarea mișcării unde o secvența de imagini este procesata pentru a produce o estimare a vitezei. Exemple de astfel de sarcini sunt:

Egomotion – determinarea mișcarii 3-D (de rotație și translație) a camerei de la o secvență de imagini produsa de aparatul foto.

Urmarirea mișcărilor unui set (de obicei) mai mic de puncte de interes sau obiecte (de exemplu, vehicule sau oameni) în secvența de imagine.

2. DESCRIEREA METODEI ȘI ALGORITMILOR PENTRU
DETECTAREA FEȚELOR

2.1 ABORDĂRI ȘI SOLUȚII ÎN CADRUL DETECTĂRII AUTOMATE A FEȚELOR

In istorie s-au dezvoltat diferite procedee, tehnici și s-au abordat diferiti algoritmi, pentru găsirea unor soluții optime, fiabile, performante și eficiente, de rezolvare a problemei detectării caracteristicilor umane în imagini digitale. Desi in anii '70 s-a dezvoltat primul sistem de detectare faciala, abia la începutul anilor '90, dezvoltarea tehnicilor de recunoaștere a fețelor a necesitat și dezvoltarea unor algoritmi mai eficienti pentru detectarea acestora, ca prim pas în recunoașterea automată. Detectarea fețelor in imaginile digitale poate fi privită ca un caz particular al detectării claselor de obiecte, presupunând ca acestea pot exista oriunde intr-o imagine, indiferent de orientare, iluminare, scalare, particularități (ochelari, barba, mustata, etc.) și expresie facială. Domeniului s-a dezvoltat in mod deosebit în ultimii 15 ani, în principal datorită creșterii numărului de aplicații comerciale, din motive de securitate care necesită autentificarea personală (de exemplu, identificarea teroristilor in aeroporturi, supravegherea spațiilor publice aglomerate etc.) pe de o parte și, pe de altă parte, dezvoltarea unui număr mare de camere foto si telefoane cu camera foto foarte ieftine.

Desi este o sarcina banala pentru un om, detectarea fețelor in mod automat este o problema dificila, practic imposibil de definit si tratat complet, varietatea si particularitatea modurilor in care pot aparea figurile umane in imagini fiind practic infinita. Trasaturile si particularitatile fizionomice nu sunt singura problema ci si varietatea in perceptia lor in 2-D, din cauza pozitiei in imagine si in special din cauza umbrelor si impactului luminii asupra reliefului acestora. Contextul imaginii este un alt factor care trebuie luat in calcul, mediul fiind variat si imprevizibil.

Abordările încercate cu timpul au trebuit să-și propună să sa verifice toate cazurile care se pot întâlni, fara a tine cont de particularitățile subiectului și în orice pozitie, încadrare, dimensiune, scalare, fundal sau iluminare s-ar afla el. Din cauza specificului aplicațiilor pentru majoritatea algoritmilor s-a impus să genereze rezultate în timp real. Unele au fost mai performante, altele mai putin performante. Performanța unui sistem de detectie a caracteristicilor faciale este dat de două componente: procentul de rezultate fals-pozitive (acestea sunt confuzii sau raportări false ca fețe ale unor zone din imagini care nu conțin de fapt o față), precum și procentul rezultatelor fals-negative (acestea sunt regiuni care contineau o fața dar nu au fost raportate ca atare). Ca un sistem sa fie cat mai robust si cat mai general ambele procente trebuie sa fie cat mai mici, tinzand catre zero.

Indiferent de metoda folosita, detectarea caracteristicilor faciale nu este si nu poate fi o stiinta exacta. Algoritmii de detectare a fetelor pot fi pacaliti de imagini bidimensionale care par sa contina o față la fel cum si oamenii se pot insela. Acest fenomen este atat de comun incat are si o denumire „pareidolia” in limba engleza si se refera la recunoasterea gresita a ceva caracteristic (o față umana) intr-un loc in care nu exista in mod normal. Exemple in acest sens sunt numeroase, de la imaginea Sfintei Fecioare pe diferite tipuri de mancare pana la figura umana sculptata in stancile pe Marte.

Putem enumera principalii factori care pot crea dificultati in detectarea automata a caracteristicilor faciale in imaginile bidimensionale:

Poziția feței și orientarea acesteia în imagine (frontal, din profil etc.) – unele caracteristici faciale (nas, ochi) putând fi ascunse parțial sau in intregime;

Expresia facială care afecteaza geometria feței;

Prezența sau absența unor particularitati structurale – anumite caracteristici faciale cum ar fi barba sau ochelarii pot fi sau nu prezente, existand multe modele din punct de vedere al culorii, formei sau dimensiunilor;

Obturarea – unele fețe pot fi parțial acoperite de alte obiecte;

Calitatea imaginii si caracteristicile aparatului de captura;

Intensitatea si pozitia luminii in scena capturata.

In general un algoritm de detectarea a caracteristicilor faciale presupune numeroase iteratii, analize, filtrari, scalari si comparatii. Majoritatea recurg la operatii de normalizare a imaginii sau a unei subferestre de analiza, prin glisare peste imagine. Exista algoritmi care se bazeaza pe antrenari anterioare, utilizand retele neuronale, a unor clasificatoare care se pot folosi pentru diverse obiecte dar in cazul detectarii faciale se utilizeaza, in general, doar doua clase: fata si non-fata.

Mai jos sunt prezentate cele patru mari categorii in care se impart algoritmi de dectare a caracteristicilor faciale.

2.1.1 Abordarea bazată pe cunoștințe

Aceasta se bazează pe cunoștințe programate despre geometria caracteristică feței umane și dispunerea spațială a caracteristicilor feței (distanta intre ochi, puntea nasului). Algoritmii bazati pe cunoștințe folosesc reguli pentru a descrie forma, culoarea sau alte particularitati ale elementelor feței (ochi, nas, buze, barbie etc.). Imaginea este examinata la diverse rezolutii, utilizandu-se, in general, o abordare ierarhica. La cel mai inalt nivel se cauta posibili candidati utilizand o descriere grosiera a geometriei fetei. La nivelurile inferioare se analizeaza particularitatile faciale și zonele din imagine sunt identificate ca fiind o față sau nu, pe baza unor reguli programate si rezultatul analizei asupra caracteristicilor faciale. Principala problema in utilizarea acestei metode este definirea cunostintelor umane despre geometria fetei in reguli care sa fie analizate. Daca regulile sunt prea stricte algoritmul nu va detecta fetele care nu indeplinesc toate regulile iar daca regulile sunt prea generale va genera multe rezultate fals-pozitive. O alta problema este data de variatia luminii in imagini si diferitele orientari ale fetei, doarece este imposibil sa se prevada si sa se defineasca toate cazurile posibile.

2.1.2 Metoda bazată pe trăsaturi invariante

Această abordare încearcă să găsească unele caracteristici de structura comune fara a lua in seama condițiile de iluminare sau unghiul din care a fost capturată imaginea. S-au utilizat diverse caracteristici de structura: particularitati faciale locale, forma, textura și culoarea pielii. Particularitatile faciale locale, precum ochii, nasul, sprâncenele, gura etc., sunt indentificate utilizând filtre multi-rezoluție, detecția marginilor, operații morfologice, sau cu ajutorul anumitor praguri. Pe baza acestor filtre se genereaza modele statistice care verifică existența feței. Daca se analizeaza imagini color, este parctica folosirea culorii pielii pentru identificarea posibililor candidati, segmentarea după schema de culoare a unei imagini fiind rapidă din punct de vedere computațional și nu tine cont de unghiului de captură a imaginii, de scalare, de umbre sau obiecte care obtureaza fata, sau de prezența unui fundal complex. O combinație de caracteristici pot fi folosite pentru a spori acuratețea detecției, de exemplu identificarea texturii, formei și culorii pielii pentru a găsi mai intai candidați posibili și apoi a particularitatilor faciale locale (nas, ochi, gură) pentru a valida candidatii. Această metodă devine ineficientă dacă imaginea este deformata sau coruptă.

2.1.3 Sistemul bazat pe șabloane

Acest sistem detectează mai întâi capul, care are o forma aproximativ eliptica, folosind filtre, detectoare de margini / contur sau siluete. Se extrag apoi caracterisiticile faciale cu ajutorul cunoștințelor despre fizionomia umana (șabloanele sunt predefinite manual sau sunt date de parametrii unei functii). Se analizeaza relația dintre particularitatile extrase din imagine și modelele predefinite ale caracteristicilor fetei. Sistemele bazate pe șabloane predefinite nu sunt rezistente la scalare și la variațiile formei și poziției in care se poate gasi o fata. O solutie pentru aceasta problema a fost propunerea unor modele deformabile, care permit scalarea, rotația si translatarea modelând geometria feței cu sabloane elastice.

2.1.4 Abordarea bazată pe înfățișare

Aceata abordare priveste problema detectarii fetelor ca o problema de recunoastere de forme impartie in doua clase: „fata” si „non-fata”, utilizand un numar mare de exemple pentru ambele clasificari. Invatarea se face in mod automat folosind tehnici de Machine Learning pentru a descoperi proprietatile statistice. Printre cele mai populare metode se numara eigenfaces, support vector machines (SVM) si retele neuronale. Putem intelege aceste metode într-o conjunctura probabilistica. Imaginea sau vectorul de caracteristici rezultat dintr-o imagine este variabila aleatoare x, cu funcțiile de densitate p(x|față) și p(x|non-față). Pentru clasificarea subimaginilor, se folosește un clasificator de asemănare maximă. Implementarea directă a unui astfel de clasificator nu este posibilă din cauza dimensionalității lui x. De obicei se utilizează o astfel de funcție dupa ce se reduce dimensionalitatea imaginii.

2.2 STRUCTURA VIOLA-JONES PENTRU DETECTAREA OBIECTELOR

2.2.1 Prezentare generală

Un cadru nou si inovativ pentru detectarea obiectelor in imagini a fost prezentat in anul 2001 de catre Michael Jones si Paul Viola. Algoritmul, rafinat pentru detectia fetelor, este cunoscut drept metoda Viola-Jones si este unul dintre cei mai eficienti, robusti si performanti, inovatia celor doi fiind practic un punct de cotitura in dezvoltarea aplicatiilor practice care utilizeaza detectia fetelor in timp real, cum este cazul celor incluse in camerele foto digitale si a telefoanelor inteligente cu camera de astazi.

Aceasta abordare ofera o viteza deosebita cu un procent mare de acuratete, rata de fals-negative (nedectarea unei fete) fiind de sub 1% iar cea de fals-pozitive (detectarea unei fete unde nu este una in realitate) de sub 40%, utilizand cele mai simple filtre. Algoritmul complet foloseste pana la 38 de filtre (sau clasificatoare).

2.2.2 Caracteristici de tip Haar

Inovatia adusa de Viola si Jones consta in faptul de a nu incerca sa analizeze imaginea direct, ci a unor „caracteristici” de forma dreptunghiulara in imagine. Inspiratia lor pentru aceste caracteristici a venit din analiza formelor de unda complexe din sistemul de functii ortogonale introdus de Haar, ele purtand numele de „caracateristici de tip Haar” dupa matematicianul ungur Alfred Haar.

Primul pas in aplicarea metodei este de a transforma imaginea in nivele de gri daca aceasta este color, informatia de culoare fiind neglijata. Aceasta independenta de culoare face algoritmul sa fie unul foarte robust. Se poate utiliza urmatoarea relatie pentru fiecare pixel (x, y) al imaginii:

i(x, y) = 0,299 R(x, y) + 0,587 G(x, y) + 0,114 B(x, y),

unde R, G, B reprezinta, in spatiul RGB de culoare, componentele de rosu verde si albastru ale valorii pixelului (x, y). Valorile sunt intre 0 si 255.

Figura 2.1 – Câteva tipuri de caracteristici definite de Viola și Jones

Pe imaginea în 256 de tonuri de gri obţinută pot fi analizate unele caracteristici de forma dreptunghiulara prin insumarea valorilor intensităţilor pixelilor în diferite blocuri dreptunghiulare. In acest fel se pot detectata caracteristici formate din zone mai întunecate, alaturate unor zone mai luminoase în imagine, suma pixelilor din primul bloc fiind mai mică decât suma pixelilor in blocul din urmă. Aceste caracteristici dreptunghiulare nu reprezinta trasaturi ale fetelor, deci pot fi folosite si in detectarea altor obiecte.

Viola şi Jones au definit mai multe tipuri de astfel de caracteristici, cu două, trei, sau chiar patru blocuri dreptunghiulare alaturate. În Figura 2.1 sunt reprezentate câteva dintre acestea. Caracteristicile din Figura 2.1 sunt doar cu titlu de exemplu, ele putand fi evaluate la orice scala sau pozitie in imagine, cat timp blocurile dreptunghiulare componente au acceasi forma si dimensiune.

Pentru fiecare astfel de caracteristica asociem o valoare care este diferenta dintre suma pixelilor din regiunea cu dreptunghiuri deschise, minus suma pixelilor din regiunea de imagine delimitata de dreptunghiurile inchise. Un filtru verifica apoi daca acea caracteristica este sau nu prezenta in imagine.

2.2.3 Imagine integrală

Procedeul descris anterior este destul de costisitor din punct de vedere computaţional, adică destul de lent, ceea ce face utilizarea in timp real dificila. O a doua inovaţie adusă de metoda Viola-Jones este reprezentata de o optimizare computaţională ingenioasă, pentru a creste viteza de sumare a intensităţilor pixelilor din blocurile componente ale caracteristicilor de tip Haar definite. Asadar, pentru fiecare imagine de analizat se generează iniţial o aşa numită „imagine integrală”, mapată 1 la 1 peste imaginea originală, în care fiecare punct are valoarea sumei tuturor pixelilor situaţi la stânga şi deasupra coordonatelor punctului respectiv din imaginea originală.

Valorile punctelor ii(x, y) din imaginea integrală se pot calcula cu o singură trecere prin imaginea originala, pornind din stânga-sus (x = 0 şi y = 0), pixel cu pixel, linie după linie, de sus în jos.

Figura 2.2 – Calculul sumei intensităţilor pixelilor dintr-o regiune dreptunghiulară a imaginii originale utilizându-se valorile punctelor din imaginea integrală

Fie, pentru oricare linie y din imaginea originală:

s(x, y) = s(x-1, y) + i(x, y), cu convenţia: s(-1, y) = 0,

suma valorilor tuturor pixelilor i(x, y) din linia y până la x, inclusiv. Valoarea oricărui punct (x, y) din imaginea integrală se poate calcula ca:

ii(x, y) = ii(x, y-1) + s(x, y), cu convenţia: ii(x, -1) = 0.

Termenul „integrală” are aceiaşi semnificaţie ca integrala definita in matematica, respectiv aria de sub o curbă, obţinută prin insumarea unor arii dreptunghiulare de baza.

Dupa ce se calculeaza imaginea integrală pentru fiecare punct din imaginea originală, suma intensităţilor pixelilor dintr-un dreptunghi arbitrar din imagine poate fi calculată cu uşurinţă. Pentru calcularea sumei tuturor pixelilor din dreptunghiul abcd din imaginea originală (Figura 2.2), pot fi utilizate numai valorile punctelor a, b, c şi d corespondente din imaginea integrală, efectuându-se numai trei operaţii simple (două scăderi şi o adunare) între acestea, astfel:

Sabcd = iia – iib – iid + iic

Astfel se pot calcula extrem de eficient din punct de vedere computaţional valorile asociate caracteristicilor de tip Haar definite, indiferent de scală şi de pozitia fetei în imaginea originală. Aceste caracteristici oferă o vedere mai grosieră prin comparaţie cu analiza directă a intensităţii pixelilor si sunt potrivite pentru a caracteriza unele particularităţi locale în imagine prin detectarea marginilor, delimitand zonele luminate de cele intunecate.

2.2.4 Algoritmul Adaboost

A fost necesar ca Viola şi Jones să introduca un sistem de învăţare pentru care s-au utilizat ca date de intrare un set de imagini de 24 × 24 de pixeli conţinând feţe şi un alt set de imagini, tot de 24 × 24 pixeli care nu conţineau feţe şi au antrenat algoritmul să recunoască feţele şi să excluda non-feţele. Au fost utilizate in jur de 4.900 de astfel de imagini conţinând feţe şi 10.000 de exemple de non-feţe, colectate de pe Internet in mod arbitrar.

Utilizând aceste imagini 24 × 24 inseamna ca exista aproximativ 45.000 de moduri diferite de aplica una dintre cele patru tipuri de caracteristici de tip Haar prezentate în Figura 2.1 pe o imagine de acest tip, sau peste 160.000 de moduri în cazul tuturor tipurilor de caracteristici de tip Haar definite de Viola şi Jones. Putem considera pentru primul tip de caracteristica Haar dreptunghiuri de 1 × 2 pixeli, până la 1 × 24, apoi 2 × 2 până la 2 × 24 şi aşa mai departe. Caracteristicile de acest tip se pot plasa în poziţii diferite pe imagine astfel încât să fie testate toate situatiile posibile, de orice dimensiune.

Se observa usor că numărul caracteristicilor posibile, de aproximativ 45.000 (sau 160.000 in cazul tutror tipurilor de caracteristici definite), este mult mai mare decat numărul de pixeli dintr-o imagine 24 × 24 (576), inseamna că trebuie redus cumva numărul caracteristicilor care sunt folosite. Deoarece pentru fiecare caracteristică de tip Haar se calculează diferenţa între sumele pixelilor din regiunile deschise şi cele întunecate, se poate stabili o limita pentru aceste diferenţe (care se poate adapta în timpul antrenării sistemului) pe baza căruia caracteristica a fost sau nu detectata.

Viola si Jones au determinat ca unele caracteristici nu ajuta la determinarea faptului că o imagine reprezintă o fata sau nu, adica nu exista nicio relaţie între felul în care o caracteristică identifică o faţă sau nu o identifică şi reciproc. La aceste caracteristici s-a renunţat. Alte caracteristici au aratat o rata mai mare de succes în eliminarea subferestrelor din clasa non-faţă şi aici intervine învăţarea.

Cei doi au realizat o serie de experimente cu caracteristicile de tip Haar rămase dupa eliminare pentru a stabili cea mai eficienta metodă de utilizare a lor pentru clasarea unei imagini ca faţă sau non-faţă. În final au ales să foloseasca o versiune a unui sistem de învăţare automată (machine learning in engleza) denumit AdaBoost, pentru a construi un clasificator.

AdaBoost este un meta-algoritm de Inteligenţă Artificială (I.A.) similara reţelelor neuronale, acesta a fost formulat iniţial de Zoav Freund şi Robert Schapire si a fost dezvoltat pentru a imbina caracteristici slabe într-un clasificator mai puternic. Fiecărei caracteristici de tip Haar dintr-un clasificator îi este asociata o pondere (care se poate ajusta în timpul învăţării) care defineşte precizia clasificatorului. Caracteristicile slabe sunt reprezentate de ponderi mici, în timp ce ponderile mari sunt asociate caracteristicilor puternice. Ponderile caracteristicilor care au răspuns pozitiv se insumeaza si daca suma depăşeşte o anumita limita (care de asemenea se poate ajusta în timpul învăţării) pe imaginea data, se decide că imaginea respectivă intra in categoria „faţă”.

Viola si Jones au folosit acelasi algoritm AdaBoost nu numai pentru antrenarea clasificatorului, dar si pentru a alege un numar mult mai mic de caracteristici initial definite din cele disponibile si care urmeaza sa fie folosite.

In urma experimentelor Viola şi Jones au remarcat că există două caracteristici de tip Haar care, imbinate şi adaptate corespunzător de sistemul AdaBoost într-un singur clasificator, pot recunoaşte 100% feţele, cu un procent al fals-pozitivelor de 40% (60% dintre non-feţe sunt respinse de acest clasificator).

Acest clasificator este prezentat in actiune in Figura 2.3. Se observa ca foloseste doar două caracteristici pentru a analiza imaginea: o caracteristică orizontală (cu un bloc intunecat sus, respectiv unul deschis jos), care calculeaza diferenţa între regiunea mai luminată a pomeţilor obrajilor şi cea mai întunecată a ochilor şi o caracteristică cu trei dreptunghiuri verticale (un bloc luminat intre doua blocuri intunecate), care analizeaza regiunea mai luminata a puntii nasului in comparatie cu zona mai intunecata a ochilor.

Figura 2.3 – Primul clasificator la lucru pe o imagine 24 × 24px

2.2.5 Cascada de clasificatori Viola-Jones

Desi Viola si Jones au plecat iniţial de la incercarea de a implementa un clasificator puternic prin combinarea a peste 200 de clasificatoare slabe, s-a dovedit în cele din urmă ca in locul unui singur clasificator uriaş este mai eficient sa foloseasca o cascadă de clasificatoare cu două clase fiecare, prezentat sub forma unui arbore de decizie degenerat. Această cascadă de filtre poarta numele de „cascadă atenţională” (prezenta in Figura 2.4) si este cea de-a treia inovaţie importanta adusa in domeniu de metoda Viola-Jones.

In imaginea originala se testeaza fiecare subfereastra cu primul clasificator slab. Dacă rezultatul este pozitiv, este testată cu al doilea clasificator slab. Dacă si rezultatul acestuia este pozitiv, este testată cu cel de-al treilea clasificator slab şi aşa mai departe. Daca exista un clasificator de care nu trece, subfereastra este respinsa din lista posibililor candidati pentru faţă. Numai subferestrele care trec de toate filtrele din cascadă sunt clasificate ca fiind o faţă.

Ce este important si interesant in acelasi timp, este că nu mai avem nevoie sa antrenam cel de-al doilea clasificator şi următorii pe întregul set de învăţare, ci numai pe imaginile care nu au fost respinse de clasificatorii precedenti din lanţ. În acelaşi timp algoritmul poate fi imbunatatit prin oferirea subferestrelor fals-pozitive scapate de primele niveluri ca exemple de invatare pentru clasificatorul de non-fete.

Clasificatorul de nivel doi şi următorii sunt mai complecşi şi foloseste mai multe caracteristici de tip Haar decât primul şi drept consecinta consuma mai mult timp computaţional. De aceea este de remarcat existenta unui astfel de clasificator simplu care poate să elimine atât de multe subferestre din prima fără sa fie nevoie de calcularea clasificatorilor mai complecşi. Acest lucru este important pentru probabilitatea regiunilor dintr-o imagine arbitrara care sa contina o fata este scazuta, de aceea posibilitatea de a elimina aceste regiuni cu un efort computational redus face ca acest algoritm sa fie foarte robust si eficient.

Figura 2.4 – Cascada de clasificatori Viola-Jones

Cascada de clasificatori definita de Viola si Jones are 38 de niveluri, la primul nivel utilizandu-se 2 caracterisitici slabe, la cel de-al doilea nivel 10, ajungand in total pentru toate nivelurile la 6060 de caracteristici slabe. La acest numar s-a ajuns empiric, prin incercarea a diferite caracteristici pentru primele niveluri. Criteriul de selectie a fost minimizarea rezultatelor fals-pozitive pana sub un prag definit pentru fiecare nivel. Un alt criteriu a fost mentinerea unui procent ridicat de rezultate corecte (rata fals-pozitivelor sa tinda catre zero).

Pentru fiecare nivel s-au adaugat pe rand caracterisitic pana criteriile impuse au fost respectate.

La primele niveluri se gasesc clasificatoare simple pentru a asigura eliminarea rapida a unui numar mare de subferestre din clasa „non-fata”. Clasificatorul de la primul nivel elimina peste 50% din rezultatele „non-fata” iar cel imediat urmator elimina pana la 80% din non-fete folosind 10 caracteristici.

Figura 2.5 – Analiza prin glisare peste imaginea originală a caracteristicilor de tip Haar

Pentru antrenarea clasificatorului s-au utilizat 4.916 exemple de feţe descărcate arbitrar de pe Internet, decupate, aliniate manual şi scalate la 24 × 24 de pixeli. Pentru a mari rapid numarul de imagini folosite in procesul de antrenare s-au utilizat şi imaginile în oglindă (faţă de axa verticală) ale acestora ca exemple de feţe, rezultand un total de 9.832 de imagini. La fel s-a procedat si in cazul exemplelor de non-fete, au fost selectate arbitrar de pe Internet peste 9500 de imagini care au fost verificate grosier sa nu contina fete. Fiind vorba despre o învăţare adaptivă, inseamna ca daca pentru primul nivel s-au utilizat numai subferestre din cele aproximativ 9.500 de imagini non-feţe, pentru nivelurile succesoare s-au luat in seama si subferestrele de tip non-faţă obţinute din rezultatele fals-pozitive date de nivelurile precedente.

Metoda prezentata de Viola si Jones a presupus o prima etapa extrem de laborioasa din cauza experimentarilor necesare pentru alegerea caracteristicilor slabe, a tipului de clasificator dar si adaptarea ponderilor. La timpul consumat pentru aceste experimente se adauga si procesul lung de invatare a sistemului care a durat cateva saptamani. Putem spune ca este vorba despre o metoda in care invatarea este lenta dar detectia este extrem de rapida.

Ulterior, pentru a face mai bine faţă in cazul în care fetele nu apar frontal în imagini, atât Jones şi Viola cât şi alţi cercetători, precum Lenhart şi Maydt au continuat să aducă optimizari prin extinderea setului de caracteristici slabe utilizate, adaugand filtre diagonale sau caracteristici rotite cu 45 de grade.

Amintim aici faptul că în biblioteca de funcţii de vedere artificială (Computer Vision) OpenCV, open source, disponibilă pentru mai multe platforme (inclusiv Python), există o implementare a algoritmului Viola-Jones ce poate fi utilizată direct prin includerea funcţiilor şi structurilor predefinite în diverse aplicaţii. Un exemplu este prezentat pe larg în studiul de caz.

3. STUDIU DE CAZ: DETECTAREA FEȚELOR ÎN PYTHON FOLOSIND OPENCV

3.1 Prezentarea aplicației

A fost imaginata, proiectata, implementata şi testata cu succes o aplicatie pentru detecţia şi urmărirea feţelor în imagini succesive utilizându-se implementări ale metodei Viola-Jones din libraria open source de funcţii de vedere artificială dezvoltata de Intel, OpenCV. Pentru procesarea rapida a imaginilor OpenCV foloseste matrici de tip NumPy pentru a reprezenta imaginile drept matrice a intensitatilor pixelilor. Aplicatia a fost realizata în limbajul dinamic Python. Sistemul lucrează în timp real, făcând faţă fără probleme la achiziţie video continuă cu o cameră web simplă, la o rezoluţie de 512×512 pixeli, cu 15 cadre pe secundă.

Experimentele s-au desfăşurat în condiţii ambientale diferite în ceea ce priveşte iluminarea şi tonalitatea încăperii, iar achiziţia imaginilor în flux continuu s-a realizat cu ajutorul unei camere web simple.

S-a constatat că apar sporadic anumite scăpări ale funcţiilor OpenCV folosite la detectarea unor feţe în anumite cadre, in special la detectarea fetelor cu tonuri inchise la culoare sau în medii cu luminozitate foarte mare. S-a observat că cascade de caracteristici de tip Haar diferite din OpenCV se obţin rezultate diferite.

Sistemul experimental implementat are capacitatea de a analiza în timp real cadre cu o rezoluţie de 512×512 pixeli din flux video continuu la 15 cadre pe secundă. Timpul mediu necesar rulării unui ciclu de urmărire facială pe un cadru este sub 200 ms pe un calculator de generaţie actuală, cu procesor Intel Core i7 la 2,3 GHz şi 16GB RAM DDR3 la 1600 MHz.

În cele ce urmează sunt prezentate câteva capturi sugestive pentru modul de funcţionare al algoritmului de detectare a feţelor propus şi implementat. In cazul acestor capturi s-au folosit imagini statice.

Figura 3.1 – O față detectată

Figura 3.2 – Detectarea unei fețe cu particularități faciale

Figura 3.2 – Dificultăți la identificare fețelor de culoare închisă sau a celor umbrite

Dupa cum se poate observa in Figura 3.2 algoritmul intampina dificultati in detectarea fetelor de culoare inchisa sau a celor umbrite. Ajustand factorul de multiplicare a scalei pentru rezoluția de detecție de la 1.3 la 1.11 am obtinut rezultatul de la Figura 3.3, adica detectia fara fals-pozitive a tuturor fetelor din imagine cu sacrificiul unui timp computational mai lung de aproape 350ms.

Figura 3.3 – Rezultatul modificării factorului de multiplicare pentru detectarea corectă a fețelor de la Figura 3.2

Figura 3.4 – Detectarea corectă în cazul fețelor parțial obturate

In Figura 3.4 observam cum algoritmul identifica corect o fata chiar si atunci cand aceasta este partial obturata sau cand este acoperita de ochelari (Figura 3.5).

Figura 3.5 – Detectarea corectă în cazul fețelor cu ochelari

Figura 3.6 – Recunoașterea emoției în cazul fețelor detectate. Pătratul verde reprezinta fața, cel galben marchează gura iar cele albastre identifică caracteristicile zâmbetului

Așa cum se observa in Figura 3.6 putem estima foarte usor emotiile daca ne bazam pe caracteristicile fetei, in cazul acesta detectam zambetul stiind ca ochii se miscoreaza si apar dintii.

3.2 Codul sursă

Mai jos este prezentat codul sursa al aplicatiei pentru detectia faciala folosind metoda Viola-Jones, dezvoltata in limbajul Python.

Listing 3.1

face_detect.py

CONCLUZII

În prezenta lucrare s-a încercat o introducere în domeniul detecţiei automate a feţelor, cu o prezentare concisă a principalelor tipuri de abordări in rezolvarea acestei probleme şi o descriere ceva mai detaliată, dar totuşi la un nivel de înţelegere cât mai general, a unui algoritm de referinţă în domeniu, metoda Viola-Jones.

Detecţia automată a feţelor în imagini digitale s-a dovedit utila în viaţa noastră de zi cu zi fiind inclusă ca funcţionalitate în majoritatea camerelor foto digitale, aplicaţii de recunoaştere a feţelor sunt inglobate în sisteme de securitate si de verificare a identităţii, interfeţele om-calculator evoluate care permit masinilor recunoasterea gesturilor si intentiilor umane, clasificarea şi etichetarea imaginilor si datelor de pe Internet cu meta-informaţii, masini care se pot conduce singure datorita unor algoritmi puternici de vedere artificiala (computer vision) si acestea sunt numai cateva exemple.

Problema detectării caracteristicilor faciale în imagini nu este tocmai una trivială, datorită varietăţii uriaşe în care acestea pot exista în percepţia senzorului 2-D, atât din cauza trăsăturilor şi particularităţilor fizionomice de la om la om, dimensiunilor, culorii, poziţiei, obturarii parţiale, fundalului complex, dar mai ales din cauza zonelor de lumină şi umbră conditionate de distribuţia şi poziţia sursei de lumină.

Abordările încercate cu timpul au trebuit să-și propună să sa verifice toate cazurile care se pot întâlni, fara a tine cont de particularitățile subiectului și în orice pozitie, încadrare, dimensiune, scalare, fundal sau iluminare s-ar afla el. Din cauza specificului aplicațiilor pentru majoritatea algoritmilor s-a impus să genereze rezultate în timp real. Unele au fost mai performante, altele mai putin performante. Performanța unui sistem de detectie a caracteristicilor faciale este dat de două componente: procentul de rezultate fals-pozitive (acestea sunt confuzii sau raportări false ca fețe ale unor zone din imagini care nu conțin de fapt o față), precum și procentul rezultatelor fals-negative (acestea sunt regiuni care contineau o fața dar nu au fost raportate ca atare). Ca un sistem sa fie cat mai robust si cat mai general ambele procente trebuie sa fie cat mai mici, tinzand catre zero.

Indiferent de metoda folosita, detectarea caracteristicilor faciale nu este si nu poate fi o stiinta exacta. Algoritmii de detectare a fetelor pot fi pacaliti de imagini bidimensionale care par sa contina o față la fel cum si oamenii se pot insela.

In general un algoritm de detectarea a caracteristicilor faciale presupune numeroase iteratii, analize, filtrari, scalari si comparatii. Majoritatea recurg la operatii de normalizare a imaginii sau a unei subferestre de analiza, prin glisare peste imagine. Exista algoritmi care se bazeaza pe antrenari anterioare, utilizand retele neuronale, a unor clasificatoare care se pot folosi pentru diverse obiecte dar in cazul detectarii faciale se utilizeaza, in general, doar doua clase: fata si non-fata.

Metoda Viola-Jones este de referinţă si a marcat un punct de cotitură începând cu anul 2001 în evoluţia sistemelor utilizând detecţia feţelor, extrem de importanta atât prin ingeniozitate cât şi prin viteza și performanţe.

Spre deosebire de alte metode, solutia propusa de Viola si Jones nu presupune o abordare piramidală prin scalarea imaginii iniţiale cu mai mulți factori şi nu se rezumă la o analiză în sens clasic a valorilor intensităţilor pixelilor din care este formată imaginea originală. Metoda analizează caracteristici locale în imagini, utilizând „caracteristici de tip Haar” (Haar-like features în engleză), prin analogie, dar fără a se confunda acestea cu wavelet-uri Haar, şi care sunt reprezentate fiecare de câte 2, respectiv 3 sau 4 dreptunghiuri alăturate, cu nuanță închisă şi respectiv deschisă, cu dimensiuni şi formă identice între ele. Aceste caracteristici slabe sunt scalate şi translatate prin subferestre de dimensiuni diferite, apoi glisate peste imaginea originală şi se calculează câte o valoare pentru fiecare, dată de diferenţa între suma pixelilor din zonele din imaginea sursă acoperite de dreptunghiurile deschise minus suma pixelilor din zonele acoperite de dreptunghiurile întunecate componente ale caracteristicii care este analizată.

O altă inovaţie introdusă in aceasta metoda, care a adus o optimizare computaţională considerabilă, o reprezintă folosirea unei asa numite „imagini integrale” care se calculeaza cu o singură trecere peste imaginea originală, fiecare punct capătand valoarea sumei tuturor pixelilor de deasupra şi din stânga pixelului corespondent din imaginea sursă. Pentru a obtine suma pixelilor a orcarui dreptunghi definit pe imaginea sursă se folosesc trei operaţii elementare (două scăderi şi o adunare) între cele patru valori din imaginea integrală care corespund colţurilor dreptunghiului respectiv.

Pe baza unui prag ce s-a stabilit empiric, se poate indica faptul că o caracteristică este sau nu prezentă într-o subfereastră analizată. În loc să genereze un clasificator complex unic cu ajutorul unui meta-algoritm precum AdaBoost, Viola şi Jones au ales caracteristicile cele mai discriminante, apoi le-au mixat în mai multe niveluri, creând o cascadă de filtre, formata clasificatoare slabe AdaBoost (cea de-a treia inovaţie introdusă de Viola şi Jones), în care la primele niveluri, caracteristicile sunt mai simple si mai putine calculele efectuandu-se rapid, astfel eliminand rapid peste 50% din subferestrele de tip non-faţă, urmând ca nivelurile următoare, cu mai multe caracteristici complexe si durata mai lunga de procesare, să analizeze profund subferestrele care au trecut de nivelurile precedente dacă sunt feţe sau nu.

Pentru antrenarea sistemului au fost folosite aproape 5.000 de exemple de feţe şi 10.000 de exemple de non-feţe. Învăţările au durat săptămâni.

Putem spune ca este vorba despre o metoda in care invatarea este lenta dar detectia este extrem de rapida. Rezultatul inovatiilor aduse de Viola si Jones se vede in dispozitivele de captura din zilele noastre care cu o putere limitata de calcul fac fata cu succes la detectarea rapid a fetelor in imagini in timp real.

BIBLIOGRAFIE

Numele autorului, P. – Titlul cărții. Editura, Orașul, 2008

VIOLA, P.; JONES, M.: Rapid Object Detection using a Boosted Cascade of Simple Features, in the Proceedings of the Conference on Computer Vision and Pattern Recognition (CVPR), 2001.

VIOLA, P.; JONES, M. J.: Robust Real-Time Face Detection, in the International Journal of Computer Vision (IJCV) 57(2), pag. 137-154, Kluwer Academic Publishers, 2004.

JONES, M.; VIOLA, P.: Fast multi-view face detection, in Technical report, Mitsubishi Electric Research Laboratories, TR2003-96, 2003.

LIENHART, R.; MAYDT, J.: An extended set of Haar-like features for rapid object detection, in Proc. of ICIP, 2002.

YANG, M.-H.; KRIEGMAN, D. J.; AHUJA, N.: Detecting Faces in Images: A Survey, in IEEE Trans. on PAMI, 24(1), 2002.

BUCKNALL, J. M.: How to Find a Face, in PC Plus, Issue 296, July 18th 2010.

FREUND, Y.; SCHAPIRE, R. E.: A Decision-Theoretic Generalization of on-Line Learning and an Application to Boosting, in Proceedings of EuroCOLT, 1995.

HEWITT, R.: Seeing With OpenCV, Part 2: Finding Faces in Images, in SERVO Magazine, T & L Publications Inc., February 2007.

ROSEBROCK, A.: Practical Python and OpenCV: An Introductory, Example Driven Guide to Image Processing and Computer Vision, 2014.

Revista Română de Informatică şi Automatică, vol. 23, nr. 2-3, 2013

Similar Posts