Analiza Si Implementarea Metodelor de Recunoastere a Formelor Utilizand Imaginile Video
Analiza și implementarea metodelor de recunoaștere a formelor utilizând imaginile video
Cuprins
Capitolul 1. Metode de extragere și selecție a caracteristicilor dintr-o imagine video
1.1 Generalități
1.2 Analiza video
1.3 Metode de selecție a caracteristicilor
1.4. Analiza componentelor principale (PCA
1.5 Analiza Discriminatorie Liniară (LDA
1.6. Extracția și selecția caracteristicilor
1.7. Clasificarea propriu-zisă
1.8. Interpolarea cubica
1.9. Meode de implementare folosind interpolarea cubica
Capitolul 2. Recunoașterea fețelor umane folosind tehnici de calcul distribuit
2.1 Sisteme distribuite
2.2 Procesarea imaginilor
2.3. Recunoașterea formelor din imagini video
2.4. Schema aplicației utilizând un sistem distribuit
2.5. OPENCV
2.6. NODE.JS
2.7. Estimarea prin segmentare cu prag
2.8. Algoritmul Viola-Jones
2.9. Evaluarea aplicației
2.10. Concluzii parțiale
Capitolul 3. Aplicație practică folosind algoritmul ADABOOST
3.1. Modelul tip HAAR-LIKE
3.2. Imaginea integrală (Integral Image
3.3. Antrenarea rețelei
3.4. Arhitectura aplicației
3.5. Detalii folosite la implementare
3.6. Detecția feței unei persoane
3.7. Detecția fețelor mai multor persoane
Capitolul 4. Aplicație practică de detecție și recunoaștere a persoanelor folosind clasificatorii Haar si algoritmul pentru detectia centroidului privirii
4.1. Detecția feței unei persoane
4.2. Analiza direcției privirii
4.3. Exemple de analiză și localizare a direcției privirii
4.4. Algoritmul de localizare a pupilei
4.5. Descrierea aplicației
4.6. Specificații ale programului informatic
4.7.Rezultate obtinute
Capitolul 5. Concluzii și perspective
5.1. Concluzii privind prelucrarea imaginii pentru detecția feței
5.2.Concluzii privind prelucrarea imaginii pentru recunoașterea feței
5.3. Perspective și oportunități de cercetare
Bibliografie
Anexa 1 Codul sursă al aplicatiei
Anexa 2 Clasificatorul HAAR – Like folosit pentru detecția fețelor
Anexa 3 Codul sursa folosit pentru recunoasterea fiecarui obiect prin metoda PCA
Anexa 4 Baza de date
Lucrarea a beneficiat de suport financiar prin proiectul cu titlul “Studii doctorale și postdoctorale Orizont 2020: promovarea interesului național prin excelență, competitivitate și responsabilitate în cercetarea științifică fundamentală și aplicată românească", număr de identificare contract POSDRU/159/1.5/S/140106.
Proiectul este cofinanțat din Fondul Social European prin Programul Operațional Sectorial Dezvoltarea Resurselor Umane 2007-2013. Investește în Oameni!
CAPITOLUL 1
Metode de extragere și selecție a caracteristicilor dintr-o imagine video
1.1 Generalități
Extracția și selecția caracteristicilor (feature extraction and selection) unor forme vizuale reprezintă două etape importante privind reușita și performanțele procesului de recunoaștere sau identificare a formei (pattern recognition) respective (fig. 1.1.1.)
Fig. 1.1.1. Extragerea și selecția caracteristicilor dintr-o imagine video
Pentru o corectă implementare a recunoașterii, regiunile obținute în urma procesului de segmentare a imaginii video de intrare trebuie reprezentate într-o forma concisă, eliminând informațiile redundante și reținând informațiile necesare recunoașterii formelor/obiectelor de interes.
Procesul de obținere a unei asemenea reprezentări a regiunilor de interes este cunoscut ca etapa de descriere/extragere de caracteristici.
Descrierea este în directă legatură cu structura de date aleasă pentru reprezentare, în raport cu care există o puternică dependență față de aplicația dezvoltată.
Posibilitățile de descriere a unei regiuni se diversifică în funcție de metodele implementate pentru selecția de caracteristici:
caracterizarea formei conturului regiunii (descriptori de contur);
caracterizarea regiunii pe baza interiorului acesteia (descriptori regionali sau de moment);
descrierea topologică a regiunii de interes (texturi);
descrierea morfologică a regiunii de interes (descriptori morfologici).
Fig. 1.1.2. Schema bloc cu etapele de extragere și selecție a caracteristicilor din imagine
Alegerea unei modalități adecvate de descriere este esențială pentru reușita procesului de recunoaștere a formei. De asemenea, un principiu fundamental care supervizează construcția descriptorilor formei este principiul invarianței acestora la diferite tipuri de transformări liniare sau neliniare aplicate formei de interes.
Astfel, se dorește invarianța setului de descriptori utilizat la punctul de start, scalare, translație, reflexie și rotație
Experiența practică demonstrează că aspectul cel mai important pentru recunoașterea unei forme îl reprezintă selecția caracteristicilor/proprietăților, respective a descriptorilor utilizați.
Selecția caractersiticilor este un process de compresie de date și poate fi asimilat cu o transformare liniară sau neliniară, de la spatiul inițial al observațiilor presupus n-dimensionale, la un spațiu cu mai puține dimensiuni, m (m<<n).
O asemenea transformare conduce la conservarea informației și permite elaborarea unor algoritmi de calcul în timp real, întrucât există algoritmi eficienți din punct de vedere al timpului de calcul și a resurselor de memorie necesare doar în spații cu dimensiuni reduse.
În cazul unei singure clase de forme, selecția caracteristicilor se consideră optimă dacă realizează o reducere a dimensionalității împreună cu conservarea informației originale majoritare.
În cazul prezenței mai multor clase de forme, eficiența selecției caracteristicilor este dată în special de posibilitatea separabilității claselor, care depinde în special de repartiția claselor dar și de clasificatorul selectat.
Ca referință în acest sens am demonstrat în diferite lucrări, performanțele clasificatorului Bayes, iar ca măsură a eficacității caracteristicilor selectate am considerat posibilitatea de eroare a acestui clasificator.
Majoritatea transformarilor utilizate pentru selecția caracteristicilor sunt liniare însă pot fi folosite și transformări neliniare chiar dacă acestea sunt mai greu de implementat
Ele pot oferi o eficacitate mai ridicată exprimând dependența dintre formele reale observate, datele primare extrase și caracteristicile selectate ale acelor forme.
Principale metode folosite pentru selecția caracteristicilor în Raportul nr. 3 au fost:
analiza componentelor principale (PCA);
analiza discriminant liniara (LDA)
Există însă și alte metode ca:
transformata KL, cu varianta sa 2D, Fukunaga-Koontz;
selecția caracteristicilor prin maximizarea criteriilor de separare a claselor (analiza discriminatorie);
transformări neliniare;
driteriul divergenței;
proiecții in spații 2 D (algoritmul lui Sammon, algoritmul Lee-Slayle-Blum).
1.2 Analiza video
Procesul de segmentare a imaginii video comportă 2 principale metode:
procesarea pixelilor;
procesarea compresiei.
Principalele tehnologii de segmentare a secvenței video în clipuri sunt bazate pe procese de prelucrare asupra:
pixelilor;
transformărilor;
caracteristicilor;
histogramei;
elementelor de statistică.
Clipul video este o secvență de cadre continuă, capturată în aceleasi condiții de către o cameră.
Procesul de segmentare permite detecția secvențelor de imagini și este o etapă de identificare a modificarilor din conținutul unui cadru.
Privind analiza imaginilor din inregistrări video, ideală este alegerea extragerii unor secvențe de înregistrare video cat mai scurte care să păstreze caracteristici principale ale originalului și subiecților analizați.
Fig. 1.2.1 Reprezentarea modului de descompunere a imaginii video
Conținutul unei imagini video poate fi modelat la nivel de pixeli respectiv a unor informații de culoare sau strălucire
Un nivel intermediar al analizei se referă la obiectele și atributele lor, iar nivelul superior realizează o intrepretare a obiectelor și/sau conceptelor umane.
După această clasificare, caracteristicile ce se extrag din cadrele de bază și care sunt folosite pentru regăsirea bazată pe conținut se împart în:
Caracteristici vizuale:
textura;
culoarea;
contururi;
forma;
mișcarea camerei.
Caracteristici semantice:
abstractizarea datelor;
alegerea cadrului probabilistic.
Fig. 2.2.2 Clasificarea nivelurilor privind conținutul unei imagini video
Accesul la niveluri diferite poate fi eficient prin organizarea sub formă de cuprins al înregistrarilor video, acesta continănd structura semantică legată de conținut.
Privind navigarea între niveluri și regăsirea apoi a conținutului, tehnologii actuale abordează reprezentarea conținutului video prin:
cadre cheie (indexarea video realizeaza selecția cadrelor cheie pentru generarea rezumatului video);
scene unde cuprinsul este construit pe baza unor scene;
grupuri.
Fig.1.2.3 Organizarea sub formă de cuprins a înregistrărilor video
Implementarea tehnologiilor moderne care accesează baze de date de mari dimensiuni solicită pentru regasirea datelor metode de acces selective accesând memoria calculatorului unidimensional.
În cazul tehnologiilor ce implică înregistrări video 2D sau 3 D datele sunt organizate sub forma de grilă ce stochează celule cu informații și nume unice privind obiectele analizate.
Fig. 1.2.4 Procesul de transformare/inserare a datelor efectuate în cazul înregistrărilor video
Indexarea multidimensională a înregistrărilor video realizează:
strategii de partiție a datelor prin împarțirea spațiului acestora în funcție de distribuția de date încărcate sau inserate în date de tip R-tree sau R*-tree;
strategii de partiție a spațiului prin partiție recursivă disjunctă indiferent de date sub formă de grille Kd-tree, KdB-tree, Quad-tree;
strategii hibride ce înglobează primele procedee.
Fig. 1.2.5 Indexarea multidimensională a înregistrarilor video
Un procedeu inovator a fost propus de Hirzalla și Karmouch care au implementat printr-un limbaj de interogare sectoare de interes ale unor baze de date folosind procese de multi-segmentare. Regasirea segmentelor privind date conținând vorbirea și imagini ale feței persoanei/unui subiect s-a realizat prin descrierea selectivă a datelor subiectului în cauză.
Modelul implementat de aceștia permite conexiuni unu-la mai multi subiecți, prin asocieri la nivel de rețea și ierarhic a datelor, realizând astfel o interdependență a acestora.
Aceștia au implementat un model bazat pe algebra relațională și pe calculul cu predicate de ordin întâi [29], în prezent existând preocupari de înlăturare a unor limitări impuse de imposibilitatea stocării comportamentului obiectelor în diferite relații.
Acestea vizează implementarea unui model entitate-legatură pentru conexiuni la nivelul bazei de date dar și procedee de observare/afișare a subiectului sincron cu secvența multimedia în care se regăsește .
Fig.1.2.6. Implementarea unui proces de multi-segmentare la nivelul unei înregistrari video
Cercetări actuale descriu înregistrările multimedia ca o interconectare de scene ce pot fi combinate în funcție de aplicație prin operatori de compoziție temporali sau spațiali, datele folosite fiind în legătură cu:
ordinea acțiunilor ce vor avea loc în înregistrare;
răspunsul subiecților la evenimente
Un alt model, propus de Subrahmanian [29], implementează o instanță media printr-un mecanism de stocare pe diverse medii, împreună cu funcții și relații ce definesc aspecte și caracteristici evaluate.
Fig.1.2.7 Reprezentarea procesului de recunoaștere în aplicații ce implică diversitate
Procesul de recunoaștere presupune identificarea și potrivirea caracteristicilor la un nivel cerut de utilizator.
Alte implementări folosesc tehnologii de regăsire a conținutului cum sunt VIRAGE, JACOB, QBIC, NETRA, MARS,VIBE, PHOTOBOOK.
Acestea folosesc conținutul din imagini video sau clipuri pentru a reprezenta seturi de atribute: de culoare, textură, formă –necesare interogării unor anume caracteristici prin intermee date folosind procese de multi-segmentare. Regasirea segmentelor privind date conținând vorbirea și imagini ale feței persoanei/unui subiect s-a realizat prin descrierea selectivă a datelor subiectului în cauză.
Modelul implementat de aceștia permite conexiuni unu-la mai multi subiecți, prin asocieri la nivel de rețea și ierarhic a datelor, realizând astfel o interdependență a acestora.
Aceștia au implementat un model bazat pe algebra relațională și pe calculul cu predicate de ordin întâi [29], în prezent existând preocupari de înlăturare a unor limitări impuse de imposibilitatea stocării comportamentului obiectelor în diferite relații.
Acestea vizează implementarea unui model entitate-legatură pentru conexiuni la nivelul bazei de date dar și procedee de observare/afișare a subiectului sincron cu secvența multimedia în care se regăsește .
Fig.1.2.6. Implementarea unui proces de multi-segmentare la nivelul unei înregistrari video
Cercetări actuale descriu înregistrările multimedia ca o interconectare de scene ce pot fi combinate în funcție de aplicație prin operatori de compoziție temporali sau spațiali, datele folosite fiind în legătură cu:
ordinea acțiunilor ce vor avea loc în înregistrare;
răspunsul subiecților la evenimente
Un alt model, propus de Subrahmanian [29], implementează o instanță media printr-un mecanism de stocare pe diverse medii, împreună cu funcții și relații ce definesc aspecte și caracteristici evaluate.
Fig.1.2.7 Reprezentarea procesului de recunoaștere în aplicații ce implică diversitate
Procesul de recunoaștere presupune identificarea și potrivirea caracteristicilor la un nivel cerut de utilizator.
Alte implementări folosesc tehnologii de regăsire a conținutului cum sunt VIRAGE, JACOB, QBIC, NETRA, MARS,VIBE, PHOTOBOOK.
Acestea folosesc conținutul din imagini video sau clipuri pentru a reprezenta seturi de atribute: de culoare, textură, formă –necesare interogării unor anume caracteristici prin intermediul unei interfețe.
Există și sisteme ce realizează interogări prin casete de tip dialog cu utilizatorul (CBR, CHABOT), acestea necesitând însă detalii și atribute exacte ale imaginilor analizate. Detaliile de textură, culoare, formă sau de distribuție spațială ale subiecților sunt evaluate și comparate cu imagini ale bazei de date prin analiza distanțelor dintre vectorii caracteristicilor.
Astfel s-a definit un sistem referintă prin care utilizatorul își poate predefini cea mai apropiată distanță față de un prag în funcție de aplicația sa.
Un ultim aspect de interes militar în recunoașterea persoanelor se referă la regăsirea unui conținut din care să fie extrase caracteristici ale fiecărui cadru, urmând apoi gruparea înregistrărilor video pe baza clusterelor. Un cluster poate să includă cadre din înregistrări diferite iar fiecare dintre acestea pot conține clustere diferite.
Fig.1.2.8 Regăsirea unui conținut de informații din clipuri
Metoda presupune furnizarea de etichete pentru fiecare cluster și grupări bazate pe Hidden Markov sau adnotare.
Implementarea unor metode semiautomate în aplicații militare presupun elaborarea unor platforme de instrumente interactive pentru afișarea fiecarui cluster în interacțiune cu diferite baze de date.
Fig.1.2.9 Schema bloc pentru relaționarea înregistrărilor video cu diferiți indecși
Aplicația necesită reducerea numărului de cadre și construcția unui rezumat care să definească aplicația urmarită. Aceasta presupune o detecție eficientă a înregistrărilor urmată de o grupare a acestora pe grupuri și scene.
Totodată este necesară o extragere selectivă a caracteristicilor bazate pe reguli de etichetarea și clasificarea conținutului aproape de realitate.
Aceasta se realizează prin vectori multidimensionali stocați în baze de date prin a căror interogare se caută generarea de similitudini .
1.3 Metode de selecție a caracteristicilor
Dimensiunea spațiului caracteristicilor influentează în măsură mare eficiența și performanțele algoritmilor de clasificare .
Astfel, o serie de algoritmi de clasificare eficienți în spații cu puține dimensiuni devin nepractici în spații cu mai multe dimensiuni.
De aceea am căutat implementarea unor transformari care să ierarhizeze importanța caracteristicilor în spațiul transformat și să permită astfel, micșorarea dimensiunii acestuia prin eliminarea celor mai puțin semnificative , păstrand în același timp informația esențială în vederea clasificării.
Pentru aceasta am selectat acele caracteristici care conțin cea mai mare cantitate de informatie despre forma respectivă.
Aplicarea transformărilor asupra datelor obținută în urma fazei de extragere a caracteristicilor și reținerea numai a celor semnificative se numește selecția caracteristicilor (feature selection).
1.4. Analiza componentelor principale
Analiza componentelor principale este o metodă standard de analiză a datelor care permite detectarea celor mai marcante tendințe ale unei mulțimi de date.
Fie X un nor de date din spatial . Componentele principale ale acesei mulțimi sunt direcțiile din de-a lungul căroră alungirea norului este cea mai semnificativă. Cunoașterea acestor direcții poate servi atât în scopuri de clasificare cât și pentru determinarea celor mai importante caracteristici ale norului de puncte analizat .
PCA reduce dimensiunea respectiv numărul de variabile al unui set de date.
Fig. 1.4.1. Variantă de reprezentare a proiecției utilizând PCA
În figură este reprezentată o rețea într-un subspațiu bidimensional. PCA este utilizată pentru a vizualiza aceste date prin reducerea dimensionalitatea datelor. Cele trei variabile sunt reduse la un număr mai mic, de două variabile noi componente principale numite (PC). Folosind PCA, putem identifica planul bidimensional care descrie optim mai varianța datelor.
Selecția folosind PCA rotește spațiul de date original, încât axele de coordonate ale noului punct au cea mai mare variație a datelor într-o anumită direcție. Axele sau noile variabile sunt denumite componente principale și sunt ordonate de variație. Prima componentă, PC 1, reprezintă direcția cu cea mai mare varianța a datelor. Direcția PC 2, reprezintă cea mai mare a varianță ortogonală ce a rămas după prima componentă. Reprezentarea permite obținerea numărului necesar de componente care acoperă un spațiu și a cantității dorite de varianță.
Cele mai multe transformări utilizate pentru selecția caracteristicilor sunt cele liniare, în timp ce transformările neliniare au o complexitate mai ridicată, sunt mai greu de implementat, dar pot avea o eficiență mai ridicată, exprimând mai bine dependența dintre formele observate, datele primare observate și caracteristicile selectate ale acestor forme.
Transformata Karhunen-Loéve (Principal Component Analysis PCA) este o metodă liniară de selecție a caracteristicilor. Fie X un vector aleator n-dimensional. Se caută o transformare ortogonală care să permită reprezentarea optimă a vectorului X în raport cu criteriul erorii medii pătratice minime.
Proiectând norul pe direcțiile date de componentele sale principale, efectul imediat este o compresie a informației conținută în mulțimea respectivă.
Conform referinței [2], determinarea componentelor principale ale norului de date X se reduce la determinarea valorilor vectorilor/valorilor proprii ai matricei de dispersie a mulțimii de date analizată. Caracterul liniar al metodei standard PCA (realizată prin proiecția liniară a datelor analizate pe componentele/direcțiile principale) determină o serie de neajunsuri majore în prelucrarea datelor de intrare reale .
În consecință, în prezent au fost dezvoltate o serie de generalizări neliniare ale variantei clasice, un exemplu fiind algoritmul Kernel PCA a carui structură este prezentată în [1].
In EigenObjectRecognizer.cs si in Anexa se gaseste codul sursa folosit pentru recunoasterea fiecarui obiect prin metoda PCA (Principle Components Analysis)
1.5 Analiza Discriminatorie Liniară (LDA)
Analiza Discriminatorie Liniară (Linear Discriminant Analysis, LDA), ca și analiza componentelor principale, este o metodă statistică de selecție a caracteristicilor.
Spre deosebire de PCA, unde se urmărește o proiecție în sensul maximizării matricii totale de covariație, aici se caută o proiecție în sensul maximizării matricii de covariație interclase SB și minimizării matricii de covariație cumulată din interiorul claselor SW. Mai exact LDA încearcă să găsească cea mai bună direcție de proiecție în care vectorii de antrenare aparținând în clase diferite sunt cel mai bine separați.
Fig.1.5.1. Proiecția folosind LDA
O descriere a algoritmului si implementari ale unor aplicatii cu acesta au fost descrise în referința bibliografică [8]. Totodată au fost testate aplicații demo a transformatei LDA pentru vectori bidimensionali dar și clasificarea pixelilor din imagini cu sol și vegetație folosind transformata LDA [9].
1.6. Extracția și selecția caracteristicilor
Analiza în componente independente (Independent Component Analysis, ICA) este o tehnică de prelucrare a semnalelor a cărui scop este exprimarea unui set de variabile aleatoare ca și combinații liniare de variabile de componente independente statistic.
Aplicațiile de bază ale ICA sunt legate de extracția caracteristicilor, deconvoluția oarbă, etc.
În referinta bibliografică [8] se prezintă o caracteristică neuronală (având la bază o lege de instruire neuronală de tip hebbian) capabilă să îndeplinească cerințele algoritmului ICA.
Lucrarea bibliografică [3], prezintă într-o manieră concisă cele mai recente dezvoltări neuronale ale algoritmului de analiză în componente principale (Principal Component Analysis, PCA).
Este introdus conceptul de rețele PCA, care sunt în esenta, arhitecturi neuronale neliniare de tip hebbian. Gama aplicativă a acestora cuprinde extracția optimală de caracteristici, compresia de date, etc.
Extracția primitivelor 3D de tipul supercuadricelor pentru descrierea formelor spațiale poate fi optimizată prin utilizarea algoritmului de călire simulată (varianta Metropolis).
Practic, este minimizată măsura erorii de asemănare (considerate drept funcție de energie) între formele de intrare și suprafețele superelipsoidale, funcție evaluată în adâncime și pe suprafață.
Metoda lui Sammon este o altă metodă de selecție a caracteristicilor unei forme (vizuale) și reprezintă o transformare neliniară a spațiului inițial al caracteristicilor într-un spațiu de dimensiune redusă, totul cu conservarea relațiilor de vecinătate dintre vectorii spațiului origine.
În referinta bibliografică [8] se prezintă o metodă de calcul a proiecției Sammon cu ajutorul unui perceptron multistrat (MLP) .
1.7. Clasificarea propriu-zisă
Implementarea structurilor neuronale ca și clasificatori ai formelor vizuale este una din cele mai răspândite aplicații ale majorității rețelelor neuronale. În prealabil, este util de menționat, faptul că, procesul de antrenare al unei rețele neuronale pentru recunoașterea formelor vizuale (2D sau 3D) presupune, în principiu, abordarea a 3 direcții distincte, schematizate generic mai jos:
(1){forme vizuale (2D sau 3D)}intrare extragere/selecție descriptori ai formei (1D){multime de instruire (1D)}rețele neuronale standard;
(2) {forme vizuale (2D)}intrare {mulțime de instruire (2D)} rețele neuronale specializate 2D;
{forme vizuale (3D)}intrare extragere/selecție proiecții (2D) {mulțime de instruire (2D) rețele neuronale specializate 2D;
(3) {forme vizuale (3D)}intrare extragere/selecție descriptori ai formei (3D) {mulțime de instruire (3D)} rețele neuronale specializate 3D.
Din punct de vedere al performanțelor de clasificare (scorului de bună recunoaștere) obținute, al efortului de timp și calcul necesar, literatura de specialitate recomandă utilizarea următoarelor arhitecturi neuronale:
(1) cazul supervizat:MLP cu BP, RBFN, SART, LVQ,Hopfield, etc.;
(2) cazul nesupervizat:SOFM, ART1/ART2 sau ART3, HONN, Kwan-Kai, etc.
Rețelele neuronale enumerate la punctul precedent (2)sunt structuri specializate antrenării cu forme de intrare 2D, având flexibilitatea organizării neuronilor din stratul de intrare sub forma unor matrici bidimensionale de diferite forme (circular, hexagonal, etc.).
O metodă eficientă de clasificare neuronală care elimină etapa de extragere a caracteristicilor este prezentată în referința bibliografică [4].
În esență, metoda constă în transformarea spațiului vectorilor de instruire într-un nou spațiu a carui dimensiune este egală cu numărul de clase.
Vectorii astfel transformați sunt pseudo-caracteristici, fiind prezentați ulterior unei retele multistrat clasice
În final, este necesar a fi facută și observatia naturală că, datorită ritmului alert de dezvoltare și implementare a noi structuri de rețele neuronale, gama aplicativă a teoriei calcului neurale în recunoașterea formelor (vizuale) este cu mult mai amplă, depășind cu mult posibilitățile de cuprindere și prezentare în acest paragraf.
1.8. Interpolarea cubică
Redimenisonarea fetei detectate ca imagine pentru compararea fortata a aceleiasi dimensiuni cu imaginea de test s-a realizat folosind metodologia interpolarii cubice.
Aceasta a presupus abordarea unor tehnici de aproximare predefinite, bazate pe functia splin.
S-a propus ca aplicatia, dupa aplicarea interpolarii sa realizeze:
-afisarea fetei adaugate intro scala gri
– salvarea intrun fisier de tip text a fetelor antrenate
-scrierea etichetelor a fetelor antrenate intrun fisier text pentru incarcari si detectari ulterioare
Interpolarea este metoda de estimare a unei valori aplicata intr-o locatie fara masuratori,care se bazeaza pe valorile masurate in punctele vecine.
Procedeul consta in gasirea unei functii f(x,y) pentru a reprezenta oata suprafata valorilor z associate cu puncte(x,y) dispuse regulat, functia efectuand o predictie a valorilor z pentru alte pozitii dispuse regulat.
Fig.1.8.1. Raster rezultat in urma estimarii unor valori cunoscute
Grafica imleplementata pe tehnica de calcul trebuie sa indeplineasca conditii de aspect regulat, neted, fara discontinuitati, oscilatii sau bucle intre punctele de masura.
Pentru a permite proiectarea interactive a formelor, metoda presupune ca modificarea pozitiei unui punct de control sa aiba un effect local pentru a schimba aspectul formei curbelor numai in vecinatatea restransa a acelui punct.
Una din conditii este ca ecuatiile analitice descrise de curbe sa fie cat mai simple, de forma polinomiala de grad redus, intrucat o asemenea curba nu va putea sa acopere tot setul de control al formei definite.
Una din solutiile adoptate este aceea de separare a setului de puncte de control in subgrupe de puncte si construirea unor curbe de nivel redus pentru fiecare subgrupa. Curba cautata va rezulta din asamblarea acestor curbe elementare (portiuni de curba) si deci ea nu va fi descrisa de o ecuatie unica pe intregul domeniu de definitie. Aspectul neted al curbei rezultate va fi obtinut prin impunerea conditiilor de continuitate si derivabilitate functiei asociate, in punctele de jonctiune a doua portiuni de curba.
Construind in acest mod curbe de interpolare, utilizand curbe descrise de functii polinomiale de grad 3 se obtine curba spline cubica naturala. Dezavantajul acesteia este controlul global pe care il exercita fiecare punct de control asupra curbei. Determinarea acestei curbe avand n+1 puncte de control necesita rezolvarea unui sistem liniar de 4*n ecuatii cu 4*n necunoscute. Acest sistem furnizeaza coeficientii functiilor polinomiale de grad 3 asociate celor n portiuni de curba care definesc curba de interpolare.
O alta metoda pentru constructia unei curbe de interpolare spline cubica utilizeaza un set de curbe SPLINE DE BAZA. Curba de interpolare se obtine ca o combinatie liniara (suma ponderata) a acestora. Si in acest caz se obtine o curba de interpolare asupra careia fiecare punct de control exercita o influenta globala.
Asigurarea controlului local asupra unei curbe spline cubice de interpolare nu pot poate fi obtinuta decat renuntand la unele conditii asupra curbei. Renuntand la cerinta ca curba sa treaca prin punctele de control conduce la obtinerea unor curbe de aproximare numite CURBE B-SPLINE CUBICE (figura 1.8.2.). Renuntand la cerinta de derivabilitate de ordin II a curbei, se va obtine o curba de interpolare de tip Romm-Catmull (figura 1.8.3).
Curbele B-Spline cubice sunt formate prin combinatii liniare ale unor curbe spline numite B-Spline sau baze. Curba B-Spline cubica este in general si ea o curba spline.
Pentru reprezentarea acestui tip de curba se utilizeaza o forma parametrica.
Fiind date n+1 puncte de control, P0, …,Pn, vom diviza intervalul [0,n] al parametrului u in n subintervale [ui, ui+1], cu 0 <= t <= 1 si t(0)=ui si t(1)=ui+1. Pentru fiecare subinterval avem, in expresia matriceala:
figura 1.8.2. Reprezentare grafica a functiei splin cubice
figura 1.8.3. Reprezentare grafica a curbei de interpolare de tip Romm-Catmull
(1.8.1)
pentru curbele B-Spline cubice, respectiv
(1.8.2)
pentru curbele Romm-Catmull.
Un punct al curbei va avea coordonatele [cx(t), cy(t)], obtinute aplicand formula de mai sus si inlocuind vectorul P cu coordonatele x respectiv y ale punctelor de control.
Proprietatile curbei B-Spline cubice
curba nu este o curba de interpolare ci una de aproximare
specificand un punct de control de doua ori, curba este atrasa mai aproape de acel punct
specificand un punct de control de trei ori, curba trece prin acel punct
1.9. Metode de implementare a funcțiilor splin in cadrul procesului de interpolare cubica.
Pentru dezvoltarea aplicatiilor de recunoastere a fetelor persoanelor s-a insistat asupra urmatoarelor metode:
A. Triangulația
Metodă dezvoltată de Peuker și colaboratorii (1978), ce folosește triangulația Delaunay.
Rezultatul constă într-o rețea de triunghiuri (structură de tip TIN) perfect circumscrise unor cercuri, lucru ce face ca distanța dintre punctele care formează vârfurile triunghiului să fie întotdeauna minimă .
Pentru fiecare triunghi se memorează coordonatele și atributele celor trei vârfuri, topologia precum și panta și direcția de înclinare a suprafeței triunghiului.
Triangulația funcționează cel mai bine când datele sunt distribuite uniform pe suprafața ce urmează a fi interpolată.
Metodă exactă ce folosește interpolarea polinomială lineară sau cubică.
Este indicat a se utiliza pentru seturi mari de date, fiind și destul de rapidă.
Aplicații open source în care această metodă este implementată:
QGIS (Quantum GIS);
SAGA (System for Automated Geoscientific Analyses);
B. Nearest Neighbor
Atribuie valoarea celui mai apropiat punct neținând cont de celelalte.
Este utilă când datele sunt deja egal depărtate, dar este nevoie să fie convertite într-un fișier de tip grid.
Alternativ, în cazul în care datele sunt deja într-o rețea cu doar câteva valori lipsă, aceasta metoda este eficientă pentru umplerea lipsurilor.
Metoda are avantajele:
Rapidă și exactă.
Nu extrapolează valoarea z.
Aplicații open source în care această metodă este implementată:
gvSIG
ILWIS (Integrated Land and Water Information System);
SAGA (System for Automated Geoscientific Analyses);
Whitebox Geospatial Analysis Tools;
O comparatie intre principalele metode pentru implementarea interpolarii cubice a fost reprezentata prin studii pe www.geo-spatial.org folosind 101987 puncte si un calculator 2.8Ghz cu 8 nuclee.
Figura 1.8.4. Lista comparativa intre performante oferite de diferite metode de interpolare
CAPITOLUL 2
Recunoașterea fețelor umane folosind tehnici de calcul distribuit
Capitolul 2 prezintă posibilitățile de procesare a imaginilor pentru recunoaștere a formelor, respectiv a fețelor umane, folosind tehnicile de calcul distribuit. Am evidențiat noțiunile și definițiile ce descriu sistemele distribuite de calcul. Am arătat legătura acestora cu tema raportului de cercetare, respectiv de procesarea imaginilor, descriind procesul de recunoaștere a formelor și prezentând o aplicație la nivel de schemă logică, algoritmul și tehnologiile implementate.
Valoarea aplicației este argumentată cu rezultatele obținute în urma rulării ei.
Experimentul a demonstrat posibilități de procesare a imaginilor la nivelul de recunoaștere a formelor implementând tehnicile de calcul distribuit.
Am descris procesul de recunoaștere a formelor, respectiv anume a fețelor persoanelor folosind algoritmul de clasificare.
Am realizat o aplicație pe care am descris-o la nivel de schemă-logică, prin algoritmul Haar-like features și folosind tehnologii folosite OpenCV și node.js.,prezentând rezultate în urma rulării unei aplicații și formulând concluzii pentru performanțele constatate prin aplicare a algoritmului de recunoaștere a obiectelor din imagini video.
2.1 Sisteme distribuite
Sistemul distribuit de calcul este un sistem informatic ce conține mai multe programe orientate peste o rețea de noduri implementând calculatoare, multiprocesoare, procesoare paralele masive, stații de lucru, clustere, grid, etc.
Acestea au acces fiecare la o memorie proprie sau la memorii partajate și sunt conectate între ele prin linii de comunicație ce au diverse topologii de conexiune.
Sistemul distribuit este conceput pentru partajarea unor resurse sau/și în scopul de a rezolva concurent mai multe aplicații paralele sau paralelizabile[15].
Procesarea imaginilor care implică pre-procesarea, recunoașterea de forme și identificarea de particularități, este un caz particular de implementare a sistemelor și tehnologiilor ce folosesc procesarea distribuită a informației. Aplicațiile care permit folosirea unor sisteme distribuite necesită resurse de calcul mari [14].
Aplicația poate rula pe mai multe servere, permițând o încărcare echilibrată și alocare a resurselor de calcul.
Serverul principal utilizat, are capacitatea de 2Gb RAM, iar celălalt este folosit pentru a stoca fișierele. Acesta are tot o capacitate de 2Gb RAM și 80Gb spațiu liber, folosind 3 noduri pentru recunoașterea imaginilor, ce au o capacitate de 2Gb RAM.
Această structură permite ca aplicația să fie rapidă și fiabilă.
2.2 Procesarea imaginilor
Procesarea imaginilor reprezintă o etapă importantă privind proiectarea a unor algoritmi optimizați de prelucrare[16] a căror alegere va influența reducea timpului de procesare.
Aceasta implementează o teorie matematică cu calcule mari ce consumă multe resurse de calcul și memorie dacă se urmărește utilizarea în timp real a informațiilor extrase din imaginile video[14].
Din aceste considerente se folosesc oportunitățile oferite de către sistemele distribuite.
Analiza și prelucrarea imaginilor cuprinde un ansamblu de tehnici și metode de achiziție, afișare, stocare, exploatare și modificare a informației conținută în imaginile video.
De menționat faptul că analiza acestor imagini se poate referi și la capacitatea de descriere, recunoaștere și înțelegere a scenelor, obiectelor din scene precum și a dependențelor dintre acestea.
Prelucrarea imaginilor este un domeniu foarte dinamic, și în acest capitol voi utiliza sintetizarea făcută de către Pavlidis în [17].
Figura 2.2.1. Domeniul prelucrării imaginilor
2.3. Recunoașterea formelor din imagini video
Recunoașterea formelor este o modalitate de extragere a unor informații din imaginile achiziționate, care permit recunoașterea feței umane.
Recunoașterea formelor implică o clasificare și/sau o descriere a conținutului din imaginea video.
Am folosit clasificarea ce constă în atribuirea pentru o formă necunoscută din imagine la o clasă dintr-un set predefinit de mai multe clase.
După ce am aplicat operația de clasificare am obținut la ieșire, o imagine nouă ce reprezintă harta a obiectelor ce sunt determinate astfel.
Algoritmii de clasificare folosiți se bazează pe extragerea caracteristicilor/trăsăturilor folosind ca reper distanța.
Pentru selectarea caracteristicilor este necesară o cantitate destul de mare de informație.
Principalele module pe care trebuie să le conțină clasificatorul sunt:
A. modulul de clasificare,
B. modulul de învățare care necesită prezența unui set de imagini de antrenare,
C. modulul de selecție și extragere a caracteristicilor.
Acestea sunt implementate în limbajul C++ ca părți componente ale unei aplicații finale.
2.4. Schema aplicației utilizând un sistem distribuit
Demonstrarea funcționării unui sistem de calcul distribuit care este bazat pe recunoașterea formelor a fost implementat ca o aplicație Web ce permite recunoașterea fețelor persoanelor necesitând următoarele activități:
• Încărcarea imaginilor pe un server în regim multiuser
• Stocarea de imagini pe un server de fișiere
• Recunoașterea de imagini în regim multiuser folosind un modul elaborat în limbajul C++ și libraria OpenCV
• Ștergerea imaginilor de pe server
Aplicația este implementată pe un sistem distribuit de calcul care oferă o alocare eficientă a resurselor disponibile. Schema bloc a aplicației este prezentată în figura 2.4.
Figura 2.4.1. Schema funcțională a aplicației elaborate
Liniile roșii reprezintă faptul că imaginile sînt încărcate pe server fără a fi procesate.
Liniile verzi reprezintă faptul că imaginile sunt prelucrate.
Liniile galbene reprezintă solicitarea imaginilor prelucrate de către browser.
Calculul distribuit este utilizat în aplicație fiind argumentat prin aceea că utilizarea nodurilor de mai sus permit să se efectueze rapid și eficient calculele necesare pentru recunoașterea formelor.
2.5. OPENCV
Pentru implementarea algoritmului Haar-like am folosit ca instrument librăria OpenCV ce oferă posibilități de rulare a acestuia.
OpenCV este o librarie open source de recunoașterea imaginilor inițial creată de Intel. Aceasta e scrisă în C și C++, având mai multe module pentru Python, Ruby, Matlab și alte limbaje de programare, fiind gratuită pentru uz comercial (licența BSD).
Această librarie este cross-platform: lucrând în Mac OS X, Windows și Linux.
Implementarea OpenCV a permis:
● Lucrul cu fișiere .xml asupra cărora se aplică algoritmul Haarcascades folosind funcția:
cv::CascadeClassifiercascade.load()
● Încărcareaimaginilorutilizândfuncția: cv::imgread()
● Recunoașterea de imagini folosind funcțiacv::CascadeClassifierdetectM ultiScale()
● Numărarea de obiecte de pe imaginea analizată
2.6. NODE.JS
Utilizarea aplicației on-line permite accesul multiuser din orice locație folosind instrumentele oferite de Node.js.
Aceasta este o platformă pentru a rula programe scrise în JavaScript pe un server.
Ea este cross-platform, lucrând cu cele mai cunoscute sisteme de operare: Windows, Linux și MacOS. Oportunitățile aduse de NodeJS sunt:
• Viteza de lucru a aplicației este mai înaltă datorită faptului că NodeJS utilizează motorul de rulare al JavaScript-ului V8, care de asemenea este folositși în browser-ul Google Chrome
• Lucru ușor cu fluxuri de date multiple [19].
2.7. Estimarea prin segmentare cu prag
Metoda de evaluare a fost de a estima poziția subiectului prin determinarea centrului de vizare al imaginii împărțite de prin prag optim [13].Segmentarea imaginii inițiale a fost efectuată cu pragul optim, care se aplică un algoritm de centrul de greutate.
Textura complexă și contrastul imaginii a redus apariția de segmentare și resturi de produs.
S-a folosit soluția de filtrare și un algoritmul de tip centroid pentru calibrare a pragului de discriminare al subiectului [20].
În continuare este prezentat schematic algoritmul descris.
Fig.2.7.1. Structura algoritmului propus
Pe imaginea inițială s-a realizat o segmentare cu prag optim asupra căreia s-a aplicat un algoritm de centroid. Textura complexă a imaginii și contrastul redus au condus la apariția unor artefacte de segmentare pentru a căror eliminare a fost aleasă soluția aplicării unui filtru morfologic.
2.8. Algoritmul Viola-Jones
Am inserat clasificatorii HAAR LIKE în cascadă conform modelului următor model, aplicând în ordine acești clasificatori până la epuizarea acestora și la obținerea unei fețe din imaginea analizată.
Procedeul permite să se afle și dacă un clasificator folosit nu are elemente de validitate.
Algoritmul Viola Jones permite obținerea de rezultate cu acuratețea de până la 95% pentru detecția fetelor umane, aceasta implicând numai 200 de clasificatori simpli.
Prelucrarea se poate face folosind un calculator cu performanțe medii, instalat cu un procesor de 2GHZ care poate prelucra astfel cca. 5 frame-uri de imagini pe secundă.
Fig.2.8.1 Schema algoritmului Viola-Jones
Algoritmul specific utilizat în cadrul aplicaței este acela folosind detecția centroidului feței, având structura din fig 2.10.1 și fiind descris de ecuațiile din fig.2.10.2, unde S este pragul utilizat pentru discriminarea pupilei.
, (2.1.)
Fig.2.8.2. Algoritm de centroid implementat pentru determinarea centrului de imagine
2.9. Evaluarea aplicației
Pentru verificarea eficienței utilizării acestei aplicații informatice am utilizat un set de imagini de diferite dimensiuni care corespund unui format .jpeg, cu 90 x 120 pixeli din Baza de date realizată personal și care a fost prezentată în Raportul 3 de cercetare.
Cele 560 de fotografii astfel realizate se regăsesc în aplicație la Resources.
Suplimentar acesteia am realizat o alta Bază de date ce conține imagini din înregistrări video ce conțin o parte din subiecții primei Baze de date.
În figura 2.9.1. am prezentat rezultatul unei rulări a aplicației pe o imagine ce conține mai multe fețe.
Din imagine se observă detecția tuturor fețelor, acestea fiind încercuite.
De menționat faptul că am folosit o imagine cu o rezoluție foarte bună ce a permis o bună implementare a algoritmului în etapa de detecție.
Figura 2.9.1. Rezultatul execuției unei aplicații pentru o imagine
Datele obținute prin rularea aplicației le-am prezentat în tabelul 2.9. 1.
Analiza acestuia relevă faptul că au fost folosite imagini care conțin în medie 3sau 4 fețe.
Tabel 2.9.1. Rezultatele aplicației folosind un sistem informatic distribuit
2.10. Concluzii parțiale
1. Folosind un sistem informatic distribuit timpul de prelucrare este de 130 secunde
2. Analiza rezultatelor a scos în evidență aspecte negative, ce nu permit recunoașterea obiectelor din imagini, ca:
• Imposibilitatea de a depista fețe sunt sub un unghi de rotire mai mare de 30 grade.
• Probleme de luminozitate și contrast
• OpenCV nu permite recunoașterea de imagini cu dimensiuni mici
3. Aplicația nu recunoaște toate fețele din imagini, fiind observate fețe în plus acolo unde nu erau și nu au fost găsite fețe acolo unde ele existau.
4. Aplicația permite detecția în timp scurt a persoanelor din imagini video de dimensiuni medii și mari, cu condiția achiziției imaginilor fețelor orientate sub direcții mai mici de 30 grade față de poziția normal.
CAPITOLUL 3
Aplicație practică folosind algoritmul ADABOOST
3.1. Modelul tip HAAR-LIKE
Pentru recunoașterea unui obiect din imaginea video, respectiv fața unei persoane am utilizat algoritmul Haar-like features ce permite efectuarea acestor operații.
Clasificatorii în cascadă de tip HAAR CASCADE au fost descoperiți de Viola și Jones. Aceștia implementează caracteristici bazate pe variații ale valorilor de intensitate și de contrast între grupuri adiacente, rectangulare de pixeli, variațiile de contrast fiind utilizate la determinarea zonelor întunecate și luminate din fotografie.
Mai multe grupuri adiacente ce au o variație de contrast specifică, individuală, definesc o caracteristica HAAR LIKE, mai multe astfel de caracteristici putând a fi ușor scalate pentru a se detecta obiecte de diferite dimensiuni
Procesul de recunoaștere folosește dreptungiuri cu culori alb și negru care pot avea diferite poziții și mărimi pe imaginea achiziționată și analizată.
Figura 3.1.1. Elemente de recunoaștere a formelor
Recunoașterea se efectuează în următoarele etape:
1. Dreptunghiul cu trăsăturirile Haar se deplasează deasupra imaginii procesate.
2. Pentru fiecare poziție acestui dreptungiul se calculează suma conform formulei:
( 3.1 )
unde W și H sînt dimensiunile pentru imaginea inițială, i și j poziția dreptungiului cu trăsături Haar, respectiv locul unde suma este minimală determinând poziția obiectului căutat [18].
3.2. Imaginea integrală (Integral Image)
Caracteristicile rectangulare extrase dintr-o imagine se calculează după o reprezentare intermediară a imaginilor numită Integral Image, aceasta fiind de fapt o matrice calculată după formula:
, (3.2)
în care AI este imaginea integrală, iar A este imaginea inițială.
Caracteristicile din fețele umane ce sunt rotite cu 45 de grade față de poziția frontală, normală de achiziție, folosesc o reprezentare de imagini numită rotated integral image, definită de Maydt și Lienhart.
Formula folosită de aceștia pentru această reprezentare este:
, (3.3)
unde AR este Rotated Integral Image iar A este imaginea inițială.
Aplicația software necesită două parcurgeri, căte una pentru calcularea fiecărei reprezentări.
Astfel, aplicația propusă folosește imaginea corespunzătoare integrală care este analizată prin diferența a 6-8 matrici cu elemente și o caracteristică ce se află la orice nivel de scalare, al cărei conținut de intensitate și contrast poate fi verificat.
Eficiența și rapiditatea metodei au fost demonstrate în cadrul mai multor colective de cercetare, permițănd controlul tuturor caracteristicilor la niveluri diferite ale scalării obținute cu aceleași resurse.
Aplicația urmată implementează un astfel de clasificator în cadrul unei aplicații software proprii.
3.3. Antrenarea rețelei
Pentru antrenarea rețelei s-a folosit algoritmul ADABOOST.
Se dă unde
Inițializare
Pentru:
Se caută clasificatorul :
, unde
Dacă atunci ne oprim.
Se alege , unde εt este rata de eroare pentru clasificatorul ht.
Se setează:
unde Zt este factorul de normalizare.
Clasificatorul final ce se obține:
Ecuația ce modifică distribuția Dt este construită după modelul:
După ce este selectat un clasificator optim pentru o distribuție tip , exemplele (xi), identificate corect de către clasificatorul au o pondere mai mică iar exemplele identificate incorect au ponderea mai mare.
Când algoritmul testează clasificatorii pentru o distribuție , se va selecta un clasificator ce identifică mai bine (exemplele) față de clasificatorul anterior.
3.4. Arhitectura aplicației
Fig. 3.4. Schema bloc a arhitecturii aplicației
3.5. Detalii folosite la implementare
Clasificatorii lucrează pe subimagini de 24*24 pixeli folosind doar unul din cele 3 canale de culori (RGB).
Detectarea se face prin mișcarea clasificatorilor deasupra imaginii și scalarea clasificatorilor cu un pas de 1.25.
Am folosit o rețea gata antrenată : haarcascade_frontalface_alt.xml.
Am scris codul sursă în C# pe baza framework-ului ACCORD. NET.
Fig.3.5.1 Interfața folosind imagini video achiziționatede la o camera web
Fig 3.5.2. Recunoasterea feței din profil, fără rotirea capului
Fig.3.5.3 Recunoaștere a feței din imagine video, obținută cu camera web, prin rotire a capului la dreapta cu 45 grade
Fig.3.5.4. Recunoaștere a feței din imagine video, obținută cu camera web, prin rotire a capului la dreapta cu 60 grade
Fig. 3.5.6. Recunoaștere a feței din imagine video, obținută cu camera web, prin rotire a capului la stânga cu 45 grade
Fig. 3.5.7. Recunoaștere a feței din imagine video, obținută cu camera web, prin rotire a capului la stânga cu 60 grade
3.7. Recunoașterea fețelor mai multor persoane
Capturile de ecran următoare surprind recunoașterea mai multor persoane dintr-o mulțime aglomerată.
Achiziția imaginilor s-a efectuat cu o cameră Panasonic SDR-570, iar la procesare au fost folosite screen shooturi extrase în format .jpg
Cele 30 de screen-shooturi realizate sunt anexate la Raport în vederea unor cercetări viitoare.
Fig. 3.5.8.Lansarea aplicației
Fig. 3.5.9.Interfața grafică pentru prelucrarea imaginilor din fișiere
Fig. 3.5.10. Selecția fișierelor din cadrul bazei de date realizată cu screen-shooturi extrase din imagini video
Fig.3.5.11. Recunoaștere 3 subiecți din grup SAM 1080016.jpg
Fig. 3.5.12. Recunoaștere 4 subiecți din grup SAM1080017.jpg
Fig. 3.5.13. Recunoaștere 4 subiecți din grup SAM1080020.jpg
CAPITOLUL 4.
Aplicație practică de detecție și recunoaștere a persoanelor folosind clasificatorii Haar si tehnologia biometrica de interpolare cubica
În prezentul Raport de cercetare am dorit obținerea unor performanțe de detecție a centroidului din privire cu aplicații directe în detectia feței. Am urmărit ca algoritmii utilizațisă poată fi implementați atât pentru procesarea imaginii cât și pentru îmbunătățirea calității acestora, prin extragerea informației utile și tehnici de fuziune decizională.
Fuziunea decizională poate permite atât exploatarea performanțelor detectorilor individuali cât și a spațiilor individuale saumodelelor asociate.
Pentru a evalua performanțele am pornit de la baza de date construită personal și care a fost prezentată detaliat în Raportul de cercetare nr. 3.
Aceasta oferă o diversitate de contexte și tipologii ale cazurilor de detecție a feței umane, fiind suficient de mare și care să includă o mare varietate de situații posibile. Majoritatea bazelor de date standardizate existente sunt dedicate aproape exclusiv algoritmilor de recunoaștere și conțin fețe achiziționate în diferite condiții de iluminare, orientare sau interval de achiziție [23].
În tabelul următor prezint o serie de baze de date utilizate frecvent în aplicații de recunoaștere a feței în domenii ca detecția, identificarea sau recunoașterea expresiilor faciale.
Tabelul 4.1 Baze de date publice utilizate pentru detecția și recunoașterea feței
Majoritatea bazelor de date publice ce urmăresc recunoașterea feței conțin ca și baza de date realizată personal imagini în care fundalul este recunoscut și uniform. Se observă din tabelul de mai sus că imaginile pe cae ar trebui să le conțină o bază de date trebuie să includă imagini de fețe cu dimensiuni între 48 x 64 și 128 x 172.
Domeniul unghiular de rotire a feței față de direcția de vizare este de ± 30 grade iar fețele frontale pot fi parțial obturate cu un procent de până 40% păstrând elementele de simetrie axială a feței.
Imaginile color din Baza de date personală conțin persoane de diferite rase, sexe, vârste,condiții de iluminare, context de fundal și procente de piele a corpului vizibile, surprinzand mai multe stări emoționale și de rotire/acoperire a capului/feței.
Privind acest din urmă aspect, contextul în care se pot regăsi imaginile ce conțin fețe este foarte variat, fața fiind delimitată de restul corpului de îmbrăcăminte, ochelari, etc. În această situație recunoașterea rezumându-se la detectarea regiunilor de piele. În acest caz este necesară utilizarea unui algoritm de detecție a pielii care pe lângă informația de culoare a pielii să utilizeze caracteristici suplimentare ale feței cum arfi detecția ochilor, gurii sau altor elemente comune feței.
Contează și invarianța caracteristicilor la toate tipurile de situații în care se poate regăsi fața (rotația acesteia sub un anumit unghi, expresia facială, obturarea) [24].
4.1. Detecția feței unei persoane
Detecția fețelor are ca principal scop identificarea fețelor umane si localizarea acestora in imagine, indiferent de parametric ca:
•Pozitie
•Scala
•Rotatie (in planul imaginii)
•Orientare (rotatie in afara planului imaginii)
•Iluminare
Detecția fețelor este prima etapa in sistemele de recunoastere automata a fețelor ,prima etapa in sistemele de “surveillance” . Are următoarele aplcabilități:
Folosita ca ipoteza in identificarea persoanelor, a corpului uman, a partilor corpului uman
Etapa de initializare in urmarirea (tracking-ul) fetelor sau a corpului in secvente de imagini Varietate mare de alte aplicatii
Dificultăți
•Dimensionalitatea mare a spatiului de trasaturi: Imagine grayscale (8 bits/pixel) de dim. 19 × 19 256361 = 28×361 = 22888 combinatii posibile ale intensitatilor
•Orientarea fetei (rotatia in afara planului imaginii) Axa capului verticala: frontal, profil, semiprofil Axa capului non-verticala •Rotatie (in planul imaginii / in jurul axei optice a camerei)
•Conditii variabile de achizitie a imaginilor: iluminare, parametri camerei (senzor, castig, rezolutie imagine, obiectiv)
•Ocluzii
•Expresia faciala: fata = obiect non-rigid cu aparenta variabila
•Prezenta / absenta elementelor structurale: ochelari, barba, mustata etc.
Evaluarea algoritmilor de detecție – parametri
Evaluarea algoritmilor de detecție a feței se realizează prin determinarea ratei de bună detecție (TPR) și a ratei de falsă detecție (FPR).
Rata de bună detecție indică procentul de pixeliai feței detectați de către algoritm, iar rata de falsă detecție indică procentul de pixeli care nu aparțin feței detectați ca fiind ai feței.
TPR = NTP / NTP + NFN, (4.1)
FPR = NFP / NFP + NTN, (4.2)
unde,
NTP este numărul de pixeli ai feței detectați corect (true positives),
NFN este numărul de pixeli ai feței nedetectați ( false negatives),
NFP este numărul de pixeli de tip non – față detectați ca fiind de tip față ( false positives), NTN este numărul de pixeli de tip non față corect nedetectați (true negatives).
Când algiritmul de detecție este dependent de un parametru, acesta va influențavariabil valori ale ratelor de detecție.
Caracterizarea algoritmului se poate realiza utilizând curba ROC (Relative Operating Characteristics), ce reprezintă in figura urmatoare dependența între TPR ȘI FPR în domeniul de variație al parametrului algoritmului [25,26].
Figura 4.1.1. Curba ROC (Relative Operating Characteristics)
Un alt parametru evaluat este procentul de detecție al pixelilor de piele ai feței (SDR) care este reaportul dintre numărul de pixeli de piele ai feței detectați NTP și numărul total de pixeli de piele din imagine N skin
SDR = NTP / N skin (4.3)
Obiectivele Raportului de cercetare sunt:
Identificarea problemelor conexe detecței fețelor
• Localizarea fetei – determinarea pozitiei unei singure fețe într-o imagine
• Detecția elementelor faciale componente – prezenta si locatia: ochi, sprancene, nas/nari, gura, buze, urechi etc.
• Recunoasterea / identificarea fetelor
• Recunoasterea expresiei faciale
O altă preocupare poate fi estimarea pozitiei corpului uman si urmarirea acestuia
Metode de detecție si localizare a feței
1. Metode bazate pe cunostiinte: – ex: relatii spatiale intre trasaturile faciale pe baza caracteristicilor antropomorfice
2. Bazate pe trasaturi invariante (la pozitie, orientare, perspectiva)
3. Metode bazate pe potrivirea de sabloane (template matching) – sabloane pentru intreaga fata sau pentru anumite parti
4. Metode bazate pe aparente – modele / template-uri invatate pe un set de imagini de antrenare care sa surprinda variabilitatea aprentelor faciale
Abordari specifice sursei de imagini:
– Imagini statice sau secvente video
– Imagini grayscale/colorTechnical University of Cluj Napoca Computer Science Department IOC Metode Resurse http://www.facedetection.com/
– BD de antrenament – aplicatii – documentatii
Aplicații recente abordează metoda bazată pe pe distriburtia de culoare specifica culorii pielii (model de culoare), respective pe analizal:
– rasa/etnie
– conditii de iluminare Spatii de culoare
– RGB, RGB normalizat, HSV, HIS, YCrCb, YIQ, UES, CIE, XYZ, CIE LIV
Analiza statistica – histograma, LUT, model gausiene sau mixturi de modele gaussiene
Capturile următoare din aplicația informatică realizată personal surprind recunoașterea feței unei persoane extrasă de pe un fundal specific mulțime aglomerată.
Achiziția imaginilor se face cu o cameră simplă web, fără performanțe.
Detecția feței bazată pe culoare și potrivire de șabloane în conjuncție cu metoda detecției ochilor și urmărirea direcției privirii.
Detecția ochilor și urmărirea direcției privirii a fost descrisă în referința bibliografică [21],[22]
4.2. Analiza direcției privirii
1. Obtinerea celor 2 imagini ale ochilor pe baza trasaturilor antopomorfice (regiunea ochilor trebuie să aibă înalțimea 1/8 din înălțimea totală a feței și lațimea 1/5 din lațimea totală a feței) 2 sub-imagini care conțin ochii din imaginea cu rezoluția cea mai mare (nivel 0). – Dimensiunea subimaginilor depinde de scala la care s-a gasit scalare la dimensiune fixa (60×80) pixeli prin interpolarefața bi-liniară.
Figura 4.2.1. Detecția centroidului din privire localizată pe harta elementelor feței analizate
2. Stabilizarea imaginilor ochilor (detectia si tracking-ul fetei nu este suficient de precis pt. miscari ale capului de cativa pixeli)
– Diferența dintre cadre succesive pentru a crea imagini binare de mișcare (background subtraction)
– Calculul momentelor de ordin 1 (centru de masa). Aceste puncte centroid sunt folosite pentru a estima locația ochilor in imaginea feței (precizie buna pt. imagini de rezolutie mica)
Figura 4..2.2. Reprezentare de urmărire a direcției privirii [22]
3. Comparatie intre ochiul stang si drept
Ochiul stâng si ochiul drept sunt comparați pentru a determina unde se uită utilizatorul:
– Imaginea ochiului stâng este pusă in oglindă (b) și este scăzută din imaginea (cochiului drept (a) & d).
– Dacă utilizatorul se va uita direct la cameră diferența este mică (d). Daca utilizatorul se uită în partea stângă, atunci ochiul pus în oglindă va părea ca se uită în partea dreaptă (b) iar diferenta (c) este evidenta.
-Diferentele de intensitate (cu semn) dintre imaginea ochiului drept si cel stang oglindit sunt proiectate (insumate) pe verticala masurarea directiei privirii
Figura 4.2.3. a)Ochiul drept (direcția de privire = stânga). b)Imagine în oglindă a ochiului stâng. c)Img. diferenta (fara semn): la privire îndreptată în stânga. d)Img. Diferenta (fara semn): la privire îndreptată înainte [22]
4.Măsurarea direcției privirii
Figura 4.2.4.Detecția privirii ochiului stâng [21]
Figura 4.2.5.Detecția privirii ochiului drept [21]
Există mișcare a ochilor:
Direcția mișcării:
4.3. Exemple de analiză și localizare a direcției privirii
Figura 4.3.1. Ilustrarea rezultatelor detecției privirii spre stânga
Figura 4.3.2. Ilustrarea rezultatelor detecției privirii spre dreapta
Figura 4.3.3.Ilustrarea rezultatelor detecției privirii către centru
4.4. Algoritmul de localizare a pupilei
Figura 4.4.1. Schema bloc a algoritmului de localizare al pupilei
Estimarea direcției privirii
Estimarea direcției privirii în aplicația realizată personal comportă două etape principale: –- – detecția și urmărirea feței,
– detecția direcției ochilor
1. Detectie fete (Viola Jones / OpenCV)
2. Detectie pozitie ochi (Viola Jones) + validare trasaturi antropomorfice. Initializare sablon ochi.
3. Urmărirea feței (tracking prin potrivire de șabloane (MatchTemplate / OpenCV)
4. Detecția și urmărirea pupilei
Alternativa la pasul 3: CAMSHIFT / OpenCV
Figura 4.4.2.Schema de antrenare a algoritmului pentru detecția centroidului privirii
Algoritmul propriu zis
Algoritmul specific utilizat în cadrul aplicaței este acela folosind detecția centroidului feței, având structura din figura următoare și fiind descris de ecuațiile următoare, unde S este pragul utilizat pentru discriminarea pupilei.
(4.4.)
Fuziunea decizională a detectorilor
Fuziunea decizională are rolul de a genera o decizie finală pe baza deciziilor detectorilor individuali . Fuziunea se realizează adaptive, determinându-se coeficienții de ponderare ai deciziilor α(i) pentru fiecare din imaginile analizate, ce pun în evivență performanțele de detecție în funcție de contextul imaginii analizate, relația 4.5
, (4.5)
unde este decizia finală, suni ponderile detectorilor pentru imaginea curentă, iar sunt deciziile detectorilor individuali.
Procedeul presupune extragerea din imaginea analizată a unei serii de caracteristici cu ajutorul cărora blocul de calcul al ponderilor determină care clasificatori se comport optim pentru contextual respectiv.
La final, metadecizia este luată prin însumarea ponderată a deciziilor individuale, conform reprezentării din figura următoare. Procedeul se numește și combinare a priori a clasificatorilor.
Figura 4.4.3. Schema bloc a modulului de fuziune a priori a detectorilor de segmentare a regiunilor feței
În procesul de determinare a coeficienților detectorilor individuali, una din caracteristici este aceea a distribuției culorilor dominante din setul se imagini analizate, exprimate sub forma unei matrice = de dimensiune = 3, unde este numărul de culori reținute din imaginea i și a vectorului histogramei normalizate a culorilor.
, (4.6)
unde, este posibilitatea apariției culorii în imaginea i, iar este numărul de pixeli din imaginea i având culoarea .
Determinarea culorilor dominante se face prin recuantizarea imaginii analizate pe un număr de culori folosind tehnici cum ar fi cuantizarea uniformă sau aceea de tip median cut‚ [27,28].
Problema de detecție a feței se întâlnește în cazul unor imagini ce conțin o regiune centrală de interes ce include fața și regiunea de fundal. Informațiile din acestea se pot utiliza sub forma valorilor medii ale regiunii de interes și a regiunii de fundal.
Regiunile sunt obținute prin determinarea imaginii medii a setului de date și apoi prin aplicarea unui prag pentru delimitarea celor doua regiuni.
Cele două valori analizate sunt intrări pentru modulul de fuziune decizională.
Blocul de selecție al expertului este construit sub forma unei rețele neuronale de tip feed-forward, la intrările căreia se află seturile caracteristici extrase din imaginile analizate, iar ieșirile permițând selecția unui singur expert sau ponderi de importanță a experților.
Antrenarea bazei de date s-a realizat cu ajutorul clasificatorului Viola-Jones și a celui de detecție a centroidului din privire.
Rezultatele obținute din experimente cu ajutorul combinării experților arată faptul că informația globală de culoare a imaginii de intrare sau cea dominantă, ori cele medii ce rezultă din regiunea de interes și regiunea de fundal (ROI) este un criteriu valid pentru selecția spatiului de culoare în care se face segmentarea culorii feței.
Totodată, rezultă că detecția feței este dependentă de contextul imaginii.
Rezultate ale unor cercetări recente [24] au condus la obținerea urmatoarelor rezultate:
Tabel 4.2. Rezultatele detecției regiunilor feței prin selecție a priori
Combinarea a posteriori a clasificatorilor se bazează pe determinarea rezultatelor pentru fiecare clasificator individual, și selectarea celui mai bun rezultat după criterii ca uniformitatea imaginilor binare obținute în procesul de detecție [24].
Aceasta presupune că detecția este optimă când se face distincție între regiunea de fundal și regiunea corespunzătoare feței.
Această variantă presupune existența unui minim de variație a imaginii, ce poate fi caracterizată cu ajutorul detecției de imagine aplicată peste rezultatul binar al detecției.
Suma normată a pixelilor corespunzători marginilor din imagine este folosită ca și criteriu de selecție al rezultatului obținut pe baza valorii minime ce a rezultat.
O detaliere a acestui procedeu este reprezentată în schema bloc din figura 4.4.4.
e (I) = , (4.7)
unde, edge (I) este imaginea rezultată ca urmare a detecției de margine ce se aplică imaginiiI, iar N este numărul total de pixeli din imagine.
Figura 4.4.4. Schema bloc a modulului de fuziune a posteriori a detectorilor de segmentare a culorii feței
Tabelul 4.3. Rezultatele detecției regiunilor feței prin selecție a posteriori
Se observă că performanțele detecției brute sunt aproximativ identice cu ale celor mai buni detectori individuali, față de detecția ce prezupune corecția zgomotului unde performanțele sunt superioare. Ca urmare selecția a posteriori a celui mai bun clasificator pe baza informației furnizate de detecția de margine este justificată de validitatea criteriului.
Segmentarea folosind culoarea feței nu este suficientă pentru a permite o detecție precisă a fețelor datorită varietății mari a culorilor existente în imagini însă cercetările au dovedit că acesta poate fi un criteriu pentru determinarea regiunilor posibil a conține fețe.
Aceasta a condus la ipoteza folosirii unor criterii suplimentare pentru determinarea caracteristicilor unei fețe cum ar fi analiza ochilor in conjuncție cu celelalte alemente ale feței.
Rezultatele obținute cu ajutorul detectorilor individuali ai feței nu sunt satisfăcători datorită variațiilor mari de performanță în funcție de contextul imaginilor, astfel încât un detector cu rezultate foarte bune pentru un anumit tip de imagine poate genera rezultate total nesatisfăcătoare pentru alt tip de imagine.
Această motivație a constituit punctul de plecare al experimentului pornind de la mixturi de experți, prin evaluarea performanțelor individuale ale fiecărui clasificator și realizarea unei metode de fuziune decizională cu luarea în considerație a informației a priori de context a imaginii și a informației a posteriori.
Rezultatele obținute înglobând cele doua tehnici de fuziune decizională sunt superioare fiecărui detector individual în parte, astfel pentru baza de date realizată obținându-se o rată de detecție corectă de peste 95% și o rată de corecție falsă de pâna la 15%, față de un procent de cca 25% pentru rata de falsă detecție a celui mai bun clasificator individual.
De menționat că algoritmii pot fi rafinați prin introducerea unor criterii suplimentare de detecție a unor caracteristici faciale continute în expresii faciale ale subiecților.
4.5. Descrierea aplicației
Aplicatia a fost realizata pornind de la libraria de clasificatori HAAR implementata folosind tehnologia interpolarii cubice prin funcții predefinite splin.
Programul ruleaza independent si necesită instalarea Microsoft Visual Studio 2013 (free), fiind realiyat in limbajul de programare C Sharp.
Considerentele principale care au stat la baza alegerii acestuia a fost viteza de prelucrare faorte rapida, catre timp real, si meniul accesibil de operare/programare.
Pasi de programare:
1. Declararea tuturor variabilelor, obiectelor si vectorilor de imagine
Image<Bgr, Byte> currentFrame; //** Cadrul curent al imaginii faciale
Capture grabber; //** variabila care pastreaza imaginea captata
HaarCascade face; //** clasificatorul pentru facial
HaarCascade eye; //** clasificatorul pentru ochi
-Definirea tipului de font
MCvFont font = new MCvFont(FONT.CV_FONT_HERSHEY_TRIPLEX, 0.5d, 0.5d); //** tipul de font si dimensiune ce o sa fie afisat deasupra imaginii
-definirea imaginilor rezultate dupa detectie precum si aceea ce urmeaza a fi inregistrata in baza de date
Image<Gray, byte> result, TrainedFace = null; //** imaginea rezultat si imaginea ce urmeaza a fi captata si inregistrata in baza de date
Image<Gray, byte> gray = null; //** sunt stocate diferentele de gri ale imaginiii
-generarea unui vector cu toate imgaginile adaugate
List<Image<Gray, byte>> trainingImages = new List<Image<Gray, byte>>(); //** un vector cu toate imaginile (subiecti) care urmeaza a fi adaugate in baza de date
-generare vector pentru etichetare subiecti
List<string> labels= new List<string>(); //** vector pentru etichetarea persoanelor
List<string> NamePersons = new List<string>(); //** vector cu numele persoanelor
int ContTrain, NumLabels, t; //** contoare pentru numarul de persoane care urmeaza a fi salvate (ContTrain), pentru etichete (NumLabels), pentru fiecare fata detectata se trece la pasul urmator (t)
string name, names = null; //** variabile de tip string (sir de caractere) pentru salvarea numelui si a numelor persoanelor.
2. Incarcarea clasificatorului pentru detectie frontala a fetei si ochilor de tip Haar Cascade
//** incarcare clasificator pentru detectie frontala a fetei
face = new HaarCascade("haarcascade_frontalface_default.xml");
//eye = new HaarCascade("haarcascade_eye.xml");
-incarcarea fetelor deja existente si etichetarea fiecareia dintre ele
– definire mesaje din box:Nu exista nimic salvat (binar) in baza de date, va rog sa adaugati cel putin un subiect cu caracteristici faciale", "Incarcarea fetelor si antrenarea lor", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
– initializare camera pentru captare (deschiderea camerei)
– initializare contor de antrenare al fetelor
– obtinerea unui cadru gri de la dispozitivul de captare (Camera)
– initializarea detectorului facial Emgu pentru procesarea imaginilor
3. Definirea actiunii pentru fiecare element detectat
4. Redimensiunea fetei detectate ca imagine pentru compararea fortata a aceleiasi dimensiuni cu imaginea de test folosind interpolare cubica.
-afisarea fetei adaugate intro scala gri
– salvarea intrun fisier de tip text a fetelor antrenate
-scrierea etichetelor a fetelor antrenate intrun fisier text pentru incarcari si detectari ulterioare
-predefinire mesaje box : " a fost detectata si adaugata.", "Trainingul a fost efectuat cu succes", "Activatia dectarea fetei mai intai.", "Trainingul a esuat.",
5. Obtinem cadrul curent de la dispozitivul de captare
– convertim imaginea obtinuta la scala gri
-folosind Detectorul facial MCvAvgComp definim actiunea pentru fiecare element rezultat in urma clasificarii HAAR prin trasarea (reprezentarea) fetei detectate in canalul 0 al culorii gri folosind culoarea albastra.
-se face apel la Clasa TermCriteria care se foloseste la recunoasterea imaginilor antrenate cu un numar maxim de antrenari (variabila maxIteration).
-se defineste obiectul de recunoastere al vectorului facial comun
-trasam cate o eticheta pentru fiecare fata detectata si recunoscuta.
– stabilim numarului de fete detectate in scena
-setam regiunea de interes a fetei
– sunt concatenate numele persoanelor recunoscute si afisarea lor
6. Afisarea fetelor procesate si recunoscute
– eliberarea listei (vectorului) de nume
4.6. Specificații ale programului informatic
Aplicatia poate fi accesata din C:\Users\boss\Desktop\FaceRecProOV\bin\Debug
In C:\Users\boss\Desktop\FaceRecProOV\bin\Debug\TrainedFaces se gasesc imaginile rezultate dupa detectie precum si cele ce urmeaza a fi inregistrata in baza de date
In EigenObjectRecognizer.cs se gaseste codul sursa folosit pentru recunoasterea fiecarui obiect prin metoda PCA (Principle Components Analysis)
In Main Form.cs din Anexa se gaseste codul sursa al intregii aplicatii
In Resources sunt prevazute posibilitati de inserare a unor imagini/baze de date format .gif
Aplicatia functioneaza foarte bine pentru urmatoarele resurse: processor dual core 2x 2.4Gz,
Ram 2 G. O calitate foarte buna a imaginilor achizitionate depinde de folosirea unei camera web de calitate.
Conditiile de iluminare in care s-au realizat experimentele arata ca aceasta nu este critica, insa performante de recunoastere superioare se pot obtine cu o iluminare buna a subiectilor.
Detectia si recunoasterea acestora presupun achizitia de imagini fixe, ceea ce din punct de vedere militar impune luarea unor masuri tehnice ex. puncte de control access au zone special amenajate.
4.7. Rezultate obținute
In cadrul cercetarilor am realizat mai multe experimente:
1.Am introdus si analizat imagini achizitionate cu camera web
2. Am introdus fotografii din cele doua baze de date personale.
De mentionat faptul ca aplicatia permite recunoasterea fetelor persoanelor din fotografii, cu conditia etichetarii prealabile a acestora (actiuni politienesti)
Detectia si recunoasterea persoanelor in cadrul sistemelor militare de supraveghere a obiectivelor/accesului in acestea, perimetre cu acces restrictionat
Experiențele efectuate pe categorii de fețe, altele decât umane precum și pe obiecte de fundal de diferite nuanțe, forme și mărimi au demonstrat o bună selectivitate a algoritmului ADABOOST la recunoașterea feței umane.
Aplicația nu creează confuzii între clase de fețe și permite o buna implementare pentru recunoașterea feței umane.
Figura 4.7.1. Captura de ecran cu eticheta unei persoane recunoscute din baza de date
Figura 4.7.2. Captura de ecran cu imaginea achizitionata in baza de date a subiectului nr. 6
Figura 4.7.3. Captura de ecran cu subiectul nr 5 identificat
Figura 4.7.4. Captura de ecran cu locatia unde se regaseste subiectul etichetat cu nr 5
Figura 4.7.5. Captura de imagine video recunoscuta dupa antrenare cu numele subiectului
Figura 4.7.6. Captura de ecran 3 subiecti detectati din baza de date
din multimi aglomerate si localizarea lor
Figura 4.7.7. Captura de ecran 4 subiecti detectati din baza de date
din multimi aglomerate si localizarea lor
Figura 4.7.8. Captura de ecran 2 subiecti detectati din baza de date
din multimi aglomerate si localizarea lor
Figura 4.7.9. Captura de ecran 1 subiect detectat din baza de date
din multimi aglomerate si localizarea lui
Figura 4.7.10. Captura de ecran 2 subiecti detectati din baza de date
din multimi aglomerate si localizarea lor pe fundal intunecat si miscarea subiectilor
Figura 4.7.11. Captura de ecran cu subiectul nr 24 din baza de date recunoscut in 6 stari faciale: cu ochelari, incruntat/maniat, trist,surprins, vesel. Iluminare: semiintuneric
CAPITOLUL 5
Concluzii și perspective
Stidiile și experiențele effectuate în prezentul Raport de cercetare au avut ca scop principal determinarea de noi metode și tehnologii biometrice de prelucrare digital a imaginii pentru îmbunătățirea unei anumite clase de algoritmi utiliyați în detecția și recunoașterea feței umane.
În cele trei aplicații practice am orientat cercetarea către doua obiective:
– prelucrarea imaginii pentru detecția feței și,
– prelucrarea imaginii pentru recunoașterea feței.
5.1. Concluzii privind prelucrarea imaginii pentru detecția feței
Experiențele au avut ca scop determinarea unor metode pentru îmbunătățirea algoritmilor actuali pentru determinare a regiunilor feței din fotografii sau imagini fixe, în scopul detectării feței în acestea.
Întrucât utilizarea unor algoritmi bazați pe un anumit model sau spațiu de culoare poate conduce la rezultate diferite în funcție de contextul nivelului de informație conținut în imaginea achiziționată am urmărit îmbunătățirea performanțelor acestora prin tehnici mixte ce presupun fuziunea decizională.
Dacă în Raportul de cercetare nr 3 am urmărit determinarea performanțelor specifice fiecărui detector individual în acest Raport am căutat folosirea unei metode mixte care să conducă la o rată de recunoaștere maximă realizată într-un timp de prelucrare real.
Folosind aplicația care implementează algoritmul personal de detecție al centroidului privirii în conjunctie cu algoritmii implementați prin metoda Viola-Jones sunt superioare din punct de vedere al ratei de detecție (TPR) și falsă detecție (FPR) față de clasificatorii folosiți individual.
Astfel s-au obținut rate maxime de bună detecție de peste 95% și rate de falsă detecție de până 15%.
Față de aceste rezultate cel mai bun clasificator individual permitea obținerea unuei rate de false detecție de 24.98%, care presupunea regiuni suplimentare detectate incorect ca fiind asociate pielii umane din imaginea analizată.
Contribuții personale
1. Construcția unei baze de date care să conțină o mare varianță a tipului pielii, contextului iluminării și poziției subiecților în scenă precum și a unor stări fizionomice specifice.
2. Evaluarea performanțelor clasificatorilor pentru baza de date propusă
3. Realizarea a trei aplicații informatice care să implementeze cele mai performante metode de detecție a feței
4. Implementarea în cadrul unei aplicații a unui algoritm personal de detecție a feței în conjuncție cu cel mai eficient clasificator individual implementat prin metode Viola- Jones.
5. Evaluarea performanțelor acestor aplicații informatice prin detecția persoanelor în mulțimi aglomerate
5.2.Concluzii privind prelucrarea imaginii pentru recunoașterea feței
Studiul aplicativ a avut ca scop obținerea unei aplicații software pentru recunoașterea în timp real a persoanelor individuale sau din mulțimi aglomerate implementand un algoritm propriu împreună cu cel mai performant recunoscut prin metoda Viola Jones.
Am experimentat metoda implementând algoritmul ADABOOST, VIOLA-JONES, și VIOLA-JONES ]n conjuncíe cu un algoritm personal pentru recunoașterea centroidului din privire în cadrul mai multor aplicații.
Rezultate obținute:
1. Metoda implementând algoritmul Viola-Jones și clasificatori predefiniți în framework-ul ACCORD.NET în cadrul unui sistem informatic distribuit permit un timp de prelucrare acceptabil de cca. 130 secunde.
Folosind însă algoritmul ABABOOST timpul de prelucrare este real, rata de recunoaștere este de peste 90% și se permite detecția a peste 6060 layere.
2. Aplicația folosind ADABOOST permite depistarea fețelor orientate cu ungiuri mai mari de până la 60 grade față de poziția normal, frontal de achiziție a imaginii video, față de prima aplicație ce oferă rezultate pentru orientarea feței până la maxim 30 grade față de poziția frontală.
3. Rezultatele implementând a doua metodă demonstrează că nu se creează confuzii la recunoaștere între clase de persoane, facându-se o foarte bună separare între achiziția și prelucrarea datelor de la subiecți umani, animale sau obiecte de pe fundal.
4. Folosind implementarea in Microsoft Visual Studio,detecția și recunoașterea feței se face în timp real, nu se fac întârzieri datorate prelucrării matematice ca de ex. la Matlab, și se obțin rezultate net superioare față de acesta.
5. Folosind aplicația care implementează algoritmul personal de detecție al centroidului privirii în conjunctie cu algoritmii implementați prin metoda Viola-Jones au rezultat niveluri superioare din punct de vedere al ratei de detecție (TPR) și falsă detecție (FPR) față de clasificatorii folosiți individual.
Astfel s-au obținut rate maxime de bună detecție de peste 95% și rate de falsă detecție de până 15%.
Față de aceste rezultate cel mai bun clasificator individual permitea obținerea unuei rate de false detecție de 24.98%, care presupunea regiuni suplimentare detectate incorect ca fiind asociate pielii umane din imaginea analizată.
6. Recunoașterea fețelor persoanelor în mulțimi aglomerate este permisă atât pe un fundal iluminat normal, uniform cât și pe un fundal accidentat, inconjurat de obiecte în semiîntuneric.
7. Aplicația ce implementează algoritmul personal permite recunoașterea a 6 stări emoționale asociate subiectului, inclusiv recunoașterea acestuia purtând ochelari, făra a se face confuyie cu alte clase de subiecți.
6. Toate aplicațiile informatice permit prelucrarea datelor stocate sub formă de fotografii în format .jpg, .png sau .bmp dar și a imaginilor video fixe, în timp real furnizate de o cameră video.
8. Comparația și rezultatele practice obținute conduc la recomandarea programului informatic pentru aplicații de supraveghere militare ce presupun detecția persoanelor în mulțimi aglomerate, manifestații sportive, cultural, religioase, detecția persoanelor date în consemn la frontieră, a persoanelor suspecte sau urmărite ce fac obiectul acțiunilor militare sau Poliției.
9. Prelucrarea imaginilor este un domeniu complex și foarte dinamic, cu numeroase aplicații în diverse domeniul militar. Optimizări ulterioare ale aplicației pot permite extragerea informațiilor utile din imagine și pot îmbunătăți procesul de extragere și analiză.
10. Aplicația optimizată a fost testată în aplicații operative pentru depistarea persoanelor ce fac obiectul misiunilor Jandarmeriei sau Poliției, precum și a celor date în consemn la frontieră în mulțimi aglomerate – obținându-se rezultate foarte bune din punct de vedere operativ.
Concluzii negative
1. Recunoașterea persoanelor prin aplicația descrisă este condiționată de orientarea feței acestora la un unghi de 30 sau 60 de grade față de obiectiv, în prima respectiv în ultima aplicație.
2. Influențează negativ și nu se poate realiza recunoașterea atunci când subiecții au fața acoperită, poartă barbă sau au fața puternic aplecată către pământ, ori fiind obturată în mare parte de către alte imagini.
Acestea pot constitui însă puncte de plecare către viitoare cercetări implementând recunoașterea și analiza feței în conjuncție cu alte metode, de exemplu, pentru imagini achiziționate de la distanțe foarte mici, procedeul de recunoaștere a irisului.
5.3. Perspective și oportunități de cercetare
2. Analiza rezultatelor prin metoda implementând algoritmul Viola-Jones și clasificatori predefiniți în framework-ul ACCORD.NET în cadrul unui sistem informatic distribuit a scos în evidență aspecte negative, ce nu permit recunoașterea obiectelor din imagini, ca:
• Imposibilitatea de a depista fețe sunt sub un unghi de rotire mai mare de 60 grade.
• Probleme de luminozitate și contrast
• OpenCV folosit în prima aplicație nu permite recunoașterea de imagini cu rezoluții mici, față de a doua aplicație ce permite recunoașterea folosind o gamă largă de rezoluții începand de la 90 x 120 pixeli.
3. Prima aplicație nu recunoaște toate fețele din imagini, fiind observate fețe în plus acolo unde nu erau și nu au fost găsite fețe acolo unde ele existau.
În comparație cu aceasta, cea de a doua aplicație permite detecția tuturor fețelor, având o rată de recunoaștere de peste 95%
4. Achiziția fotografiilor și imaginilor presupune realizarea acestora de la distanțe de 10-15 metri, frontal sau la 60 de grade fata de subiecții vizati.Performanțele pot fi crescute prin folosirea unor teleobiective sau care implementează zoom optic.
5. Algoritmii pot fi ulterior rafinați prin introducerea de criterii suplimentare specifice de detecție a feței, precum algoritmi de căutare a expresiei caracteristicilor faciale, specific stărilor emoționale.
Contribuții personale
1. Realizarea a două baze de date, cu fotografii și imagini video
2. Realizarea unei aplicații informatice pentru detectia si recunoașterea fețelor umane, achiziționate în mulțimi aglomerate, pe fundal variat și cu iluminare medie, care să răspundă cerințelor de a fi implementate pe un terminal portabil
3. Implementarea unor algoritmi robuști, și clasificatori recunoscuți pentru eficacitatea acestora în cadrul aplicației experimentale
4. Propunerea procedeului de segmentare cu prag și de determinare a centroidului imaginii în cadrul unor cercetări viitoare
5. Prezentarea comparativă a rezultatelor unor experiențe și optimizarea celei ce prezintă cele mai bune rezultate
Performante realizate
1. Realizarea unei recunosteri a fetelor persoanelor din imagini fixe in timp real
2. Implementarea pe un terminal portabil disponibil pentru aplicatii operative
3. Obtinerea unei rate de recunoastere de 100%
4. Afisarea similitudinilor fetelor subiectilor cu altii din baza de date
5. Creearea de oportunitati pentru implementare in diferite aplicatii militare
6. Prin implementarea algoritmului de centroid implementat pentru determinarea centrului de imagine descris in fig. 2.8.2., aplicatia personala permite identificarea a 6 stari faciale asociate imaginii subiectului achizitionate in conditii normale, respectiv: cu ochelari, incruntat/maniat, trist,surprins, vesel. Iluminare: semiintuneric
Bibliografie
[1] C.Bishop: Neural Networks for Pattern Recognition, Oxford Press London, 1995
[2] EDomany: Models of neural networks, Adisson-Wesley Publishing Co., 1995
[3] D Dumitrescu, C.Hariton: Retele neuronale.Teorie si aplicatii,Editura Teora, Bucuresti,1996
[4] J.D.Goldberg: Genetic Algoritms in Search, Optimization and Machine Learning, Adisson-Wesley, New York,1989
[5] V.Neagoe: Teoria recunoasterii formelor, Editura Academiei Romane, Bucuresti,1992
[6] V.Neagoe s.a.- Recunoasterea formelor si retele nerale. Algoritmi fundamentali, Editura Matrix Rom, Bucuresti,1998
[7] D.White: A genetic Algorithm for Searching Topology and Weight Spaces in Neural Network Design, Dissertation at the University of Maryland, 1993
[8] V.E. Neagoe and A.C. Mugioiu, "A fully neural approach to color facial
image recognition", Proc. of the World Automation Congress, 2008 (WAC
2008), International Symposium on Soft Computing in Industry
[9] http://www.victorneagoe.com/university/prai/lab3a.pdf
[10] drd. Marian Dorin PÎRLOAGĂ, gl.bg.(r.), prof.univ.dr.ing.Emil CREȚU, col.(r.), prof.univ.dr.ing. Ciprian RĂCUCIU, Analysis and implementation methods of pattern recognition applications using video The International Conference Strategies, technologies, military applications, simulation and resources, 13-14 nov. 2014, Vol.2 pp204-216, ISSN 2285-8415, ISSN-L 2285-8318
[11] drd. Marian Dorin PÎRLOAGĂ, gl.bg.(r.),prof.univ.dr.ing. Emil CREȚU, col.(r.), prof.univ.dr.ing. Ciprian RĂCUCIU, Optimization of biometric technologies for military applications using the recognition of faces, The International Conference Strategies, technologies, military applications, simulation and resources, 13-14 nov. 2014, Vol.2 pp216-228, ISSN 2285-8415, ISSN-L 2285-8318
[14] Mircea Petic, Inga Țițchiev, Grigorii Horoș, the International Conference on Microelectronics and Computer Science, Chisinau, Republic of Moldova, October 22-25, 2014
[15] I. Dzițac, G. Moldovan, Sisteme distribuite modele informatice, Editura Universității Agora, Oradea, 2006, 146 p.
[16] I. Țițchiev, M. Petic, V. Macari, Posibilități de procesare paralelă ale imaginilor prin intermediul funcțiilor OPENCV, Conferința internațională științifico-practică ”Dezvoltarea inovațională din Republica Moldova: problemele naționale și tendințele globale”, 7-8 noiembrie, pp.589-591, 2013, ISBN 978-9975-4266-0-2.
[17] T. Pavlidis, Algorithms for Graphics and Image Processing, Computer Science Press, 1982.
[18] Gary Bradski and Adrian Kaehler, Learning OpenCV, O’Reilly Media, 2008, pp 524-526
[19] R. Laganière. Computer Vision Application Programming Cookbook. BIRMINGHAM –
MUMBAI. First published: May 2011. ISBN 978-1-849513-24-1
[20]C.G. Vasile, “Iris recognizing. General prezentation and applications, results obtained with an experimental model”, The XXXII Communication Session of Institute for Advanced Technologies, Bucharest, 2004
[21] X.K. Wang, X. Mao, C.D. Căleanu,"Nonlinear Shape-Texture Manifold Learning", IEICE Transactions on Information and Systems, vol. E93-D, no. 7, pag. 2016-2019, Iulie 2010.
[21] B. Kisacanin, V. Pavlovic, T.S. Huang, Real-Time Vision for Human-Computer Interaction, Springer 2005, pp. 141-157, “A Real-Time Vision Interface Based on Gaze Detection — EyeKeys”, John J. Magee
[22] M. Ciesla Michal, P. Koziol, Eye Pupil Location Using Webcam, http://arxiv.org/abs/1202.6517
[23]Phillips,P.J., Moon, H.Rizvi, S.A., Rauss P.J., The Feret EvaluationMethodology for face recognitionAlgoritms, IEEE Transactionson PatternAnalysisand MachineIntelligence 22, 10 ( Oct 2000), 1090-1104.
[24] Oancea Roxana, Contribuții privind prelucrarea imaginilor, Teză de doctorat -2011.
[25] T Fawcett, Roc Graphs: Notes and practical considerations for researchers technical report, HPL-2003-4, HP Laboratory, 2004.
[26] T Fawcet, An introductionto ROC Analysis, Pattern recognition letters 27 (2006), 861-874
[27] Heckbert P.S., Color Image Quantization for frame buffer display, BsC Thesis, Massachusets Institute of Technology Dept of Mathematics, Cambridge, MA USA, 1980
[28] Wong K, Chey C.H., LIU T.S. and Po L.M., Dominant color image Retrieval using merged histogram. In Proceedings of the 2003 International Symposium an Circuits and Systems (ICAS), Bangkok, Thailand, May 2003, vol.2, pp. 908-911
[29] drd. Marian Dorin Pîrloagă, PCA versus LDA in implementing neural classifiers for face recognition, în curs de publicare MTA REVIEW Vol. XXV, No. 1, Mar. 2015
[30] drd. Marian Dorin Pîrloagă, PCA versus LDA in implementing neural classifiers for face recognition, în curs de publicare MTA REVIEW Vol. XXV, No. 1, Mar. 2015
[31] drd. Marian Dorin Pîrloagă, prof. univ. dr.ing. Ciprian Răcuciu, prof. univ. dr.ing. Emil Crețu, Recognition of faces in the crowd using biometric technologies mixed – SEA CONF 2015, în curs de publicare Buletinul științific al ANMB 2015
Anexa 1
Codul sursă
//Autor: Marian Dorin Pirloaga
//Data ultimei actualizari: 16.02.2015
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.CvEnum;
using System.IO;
using System.Diagnostics;
namespace MultiFaceRec
{
public partial class FrmPrincipal : Form
{
//Declararea tuturor variabilelor, obiectelor si vectorilor de imagine
Image<Bgr, Byte> currentFrame; //** Cadrul curent al imaginii faciale
Capture grabber; //** variabila care pastreaza imaginea captata
HaarCascade face; //** clasificatorul pentru facial
HaarCascade eye; //** clasificatorul pentru ochi
MCvFont font = new MCvFont(FONT.CV_FONT_HERSHEY_TRIPLEX, 0.5d, 0.5d); //** tipul de font si dimensiune ce o sa fie afisat deasupra imaginii
Image<Gray, byte> result, TrainedFace = null; //** imaginea rezultat si imaginea ce urmeaza a fi captata si inregistrata in baza de date
Image<Gray, byte> gray = null; //** sunt stocate diferentele de gri ale imaginiii
List<Image<Gray, byte>> trainingImages = new List<Image<Gray, byte>>(); //** un vector cu toate imaginile (subiecti) care urmeaza a fi adaugate in baza de date
List<string> labels= new List<string>(); //** vector pentru etichetarea persoanelor
List<string> NamePersons = new List<string>(); //** vector cu numele persoanelor
int ContTrain, NumLabels, t; //** contoare pentru numarul de persoane care urmeaza a fi salvate (ContTrain), pentru etichete (NumLabels), pentru fiecare fata detectata se trece la pasul urmator (t)
string name, names = null; //** variabile de tip string (sir de caractere) pentru salvarea numelui si a numelor persoanelor.
public FrmPrincipal()
{
InitializeComponent();
//** incarcare clasificator pentru detectie frontala a fetei
face = new HaarCascade("haarcascade_frontalface_default.xml");
//eye = new HaarCascade("haarcascade_eye.xml");
try
{
//Load of previus trainned faces and labels for each image
//** incarcarea fetelor deja existente si etichetarea fiecareia dintre ele
string Labelsinfo = File.ReadAllText(Application.StartupPath + "/TrainedFaces/TrainedLabels.txt");
string[] Labels = Labelsinfo.Split('%');
NumLabels = Convert.ToInt16(Labels[0]);
ContTrain = NumLabels;
string LoadFaces;
for (int tf = 1; tf < NumLabels+1; tf++)
{
LoadFaces = "face" + tf + ".bmp";
trainingImages.Add(new Image<Gray, byte>(Application.StartupPath + "/TrainedFaces/" + LoadFaces));
labels.Add(Labels[tf]);
}
}
catch(Exception e)
{
//MessageBox.Show(e.ToString());
MessageBox.Show("Nu exista nimic salvat (binar) in baza de date, va rog sa adaugati cel putin un subiect cu caracteristici faciale", "Incarcarea fetelor si antrenarea lor", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
private void button1_Click(object sender, EventArgs e)
{
//** initializare camera pentru captare (deschiderea camerei)
grabber = new Capture();
grabber.QueryFrame();
//** initializarea evenimentului de captare
Application.Idle += new EventHandler(FrameGrabber);
button1.Enabled = false;
}
private void button2_Click(object sender, System.EventArgs e)
{
try
{
//** contorul de antrenare al fetelor
ContTrain = ContTrain + 1;
//** obtinerea unui cadru gri de la dispozitivul de captare (Camera)
gray = grabber.QueryGrayFrame().Resize(320, 240, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
//** detectorul facial
//** Emgu este folosit pentru procesarea imaginilor
MCvAvgComp[][] facesDetected = gray.DetectHaarCascade(
face,
1.2,
10,
Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
new Size(20, 20));
//Actiunea pentru fiecare element detectat
foreach (MCvAvgComp f in facesDetected[0])
{
TrainedFace = currentFrame.Copy(f.rect).Convert<Gray, byte>();
break;
}
//** redimensiunea fetei detectate ca imagine pentru compararea fortata a aceleiasi dimensiuni cu imaginea de test
//** folosind interpolare cubica.
TrainedFace = result.Resize(100, 100, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
trainingImages.Add(TrainedFace);
labels.Add(textBox1.Text);
//** afisarea fetei adaugate intro scala gri
imageBox1.Image = TrainedFace;
//** Salvarea intrun fisier de tip text a fetelor antrenate
File.WriteAllText(Application.StartupPath + "/TrainedFaces/TrainedLabels.txt", trainingImages.ToArray().Length.ToString() + "%");
//** Scrierea etichetelor a fetelor antrenate intrun fisier text pentru incarcari si detectari ulterioare
for (int i = 1; i < trainingImages.ToArray().Length + 1; i++)
{
trainingImages.ToArray()[i – 1].Save(Application.StartupPath + "/TrainedFaces/face" + i + ".bmp");
File.AppendAllText(Application.StartupPath + "/TrainedFaces/TrainedLabels.txt", labels.ToArray()[i – 1] + "%");
}
MessageBox.Show("Fata lui: " + textBox1.Text + " a fost detectata si adaugata.", "Trainingul a fost efectuat cu succes", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch
{
MessageBox.Show("Activatia dectarea fetei mai intai.", "Trainingul a esuat.", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
void FrameGrabber(object sender, EventArgs e)
{
label3.Text = "0";
//label4.Text = "";
NamePersons.Add("");
//** Obtinem cadrul curent de la dispozitivul de captare
currentFrame = grabber.QueryFrame().Resize(320, 240, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
//Il convertim la scala gri
gray = currentFrame.Convert<Gray, Byte>();
//Detectorul facial
MCvAvgComp[][] facesDetected = gray.DetectHaarCascade(
face,
1.2,
10,
Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
new Size(20, 20));
//Actiunea pentru fiecare element
foreach (MCvAvgComp f in facesDetected[0])
{
t = t + 1;
result = currentFrame.Copy(f.rect).Convert<Gray, byte>().Resize(100, 100, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
//** trasarea (reprezentarea) fetei detectate in canalul 0 al culorii gri folosind culoarea albastra
currentFrame.Draw(f.rect, new Bgr(Color.Red), 2);
if (trainingImages.ToArray().Length != 0)
{
//** Clasa TermCriteria care se foloseste la recunoasterea imaginilor antrenate cu un numar maxim de antrenari (variabila maxIteration).
MCvTermCriteria termCrit = new MCvTermCriteria(ContTrain, 0.001);
//** Obiectul de recunoastere al vectorului facial comun
EigenObjectRecognizer recognizer = new EigenObjectRecognizer(
trainingImages.ToArray(),
labels.ToArray(),
3000,
ref termCrit);
name = recognizer.Recognize(result);
//** Trasam cate o eticheta pentru fiecare fata detectata si recunoscuta.
currentFrame.Draw(name, ref font, new Point(f.rect.X – 2, f.rect.Y – 2), new Bgr(Color.LightGreen));
}
NamePersons[t-1] = name;
NamePersons.Add("");
//** Stabilirea numarului de fete detectate in scena.
label3.Text = facesDetected[0].Length.ToString();
/*
//Set the region of interest on the faces
gray.ROI = f.rect;
MCvAvgComp[][] eyesDetected = gray.DetectHaarCascade(
eye,
1.1,
10,
Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
new Size(20, 20));
gray.ROI = Rectangle.Empty;
foreach (MCvAvgComp ey in eyesDetected[0])
{
Rectangle eyeRect = ey.rect;
eyeRect.Offset(f.rect.X, f.rect.Y);
currentFrame.Draw(eyeRect, new Bgr(Color.Blue), 2);
}
*/
}
t = 0;
//** concatenarea numelor persoanelor recunoscute si afisarea lor
for (int nnn = 0; nnn < facesDetected[0].Length; nnn++)
{
names = names + NamePersons[nnn] + ", ";
}
//** Afisarea fetelor procesate si recunoscute
imageBoxFrameGrabber.Image = currentFrame;
label4.Text = names;
names = "";
//** Eliberarea listei (vectorului) de nume
//Clear the list(vector) of names
NamePersons.Clear();
}
private void button3_Click(object sender, EventArgs e)
{
}
private void btnIesire_Click(object sender, EventArgs e)
{
Application.Exit();
}
}
}
Anexa 2
//clasificatorul folosit pentru detecția fețelor
HaarCascadeClassifier classifier = HaarCascadeClassifier.DefaultFaceClassifier;
//Detectorul Viola Jones bazat pe clasificatori HAAR
HaarObjectDetector detector;
//construtorul clasei
public DetectorFete()
{
detector= new HaarObjectDetector(
classifier, 30, ObjectDetectorSearchMode.NoOverlap,
1.5f, ObjectDetectorScalingMode.SmallerToGreater);
}
/// <summary>
/// Functie care obtine pozitia fetelor in imagine
/// </summary>
/// <param name="image">Imaginea</param>
/// <returns>intoarce dreptunghiurile in care au fost detectate fete</returns>
public Rectangle[] getFete(Bitmap image)
{
return detector.ProcessFrame(image);
}
}
}
Anexa 3
Codul sursa folosit pentru recunoasterea fiecarui obiect prin metoda PCA
using System;
using System.Diagnostics;
using Emgu.CV.Structure;
namespace Emgu.CV
{
/// <summary>
/// An object recognizer using PCA (Principle Components Analysis)
/// </summary>
[Serializable]
public class EigenObjectRecognizer
{
private Image<Gray, Single>[] _eigenImages;
private Image<Gray, Single> _avgImage;
private Matrix<float>[] _eigenValues;
private string[] _labels;
private double _eigenDistanceThreshold;
/// <summary>
/// Get the eigen vectors that form the eigen space
/// </summary>
/// <remarks>The set method is primary used for deserialization, do not attemps to set it unless you know what you are doing</remarks>
public Image<Gray, Single>[] EigenImages
{
get { return _eigenImages; }
set { _eigenImages = value; }
}
/// <summary>
/// Get or set the labels for the corresponding training image
/// </summary>
public String[] Labels
{
get { return _labels; }
set { _labels = value; }
}
/// <summary>
/// Get or set the eigen distance threshold.
/// The smaller the number, the more likely an examined image will be treated as unrecognized object.
/// Set it to a huge number (e.g. 5000) and the recognizer will always treated the examined image as one of the known object.
/// </summary>
public double EigenDistanceThreshold
{
get { return _eigenDistanceThreshold; }
set { _eigenDistanceThreshold = value; }
}
/// <summary>
/// Get the average Image.
/// </summary>
/// <remarks>The set method is primary used for deserialization, do not attemps to set it unless you know what you are doing</remarks>
public Image<Gray, Single> AverageImage
{
get { return _avgImage; }
set { _avgImage = value; }
}
/// <summary>
/// Get the eigen values of each of the training image
/// </summary>
/// <remarks>The set method is primary used for deserialization, do not attemps to set it unless you know what you are doing</remarks>
public Matrix<float>[] EigenValues
{
get { return _eigenValues; }
set { _eigenValues = value; }
}
private EigenObjectRecognizer()
{
}
/// <summary>
/// Create an object recognizer using the specific tranning data and parameters, it will always return the most similar object
/// </summary>
/// <param name="images">The images used for training, each of them should be the same size. It's recommended the images are histogram normalized</param>
/// <param name="termCrit">The criteria for recognizer training</param>
public EigenObjectRecognizer(Image<Gray, Byte>[] images, ref MCvTermCriteria termCrit)
: this(images, GenerateLabels(images.Length), ref termCrit)
{
}
private static String[] GenerateLabels(int size)
{
String[] labels = new string[size];
for (int i = 0; i < size; i++)
labels[i] = i.ToString();
return labels;
}
/// <summary>
/// Create an object recognizer using the specific tranning data and parameters, it will always return the most similar object
/// </summary>
/// <param name="images">The images used for training, each of them should be the same size. It's recommended the images are histogram normalized</param>
/// <param name="labels">The labels corresponding to the images</param>
/// <param name="termCrit">The criteria for recognizer training</param>
public EigenObjectRecognizer(Image<Gray, Byte>[] images, String[] labels, ref MCvTermCriteria termCrit)
: this(images, labels, 0, ref termCrit)
{
}
/// <summary>
/// Create an object recognizer using the specific tranning data and parameters
/// </summary>
/// <param name="images">The images used for training, each of them should be the same size. It's recommended the images are histogram normalized</param>
/// <param name="labels">The labels corresponding to the images</param>
/// <param name="eigenDistanceThreshold">
/// The eigen distance threshold, (0, ~1000].
/// The smaller the number, the more likely an examined image will be treated as unrecognized object.
/// If the threshold is < 0, the recognizer will always treated the examined image as one of the known object.
/// </param>
/// <param name="termCrit">The criteria for recognizer training</param>
public EigenObjectRecognizer(Image<Gray, Byte>[] images, String[] labels, double eigenDistanceThreshold, ref MCvTermCriteria termCrit)
{
Debug.Assert(images.Length == labels.Length, "The number of images should equals the number of labels");
Debug.Assert(eigenDistanceThreshold >= 0.0, "Eigen-distance threshold should always >= 0.0");
CalcEigenObjects(images, ref termCrit, out _eigenImages, out _avgImage);
/*
_avgImage.SerializationCompressionRatio = 9;
foreach (Image<Gray, Single> img in _eigenImages)
//Set the compression ration to best compression. The serialized object can therefore save spaces
img.SerializationCompressionRatio = 9;
*/
_eigenValues = Array.ConvertAll<Image<Gray, Byte>, Matrix<float>>(images,
delegate(Image<Gray, Byte> img)
{
return new Matrix<float>(EigenDecomposite(img, _eigenImages, _avgImage));
});
_labels = labels;
_eigenDistanceThreshold = eigenDistanceThreshold;
}
#region static methods
/// <summary>
/// Caculate the eigen images for the specific traning image
/// </summary>
/// <param name="trainingImages">The images used for training </param>
/// <param name="termCrit">The criteria for tranning</param>
/// <param name="eigenImages">The resulting eigen images</param>
/// <param name="avg">The resulting average image</param>
public static void CalcEigenObjects(Image<Gray, Byte>[] trainingImages, ref MCvTermCriteria termCrit, out Image<Gray, Single>[] eigenImages, out Image<Gray, Single> avg)
{
int width = trainingImages[0].Width;
int height = trainingImages[0].Height;
IntPtr[] inObjs = Array.ConvertAll<Image<Gray, Byte>, IntPtr>(trainingImages, delegate(Image<Gray, Byte> img) { return img.Ptr; });
if (termCrit.max_iter <= 0 || termCrit.max_iter > trainingImages.Length)
termCrit.max_iter = trainingImages.Length;
int maxEigenObjs = termCrit.max_iter;
#region initialize eigen images
eigenImages = new Image<Gray, float>[maxEigenObjs];
for (int i = 0; i < eigenImages.Length; i++)
eigenImages[i] = new Image<Gray, float>(width, height);
IntPtr[] eigObjs = Array.ConvertAll<Image<Gray, Single>, IntPtr>(eigenImages, delegate(Image<Gray, Single> img) { return img.Ptr; });
#endregion
avg = new Image<Gray, Single>(width, height);
CvInvoke.cvCalcEigenObjects(
inObjs,
ref termCrit,
eigObjs,
null,
avg.Ptr);
}
/// <summary>
/// Decompose the image as eigen values, using the specific eigen vectors
/// </summary>
/// <param name="src">The image to be decomposed</param>
/// <param name="eigenImages">The eigen images</param>
/// <param name="avg">The average images</param>
/// <returns>Eigen values of the decomposed image</returns>
public static float[] EigenDecomposite(Image<Gray, Byte> src, Image<Gray, Single>[] eigenImages, Image<Gray, Single> avg)
{
return CvInvoke.cvEigenDecomposite(
src.Ptr,
Array.ConvertAll<Image<Gray, Single>, IntPtr>(eigenImages, delegate(Image<Gray, Single> img) { return img.Ptr; }),
avg.Ptr);
}
#endregion
/// <summary>
/// Given the eigen value, reconstruct the projected image
/// </summary>
/// <param name="eigenValue">The eigen values</param>
/// <returns>The projected image</returns>
public Image<Gray, Byte> EigenProjection(float[] eigenValue)
{
Image<Gray, Byte> res = new Image<Gray, byte>(_avgImage.Width, _avgImage.Height);
CvInvoke.cvEigenProjection(
Array.ConvertAll<Image<Gray, Single>, IntPtr>(_eigenImages, delegate(Image<Gray, Single> img) { return img.Ptr; }),
eigenValue,
_avgImage.Ptr,
res.Ptr);
return res;
}
/// <summary>
/// Get the Euclidean eigen-distance between <paramref name="image"/> and every other image in the database
/// </summary>
/// <param name="image">The image to be compared from the training images</param>
/// <returns>An array of eigen distance from every image in the training images</returns>
public float[] GetEigenDistances(Image<Gray, Byte> image)
{
using (Matrix<float> eigenValue = new Matrix<float>(EigenDecomposite(image, _eigenImages, _avgImage)))
return Array.ConvertAll<Matrix<float>, float>(_eigenValues,
delegate(Matrix<float> eigenValueI)
{
return (float)CvInvoke.cvNorm(eigenValue.Ptr, eigenValueI.Ptr, Emgu.CV.CvEnum.NORM_TYPE.CV_L2, IntPtr.Zero);
});
}
/// <summary>
/// Given the <paramref name="image"/> to be examined, find in the database the most similar object, return the index and the eigen distance
/// </summary>
/// <param name="image">The image to be searched from the database</param>
/// <param name="index">The index of the most similar object</param>
/// <param name="eigenDistance">The eigen distance of the most similar object</param>
/// <param name="label">The label of the specific image</param>
public void FindMostSimilarObject(Image<Gray, Byte> image, out int index, out float eigenDistance, out String label)
{
float[] dist = GetEigenDistances(image);
index = 0;
eigenDistance = dist[0];
for (int i = 1; i < dist.Length; i++)
{
if (dist[i] < eigenDistance)
{
index = i;
eigenDistance = dist[i];
}
}
label = Labels[index];
}
/// <summary>
/// Try to recognize the image and return its label
/// </summary>
/// <param name="image">The image to be recognized</param>
/// <returns>
/// String.Empty, if not recognized;
/// Label of the corresponding image, otherwise
/// </returns>
public String Recognize(Image<Gray, Byte> image)
{
int index;
float eigenDistance;
String label;
FindMostSimilarObject(image, out index, out eigenDistance, out label);
return (_eigenDistanceThreshold <= 0 || eigenDistance < _eigenDistanceThreshold ) ? _labels[index] : String.Empty;
}
}
}
Anexa4.
Baza de date cu capturile de imagini din înregistrările video
Bibliografie
[1] C.Bishop: Neural Networks for Pattern Recognition, Oxford Press London, 1995
[2] EDomany: Models of neural networks, Adisson-Wesley Publishing Co., 1995
[3] D Dumitrescu, C.Hariton: Retele neuronale.Teorie si aplicatii,Editura Teora, Bucuresti,1996
[4] J.D.Goldberg: Genetic Algoritms in Search, Optimization and Machine Learning, Adisson-Wesley, New York,1989
[5] V.Neagoe: Teoria recunoasterii formelor, Editura Academiei Romane, Bucuresti,1992
[6] V.Neagoe s.a.- Recunoasterea formelor si retele nerale. Algoritmi fundamentali, Editura Matrix Rom, Bucuresti,1998
[7] D.White: A genetic Algorithm for Searching Topology and Weight Spaces in Neural Network Design, Dissertation at the University of Maryland, 1993
[8] V.E. Neagoe and A.C. Mugioiu, "A fully neural approach to color facial
image recognition", Proc. of the World Automation Congress, 2008 (WAC
2008), International Symposium on Soft Computing in Industry
[9] http://www.victorneagoe.com/university/prai/lab3a.pdf
[10] drd. Marian Dorin PÎRLOAGĂ, gl.bg.(r.), prof.univ.dr.ing.Emil CREȚU, col.(r.), prof.univ.dr.ing. Ciprian RĂCUCIU, Analysis and implementation methods of pattern recognition applications using video The International Conference Strategies, technologies, military applications, simulation and resources, 13-14 nov. 2014, Vol.2 pp204-216, ISSN 2285-8415, ISSN-L 2285-8318
[11] drd. Marian Dorin PÎRLOAGĂ, gl.bg.(r.),prof.univ.dr.ing. Emil CREȚU, col.(r.), prof.univ.dr.ing. Ciprian RĂCUCIU, Optimization of biometric technologies for military applications using the recognition of faces, The International Conference Strategies, technologies, military applications, simulation and resources, 13-14 nov. 2014, Vol.2 pp216-228, ISSN 2285-8415, ISSN-L 2285-8318
[14] Mircea Petic, Inga Țițchiev, Grigorii Horoș, the International Conference on Microelectronics and Computer Science, Chisinau, Republic of Moldova, October 22-25, 2014
[15] I. Dzițac, G. Moldovan, Sisteme distribuite modele informatice, Editura Universității Agora, Oradea, 2006, 146 p.
[16] I. Țițchiev, M. Petic, V. Macari, Posibilități de procesare paralelă ale imaginilor prin intermediul funcțiilor OPENCV, Conferința internațională științifico-practică ”Dezvoltarea inovațională din Republica Moldova: problemele naționale și tendințele globale”, 7-8 noiembrie, pp.589-591, 2013, ISBN 978-9975-4266-0-2.
[17] T. Pavlidis, Algorithms for Graphics and Image Processing, Computer Science Press, 1982.
[18] Gary Bradski and Adrian Kaehler, Learning OpenCV, O’Reilly Media, 2008, pp 524-526
[19] R. Laganière. Computer Vision Application Programming Cookbook. BIRMINGHAM –
MUMBAI. First published: May 2011. ISBN 978-1-849513-24-1
[20]C.G. Vasile, “Iris recognizing. General prezentation and applications, results obtained with an experimental model”, The XXXII Communication Session of Institute for Advanced Technologies, Bucharest, 2004
[21] X.K. Wang, X. Mao, C.D. Căleanu,"Nonlinear Shape-Texture Manifold Learning", IEICE Transactions on Information and Systems, vol. E93-D, no. 7, pag. 2016-2019, Iulie 2010.
[21] B. Kisacanin, V. Pavlovic, T.S. Huang, Real-Time Vision for Human-Computer Interaction, Springer 2005, pp. 141-157, “A Real-Time Vision Interface Based on Gaze Detection — EyeKeys”, John J. Magee
[22] M. Ciesla Michal, P. Koziol, Eye Pupil Location Using Webcam, http://arxiv.org/abs/1202.6517
[23]Phillips,P.J., Moon, H.Rizvi, S.A., Rauss P.J., The Feret EvaluationMethodology for face recognitionAlgoritms, IEEE Transactionson PatternAnalysisand MachineIntelligence 22, 10 ( Oct 2000), 1090-1104.
[24] Oancea Roxana, Contribuții privind prelucrarea imaginilor, Teză de doctorat -2011.
[25] T Fawcett, Roc Graphs: Notes and practical considerations for researchers technical report, HPL-2003-4, HP Laboratory, 2004.
[26] T Fawcet, An introductionto ROC Analysis, Pattern recognition letters 27 (2006), 861-874
[27] Heckbert P.S., Color Image Quantization for frame buffer display, BsC Thesis, Massachusets Institute of Technology Dept of Mathematics, Cambridge, MA USA, 1980
[28] Wong K, Chey C.H., LIU T.S. and Po L.M., Dominant color image Retrieval using merged histogram. In Proceedings of the 2003 International Symposium an Circuits and Systems (ICAS), Bangkok, Thailand, May 2003, vol.2, pp. 908-911
[29] drd. Marian Dorin Pîrloagă, PCA versus LDA in implementing neural classifiers for face recognition, în curs de publicare MTA REVIEW Vol. XXV, No. 1, Mar. 2015
[30] drd. Marian Dorin Pîrloagă, PCA versus LDA in implementing neural classifiers for face recognition, în curs de publicare MTA REVIEW Vol. XXV, No. 1, Mar. 2015
[31] drd. Marian Dorin Pîrloagă, prof. univ. dr.ing. Ciprian Răcuciu, prof. univ. dr.ing. Emil Crețu, Recognition of faces in the crowd using biometric technologies mixed – SEA CONF 2015, în curs de publicare Buletinul științific al ANMB 2015
Anexa 1
Codul sursă
//Autor: Marian Dorin Pirloaga
//Data ultimei actualizari: 16.02.2015
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.CvEnum;
using System.IO;
using System.Diagnostics;
namespace MultiFaceRec
{
public partial class FrmPrincipal : Form
{
//Declararea tuturor variabilelor, obiectelor si vectorilor de imagine
Image<Bgr, Byte> currentFrame; //** Cadrul curent al imaginii faciale
Capture grabber; //** variabila care pastreaza imaginea captata
HaarCascade face; //** clasificatorul pentru facial
HaarCascade eye; //** clasificatorul pentru ochi
MCvFont font = new MCvFont(FONT.CV_FONT_HERSHEY_TRIPLEX, 0.5d, 0.5d); //** tipul de font si dimensiune ce o sa fie afisat deasupra imaginii
Image<Gray, byte> result, TrainedFace = null; //** imaginea rezultat si imaginea ce urmeaza a fi captata si inregistrata in baza de date
Image<Gray, byte> gray = null; //** sunt stocate diferentele de gri ale imaginiii
List<Image<Gray, byte>> trainingImages = new List<Image<Gray, byte>>(); //** un vector cu toate imaginile (subiecti) care urmeaza a fi adaugate in baza de date
List<string> labels= new List<string>(); //** vector pentru etichetarea persoanelor
List<string> NamePersons = new List<string>(); //** vector cu numele persoanelor
int ContTrain, NumLabels, t; //** contoare pentru numarul de persoane care urmeaza a fi salvate (ContTrain), pentru etichete (NumLabels), pentru fiecare fata detectata se trece la pasul urmator (t)
string name, names = null; //** variabile de tip string (sir de caractere) pentru salvarea numelui si a numelor persoanelor.
public FrmPrincipal()
{
InitializeComponent();
//** incarcare clasificator pentru detectie frontala a fetei
face = new HaarCascade("haarcascade_frontalface_default.xml");
//eye = new HaarCascade("haarcascade_eye.xml");
try
{
//Load of previus trainned faces and labels for each image
//** incarcarea fetelor deja existente si etichetarea fiecareia dintre ele
string Labelsinfo = File.ReadAllText(Application.StartupPath + "/TrainedFaces/TrainedLabels.txt");
string[] Labels = Labelsinfo.Split('%');
NumLabels = Convert.ToInt16(Labels[0]);
ContTrain = NumLabels;
string LoadFaces;
for (int tf = 1; tf < NumLabels+1; tf++)
{
LoadFaces = "face" + tf + ".bmp";
trainingImages.Add(new Image<Gray, byte>(Application.StartupPath + "/TrainedFaces/" + LoadFaces));
labels.Add(Labels[tf]);
}
}
catch(Exception e)
{
//MessageBox.Show(e.ToString());
MessageBox.Show("Nu exista nimic salvat (binar) in baza de date, va rog sa adaugati cel putin un subiect cu caracteristici faciale", "Incarcarea fetelor si antrenarea lor", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
private void button1_Click(object sender, EventArgs e)
{
//** initializare camera pentru captare (deschiderea camerei)
grabber = new Capture();
grabber.QueryFrame();
//** initializarea evenimentului de captare
Application.Idle += new EventHandler(FrameGrabber);
button1.Enabled = false;
}
private void button2_Click(object sender, System.EventArgs e)
{
try
{
//** contorul de antrenare al fetelor
ContTrain = ContTrain + 1;
//** obtinerea unui cadru gri de la dispozitivul de captare (Camera)
gray = grabber.QueryGrayFrame().Resize(320, 240, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
//** detectorul facial
//** Emgu este folosit pentru procesarea imaginilor
MCvAvgComp[][] facesDetected = gray.DetectHaarCascade(
face,
1.2,
10,
Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
new Size(20, 20));
//Actiunea pentru fiecare element detectat
foreach (MCvAvgComp f in facesDetected[0])
{
TrainedFace = currentFrame.Copy(f.rect).Convert<Gray, byte>();
break;
}
//** redimensiunea fetei detectate ca imagine pentru compararea fortata a aceleiasi dimensiuni cu imaginea de test
//** folosind interpolare cubica.
TrainedFace = result.Resize(100, 100, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
trainingImages.Add(TrainedFace);
labels.Add(textBox1.Text);
//** afisarea fetei adaugate intro scala gri
imageBox1.Image = TrainedFace;
//** Salvarea intrun fisier de tip text a fetelor antrenate
File.WriteAllText(Application.StartupPath + "/TrainedFaces/TrainedLabels.txt", trainingImages.ToArray().Length.ToString() + "%");
//** Scrierea etichetelor a fetelor antrenate intrun fisier text pentru incarcari si detectari ulterioare
for (int i = 1; i < trainingImages.ToArray().Length + 1; i++)
{
trainingImages.ToArray()[i – 1].Save(Application.StartupPath + "/TrainedFaces/face" + i + ".bmp");
File.AppendAllText(Application.StartupPath + "/TrainedFaces/TrainedLabels.txt", labels.ToArray()[i – 1] + "%");
}
MessageBox.Show("Fata lui: " + textBox1.Text + " a fost detectata si adaugata.", "Trainingul a fost efectuat cu succes", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch
{
MessageBox.Show("Activatia dectarea fetei mai intai.", "Trainingul a esuat.", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
void FrameGrabber(object sender, EventArgs e)
{
label3.Text = "0";
//label4.Text = "";
NamePersons.Add("");
//** Obtinem cadrul curent de la dispozitivul de captare
currentFrame = grabber.QueryFrame().Resize(320, 240, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
//Il convertim la scala gri
gray = currentFrame.Convert<Gray, Byte>();
//Detectorul facial
MCvAvgComp[][] facesDetected = gray.DetectHaarCascade(
face,
1.2,
10,
Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
new Size(20, 20));
//Actiunea pentru fiecare element
foreach (MCvAvgComp f in facesDetected[0])
{
t = t + 1;
result = currentFrame.Copy(f.rect).Convert<Gray, byte>().Resize(100, 100, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
//** trasarea (reprezentarea) fetei detectate in canalul 0 al culorii gri folosind culoarea albastra
currentFrame.Draw(f.rect, new Bgr(Color.Red), 2);
if (trainingImages.ToArray().Length != 0)
{
//** Clasa TermCriteria care se foloseste la recunoasterea imaginilor antrenate cu un numar maxim de antrenari (variabila maxIteration).
MCvTermCriteria termCrit = new MCvTermCriteria(ContTrain, 0.001);
//** Obiectul de recunoastere al vectorului facial comun
EigenObjectRecognizer recognizer = new EigenObjectRecognizer(
trainingImages.ToArray(),
labels.ToArray(),
3000,
ref termCrit);
name = recognizer.Recognize(result);
//** Trasam cate o eticheta pentru fiecare fata detectata si recunoscuta.
currentFrame.Draw(name, ref font, new Point(f.rect.X – 2, f.rect.Y – 2), new Bgr(Color.LightGreen));
}
NamePersons[t-1] = name;
NamePersons.Add("");
//** Stabilirea numarului de fete detectate in scena.
label3.Text = facesDetected[0].Length.ToString();
/*
//Set the region of interest on the faces
gray.ROI = f.rect;
MCvAvgComp[][] eyesDetected = gray.DetectHaarCascade(
eye,
1.1,
10,
Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
new Size(20, 20));
gray.ROI = Rectangle.Empty;
foreach (MCvAvgComp ey in eyesDetected[0])
{
Rectangle eyeRect = ey.rect;
eyeRect.Offset(f.rect.X, f.rect.Y);
currentFrame.Draw(eyeRect, new Bgr(Color.Blue), 2);
}
*/
}
t = 0;
//** concatenarea numelor persoanelor recunoscute si afisarea lor
for (int nnn = 0; nnn < facesDetected[0].Length; nnn++)
{
names = names + NamePersons[nnn] + ", ";
}
//** Afisarea fetelor procesate si recunoscute
imageBoxFrameGrabber.Image = currentFrame;
label4.Text = names;
names = "";
//** Eliberarea listei (vectorului) de nume
//Clear the list(vector) of names
NamePersons.Clear();
}
private void button3_Click(object sender, EventArgs e)
{
}
private void btnIesire_Click(object sender, EventArgs e)
{
Application.Exit();
}
}
}
Anexa 2
//clasificatorul folosit pentru detecția fețelor
HaarCascadeClassifier classifier = HaarCascadeClassifier.DefaultFaceClassifier;
//Detectorul Viola Jones bazat pe clasificatori HAAR
HaarObjectDetector detector;
//construtorul clasei
public DetectorFete()
{
detector= new HaarObjectDetector(
classifier, 30, ObjectDetectorSearchMode.NoOverlap,
1.5f, ObjectDetectorScalingMode.SmallerToGreater);
}
/// <summary>
/// Functie care obtine pozitia fetelor in imagine
/// </summary>
/// <param name="image">Imaginea</param>
/// <returns>intoarce dreptunghiurile in care au fost detectate fete</returns>
public Rectangle[] getFete(Bitmap image)
{
return detector.ProcessFrame(image);
}
}
}
Anexa 3
Codul sursa folosit pentru recunoasterea fiecarui obiect prin metoda PCA
using System;
using System.Diagnostics;
using Emgu.CV.Structure;
namespace Emgu.CV
{
/// <summary>
/// An object recognizer using PCA (Principle Components Analysis)
/// </summary>
[Serializable]
public class EigenObjectRecognizer
{
private Image<Gray, Single>[] _eigenImages;
private Image<Gray, Single> _avgImage;
private Matrix<float>[] _eigenValues;
private string[] _labels;
private double _eigenDistanceThreshold;
/// <summary>
/// Get the eigen vectors that form the eigen space
/// </summary>
/// <remarks>The set method is primary used for deserialization, do not attemps to set it unless you know what you are doing</remarks>
public Image<Gray, Single>[] EigenImages
{
get { return _eigenImages; }
set { _eigenImages = value; }
}
/// <summary>
/// Get or set the labels for the corresponding training image
/// </summary>
public String[] Labels
{
get { return _labels; }
set { _labels = value; }
}
/// <summary>
/// Get or set the eigen distance threshold.
/// The smaller the number, the more likely an examined image will be treated as unrecognized object.
/// Set it to a huge number (e.g. 5000) and the recognizer will always treated the examined image as one of the known object.
/// </summary>
public double EigenDistanceThreshold
{
get { return _eigenDistanceThreshold; }
set { _eigenDistanceThreshold = value; }
}
/// <summary>
/// Get the average Image.
/// </summary>
/// <remarks>The set method is primary used for deserialization, do not attemps to set it unless you know what you are doing</remarks>
public Image<Gray, Single> AverageImage
{
get { return _avgImage; }
set { _avgImage = value; }
}
/// <summary>
/// Get the eigen values of each of the training image
/// </summary>
/// <remarks>The set method is primary used for deserialization, do not attemps to set it unless you know what you are doing</remarks>
public Matrix<float>[] EigenValues
{
get { return _eigenValues; }
set { _eigenValues = value; }
}
private EigenObjectRecognizer()
{
}
/// <summary>
/// Create an object recognizer using the specific tranning data and parameters, it will always return the most similar object
/// </summary>
/// <param name="images">The images used for training, each of them should be the same size. It's recommended the images are histogram normalized</param>
/// <param name="termCrit">The criteria for recognizer training</param>
public EigenObjectRecognizer(Image<Gray, Byte>[] images, ref MCvTermCriteria termCrit)
: this(images, GenerateLabels(images.Length), ref termCrit)
{
}
private static String[] GenerateLabels(int size)
{
String[] labels = new string[size];
for (int i = 0; i < size; i++)
labels[i] = i.ToString();
return labels;
}
/// <summary>
/// Create an object recognizer using the specific tranning data and parameters, it will always return the most similar object
/// </summary>
/// <param name="images">The images used for training, each of them should be the same size. It's recommended the images are histogram normalized</param>
/// <param name="labels">The labels corresponding to the images</param>
/// <param name="termCrit">The criteria for recognizer training</param>
public EigenObjectRecognizer(Image<Gray, Byte>[] images, String[] labels, ref MCvTermCriteria termCrit)
: this(images, labels, 0, ref termCrit)
{
}
/// <summary>
/// Create an object recognizer using the specific tranning data and parameters
/// </summary>
/// <param name="images">The images used for training, each of them should be the same size. It's recommended the images are histogram normalized</param>
/// <param name="labels">The labels corresponding to the images</param>
/// <param name="eigenDistanceThreshold">
/// The eigen distance threshold, (0, ~1000].
/// The smaller the number, the more likely an examined image will be treated as unrecognized object.
/// If the threshold is < 0, the recognizer will always treated the examined image as one of the known object.
/// </param>
/// <param name="termCrit">The criteria for recognizer training</param>
public EigenObjectRecognizer(Image<Gray, Byte>[] images, String[] labels, double eigenDistanceThreshold, ref MCvTermCriteria termCrit)
{
Debug.Assert(images.Length == labels.Length, "The number of images should equals the number of labels");
Debug.Assert(eigenDistanceThreshold >= 0.0, "Eigen-distance threshold should always >= 0.0");
CalcEigenObjects(images, ref termCrit, out _eigenImages, out _avgImage);
/*
_avgImage.SerializationCompressionRatio = 9;
foreach (Image<Gray, Single> img in _eigenImages)
//Set the compression ration to best compression. The serialized object can therefore save spaces
img.SerializationCompressionRatio = 9;
*/
_eigenValues = Array.ConvertAll<Image<Gray, Byte>, Matrix<float>>(images,
delegate(Image<Gray, Byte> img)
{
return new Matrix<float>(EigenDecomposite(img, _eigenImages, _avgImage));
});
_labels = labels;
_eigenDistanceThreshold = eigenDistanceThreshold;
}
#region static methods
/// <summary>
/// Caculate the eigen images for the specific traning image
/// </summary>
/// <param name="trainingImages">The images used for training </param>
/// <param name="termCrit">The criteria for tranning</param>
/// <param name="eigenImages">The resulting eigen images</param>
/// <param name="avg">The resulting average image</param>
public static void CalcEigenObjects(Image<Gray, Byte>[] trainingImages, ref MCvTermCriteria termCrit, out Image<Gray, Single>[] eigenImages, out Image<Gray, Single> avg)
{
int width = trainingImages[0].Width;
int height = trainingImages[0].Height;
IntPtr[] inObjs = Array.ConvertAll<Image<Gray, Byte>, IntPtr>(trainingImages, delegate(Image<Gray, Byte> img) { return img.Ptr; });
if (termCrit.max_iter <= 0 || termCrit.max_iter > trainingImages.Length)
termCrit.max_iter = trainingImages.Length;
int maxEigenObjs = termCrit.max_iter;
#region initialize eigen images
eigenImages = new Image<Gray, float>[maxEigenObjs];
for (int i = 0; i < eigenImages.Length; i++)
eigenImages[i] = new Image<Gray, float>(width, height);
IntPtr[] eigObjs = Array.ConvertAll<Image<Gray, Single>, IntPtr>(eigenImages, delegate(Image<Gray, Single> img) { return img.Ptr; });
#endregion
avg = new Image<Gray, Single>(width, height);
CvInvoke.cvCalcEigenObjects(
inObjs,
ref termCrit,
eigObjs,
null,
avg.Ptr);
}
/// <summary>
/// Decompose the image as eigen values, using the specific eigen vectors
/// </summary>
/// <param name="src">The image to be decomposed</param>
/// <param name="eigenImages">The eigen images</param>
/// <param name="avg">The average images</param>
/// <returns>Eigen values of the decomposed image</returns>
public static float[] EigenDecomposite(Image<Gray, Byte> src, Image<Gray, Single>[] eigenImages, Image<Gray, Single> avg)
{
return CvInvoke.cvEigenDecomposite(
src.Ptr,
Array.ConvertAll<Image<Gray, Single>, IntPtr>(eigenImages, delegate(Image<Gray, Single> img) { return img.Ptr; }),
avg.Ptr);
}
#endregion
/// <summary>
/// Given the eigen value, reconstruct the projected image
/// </summary>
/// <param name="eigenValue">The eigen values</param>
/// <returns>The projected image</returns>
public Image<Gray, Byte> EigenProjection(float[] eigenValue)
{
Image<Gray, Byte> res = new Image<Gray, byte>(_avgImage.Width, _avgImage.Height);
CvInvoke.cvEigenProjection(
Array.ConvertAll<Image<Gray, Single>, IntPtr>(_eigenImages, delegate(Image<Gray, Single> img) { return img.Ptr; }),
eigenValue,
_avgImage.Ptr,
res.Ptr);
return res;
}
/// <summary>
/// Get the Euclidean eigen-distance between <paramref name="image"/> and every other image in the database
/// </summary>
/// <param name="image">The image to be compared from the training images</param>
/// <returns>An array of eigen distance from every image in the training images</returns>
public float[] GetEigenDistances(Image<Gray, Byte> image)
{
using (Matrix<float> eigenValue = new Matrix<float>(EigenDecomposite(image, _eigenImages, _avgImage)))
return Array.ConvertAll<Matrix<float>, float>(_eigenValues,
delegate(Matrix<float> eigenValueI)
{
return (float)CvInvoke.cvNorm(eigenValue.Ptr, eigenValueI.Ptr, Emgu.CV.CvEnum.NORM_TYPE.CV_L2, IntPtr.Zero);
});
}
/// <summary>
/// Given the <paramref name="image"/> to be examined, find in the database the most similar object, return the index and the eigen distance
/// </summary>
/// <param name="image">The image to be searched from the database</param>
/// <param name="index">The index of the most similar object</param>
/// <param name="eigenDistance">The eigen distance of the most similar object</param>
/// <param name="label">The label of the specific image</param>
public void FindMostSimilarObject(Image<Gray, Byte> image, out int index, out float eigenDistance, out String label)
{
float[] dist = GetEigenDistances(image);
index = 0;
eigenDistance = dist[0];
for (int i = 1; i < dist.Length; i++)
{
if (dist[i] < eigenDistance)
{
index = i;
eigenDistance = dist[i];
}
}
label = Labels[index];
}
/// <summary>
/// Try to recognize the image and return its label
/// </summary>
/// <param name="image">The image to be recognized</param>
/// <returns>
/// String.Empty, if not recognized;
/// Label of the corresponding image, otherwise
/// </returns>
public String Recognize(Image<Gray, Byte> image)
{
int index;
float eigenDistance;
String label;
FindMostSimilarObject(image, out index, out eigenDistance, out label);
return (_eigenDistanceThreshold <= 0 || eigenDistance < _eigenDistanceThreshold ) ? _labels[index] : String.Empty;
}
}
}
Anexa4.
Baza de date cu capturile de imagini din înregistrările video
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Analiza Si Implementarea Metodelor de Recunoastere a Formelor Utilizand Imaginile Video (ID: 136213)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
