Coordonator Știintific: Absolvent: Șef Lucrări dr ing Neculoiu Giorgian Andreea NUȚĂ București 2017 Aplicație software de recunoaștere a stărilor… [305994]
PROIECT DE DIPLOMĂ
Coordonator Știintific: Absolvent: [anonimizat] 2017
Aplicație software de recunoaștere a stărilor emoționale prin interpretarea trăsăturilor faciale
Coordonator Știintific: Absolvent: [anonimizat] 2017
Cuprins
INTRODUCERE 4
Motivația alegerii temei 4
Obiectivele lucrării 4
Structura lucrării 5
1.ASPECTE TEORETICE REFERITOARE LA APLICATIILE SOFTWARE DE RECUNOASTERE A STARILOR EMOTIONALE PRIN INTERPRETAREA TRASATURILOR FACIALE. 6
1.1 Domeniul de analiză a expresiilor faciale 6
1.2 Lucrări înrudite 6
1.3 Utilizari ale aplicatiilor software de recunoastere a trasaturilor faciale 9
1.4 Descrierea componentelor utilizate în aplicatiile software de recunoastere faciala 9
1.5 Clasificarea obiectelor folosite în recunoașterea facială 11
2. TEHNOLOGII sI INSTRUMENTE SOFTWARE FOLOSITE IN IMPLEMENTAREA PROIECTULUI 13
2.1 Limbajul Python 13
2.2 Structuri de control în Python 15
2.3 Liste în Python 16
2.4 Biblioteca OpenCV 17
2.5 [anonimizat] 19
2.6 HTML (HyperText Markup Language) 22
2.7 Haar cascade training 22
2.9 Limbajul XML 27
2.10 JavaScript 29
2.11 jQuery 30
2.12 XAMPP 30
3.Studiu de caz. Aplicație software de recunoaștere a stărilor emoționale prin interpretarea trăsăturilor faciale 32
3.1 Arhitectura programului 33
3.2 Modulul Camera 35
3.3 Modul Preprocesare 35
3.4 Modulul Segmentare 36
3.5 Modulul Haar Cascade 37
3.6 Modulul Cascade Training 37
3.7.Modulul Generarea fișierelor XML 38
3.8 Funcțiile sistemului 38
3.9 Structuri de date și fișiere 39
3.10 Înregistrarea evenimentelor 41
4.Scenariu de functIonare al aplicatiei 45
4.1 Instalare 45
4.2 [anonimizat]. 45
4.3 [anonimizat]. 45
4.4 Scenariu de utilizare prin intermediul interfeței web 46
4.5 Schema interfeței cu utilizatorul în scenariu de utilizare prin intermediul interfeței web. 46
Concluzii și contribuții personale 56
Concluzii 56
Contribuți personale 56
Perspective de viitor 56
Bibliografie 58
INTRODUCERE
Motivația alegerii temei
În ultima perioadă, s-a [anonimizat]. Domeniul în cadrul căruia aceste lucruri sunt posibile se numește affective computing. [anonimizat], procesarea și simularea emoțiilor umane. De la descoperirea acestui domeniu, s-au realizat mai multe aplicații prin care sistemul să poată interacționa cu omul. Ducerea la bun sfârșit a acestor aplicații a [anonimizat]-se de unele dintre cele mai importante științe cum ar fi: ComputerScience, Psychology și Cognitive Science.
Am ales această temă deoarece mi s-a parut intersantă o aplicație care să studieze expresia facială care are un rol comunicativ în relațiile interpersonale. Ea este o manifestare vizibilă a [anonimizat] o activitate cognitivă, o intenție, reprezintă personalitatea și psihopatologia unei persoane. Expresia facială, precum și alte gesturi sunt incluse în comunicarea non-verbală. Aceste indicii pot completa un discurs, ajutând ascultătorul să înțeleagă semnificația cuvintelor rostite de către vorbitor.
Aplicațiile software de acest tip pot răspunde emoțiilor omenești, dar și altor stimuli externi. Un dispozitiv cu asemenea capacități, folosește o varietate de surse pentru determinarea emoțiilor. Gesturile, expresiile faciale, vocea sunt doar câteva dintre schimbările semnificative care pot afecta starea emoțională a unei persoane, acestea pot fi detectate și interpretare de către calculator.
O motivație adițională pentru cercetarea acestui domeniu o reprezintă abilitatea sistemului de a simula empatie. Mașina trebuie să interpreteze starea emoțională a oamenilor și să se adapteze comportamentului lor, dând un răspuns adecvat pentru acele emoții.
Obiectivele lucrării
În cadrul dezvoltării aplicației cu titlul “Aplicație software de recunoaștere a stărilor emoționale prin interpretarea trăsăturilor faciale” mi-am propus să realizez o aplicație care va avea capacitatea de a recunoaște stările emoționale în urma unor capturi efectuate de către utilizator (camera web). În funcție de trăsăturile faciale ale persoanei din poză, aplicația poate descrie starea emoțională a persoanei respective.
Prezenta lucrare reprezintă o aplicație software de recunoaștere a stărilor emoționale pe baza trăsăturilor faciale, fiind destinată utilizatorilor Windows.
Ceea ce trebuie înțeles de la început este faptul că citirea limbajului corporal nu este o știință exactă. Indivizii reacționează diferit, la fel cum o fac și diferitele culturi. Semnalele pot fi ușor interpretate greșit. Expresiile faciale, în special cele care implică ochii și buzele, pot fi folosite adesea pentru a interpreta comunicarea non-verbală. În vreme ce ne folosim gura să vorbim, deseori buzele spun mult mai mult. Mușchii complecși ai buzelor ne ajută să le dăm anumite forme cu o precizie remarcabilă. Buzele țuguiate, de exemplu, sunt adesea un indicator de tensiune. Ar putea indica frustrare sau chiar mânie. Unul dintre cele mai recunoscute semnale în orice țară și cultură este zâmbetul.
Realizarea acestei aplicații constituie cunoașterea stărilor emoționale ale unui individ doar din poze, fără a fi nevoie de o altă analiză.
Scopul final al proiectului este acela de recunoaștere a stărilor emoționale, de percepere și interpretare a trăsăturilor umane pe baza unor poze. Această recunoaștere se va putea face din pozele realizate cu camera web.
Un alt obiectiv pe care mi l-am propus a fost acela de a crea o interfață grafică care să poată fi ușor utilizată de pe un calculator.
Structura lucrării
În continuare, vor fi prezentate capitolele care vor face parte din această lucrare și prin care voi încerca să lămuresc anumite probleme referitoare la acest subiect. Lucrarea va fi împărțită, așadar, în mai multe capitole și subcapitole. Pentru început voi spune câteva cuvinte despre fiecare în parte, urmând ca descrierea în detaliu să fie făcută în cadrul fiecărui capitol.
Capitolele și subcapitolele prezente în lucrare:
-Aspecte teoretice referitoare la aplicațiile software de recunoaștere a stărilor emoționale − în care va fi descries pe scurt procesul propriu-zis de recunoaștere care este necesar pentru crearea unei galerii de imagini, galeria fiind un set de modele biometrice care servește drept referință în procesul de comparare. Crearea galeriei de imagini presupune parcurgerea următoarelor etape: captarea imaginii, detectarea feței, standardizarea, extragerea trăsăturilor și crearea șablonului pentru fiecare imagine.
-Tehnologii și instrumente software folosite în implementarea proiectului− în care va fi expus suportul teoretic care va sta la baza aplicației pe care doresc să o realizez; vor fi descrise limbajele de programare necesare implementării. Vor fi prezentate, în detaliu limbajele și mediile de programare OpenCV, Python, motivele pentru care am ales sa folosesc aceste limbaje și nu altele, comparații între limbaje (asemănări și deosebiri).
− Studiu de caz: Aplicație software de recunoaștere a stărilor emoționale prin interpretarea trăsăturilor faciale–în acest capitol se va prezenta schema care stă la baza realizării acestei aplicații. Vor fi prezentate componentele acestei scheme, precum și relațiile dintre acestea.
-Scenariu de funcționare al aplicației: în acest capitol voi vorbii despre programele necesare pentru ca aplicația să poată funcționa, modul în care această aplicație se poate executa. Tot în acest capitol, voi vorbi despre modul în care am gândit aplicația, despre interfața aplicației, care trebuie să fie una funcționala, simplă, pe care utilizatorul să o poată folosi fără prea multe probleme.
-Concluzii și contribuții personale: în acest capitol am vorbit despre rezultate obținute, atingerea sau nu a scopului propus.
1.ASPECTE TEORETICE REFERITOARE LA APLICATIILE SOFTWARE DE RECUNOASTERE A STARILOR EMOTIONALE PRIN INTERPRETAREA TRASATURILOR FACIALE.
Se poate spune că recunoașterea facială este o tehnică biometrică fiind folosită pentru identificarea unei persoane dar și pentru identificarea stărilor emoționale ale acelei persoane. Sistemul de recunoaștere facială se bazează pe imaginea statică a feței unei persoane (o fotografie) care este de fapt un set de pixeli ordonați după un anumit model (pixelul fiind unitatea funcțională fundamentală a unei imagini digitale).
Sistemul de recunoaștere facială percepe chipul unui individ ca pe o mulțime de pixeli alăturați. Abilitatea sistemului de localizare a feței individului și nu a imaginilor de fond este esențială în procesul de recunoaștere facială.
Înainte de procesul propriu-zis de recunoaștere este necesară crearea unei galerii de imagini, galeria fiind un set de modele biometrice care servește drept referință în procesul de comparare. Crearea galeriei de imagini presupune parcurgerea următoarelor etape: captarea imaginii, detectarea feței, standardizarea, extragerea trăsăturilor și crearea șablonului pentru fiecare imagine.
1.1 Domeniul de analiză a expresiilor faciale
Pentru detectarea informației emoționale avem nevoie de senzori care captează date despre starea fizică a utilizatorului sau despre comportamentul acestuia fără a interpreta și datele de intrare. Un astfel de exemplu este camera video care poate capta expresii faciale, poziția corpului și gesturi. Alți senzori pot detecta semnalele emoționale cum ar fi temperatura pielii.
Identificarea informațiilor emoționale necesită extragerea modelelor semnificative din datele colectate. Acest lucru se face folosind tehnici de învățare care procesează diferite modalități de: recunoaștere a vocii, procesare a limbajului natural sau de detectare a expresiilor faciale.
1.2 Lucrări înrudite
a)Lucrarea lui Paul Ekman
De-a lungul timpului au existat numeroase tipuri de abordări, ca metode, tehnici și algoritmi, pentru găsirea unor soluții optime, fiabile, performante și eficiente, de tratare a problemei detectării figurilor umane în imagini digitale. Paul Ekman a definit șase emoții de bază: furie, dezgust, frică, fericire, tristețe, surprindere. Pe baza acestora, a fost conceput un sistem pentru clasificarea și exprimarea fizică a emoțiilor. Acest sistem poartă numele de FACS (creat de Paul Ekman și Wallace V. Friesen în 1978), Fig 1.1
Fig 1.1 Sistem Facs
El a dezvoltat și un sistem de codificare pentru expresii facile în cazul în care mișcările feței sunt descrise printr-un set de unități de acțiune (AUS). Fiecare unitate de acțiune are o bază musculară complexă. Mulți alți cercetatori au utilizat imaginea și procesarea video pentru a urmări în mod automat caracteristicile faciale folosindu-le mai apoi pentru a clasifica diferite expresii. În general, abordarile sunt similare și urmăresc caracteristicile faciale folosind unele modele de mișcare a imaginii (fluxul optic, coeficienți DCT, etc.). Pe baza caracteristicilor clasificatorul este instruit. Diferența constă în setul de caracteristici extrase din imagini și în clasificatorul utilizat (clasificatori des folosiți sunt bazați pe abordari Bayesian sau pe modele Markov ascunse).
În anii 1990, comunitatea de cercetare de animație pe calculator s-a confruntat cu probleme similare ca și în zilele de pre-FACS că nu există nici un standard unic de sistem de animație pentru expresii faciale. Pandzic și Forhheimer au remarcat faptul că eforturile s-au concentrat asupra mișcării faciale în loc să se concentreze pe parametrii faciali. Din această cauză Grupul de experți în Imagini de mișcare (MPEG) a introdus Animație Facială (FA) specificațiile standardului MPEG-4 pentru un parametrizarea de control facial standardizat.
Setul de parametrii FAPS care reprezintă de fapt un set complet de acțiuni faciale, împreună cu cap (mișcarea capului), limba, ochi, controlul gurii se poate observa în Fig. 1.2
Fig 1.2 Parametrii FAPS
Clasificatorii utilizați pot să fie clasificatori "statici" sau dinamici. Cei statici utilizează vectori corespunzători legați de un singur cadru pentru a efectua clasificarea, în timp ce clasificatori dinamici încearcă să captureze modelul temporal în secvența de vectori de trăsături legați de fiecare cadru.
b) Lucrarea lui Albert Mehrabian
Profesorul de psihologie, Albert Mehrabian, de la Universitatea din California – LosAngeles, a concluzionat că există trei elemente de bază în orice comunicare față în față. Potrivit lui Mehrabian, aceste elemente constau din ceea ce se spune (cuvintele), cum se spune (tonul vocii) și comportamentul non-verbal (limbajul corpului). Limbajul corpului este o formă de comunicare non-verbală în care transmitem semnale la exterior, deseori fără să ne dăm seama că o facem. Este deseori sub forma posturii corpului, mișcării ochilor, expresiilor faciale și chiar gesturilor noastre. Mai mult, studierea și interpretarea limbajului corporal a devenit aproape o știință. S-au scris nenumărate cărți asupra subiectului și există peste 80 de milioane de site-uri web dedicate limbajului corporal. Potrivit profesorului Mehrabian, cuvintele constituie numai 7% din comunicarea față în față, în vreme ce tonul vocii ajunge la 38%. Aceasta înseamnă că un procent cutremurător de 55% din comunicarea față în față se realizează prin mijloacele comunicării non-verbale. Abilitatea de interpretare a limbajului corporal este un avantaj major. O persoană poate spune ceva prin cuvinte dar limbajul corpului să trădeze un mesaj opus.
Zâmbetul indică o atitudine prietenoasă și dorința de comunicare. Totuși nu este o expresie facială naturală. Este ceva ce am învățat să facem. Mai mult, zâmbetul poate fi autentic sau poate fi forțat. Un zâmbet autentic implică întreaga față, inclusiv ochii. Un zâmbet forțat folosește numai mușchii din jurul buzelor. Atingerea buzelor este deseori o indicare a gândurilor interioare ale unei persoane. Dacă vorbiți cu cineva și colțul buzelor este spasmatic, ar putea demonstra că nu crede ceea ce le spuneți. Adesea când cineva spune minciuni, buzele lor fac grimase scurte. Este acțiunea subconștientului care își exprimă dezaprobarea pentru minciunile conștiente.
1.3 Utilizari ale aplicatiilor software de recunoastere a trasaturilor faciale
Ca exemple amintim situațiile în care poliția urmărește identificarea unui infractor pe bază de amprente sau fotografii, precum și situatiile în care aceeași persoană încearcă să depună în mod fraudulos mai multe documentații în vederea obtinerii unor avantaje materiale (de exemplu, depunerea a mai multor dosare de obținere a pașaportului sau a carnetului de conducere). Cu ajutorul unei aplicații de verificare, o persoana prezintă “semnatura” sa biometrică și pretinde ca are identitatea care corespunde acelei “semnături”, pe baza căreia vrea să obțină dreptul de acces într-un spațiu sau la anumite resurse restricționate.
Sistemul poate accepta sau respinge această cerere, respectiv poate furniza un grad de încredere asupra validități identității pretinse.
Un exemplu practic de utilizare a aplicațiilor software de recunoaștere a trăsăturilor faciale este autentificarea identități în tranzacțiile bancare bazate pe utilizarea cardurilor, precum și accesul restricționat la anumite calculatoare sau incinte de clădiri. Este important de subliniat faptul că indicatorii de performanță utilizați în sistemele de verificare diferă net față de cei utilizați de sistemele de identificare (recunoaștere).
Un alt exmeplu este reprezentat de un sistem IT de recunoaștere facială a persoanelor, utilizat de poliție destinat activităților criminalistice de achiziție, comparare și verificare a imaginilor digitale faciale ale suspectilor, condamnaților, persoanelor cu identitate necunoscută, persoanelor dispărute și cadavrelor cu identitate necunoscută într-o bază de date cu fotografii faciale. Soluția IT permite identificarea persoanelor din imagini, iar pe viitor se dorește identificarea lor chiar dacă acestea poartă cagulă sau burkă.
O alta aplicație este aceea care va debloca telefonul mobil în momentul în care utilizatorul va fi recunoscut de sistem. Google a fost primul care lansat o asemenea opțiune, implementată la telefonul Galaxy Nexus. Totuși, aplicația a fost criticată de utilizatori, din cauza capacităților sale reduse.
Dispozitivele cu camera foto ar putea oferi servicii personalizate fiecărui utilizator, după recunoașterea fetei. De exemplu, setări specifice ar putea fi încarcate și salvate pe un dispozitiv de stocare, iar acesta să ofere utilizatorului informațiile selectate in prealabil, în momentul în care deschide telefonul.
1.4 Descrierea componentelor utilizate în aplicatiile software de recunoastere faciala
De-a lungul timpului au existat numeroase tipuri de abordări, ca metode, tehnici și algoritmi, pentru găsirea unor soluții optime, fiabile, performante și eficiente, de tratare a problemei detectării figurilor umane în imagini (digitale). Primul sistem de detectare a fețelor a fost dezvoltat în anii '70. Dezvoltarea tehnicilor de recunoaștere a fețelor a făcut necesară și dezvoltarea unor algoritmi mai performanți pentru detectarea acestora, ca prim pas în recunoașterea automata [16].
Detectarea automată a fețelor este o problemă dificilă, practic, imposibil de definit, fiind o varietate de moduri în care pot apărea figurile umane în imagini. Și asta nu doar din cauza trăsăturilor și particularităților fizionomice, cât și din cauza varietății în percepția lor în 2-D, datorate poziției (orientării / înclinării, scalării).
Putem enumera următorii factori principali care pot induce problemele cu care m-am confruntat în crearea acestei aplicații au avut ca principali factori:
poziția și orientarea obiectelor în imagine (frontal, profil, sub un unghi etc.) – anumite caracteristici faciale (ochi, nas) putând fi parțial sau total ascunse;
prezența / absența unor componente structurale – unele caracteristici faciale precum barbă, mustața, ochelari putând fi, sau nu, prezente și existând o mare variabilitate a acestora din punct de vedere al formei, culorii sau dimensiunilor;
expresia facială – geometria feței fiind afectată de aceasta;
obturarea – fețelor putând fi parțial mascate (acoperite) de alte obiecte (inclusiv alte fețe);
condițiile în care a fost realizată fotografia – iluminarea (spectrul, poziția și/sau distribuția sursei / surselor de lumină, intensitatea) și caracteristicile aparatului foto (lentilele, senzorul) afectând foarte puternic felul în care o figură apare înimagine[17].
Metodele utilizate, indiferent de tipul acestora, presupun numeroase iterații, analize pe diferite criterii, scalări, filtrări, comparații. Aceste sisteme se bazează pe antrenări anterioare ale unor clasificatoare (în general cu două clase: față și non-față) de diferite tipuri, utilizând rețele neuronale, support vector machines (SVM), modele ascunse (hidden) Markov etc.
Așa cum am mai menționat, algoritmii de detecție ai fețelor pot fi împărțiți în patru mari categorii:
Metoda bazată pecunoștințe
Abordarea bazată pe caracteristici invariante
Metoda bazată pe modele / șabloane(templates)
Metoda bazată pe apariție / înfățișare(appearence)
În practică se poate utiliza pentru fiecare pixel (x, y) al imaginii o relație de forma:
i(x, y) = 0,299 R(x, y) + 0,587 G(x, y) + 0,114 B(x, y),
unde valorile R, G, B reprezintă respectiv componentele de roșu, verde și albastru ale valorii respectivului pixel (x, y) în spațiul RGB utilizat frecvent în reprezentarea digitală a imaginilor color, pe 3 sau 4 octeți (24 sau 32 de biți). Valorile sunt cuprinse între 0 și 255 (cât poate fi reprezentat pe un octet).
Pe imaginea în 256 de nivele de gri astfel obținută pot fi analizate anumite caracteristici dreptunghiulare prin adunarea valorilor intensităților pixelilor în diferite blocuri dreptunghiulare. Astfel, pot fi detectate în imagine caracteristici formate din blocuri mai întunecate, adiacente unor blocuri mai luminoase, suma pixelilor din primele fiind mai mică decât cea a pixelilor din cele din urmă. Trebuie precizat faptul că aceste caracteristici nu reprezintă totuși în niciun fel anumite caracteristici / trăsături faciale specifice. Însă pentru îmbunătățirea vitezei, în spatele modulelor OpenCV stă următorul algoritm: pentru imaginea originală de analizat se generează inițial o așa numită „imagine integrală”, mapată 1 la 1 peste imaginea originală, în care fiecare punct capătă valoarea sumei tuturor pixelilor din imaginea originală situați la stânga și deasupra coordonatelor punctului respectiv, inclusiv.
Valorile tuturor punctelor ii(x, y) din imaginea integrală pot fi calculate cu o singură trecere prin imaginea inițială, pornind din colțul din stânga-sus (x = 0 și y = 0), pixel cu pixel, linie după linie[10].
1.5 Clasificarea obiectelor folosite în recunoașterea facială
Pentru clasificarea fiecărui obiect, trebuie să instruim sistemul, să-l facem să fie capabil să învețe parametrii necesari pentru a decide care etichetă specifică ar trebui să fie atribuită obiectului detectat.
Pentru fiecare obiect, vom extrage diferitele caracteristici pe care sistemul trebuie să le analizeze folosind un algoritm de învățare. Cu ajutorul unui algoritm de învățare, suntem capabili de a demonstra (folosind interfața noastră de utilizator), etichetele fiecărui obiect detectat în imaginea de intrare.
Mașina de învățare implică o recunoaștere a modelului și teoria învățării în domeniul inteligenței artificiale și este legată de statisticile de calcul. Este utilizată în sute de aplicații, cum ar fi OCR (recunoaștere optică a caracterelor), filtrarea spam-ului, motoarele de căutare, și mii de aplicații informatice.
În funcție de modul în care mașina de algoritmi ML trebuie să învețe din date sau mostre, există 3 moduri de învățare:
învățare supervizată: Calculatorul învață dintr-un set de date etichetate. Scopul este de a învăța parametrii modelului și regulile care permit computerelor să mapeze relația dintre date și rezultate de etichete de ieșire
învățare nesupravegheată: Nu există etichete, sunt date, iar calculatorul încearcă să descopere structura de intrare a datelor de intrare.
învățare armătură: Calculatorul interacționează cu un mediu dinamic care realizează scopul și învață din greșelile sale.
În funcție de rezultatele dorite pe care le obținem de la algoritmul nostru de învățare automată, le putem clasifica în următoarele:
Clasificare: În clasificare, spațiul intrărilor pot fi împărțite în clase N. Aceasta este una dintre categoriile cele mai utilizate. Un exemplu tipic este o filtrare de spam de e-mail în cazul în care există doar două clase: de spam și de non spam sau OCR, în cazul în care sunt disponibile numai N caractere, iar fiecare caracter este o singură clasă.
Regresie: Rezultatul este o valoare continuă în locul unei valori discrete, cum ar fi un rezultat de clasificare. Un exemplu de regresie poate fi de predicție a prețului casei furnizând mărimea casei, numărul de ani, și locația.
Clustering: Intrările sunt împărțite în N grupuri de formare.
Estimarea densitate: Aceasta găsește (probabilitate) distribuția de intrări.
În procesul de învățare mașină, există mai multe abordări și metode, iar unele dintre ele folosite sunt SVM (mașini vector suport), ANNs (rețele neuronale artificiale), grupare cum ar fi K-apropiați vecini, arbori de decizie, sau învățare profundă, care este abordarea rețele neuronale utilizate. Toate aceste metode și abordări sunt susținute, puse în aplicare, și bine documentate în OpenCV [11].
În procesul de învățare mașină, cea mai mare consumatoare de timp este metoda de formare. Aceasta poate dura de la câteva secunde până la câteva săptămâni sau luni pentru seturi mari de date și structuri complexe de învățare automată. Acest lucru înseamnă că nu ne putem antrena algoritmul nostru de fiecare dată când vom rula aplicația, și este recomandat să salvam modelul după ce a fost antrenat pentru că toți parametrii de formare / predicție machine learning să fie salvați.
Metoda de training este responsabilă pentru învățarea parametrilor modelului de la un set de date de formare.
Aproape orice aplicație Computer Vision începe cu o etapă de preprocesare, care se aplică imaginii de intrare. Preprocesarea implică condiții de îndepărtare a luminii și a zgomotului, thresholding. După ce aplicăm toate etapele de preprocesare necesare pentru imaginea de intrare, al doilea pas este segmentarea. În etapa de segmentare, avem este nevoie de extragerea regiunii de interes a unei imagini și de a le izola pentru a găsi obiectele de interes. De exemplu, într-un sistem de detectare a feței, avem nevoie de separarea fețele de restul pieselor din scenă.
După obținerea obiectelor din interiorul imaginii, vom continua cu pasul următor. Avem nevoie de extragerea de toate caracteristicile fiecăruia dintre obiectele detectate; o caracteristică este un vector de caracteristici ale obiectelor. O caracteristică care descrie obiectele noastre poate fi suprafața obiectului, conturul, modelul.
Acum, avem descriptorul obiectului nostru; un descriptor este o caracteristică care descrie un obiect, acești descriptori folosindu-se pentru instruire. Pentru a face acest lucru, trebuie creat un set mare de date de caracteristici, în cazul în care sunt preprocesate sute, mii și milioane de imagini.
2. TEHNOLOGII sI INSTRUMENTE SOFTWARE FOLOSITE iN IMPLEMENTAREA PROIECTULUI
În cadrul acestui capitol voi prezenta fundamentul teoretic care va sta la baza realizării acestei lucrări. Voi prezenta mecanismele pe care le voi folosi în implementare, voi argumenta de ce am ales aceste mecanisme și nu altele.Aplicația realizată de mine se încadrează în domeniul numit affectivecomputing, care permite dezvoltarea de sisteme și dispozitive care pot recunoaște, interpreta, procesa, și simula emoțiile umane. Acest domeniu este unul interdisciplinar care acoperă mai multe științe cum ar fi: știința calculatoarelor, psihologie și științele cognitive.
Mecanismele pe care le voi folosi sunt următoarele:
2.1 Limbajul Python
Este un limbaj ușor de folosit, oferă posibilitatea unei mai bune structurări, este un limbaj de nivel foarte înalt, dispune de tipuri de date de nivel înalt cum ar fi tablouri sau dicționare foarte flexibile, a căror implementare în C ar lua programatorului zile, îl voi folosi tocmai din aceste motive.
Acest limbaj este cel mai potrivit pentru elaborarea de script-uri, precum și pentru dezvoltarea de aplicații în mai multe domenii, pe majoritatea platformelor.
Are nenumărate avantaje: oferă posibilitatea unei mai bune structurări, reprezintă un bun suport pentru programe mai mari.
Pe de altă parte dispune de o mult mai bună verificare a erorilor decât C-ul, și fiind un limbaj de nivel foarte înalt, dispune de tipuri de date de nivel înalt cum ar fi tablouri sau dicționare foarte flexibile, a căror implementare în C ar lua programatorului zile. Datorită caracterului general al tipurilor de date Python poate fi aplicat într-o arie mult mai largă de probleme decât AWK sau PERL. Cu toate astea, multe lucruri se realizează la fel de ușor în Python ca și în aceste limbaje[10].
Este foarte util deoarece permite divizarea programelor în module care pot fi folosite apoi în alte programe Python.
Fiind un limbaj interpretat, acesta accelerează munca în timpul procesului de dezvoltare, nu este nevoie ca de fiecare dată să se facă o compilare a codului.
Limbajul Python permite scrierea unor programe foarte compacte¸ ușor de citit. Programele scrise în Python sunt mult mai mici decât echivalentele în C sau C++ pentru că:
tipurile de date de nivel înalt permit realizarea operațiilor complexe într-o singură instrucțiune;
gruparea instrucțiunilor este dată de paragrafare în loc de blocuri begin/end sau de acolade;
nu este necesară declararea variabilelor.
Python este un limbaj extensibil: dacă aveți cunoștințe de C puteți foarte ușor sa adăugați o nouă funcție sau un modul, fie pentru a efectua operații la viteză maximă, fie pentru a lega programe Python la biblioteci disponibile numai în formă binară (biblioteci grafice).[10]
Python este adesea comparat cu alte limbaje de programare, cum ar fi Java, JavaScript, Perl, Tcl sau Smalltalk. Comparațiile cu C ++, Lisp Common și Scheme pot fi, de asemenea, evidențiate. În această secțiune voi compara pe scurt Python cu fiecare dintre aceste limbaje de programare. Aceste comparații se concentrează numai asupra problemelor legate de sintaxă. În practică, alegerea unui limbaj de programare este adesea dictată de alte constrângeri din lumea reală, cum ar fi costul, disponibilitatea, formarea și investițiile prealabile sau chiar atașamentul emoțional. Deoarece aceste aspecte sunt foarte variabile și subiective am ales sa fac comparația în funcție de criteriul mentionat anterior:
a) Python vs Java
Programele Python ruleza in general mai lent decât programele Java, dar au nevoie de mult mai puțin timp pentru a le dezvolta. Programele Python sunt de obicei de 3-5 ori mai scurte decât programele Java echivalente. Această diferență poate fi atribuită tipurilor de date integrate Python și tipăririi dinamice. De exemplu, un programator Python nu pierde niciun moment în care să declare tipurile de argumente sau variabile. Datorită timpului de scriere în timp real, timpul de rulare al lui Python este mai îndelungat decât timpul de rulare al programelor implementate cu Java. De exemplu, atunci când evaluăm expresia a + b, trebuie mai întâi să inspectăm obiectele a și b pentru a afla tipul lor, care nu este cunoscut la momentul compilării. Apoi se invocă operația de sumă, care poate fi o metodă definită de utilizator. Java, pe de altă parte, poate efectua o integrare eficientă sau cu un număr de flotare eficient, dar necesită declarații variabile pentru a și b și nu permite supraîncărcarea operatorului + pentru instanțe de clase definite.
Din aceste motive, Python este mult mai potrivit ca limbaj de programare de legatură, în timp ce Java este mai bine caracterizat ca limbaj de implementare la nivel inferior. De fapt, cele două limbaje de programare împreună fac o combinație excelentă. Componentele pot fi dezvoltate în Java și combinate pentru a forma aplicații în Python; Python poate fi de asemenea, utilizat pentru prototipul componentelor până când designul lor poate fi "întărit" într-o implementare Java. Pentru a sprijini acest tip de dezvoltare, o implementare Python scrisă în Java este în curs de dezvoltare, ceea ce permite apelarea codului Python din Java și invers. În această implementare, codul sursă Python este tradus în Java bytecode (cu ajutorul unei biblioteci run-time pentru a susține semantica dinamică).
b) Python vs Javascript
Limbajul de programare Python este aproximativ echivalent cu JavaScript din punct de vedere al faptului ca este limbaj de programare orientat pe obiect. Ca JavaScript (și spre deosebire de Java), Python acceptă un stil de programare care folosește funcții simple și variabile fără a se angaja în definiții de clasă. Cu toate acestea, pentru JavaScript, asta e tot. Python, pe de altă parte, susține scrierea unor programe mult mai mari și o reutilizare mai bună a codurilor printr-un adevărat stil de programare orientat pe obiect, unde clasele și moștenirea joacă un rol important.
c) Python vs Perl
Python și Perl provin dintr-un mediu similar (scripturi Unix) și au multe caracteristici similare, dar au o filosofie diferită. Perl pune accentul pe suportul pentru sarcini comune orientate pe aplicație, de exemplu. Prin construirea de expresii regulate, scanarea fișierelor și generarea de rapoarte de caracteristici. Python pune accentul pe sprijinirea metodologiilor comune de programare, cum ar fi proiectarea structurii de date și programarea orientată pe obiecte, și încurajează programatorii să scrie cod care poate fi citit (și astfel menținut) oferind o notație elegantă, dar nu prea criptică. Ca o consecință, Python se apropie de Perl, dar rareori îl bate în domeniul său de aplicare original; Cu toate acestea, Python are o aplicabilitate care depășește nivelul de nișă.
d) Python vs TCL
Ca și Python, Tcl este utilizabil ca limbaj de programare de extensie a aplicației, precum și un limbaj de programare autonom. Cu toate acestea, Tcl, care stochează în mod tradițional toate datele ca șiruri de caractere, este mai putin performant față de structurile de date și execută codul tipic mult mai lent decât Python. Tcl nu are, de asemenea, caracteristici necesare pentru scrierea programelor mari, cum ar fi spațiile de nume modulare. Astfel, în timp ce o aplicație "tipică" folosind Tcl conține, de obicei, extensii Tcl scrise în C sau C ++ care sunt specifice acelei aplicații, o aplicație Python echivalentă poate fi adesea scrisă doar in Python. Desigur, dezvoltarea Python este mult mai rapidă decât necesitatea de a scrie și depana o componentă C sau C ++.
e) Python vs SmallTalk
Poate că cea mai mare diferență dintre Python și Smalltalk este sintaxa mai structurată a lui Python, care îi conferă un avantaj programatorului. La fel ca Smalltalk, Python are tastarea și legarea dinamică, iar totul în Python este un obiect. Cu toate acestea, Python distinge tipurile de obiecte încorporate din clasele definite de utilizator și, în prezent, nu permite moștenirea de la tipurile încorporate.In limbajul de programare Smalltalk biblioteca standardă de date de colectare tipuri este mai rafinata, în timp ce biblioteca lui Python are mai multe facilități pentru realizarea legaturii cu Internet și WWW, cum ar fi e-mail, HTML și FTP.
Python are o filozofie diferită în ceea ce privește mediul de dezvoltare și distribuirea codului. În cazul în care Smalltalk are în mod tradițional o "imagine a sistemului" monolit care cuprinde atât mediul, cât și programul utilizatorului, Python stochează atât module standard cât și module de utilizator în fișiere individuale care pot fi ușor rearanjate sau distribuite în afara sistemului. O consecință este că există mai multe opțiuni pentru atașarea unei interfețe grafice (GUI) la un program Python, avand in considerare ca GUI nu este embeded in sistem.
f) Python vs C ++
Aproape tot ceea ce a fost spus pentru Java se aplică și pentru C ++, cu atât mai mult: unde codul Python este de obicei de 3-5 ori mai scurt decât codul Java echivalent, este adesea de 5-10 ori mai scurt decât codul C ++ echivalent! Dovezile anecdotice sugerează că un programator Python poate termina în două luni ceea ce doi programatori C ++ nu pot finaliza într-un an. Python strălucește ca limbaj de legatura utilizat pentru combinarea componentelor.[4]
2.2 Structuri de control în Python
Python dispune de structurile de control obișnuite, întâlnite și în celelalte limbaje. Acestea sunt:
instrucțiuni if (instrucțiunea prezentă în toate limbajele de programare).
Fără această instrucțiune, nu s-ar putea face verificarea uneia sau mai multor condiții. În cadrul unui program pot exista mai multe secțiuni elif sau niciuna, iar secțiunea else este opțională. Cuvântul cheie “elif” fiind prescurtarea de la ”elseif”, acesta este folositor pentru a evita tabularea excesivă. O secvență if..elif..elif funcționează ca un bloc case sau switch, secvențe proprii altor limbaje de programare [4].
instrucțiuni for
Instrucțiunile for din Python sunt diferite. Iterațiile instrucțiunii for din Python funcționează după elementele listei sau a unui șir, pe când în alte limbaje de programare, de exemplu în limbajul C iterația este una flexibilă, programatorul putând defini atât pasul cât și condiția de oprire.
funcția range()
Această funcție este folosită pentru generarea unor liste ce conțin progresii aritmetice. Parametrul furnizat funcției nu va fi niciodată un membru al secvenței. Secvența generată de această funcție trebuie să nu înceapă de la 0. Rația progresiei aritmetice poate fi modificată de fiecare dată.
instrucțiuni break
Instrucțiunea din cadrul acestui limbaj are aceeași semnificație ca și în limbajul de programare C, adică terminarea forțată a unei bucle while sau for.
Instrucțiunile din cadrul unei clauze else sunt executate atunci când bucla se termină odată cu terminarea listei (for) sau atunci când condiția buclei devine falsă (pentru while) aceste instrucțiuni nu sunt executate dacă bucla este terminată printr-o instrucțiune break.[4]
instrucțiuni continue
Această instrucțiune trece necondiționat la următoarea iterație.
instrucțiuni pass
Instrucțiunea “pass” poate fi folosită atunci când este necesară prezența sintactică a unei instrucțiuni, fără ca aceasta să execute ceva.[4]
instrucțiuni funcții
Cuvântul def este un cuvânt cheie în Python, este primul cuvânt folosit în definiția unei funcții. Acesta este urmat de numele funcției și de o listă de parametrii ai respectivei funcții.
Instrucțiunile care formează funcția încep pe linia următoare, și sunt plasate la o distanță diferită de margine față de definiția funcției.
Prima instrucțiune din corpul funcției poate fi un șir de caractere (opțional), acest șir reprezentând documentația funcției. În momentul în care se produce execuția unei funcții, se creează o nouă tabelă de simboluri, care se folosește pentru variabilele locale. Toate atribuirile din cadrul unei funcții vor stoca valorile în tabela de simboluri locală. Atunci când interpretorul găsește un nume de variabilă, întâi caută în tabela de simboluri locală, apoi în cea globală, și în final în cea predefinită. Cu toate acestea variabilelor globale nu li se pot atribui valori în cadrul unei funcții, decât dacă se folosește instrucțiunea global.
Parametrii actuali ai unei funcții apelate sunt introduși în tabela de simboluri locală a acelei funcții în momentul apelării ei. Transferul argumentelor făcându-se prin utilizarea unui apel prin valoare (unde valoarea este întotdeauna un obiect referință, nu valoarea obiectului).Când o funcție apelează o alta funcție, este creată o nouă tabelă de simboluri pentru funcția apelată.
Definirea unei funcții trece numele funcției în tabela de simboluri curentă.
2.3 Liste în Python
Acest tip de date dispune de câteva metode. Acestea sunt:
append(x) −Adăugarea unui element la sfârșitul listei.
extend(L) −Adăugarea elementelor furnizate ca și parametru la sfârșitul listei.
insert(i, x) −Inserarea unui element într-o anumită poziție. Primul argument reprezintă indicele elementului din listă înaintea căruia se va face inserția.
remove(x) −Ștergerea din listă a primului element găsit cu valoarea ’x’. Dacă nu există un astfel de element apare o eroare.
pop([i]) − Ștergerea din listă a elementului de pe poziția ’i’, și returnarea valorii acestuia.
index(x) − Întoarce indicele primului parametru din listă care are valoarea ’x’.
count(x) − Întoarce numărul de apariții ale valorii ’x’ între elementele listei.
sort() − Sortează elementele listei.
reverse() − Schimbă ordinea elementelor din listă.
2.4 Biblioteca OpenCV
Este o bibliotecă creată pentru a rezolva problemele de computer vision. Unul dintre principalele avantaje ale OpenCV este faptul că este foarte optimizată și disponibilă pe aproape toate platformele. OpenCV (Open Source Computer Vision Library) este o mașină de învățare a unor librari software. Biblioteca OpenCV a fost construită pentru a oferi o infrastructură comună pentru aplicațiile de computer vision și pentru a accelera utilizarea percepției mașinilor în produsele comerciale. OpenCV facilitează utilizarea și modificarea codului de către companii în vederea îmbunătățirii acestuia.
Biblioteca Open CV are mai mult de 2500 de algoritmi optimizați, care include un set cuprinzător de algoritmi de vizionare clasică și de ultimă generație, precum și de algoritmi de învățare a mașinilor. Acești algoritmi pot fi utilizați pentru a detecta și recunoaște fețele, a identifica obiecte, a clasifica acțiunile umane în videoclipuri, a urmări mișcările camerei, a urmări obiectele în mișcare, a extrage modele 3D de obiecte, a produce nori de puncte 3D din camerele stereo. Imaginea unei scene întregi, găsirea unor imagini similare dintr-o bază de date a imaginilor, eliminarea ochilor roșii din imaginile realizate cu ajutorul blitz-ului, urmărirea mișcărilor ochilor, recunoașterea peisajelor și stabilirea marcatorilor pentru a suprapune cu realitatea augmentată etc. OpenCV are mai mult de 47 mii de utilizatori. Comunitatea și numărul estimat de descărcări depășește 14 milioane. Biblioteca este utilizată extensiv în companii, grupuri de cercetare și organizatii guvernamentale.
Împreună cu companii de renume precum Google, Yahoo, Microsoft, Intel, IBM, Sony, Honda, Toyota care angajează biblioteca, există numeroase companii începătoare, cum ar fi Applied Minds, VideoSurf și Zeitera, care folosesc extensiv OpenCV
Are interfețe C ++, C, Python, Java și MATLAB și suportă Windows, Linux, Android și Mac OS. OpenCV se bazează în principal pe aplicațiile vizuale în timp real și beneficiază de instrucțiunile MMX și SSE atunci când sunt disponibile. O interfață CUDA și OpenCL cu funcții complexe sunt dezvoltate în prezent. Există peste 500 de algoritmi și aproximativ 10 ori mai multe funcții care compun sau susțin acești algoritmi. OpenCV este scris nativ în C ++ și are o interfață template care funcționează perfect cu containerele STL.
Biblioteca OpenCV permite rularea algoritmilor Computer Vision în timp real. OpenCV a devenit biblioteca standard în acest domeniu.
Unul dintre cele mai bune lucruri pe care le face OpenCV este că oferă o mulțime de primitive pentru construirea operațiunilor legate de procesarea imaginii și Computer Vision. Definirea unei imagini, a unui punct, a unui dreptunghi sunt fundamentale pentru aproape orice algoritm din cadrul Computer Vision.
Reconstrucția 3D este un subiect important în Computer Vision. Având în vedere un set de imagini 2D, va reconstitui scena 3D folosind algoritmi relevanți. OpenCV prevede algoritmi care pot găsi relația dintre diferitele obiecte din aceste imagini 2D pentru a calcula pozițiile lor 3D. Există un modul numit calib3d care se poate ocupa de toate astea. Acest modul se poate ocupa de asemenea, de calibrarea aparatului foto, care este esențială pentru a estima parametrii camerei[10].
Sistemul vizual uman are tendința de a extrage caracteristicile de bază dintr-o anumită scenă, astfel încât să poată fi recuperate ulterior. Pentru imitarea acestui lucru, oamenii au început proiectarea diferitelor extractoare de caracteristici care pot extrage aceste puncte importante dintr-o anumită imagine. Cei mai populari algoritmi includ SIFT, SURF, FAST și așa mai departe. Există un modul numit features2d care oferă funcții pentru a detecta și a extrage toate aceste caracteristici. Un alt modul numit xfeatures2d oferă câteva extractoare, unele dintre funcții care sunt încă în faza experimentală.
Detectarea obiectelor se referă de fapt la detectarea locației unui obiect într-o anumită imagine. Acest proces nu este influențat de tipul obiectului. Detectarea localizării obiectelor este un pas foarte important în multe sisteme de Computer Vision.
Detectarea obiectelor folosite necesită calcul intensiv, din cauza numărului de calcule necesare pentru a efectua detectarea la diferite scări. Pentru a rezolva acest lucru, Paul Viola și Michael Jones au venit cu un mare algoritm, oferind o modalitate rapidă de a proiecta un detector de obiect pentru orice obiect. OpenCV are module numite objdetect și xobjdetect care oferă cadrul pentru a proiecta un detector de obiect[11].
Computer Vision utilizează diverși algoritmi de învățare automată pentru a realiza lucruri diferite. OpenCV oferă un modul numit ml, care are mulți algoritmi de învățare incluși în ea.
Unii dintre algoritmi includ: Bayes clasificator, Support Vector Machines, arbori de decizie, rețele neuronale, și așa mai departe. Există și un modul numit Flann care conține algoritmi pentru căutări rapide (cel mai apropiat vecin în seturi mari de date). Algoritmii de învățare mașină sunt utilizați pe scară largă pentru a construi sisteme de recunoaștere a obiectului, clasificarea imaginii, de detectare a feței, căutări vizuale.
Noțiunea de shape este crucială în Computer Vision. Noi analizăm datele vizuale prin recunoașterea diferitelor forme dintr-o imagine. Acesta este de fapt un pas important în mulți algoritmi. Sunt oferiți toți algoritmii necesari pentru a extrage diferite forme.
Algoritmii optical flow sunt utilizați în video pentru urmărirea funcțiilor din cadre succesive. Să presupunem că dorim să urmărim un anumit obiect dintr-un film. Este nevoie de extragerea caracteristicilor din cadrul curent și apoi de urmărirea acestor caracteristici în cadre succesive.
Recunoașterea feței se referă la identificarea persoanei dintr-o imagine. Acest lucru nu este același lucru cu detectorul feței. Dacă se dorește construirea unui sistem practic biometric care poate recunoaște persoana din fața camerei, trebuie mai întâi rulat detectorul de față care poate identifica locația feței, după care trebuie executat un recognizer al feței care poate recunoaște acea persoană. Există un modul numit face care se ocupă de recunoașterea feței. Așa cum s-a discutat mai devreme, Computer Vision încearcă să modeleze algoritmi pe baza modului în care oamenii percep datele vizuale. Pentru a găsi regiuni și obiecte importante în imagini, cum ar fi recunoașterea obiectelor, detectarea obiectelore este utilă folosirea modului numit saliency care este proiectat în acest scop. Acesta oferă algoritmi care pot detecta regiunile importante în imagini și videoclipuri statice [10].
Anumite aplicații includ recunoașterea plăcuței de identificare, recunoaștere a semnelor de circulație pentru mașinile, scanarea cărților în format digital. Pentru aceste aplicații există un modul numit text care conține diverși algoritmi pentru a detecta și a recunoaște un text.
2.5 ComputerVision pentru inspecție optică, segmentare și detectare
Detectarea stării emoționale a unui utilizator se poate face prin monitorizarea și analiza semnelor fiziologice. Cele trei semne fiziologice principale care pot fi analizate sunt: pulsul volumului sanguin, răspunsul galvanic al pielii, electromiografie facială[6].
Acest domeniu de cercetare este încă în fază incipientă, dar care prinde avânt. Affective computing folosește diverse modalități pentru analizarea emoțiilor umane. Una dintre cele mai importante modalități este Computer Vision.
Computer Vision este un domeniu care include metode pentru dobândirea, prelucrarea, analizarea și înțelegerea imaginilor și, în general, date high-dimensionale din lumea reală, în scopul de a produce informații numerice sau simbolice. O temă dezvoltată în acest domeniu a fost dublarea capacitățile vederii umane, prin perceperea și înțelegerea unei imagini în format electronic, transformarea imaginilor vizuale în descrieri ale lumii și interfațarea cu alte procese. Această înțelegere a imaginilor poate fi văzută ca despletirea informației simbolice în date image folosind modele construite cu ajutorul geometriei, fizicii, statistici, și teoria învățării. ComputerVison a fost de asemenea descrisă ca fiind automatizarea și integrarea unei largi game de procese și reprezentări pentru percepția vederii[7].
Computer Vison studiază teoria din spatele sistemelor artificiale care extrag informațiile din imagini. Image date poate lua diverse forme: secvențe video, date multi-dimensionale de la un scanner medical. Această disciplină, caută să aplice teoriile și modelele sale în construirea de aplicații Computer Vision.
Inteligența artificială și Computer Vision împărtășesc aceeași viziune despre subiecte cum ar fi: recunoașterea formelor și a tehnicilor de învățare. În consecință, Computer Vison este uneori văzut ca o parte a domeniului inteligenței artificiale, dar și a domeniului Affective Computing [7].
Computer Vision este opusul graficii pe calculator. În timp ce grafica computerizată produce image date de la modele 3D, Computer Vision produce modele 3D de la image date.
O problemă des întâlnită în Computer Vision este aceea de a procesa imaginile, dar și de a determina dacă imaginile conțin anumite obiecte. Diferite varietăți ale problemei recunoașterii sunt descrise în literatura de specialitate:
Recunoașterea obiectului (clasificarea obiectelor) – unul sau mai multe obiecte sau clase de obiecte pot fi recunoscute, de obicei după forma lor. Blippar, LikeThat furnizează programe independente care ilustrează această funcționalitate.
Identificarea – o instanță individuală a unui obiect este recunoscută. Exemplele includ identificarea feței sau a amprentelor digitale al unei anumite persoane, identificarea cifrelor scrise de mână, sau identificarea unui anumit vehicul.
Detecție –image date sunt scanate pentru o anumită afecțiune. Exemplele includ detectarea posibilelor celule sau țesuturi, sau detectarea unui vehicul într-un sistem automat de taxare rutieră. Detecția bazată pe calcule relativ simple și rapide este uneori folosită pentru identificarea unei regiuni mai mici de date a unei imagini [7].
Cei mai buni algoritmi pentru astfel de sarcini sunt cei bazați pe rețele neuronale convoluționale. Performanța acestor rețele pe testele ImageNet, este aproape de cea a oamenilor.
Computer Vison este extrem de dependent de aplicație. Unele sisteme sunt stand-alone, altele constituie un subsistem al modelului mai mare, care poate conține alte subsisteme pentru controlul dispozitivelor de acționare mecanice, planificare, etc.
O imagine digitală din cadrul unei aplicații din acest domeniu este produsă de unul sau mai mulți senzori de imagine, care, pe lângă diferite tipuri de camere sensibile la lumină, includ senzori cu rază, dispozitive de tomografie, radar, camere video ultra-sonic, etc., în funcție de tipul de senzor, rezultând o imagine obișnuită 2D, un volum 3D, sau o secvență de imagini. Valorile pixelilor corespund uneia sau mai multor benzi spectrale (imagini gri sau imagini color)[11]. Este necesară pre-procesarea imaginilor/datelor în scopul îndeplinirii anumitor ipoteze implicite. Câteva exemple ar putea fi:
Re-eșantionare pentru a se asigura că sistemul de coordonate al imaginii este corectă.
Reducerea zgomotului pentru a se asigura că zgomotul senzorului nu introduce informații false.
Îmbunătățirea contrastului pentru a se asigura că informațiile relevante pot fi detectate.
În procesul de prelucrare se iau o serie de decizii cu privire la punctele si regiunile cele mai relevante pentru o prelucrare ulterioară. Exemple:
Selecția unui anumit set de puncte de interes.
Segmentarea uneia sau a mai multor regiuni de imagini care conțin un anumit obiect de interes.
Segmentarea imaginii în scene formate din grupuri de obiecte, obiecte singulare sau părți ale obiectelor importante [7].
După pre-procesare, urmează procesarea la nivel înalt. În cadrul acesteia se folosește un set mic de date de intrare, un set de puncte sau o regiune a unei imagini care presupune că acesta conține un anumit obiect. Exemple:
Verificarea că datele satisfac modelele de bază.
Estimarea parametrilor specifici de aplicare, mărimea obiectului.
De recunoașterea imaginilor – clasificarea unui obiect detectat în diferite categorii.
Înregistrarea imaginii – compararea și combinarea a două puncte de vedere diferite ale aceluiași obiect.
Luarea deciziei finale, de exemplu:
Pass / fail privind cererile de inspecție automate.
Potrivire / nepotrivire în aplicații de recunoaștere.
Pavilion pentru examinare umană și mai mult în aplicații medicale, militare, de securitate și de recunoaștere[7].
Sectorul industrial utilizează sisteme complexe Vision și hardware. Computer Vision încearcă să detecteze problemele și să minimizeze erorile produse în procesul de producție.
În zilele noastre, utilizarea de inspecție optică, folosind diferite tipuri de camere, cum ar fi camere video în infraroșu, 3D depinde de obiectele de măsură, de detectarea efectelor de suprafață.
Se extrag atât caracteristicile fiecărui obiect segmentat precum și algoritmul pentru a identifica fiecare obiect de clasă pentru a permite clasificarea obiectele noastre.
Pașii care trebuie urmați pentru preprocesare sunt:
eliminarea zgomotului de ștergere
Iluminare
Binarizare
În etapa de segmentare, se folosesc doi algoritmi diferiți:
Algoritmul de detecție a conturului
corecția de extragere a componentei (etichetare)[12]
Pentru crearea unei aplicații, avem nevoie de câțiva parametri de intrare atunci când utilizatorul le execută:
O imagine de intrare pentru a fi procesată
Modelul imaginii de lumină
Operațiunea de lumină
Preprocesarea este prima modificare pe care o facem într-o nouă imagine.
În mod normal, în etapa de preprocesare, se reduce la minimum zgomotul imaginii, condițiile de iluminare, sau deformările imaginii datorită lentilelor camerei. Acești pași minimizează erorile atunci când se încearcă să se detecteze obiecte.
Dacă nu se elimină zgomotul, se detectează mai multe obiecte decât ne așteptăm, deoarece în mod normal, zgomotul este reprezentat ca un punct mic din imagine și poate fi segmentat ca un obiect. Circuitul senzorului și în mod normal, scanerul produce acest zgomot. Această variație de luminozitate sau culoare poate fi reprezentată în diferite tipuri, cum ar fi zgomotul gaussian, Spike zgomot, și zgomotul împușcat. Există diferite tehnici care pot fi folosite pentru a elimina zgomotul[8].
Cum putem elimina lumina din imaginea noastră? Este foarte simplu; avem nevoie doar de o imagine, fără nici un obiect, care este luată de la exact aceeași poziție de unde au fost luate alte imagini, și să aibă aceleași condiții de lumină.
Apoi, cu o operație matematică simplă, putem elimina acest model de lumină. Există două opțiuni pentru a le elimina:
Diferență
Diviziunea imaginilor reprezintă cea mai simplă abordare.
Dacă avem modelul L de lumină și de imagine I, rezultatul de îndepărtare R este diferența dintre ele: R = L-I. Această diviziune este un pic mai complexă, dar simplă, în același timp. Dacă avem o matrice a luminii de model L și matricea de imagine I, rezultatul de îndepărtare R este după cum urmează: R = 255 * (1- (I / l)).
În cazul în care modelul nostru de lumină este de culoare albă, iar obiectele sunt mai întunecate decât banda purtătoare de fond, atunci valorile pixelilor imaginii vor rămâne întotdeauna la fel sau vor fi mai mici decât valorile pixelilor luminoși. Apoi, rezultatul pe care îl obținem de la I / L este între 0 și 1. În cele din urmă, am inversat rezultatul acestei diviziuni pentru a obține aceeași gamă de direcție de culoare și îl înmulțim cu 255 pentru a obține valori între intervalul 0-255.
În codul nostru, vom crea o nouă funcție numită removeLight cu următorii parametri:
o imagine de intrare pentru a elimina lumina / fundal
model de lumină mat
Metoda: 0 este diferența, 1 divizia, ieșirea este o matrice nouă imagine fără lumină /fundal[8].
Când nu avem un model de lumină, cu ajutorul unui filtru, putem crea unul care poate fi utilizat, dar există algoritmi mai buni de la care se poate afla fundalul de la câteva imagini, în cazul în care apar piesele în diferite domenii. Pentru a estima imaginea de fundal, vom folosi o estompare cu o dimensiune miez mare care este aplicată la imaginea noastră de intrare. Aceasta este o tehnică comună utilizată în OCR în cazul în care literele sunt relativ subțiri și mici pentru întregul document, și ne permite să efectuăm o aproximare a modelelor de lumină din imagine.
După scoaterea fundalului, trebuie doar să se binarizeze imaginea pentru segmentarea viitoare. Acum, vom aplica funcția de prag cu ajutorul a două valori de prag diferite: o valoare foarte scăzută atunci când eliminăm lumina / fundal, deoarece toate regiunile de bază non-dobândă sunt valori negre sau foarte mici, și o valoare medie, atunci când nu folosim o îndepărtare ușoară.
Două tehnici utilizate pentru segmentarea imaginii noastre thresholded:
Componentele conectate
Funcția “find Contours” (găsește contur)
Cu aceste două tehnici, se poate extrage fiecare regiune de interes a imaginii noastre în cazul în care apar obiectele noastre țintă[8].
Componenta conectată este un algoritm foarte comun folosit pentru a identifica segmente și părți în imagini binare. O componentă conectată este un algoritm iterativ folosit în scopul etichetării unei imagini cu ajutorul unui pixel cu 8 sau 4-conectivitate. Doi pixeli sunt conectați în cazul în care au aceeași valoare și sunt vecini.
2.6 HTML (HyperText Markup Language) este un limbaj de marcare utilizat pentru crearea paginilor web ce pot fi afișate într-un browser (sau navigator). Scopul HTML este mai degrabă prezentarea informațiilor – paragrafe, fonturi, tabele ș.a.m.d. – decât descrierea semanticii documentului.
Specificațiile HTML sunt dictate de World Wide Web Consortium (W3C).
HTML furnizează mijloacele prin care conținutul unui document poate fi adnotat cu diverse tipuri de metadate și indicații de redare. Indicațiile de redare pot varia de la decorațiuni minore ale textului, cum ar fi specificarea faptului că un anumit cuvânt trebuie subliniat sau că o imagine trebuie introdusă, până la scripturi sofisticate, hărți de imagini și formulare.
Metadatele pot include informații despre titlul și autorul documentului, informații structurale despre cum este împărțit documentul în diferite segmente, paragrafe, liste, titluri etc. și informații cruciale care permit ca documentul să poată fi legat de alte documente pentru a forma astfel hiperlink-uri [1].
Elementele HTML sunt blocuri de constructie pentru paginile HTML. Cu ajutorul constructorilor HTML, imaginilor si altor obiecte precum forme interactive, se pot construi pagini cu diferite intrebuintari. HTML furnizeaza un mod de a crea documente structurate prin denotarea elementelor sematince structurale pentru text cum ar fi rubricile, paragrafele, listele, link-urile, citarile si alte elemente. Elementele HTML sunt delimitate de tag-uri care sunt scrise folosind paranteze unghiulare. Tag-uri precum <img /> si <input /> introduc continut in pagina direct. Altele cum ar fi <p>…</p> incastreaza si furnizeaza informatii despre textul din interiorul sau si poate include si alte tag-uri ca sub-elemente. Navigatoarele de internet nu afiseaza tag-urile HTML, dar le folosesc pentru a interpreta continutul paginii [7].
HTML poate incorpora programe scrise in limbaj script cum ar fi JavaScript care afecteaza comportamentul si continutul paginilor web. Includerea CSS-ului definieste modul in care se afiseaza continutul si modul in care este asezat acesta. W3C, detinatorul standardelor pentru HTML si CSS, încurajează folosirea limbajului CSS în detrimentul scrierii de HTML explicit.
2.7 Haar cascade training
Haar cascades sunt clasificatori în cascadă, care se bazează pe caracteristicile Haar. Un clasificator cascadă este pur și simplu o înlănțuire a unui set de clasificatori slabi, ce pot fi folosiți pentru a crea un clasificator puternic. Clasificatori slabi sunt clasificatori ale căror performanțe sunt limitate, aceștia nu au capacitatea de a clasifica totul corect. Clasificatorii puternici sunt foarte buni la clasificarea corectă a datelor noastre. O altă parte importantă a Haar cascades sunt caracteristicile Haar[8]. Aceste caracteristici sunt simple dreptunghiuri dintr-o imagine. Să considerăm următoarea figură:
Fig 2.1
Dacă dorim să calculăm caracteristicile Haar ale regiunii ABCD, trebuie să calculăm diferența dintre pixelii albi și pixelii de culoare din acea regiune. Vom folosi diferite modele pentru a construi caracteristici Haar.
Algoritmul utilizează o cascadă amplificată de clasificatori slabi. Acest sistem este folosit pentru a construi un clasificator puternic, care se poate realiza foarte bine. Pentru a construi un astfel de sistem, trebuie colectate imagini care pot fi folosite pentru instruirea acestuia. Avem nevoie atât de imagini pozitive, cât și de imagini negative. Sistemul va ingera aceste date și apoi va învăța să facă diferența între acestea.
Pentru a asigura calitatea clasificatorilor, Viola și Jones au descris o tehnică nifty în etapa cascadă. Primul a fost extragerea caracteristicilor din toate imaginile. Ei au folosit caracteristici Haar în lucrarea lor pentru a construi vectori de trăsături. Odată ce aceste caracteristici sunt extrase, vor fi trecute printr-o cascadă de clasificatori. Urmează verificarea tuturor subregiunilor dreptunghiulare și păstrarea celor care nu conțin fețe.
Pentru a extrage caracteristicile Haar, trebuie să calculăm suma valorilor pixelilor închiși în multe regiuni dreptunghiulare ale imaginii. Pentru a face această scală invariantă, trebuie să calculăm aceste zone la scări multiple (adică, pentru diferite dimensiuni ale dreptunghiului). Dacă va fi implementat în mod naiv, acest lucru ar fi un proces intensiv foarte computațional. Trebuie să evităm iterarea acelorași pixeli de mai multe ori. Pentru a evita acest lucru, putem folosi imaginile integrale. Aceste imagini pot fi inițializate într-un timp liniar. Pentru a înțelege mai bine, să aruncăm o privire la figura de mai jos:
Fig 2.2
Dacă dorim să calculăm suprafața oricărui dreptunghi din imagine, nu trebuie să iterăm toți pixelii din acea regiune. Putem să considerăm un dreptunghi format dintr-un punct din stânga-sus și orice punct P ca și colț opus. AP denotă zona acestui dreptunghi. De exemplu, în figura precedentă, AB denotă zona 5 x 2 dreptunghiul fiind format prin preluarea punctului din stânga sus și B ca și colțuri opuse. Hai să aruncăm o privire la figura următoare în scopul clarității[12]:
Fig 2.3
Pixelii colorați indică zona dintre pixel sus-stânga și punctul A. Aceasta este notat cu AA. Diagramele rămase sunt notate cu: AB, AC și AD. Pentru calcularea ariei dreptunghiului ABCD folosim formula: aria dreptunghiului ABCD = AC – (AB + AD – AA)
Lucrul cu un clasificator cascadă include două etape majore: de formare și de detecție.
Există două aplicații în OpenCV pentru „instruirea” cascadei clasificator: opencv_haartraining și opencv_traincascade. Opencv_traincascade este o versiune mai nouă, scrisă în C ++ conform OpenCV 2.x API. Principala diferență dintre aceste două aplicații este că opencv_traincascade suportă ambele tipuri de caracteristici: Haar [Viola2001] și LBP [Liao2007] (modele binare locale).
În ceea ce privește LBP calitatea de detectare depinde de calitatea setului de date de formare și de parametrii de formare. Opencv_traincascade și opencv_haartraining stochează clasificatorul în diferite formate de fișiere. Noua variantă de opencv_traincascade suportă ambele formate. Opencv_traincascade poate salva o cascadă formată în format mai vechi. Există unele utilitare auxiliare legate de formare. Opencv_createsamples este utilizat pentru a prepara un set de date de formare de probe pozitive și de testare. Opencv_createsamples produce set de date probe pozitive într-un format care este acceptat atât de opencv_haartraining și opencv_traincascade. Ieșirea este un fișier cu extensia * .vec, acesta este un format binar care conține imagini. Opencv_performance pentru evaluarea calității clasificatorilor, dar numai antrenat de opencv_haartraining.
Pentru întocmirea raportului de performanță avem nevoie de o colecție de imagini, de numărul de obiecte găsite, de numărul de obiecte pierdute, numărul de alarme false și de alte informații. Din moment ce opencv_haartraining este o aplicație învechită care nu se mai prea folosește în momentul de față, doar opencv_traincascade va fi descrisă în continuare.
Un utilitar opencv_createsamples oferă funcționalități pentru generarea setului de date. Pentru formare avem nevoie de un set de mostre. Există două tipuri de probe: negative și pozitive. Eșantioanele negative corespund imaginilor non-obiect. Probele pozitive corespund imaginilor cu obiecte detectate. Setul de eșantioane negative, trebuie să fie pregătite manual, în timp ce un set de probe pozitive este creat folosind utilitarul opencv_createsamples.
Probele negative sunt luate din imagini arbitrare. Aceste imagini nu trebuie să conțină obiectele ce urmează să fie detectate. Eșantioanele negative sunt enumerate într-un fișier special. Este un fișier text în care fiecare linie conține un nume de fișier imagine (relativ la directorul fișierului de descriere) a imaginii eșantionului negativ. Acest fișier trebuie creat manual.
Probele pozitive sunt create de utilitarul opencv_createsamples. Acestea pot fi create dintr-o singură imagine cu un obiect sau dintr-o colecție de imagini marcate anterior. Cantitatea și gama de dezordine pot fi controlate prin argumente din linia de comandă. Exemple de argumente în linia de comandă:
vec numele fișierului de ieșire ce conține probele pozitive pentru formare
img Imagine obiect sursă
bg fișier descriere fundal; conține o listă de imagini, care sunt folosite ca fundal pentru versiunile distorsionate în mod aleatoriu ale obiectului
num Numărul de eșantioane pozitive pentru a genera
bgcolor Culoare de fundal (în prezent, imaginile în tonuri de gri sunt asumate). Din moment ce ar putea exista artefacte de compresie, cantitatea de toleranță de culoare poate fi specificată de -bgthresh. Toți pixelii withing bgcolor-bgthresh și bgcolor + bgthresh gama sunt interpretate ca transparente.
bgthresh -inv În cazul în care sunt specificate, culorile vor fi inversate.
randinv În cazul în care sunt specificate, culorile vor fi inversate în mod aleatoriu.
maxidev deviație de intensitate maximă a pixelilor în probe de prim-plan.
maxxangle
maxyangle
maxzangle
Unghiurile maxime de rotație trebuie să fie date în radiani. În cazul în care se specifică, fiecare probă va fi afișată. Apăsarea butonului Esc va continua procesul de creare a eșantioanelor.
w Lățime (în pixeli) a probelor de ieșire.
h Înălțimea (în pixeli) a probelor de ieșire.
pngoutput Cu această opțiune activată opencv_createsamples generează o colecție de eșantioane PNG și un număr de fișiere de adnotări asociate, în loc de un singur fișier vec.
Utilitarul opencv_createsamples poate lucra într-un număr de moduri, și anume:
crearea setului de formare dintr-o singură imagine și o colecție de medii;
cu un singur fișier vec ca o ieșire;
cu o colecție de imagini JPG și un fișier cu listă adnotări ca o ieșire;
cu o colecție de imagini PNG și fișiere asociate cu adnotări ca o ieșire;
convertirea colecției marcate a probelor într-un format vec;
se afișează conținutul fișierului VEC[9].
Pentru a obține un astfel de comportament: -img, -bg, -info și ar trebui să fie specificate. Numele fișierului specificat cu -info ar trebui să includă cel puțin un nivel de ierarhie director, acel director va fi folosit ca directorul de nivel superior pentru setul de formare.
Probele pozitive, de asemenea, pot fi obținute dintr-o colecție de imagini marcate anterior. Această colecție este descrisă printr-un fișier text similar cu descrierea de fundal fișier. Fiecare linie a acestui fișier corespunde unei imagini. Primul element al liniei este numele fișierului. Acesta este urmat de numărul de instanțe obiect. Următoarele numere sunt coordonatele obiectelor (x, y, lățime, înălțime).
Din cauza organizării elementelor în cadrul fișierelor Xml pe care doresc să le convertesc într-un format ușor de vizualizat, voi folosi atât liste cât și dicționare; așadar parcurgerea se va face în funcție de tipul de date prezent în fișiere. În momentul conversiei se va ține cont de aceste structuri de date, conversiile fiind diferite, în sensul că, dacă un element este de tip listă va arăta diferit față de cel care inițial era de tip dicționar.
2.8 Dicționare
La fel ca și lista, dicționarul reprezintă un tip de date predefinit, pe care îl voi folosi în implementare, fiind foarte folositor. Se pot întâlni și în alte limbaje de programare dicționare, dar sub o altă denumire: “memorii asociative” sau “ valori asociative”.
Dicționarele sunt indexate de chei, care pot fi definite de oricare din tipurile de date invariabile (nemodificabile). Perechile pot fi folosite drept chei ale unui dicționar numai dacă conțin obiecte invariabile. Nu se pot folosi drept chei, listele deoarece acestea pot fi modificate folosind metode ca append() sau extend().Este indicat să ne gândim la un dicționar ca la o mulțime neordonată de perechi cheie-valoare, cu observația că o cheie trebuie să fie unică într-un dicționar. O pereche de acolade creează un dicționar gol[13].
Operațiile realizate de un dicționar sunt:
stocarea unei valori cu anumită cheie
extragerea unei valori cunoscându-se o anumită cheie.
O pereche cheie-valoare poate fi ștearsă folosind instrucțiunea del. Dacă se adaugă o valoare în dicționare pentru o cheie care există deja, valoarea veche asociată acelei chei este pierdută.
Metoda keys() a unui obiect dicționar întoarce o listă cu toate cheile existente în respectivul dicționar. Lista returnată este sortată, însă pentru a o sorta se poate folosi metoda sort() a obiectului listă returnat de funcție.
2.9 Limbajul XML
Limbajul XML, acronimul de la eXtensible Markup Language, a fost definit de consorțiul W3C în anul 1996.
Este un limbaj simplu care definește reguli de codificare ale documentelor într-un format lizibil omului.Este un meta-limbaj de marcare și a fost proiectat în scopul transferului de date între aplicații pe internet. Datele XML pot fi utilizate în limbaju HTML permițând o identificare rapidă a documentelor cu ajutorul motoarelor de căutare. Fișierele XML altfel spus sunt doar secvențe de text create pentru a structura, depozita și transporta informație.Avantajele oferite de XML sunt:
oferă extensibilitate (dacă este nevoie se pot definii noi indicatori);
validiate (corectitudinea structurală a datelor se poate verifica cu ușurință) utilizatorul își poate reprezenta datele într-un mod independent de aplicație;
XML este simplu si accesibil (fișiere create pt a structura, stoca și transporta informația) poate fi editat și modificat foarte ușor ;
Fișierele folosite in detectarea trăsăturilor umane sunt reprezentate de o serie de coordonate și au formatul XML, din această cauză voi încerca să descriu pe scurt acest limbaj, pentru ca oricine va vedea fișierele în acest format să poată să înțeleagă elementele de bază, să poată să-și facă o idee referitor la ce se află în acel fișier, chiar dacă până acum nu a avut de-a face cu acest limbaj.
Voi prezenta în câteva cuvinte XML-ul:
la fel ca și HTML se bazează pe tag-uri.
XML poate fi folosit de autorii de pagini Web ale căror nevoi depășesc limitele HTML-ului.
XML a fost creat pentru descrierea structurilor de date
Tag-urile XML nu sunt predefinite; altfel spus, XML permite crearea tag-urilor personalizate, ceea ce este nemaipomenit.
Pentru descrierea structurilor de date, documentele XML pot utiliza un DTD (Document Type Definition).
Un document care conține un DTD este auto descriptiv.
Xml -ul este un metalimbaj utilizat pentru descrierea datelor.[7]
Fie că se dorește crearea unui document Xml sau doar studierea și parcurgerea unui document Xml trebuie ținut cont de faptul că acest metalimbaj are niște reguli care trebuie respectate. Acestea reguli pot fi: de sintaxă Xml și de validitate a documentelor Xml.
Reguli de sintaxă Xml:
Închiderea tuturor elementelor − toate elementele care se găsesc în cadrul unui document Xml trebuie să aibă un tag de deschidere și unul de închidere.
Închiderea tuturor elementelor vide − dacă în cadrul unui document Xml există unul sau mai multe elemente vide, acestea nu pot fi lăsate deschise, trebuie închise.
Utilizarea ghilimelelor pentru a delimita valorile unor atribute − dacă se folosesc atribute, valorile acestora trebuie neapărat puse între ghilimele.
Toate atributele folosite într-un document Xml trebuie să conțină valori − fiecare atribut trebuie să aibă atribuită o valoare.
Elementele Xml sunt case-sensitive − spre deosebire de alte limbaje, limbajul Xml este unul case-sensitive, literele mici fiind interpretate diferit față de cele mari. Așadar elementele dar și atributele trebuie utilizate așa cum au fost ele descrise în DTD –ul (Document Type Definition) asociat. În cazul în care nu se folosește un DTD, trebuie avut grijă ca fiecare tag de deschidere să aibă un tag de închidere.
Imbricarea corectă a elementelor − un element poate conține și alte elemente, asta înseamnă că elementele se pot imbrica. Există și niște reguli referitoare la modul de imbricare și anume:
Fiecărui tag de deschidere trebuie să-i corespundă un tag de închidere. Numele celor două tag-uri trebuie să fie identice.
Tag-ul de închidere al unui element “fiu” trebuie să preceadă tag-ul de închidere al „părintelui” său. Altfel spus, un element „fiu” trebuie să fie închis înaintea „părintelui” său.
Elementele imbricate sunt „fii ai elementului părinte”[7].
Entitățile analizate recursiv sunt interzise, adică un element nu se poate referi la el însuși.
Un document Xml este un document “bine format” dacă respectă anumite reguli structurale și notații Xml.
Reguli de validitate a documentelor Xml :
Utilizarea elementului rădăcină − orice document Xml trebuie să conțină cel puțin un element rădăcină, iar acest element trebuie să le conțină pe celelalte elemente ale documentului. Un element rădăcină este delimitat printr-un tag de deschidere plasat la începutul documentului și un tag de închidere plasat la finele documentului[7].
Un document Xml este considerat valid dacă conține un DTD (Document Type Definition)
Așadar un document Xml este format din două părți:
Prolog (declarația documentului)
Elementul rădăcină
După această scurtă introducere în Xml și însușirea unor cunoștințe de bază în acest limbaj, putem să privim altfel fișierele cu care avem de-a face.
Pentru detectarea informației emoționale avem nevoie de senzori care captează date despre starea fizică a utilizatorului sau despre comportamentul acestuia fără a interpreta și datele de intrare. Un astfel de exemplu este camera video care poate capta expresii faciale, poziția corpului și gesturi. Alți senzori pot detecta semnalele emoționale cum ar fi temperatura pielii.
Identificarea informațiilor emoționale necesită extragerea modelelor semnificative din datele colectate. Acest lucru se face folosind tehnici de învățare care procesează diferite modalități de: recunoaștere a vocii, procesare a limbajului natural sau dedetectare a expresiilor faciale.
În științele cognitive există două modele de conducere care descriu modul în care oamenii percep și clasifică emoțiile: modelul continuu și modelul categoric. Modelul continuu definește fiecare expresie facială ca un vector caracteristic într-un spațiu al feței.[9].
Modelele: categoric și continuu nu pot identifica mai multe emoții. Majoritatea sistemelor actuale sunt dependente de date, iar pentru detectarea emoțiilor bazate pe vorbire, sau detectarea celor bazate pe trăsăturile faciale este nevoie de baze de date adecvate folosite pentru a instrui clasificatorul[13].
Pentru detectarea și prelucrarea expresiilor faciale se folosesc diverse metode , cum ar fi: fluxul optic, modelul Markov ascuns și procesarea de rețele neuronale.
Pentru detectarea și prelucrarea facială, este necesară depășirea obstacolelor pentru evidențierea algoritmului și a metodei folosite. Pentru aceasta se folosește curba lui Gauss, filtrare mediană, sau metode mai noi.
Este cunoscut faptul că gradul de acuratețe în recunoașterea facială nu a fost adus la un nivel suficient de ridicat pentru a permite utilizarea lor pe scară largă (au existat multe încercări, dar nu s-a reușit identificarea cu succes a infractorilor). Fără a îmbunătăți precizia hardware și software folosită pentru a scana fețele, progresul este foarte mult încetinit[14].
Gesturile pot fi utilizate în mod eficient pentru detectarea unei anumite stări emoționale a utilizatorului, în special atunci când este utilizat în conjuncție cu vorbirea și recunoașterea feței. În funcție de acțiunea specifică, gesturile ar putea fi simple reflexe (ridicarea umerilor atunci când nu se cunoaște răspunsul la o întrebare), sau ar putea fi complexe și pline de înțeles atunci când comunică cu limbajul semnelor. În cazul în care se folosesc obiecte, care pot fi atinse sau mutate, acestea ar trebui să fie și recunoscute, analizate și utilizate eficient de către un computer.
LXML -Este o bibliotecă Python pentru citire și scriere XML-uri
2.10 JavaScript
JavaScript este un limbaj de programare orientat obiect bazat pe conceptul prototipurilor. Este folosit mai ales pentru introducerea unor funcționalități în paginile web, codul Javascript din aceste pagini fiind rulat de către browser este un limbaj ușor, orientat pe obiecte, cu funcții de primă clasă, și este cunoscut sub numele de limbaj de scripting pentru paginile Web, dar este folosit și în multe medii non-browser. Este un limbaj de scripting bazat pe prototip, multi-paradigmă, care este dinamic și susține stiluri de programare orientate spre obiect, imperative și funcționale.
Cea mai des întâlnită utilizare a limbajului de programare JavaScript este în scriptarea paginilor web. Programatorii web pot îngloba în paginile HTML script-uri pentru diverse activități cum ar fi verificarea datelor introduse de utilizatori sau crearea de meniuri și alte efecte animate.
Browserele rețin în memorie o reprezentare a unei pagini web sub forma unui arbore de obiecte și pun la dispoziție aceste obiecte script-urilor JavaScript, care le pot citi și manipula. Arborele de obiecte poartă numele de Document Object Model sau DOM. Există un standard W3C pentru DOM-ul pe care trebuie să îl pună la dispoziție un browser, ceea ce oferă premiza scrierii de script-uri portabile, care să funcționeze pe toate browserele. În practică, însă, standardul W3C pentru DOM este incomplet implementat. Deși tendința browserelor este de a se alinia standardului W3C, unele din acestea încă prezintă incompatibilități majore, cum este cazul Internet Explorer.
O tehnică de construire a paginilor web tot mai întâlnită în ultimul timp este AJAX, abreviere de la „Asynchronous JavaScript and XML”. Această tehnică constă în executarea de cereri HTTP în fundal, fără a reîncărca toată pagina web, și actualizarea numai anumitor porțiuni ale paginii prin manipularea DOM-ului paginii. Tehnica AJAX permite construirea unor interfețe web cu timp de răspuns mic, întrucît operația (costisitoare ca timp) de încărcare a unei pagini HTML complete este în mare parte eliminată.
2.11 jQuery
jQuery este o platformă de dezvoltare JavaScript, concepută pentru a ușura și îmbunătăți procese precum traversarea arborelui DOM în HTML, managementul inter-browser al evenimentelor, animații și cereri tip AJAX. jQuery a fost gândit să fie cât mai mic posibil, disponibil în toate versiunile de browsere importante existente
JQuery este o bibliotecă JavaScript care folosește modelul “scrie mai puțin, face mai mult”. Scopul jQuery este de a ușura utilizarea JavaScript pe site-ul Web. JQuery ia multe sarcini comune care necesită multe linii de cod JavaScript pentru a le realiza și le împachetează în metode care se pot apela cu o singură linie de cod. JQuery simplifică, de asemenea, o mulțime de lucruri complicate din JavaScript, cum ar fi apelurile AJAX și manipularea DOM. Biblioteca jQuery conține următoarele caracteristici: Manipulare HTML / DOM Manipularea CSS Metode de eveniment HTML Efecte și animații AJAX Utilități.
jQuery se poate folosi pentru a rezolva următoarele probleme specifice programării web:
selecții de elemente în arborele DOM folosind propriul motor de selecții open source Sizzle, un proiect născut din jQuery ;
parcurgere și modificarea arborelui DOM (incluzând suport pentru selectori CSS 3 și XPath simpli);
înregistrarea și modificarea evenimentelor din browser;
manipularea elementelor CSS;
efecte și animații;
cereri tip AJAX;
extensii;
utilităti – versiunea browser-ului, funcția each.
Plugin-urile sau extensiile sunt unele dintre cele mai interesante aspecte ale jQuery. Arhitectura sa permite programatorilor să dezvolte subaplicații bazate în biblioteca principală care extind funcțiile de bază jQuery cu funcții specifice plugin-ului. În acest fel biblioteca principală poate ocupa foarte puțin spațiu, iar extensiile necesare în anumite pagini web pot fi încarcate la cerere, doar când este nevoie de ele. Există un set de extensii principal numit jQuery UI( jQuery User Interface). jQuery UI ofera un set de extensii pentru interactivitate de bază, efecte mai complexe decât cele din biblioteca de bază și teme de culori. Avantajul jQuery UI față de alte extensii este că dezvoltarea și testarea acestor componente se face în paralel cu dezvoltarea bibliotecii principale, minimizând riscul de incomptibilitate.
Orice programator poate crea o extensie și jQuery oferă publicare în catalogul de pe pagina proiectului în diversele categorii disponibile
2.12 XAMPP
XAMPP este un pachet de programe free software, open source și cross-platform web server, care constă în Apache HTTP Server, MySQL database și interpretoare pentru scripturile scrise în limbajele de programare PHP și Perl. Numele XAMPP este un acronim pentru:X (de la"cross", care înseamnă (cross-platform), Apache HTTP Server, MySQL, PHP, Perl.
Acest program este lansat sub termenii licenței GNU și acționează ca un web server capabil de a servi pagini dinamice. XAMPP este disponibil pentru Microsoft Windows, Linux, Solaris, și Mac OS X, și este utilizat în principal pentru dezvoltarea proiectelor web. Acest software este util pentru crearea paginilor dinamice, utilizând limbaje de programare ca PHP, JSP, Servlets.
In mod oficial, designerii XAMPP au avut intenția de a îl utiliza numai ca utilitar de dezvoltare, pentru a permite designerilor și programatorilor web să își testeze munca pe calculatoarele proprii, fără a avea nevoie de acces la Internet. Pentru a face posibil acest lucru, multe caracteristici de securitate importante sunt dezactivate în mod implicit. In practică, totuși, XAMPP este uneori utilizat pentru a servi pagini web în World Wide Web. Un utilitar special este asigurat pentru a proteja prin parolă cele mai importante părți ale pachetului.
XAMPP deasemeni asigură suport pentru crearea și manipularea bazelor de date în MySQL și SQLite între utilizatori.Odată ce XAMPP este instalat, poți trata adresa de localhost a serverului XAMPP ca pe un server la distanță, prin connectarea utilizând protocolul client FTP. Utilizarea unui program ca FileZilla are multe avantaje atunci când instalezi un CMS (content management system)) ca Joomla. Deasemenea este posibilă conecta la o gazdă locală prin FTP utilizând editorul HTML propriu.
3.Studiu de caz. Aplicație software de recunoaștere a stărilor emoționale prin interpretarea trăsăturilor faciale
În cadrul acestui capitol voi detalia modul în care este realizată aplicația.
Pentru a înțelege emoțiile și sentimentele celor din jur, trebuie să le analizăm mai întâi expresiile faciale. Este mult mai complicat ca o „mașină” să facă asta în locul omului. O mașină trebuie instruită și învățată tehnica recunoașterii. Pentru a face acest lucru, sistemul a fost împărțit în 3 module: modul de pre-procesare, modul de selecție caracteristică și extracție și modul de clasificare. În această lucrare, sistemul de recunoaștere a expresiilor faciale utilizează Haar Cascade Clasifier. Detectarea rapidă a caracteristicilor faciale se realizează prin concentrarea atenției asupra ochilor și a gurii care reduc foarte mult din calcul. Metoda propusă a fost implementată folosind OpenCV .
Aplicația realizată (ca și restul aplicațiilor de tip Computer Vision) este interesantă și utilă, dar algoritmii care stau la baza ei sunt intensivi din punct de vedere computațional.
La baza oricărei aplicații stă o schemă generală, în care sunt prezentate componentele de bază ale aplicației, precum și legăturile dintre ele. Voi prezenta schema care stă la baza aplicației mele, dar și schema care stă la baza întregului sistem de recunoaștere, încercând să evidențiez prin părțile realizate de mine, prezentând și explicând fiecare modul în parte, legătura dintre ele, importanța fiecărui modul din cadrul acestui uimitor sistem și mai ales importanța modulelor/aplicației mele. Schema generală a proiectului este prezentată în Fig3.1
Fig 3.1.Schema generală a sistemului
3.1 Arhitectura programului
În cadrul unei arhitecturi software este descrisă structura unui sistem de programe la nivel abstract. Arhitectura programului meu, constă dintr-un set de componente, conectori și configurații care sunt caracterizate de un anumit șablon (tip arhitectural). Tipul arhitectural trebuie ales în așa fel încât să fie unul potrivit, pentru ca arhitectura să fie în conformitate cu specificațiile. Trebuie așadar găsită o metodă prin care un astfel de program complex să poată fi evaluat din punct de vedere al fiabilității. Această metodă oferă un mijloc prin care proiectanții să poată proiecta arhitectura care se potrivește cel mai bine cu specificațiile aplicației. În același mod am procedat și eu, atunci când am creat arhitectura aplicației mele.
În cadrul schemei prezentate în Fig 3.2 sunt ilustrate componentele aplicației mele, precum și conectorii.
Fig 3.2 Aplicație recunoaștere stări emoționale
Voi descrie detaliat fiecare componentă în parte din cadrul acestei scheme, explicând relația dintre ele, precum și modul în care au fost create.
Pentru crearea acestor componente am folosit ca și medii de dezvoltare următoarele medii:Notepad++, Sublime Text, OpenCV, iar limbajul pe care l-am folosit este Python( împreună cu o serie de biblioteci și funcții din OpenCV).
Așa cum reiese și din schema de mai sus (Fig 3.2) părțile componente ale modului Cascade Training sunt: colecție imagini, creare mostre, mapare fișiere binare, îmbinare fișiere binare precum și generarea fișierelor xml.
Componenta de normalizare după cum îi spune și numele realizează normalizarea în cazul în care fața este rotită, decupată, redimensionată sau chiar deformată.
În cadrul componentei denumită aliniere se realizează localizarea componentelor faciale, cum ar fi ochii, sprâncenele, nasul si buzele.
După primul modul denumit Preprocesare urmează modulul de Segmentare. În etapa de segmentare, se extrag regiunile de interes ale unei imagini și se izolează pentru a găsirea obiectelor de interes. De exemplu, într-un sistem de detectare a feței, avem nevoie să separăm fețele de restul pieselor din scenă. După obținerea obiectelor din interiorul imaginii, vom continua cu pasul următor. Este necesară extragerea caracteristicilor fiecărui obiect detectat.
Sistemul de recunoaștere a expresiilor faciale utilizează Haar Cascade Clasifier, modul complex în cadrul căruia se execută operațiile enumerate mai sus.
Următorul modul în care se va face clasificarea propriu-zisă. Acest modul poartă numele de Cascade Training. Până la terminarea acestui modul, am întâmpinat numeroase probleme. Cu toate acestea, am reușit să instruiesc întregul sistem să capabil să învețe parametrii necesari pentru dectectarea obiectului.
Pentru fiecare obiect, am extras diferitele caracteristici pe care sistemul trebuie să le analizeze folosind un algoritm de învățare.
Am colectat un set de câteva sute de imagini pozitive și negative (în cadrul modulului Colectare Imagini). Opencv_createsamples produce un set de date (probe pozitive) într-un format care este acceptat atât de opencv_haartraining și opencv_traincascade (modul Creare Mostre). Ieșirea este un fișier cu extensia * .vec (modul Creare Fișiere binare), acesta este un format binar care conține imagini opencv_performance pentru evaluarea calității clasificatorilor, dar numai antrenat de opencv_haartraining. Pentru întocmirea raportului de performanță am avut nevoie de o colecție de imagini, de numărul de obiecte găsite (modul Îmbinare fișiere), numărul de obiecte pierdute, numărul de alarme false și alte informații.
În modulul Generarea fișierelor XML avem o bază de date care conține mai mulți parametrii ai datelor inițiale. Acești parametrii sunt puși în fișiere cu extensia xml.
Modul de generare al acestor fișiere este prezentat într-un capitol anterior.
Magia din cadrul acestei aplicații o constituie modulele: Creare funcții Python și Creare Funcții OpenCV. În cadrul acestui modul sunt folosite funcții din celelalte module, iar rezultatele finale ajung în modulul Sistem de recunoaștere a stărilor emoționale.
Funcțiile(din cadrul OpenCV) folosite în fișierele .py sunt:
VideoCapture – crează o interfață (o fereastră) în momentul în care pornește camera Web.
detectMultiScale – detectează un obiectul dorit dintr-o poză, returnând cooronatele acestuia.
putText – cu ajutorul acestei funcții se pot scrie mesaje în interfața grafică (peste poză)
rectangle – încadrează obiectul detectat prin constuirea unui dreptunghi în jurul acestuia.
Read – citește și interpretează o poză.
waitKey – așteaptă apăsarea unei taste pentru închiderea aplicației
release – salvează poza făcută cu camera Web.
destroyAllWindows – distrugerea/închiderea ferestrelor deschise care nu se mai folosesc.
În realizarea aplicației am importat și o serie de biblioteci din Python. Bibliotecile pe care le-am folosit sunt următoarele:
numpy – conține obiecte N-dimensionale, tool-uri pentru integrarea codului de C/C++, algebră liniară.
Cv2 – ajută la vizualizarea, salvarea și editarea imaginilor.
Sys – conține variabile și funcții pentru interacțiunea cu interpretorul.
Rezultatele obținute în urma acestor operații complexe poate fi observat în cadrul interfeței
Aplicația trebuie să poată să recunoască stările emoționale ale unei persoane în funcție de trăsăturile faciale ale persoanei respective. Cu ajutorul camerei web, sunt realizate niște capturi ale fețelor persoanelor, iar aceste capturi/poze sunt prelucrate pentru a obține în final rezultatul dorit și anume aflarea stării emoționale a persoanei care folosește aplicația în acel moment.
Pentru prelucrarea acestor poze avem nevoie de un set de informații suplimentare:
O bază de date cu poze ale fețelor unor persoane de diferite rase; poze care surprind diferite stări emoționale ale acestor persoane
Fig 3.3 Poze cu stări emoționale ale unor persoane de diferite rase
Diverse coordonate obținute pe baza acestor poze; coordonate care apar sub forma unor fișiere cu extensia xml
Diverși algoritmi care stau în spatele funcțiilor de OpenCV, necesari în procesul de prelucrare și obținere a rezultatelor finale
Voi încerca să explic pe larg toate modulele, legăturile dintre ele și cum în final, acestea puse cap la cap o să producă un anumit rezultat, rezultatul trebuind să fie desigur cel așteptat.
Așadar, întreg proiectul se împarte in 5 module, unele mai complexe, altele mai puțin complexe si anume:
3.2 Modulul Camera reprezintă input-ul acestui sistem complex. Pentru ca această aplicație să poată fi folosită, existența unei camere web este absolut necesară.
Camera web reprezintă „motorul” acestei aplicații. Așa cum o mașină nu poate înainta dacă motorul ei este oprit, tot așa nici această aplicație nu poate fi folosită în cazul în care calculatorul nu este dotat cu o cameră web.
Rolul camerei web este acela de a capta imagini cu fața utilizatorului. În urma folosirii acestei camere rezultă o serie de imagini ce urmează a fi prelucrate în scopul descoperirii emoțiilor utilizatorului.
Imaginile produse de camera web trebuie pre-procesate pentru îndeplinirea anumitor ipoteze implicite: re-eșantionare (ne asigurăm că sistemul de coordonate al imaginii este corect), îmbunătățirea contrastului pentru a se asigura că informațiile relevante pot fi detectate.
3.3 Modul Preprocesare reprezintă un modul complex, în cadrul căruia sunt îmbinate o serie de funcții din cadrul OpenCV împreună cu o serie de algoritmi codați în Python pentru:
Detecția obiectelor ( în acest caz detecția fețelor persoanelor, dar și detecția altor simboluri necesare în recunoașterea emoțiilor)
Alinierea este localizarea componentelor faciale, cum ar fi ochii, sprâncenele, nasul și buzele.
Normalizarea geometrică se realizează în cazul în care fața este rotită, decupată, redimensionată sau chiar deformată [14].
În etapa de preprocesare, se reduce la minimum zgomotul imaginii, condițiile de iluminare, sau deformările imaginii datorită lentilelor camerei. Acești pași minimizează erorile atunci când se încearcă să se detecteze obiectele.
Dacă nu se elimină zgomotul, se detectează mai multe obiecte decât ne așteptăm.
După ce aplicăm toate etapele de preprocesare necesare pentru imaginea de intrare, al doilea pas este Segmentarea.
3.4 Modulul Segmentare în cadrul acestui modul se realizează extragerea regiunilor de interes ale unei imagini și izolarea lor pentru a găsi obiectele de interes. Pentru detectarea feței, trebuie separate fețele de restul pieselor din scenă. După obținerea obiectelor din interiorul imaginii, vom continua cu pasul următor. Avem nevoie de extragerea tuturor caracteristicilor pentru fiecare obiect detectat.
Fig 3.4 Fragment de cod. Identificare față
Pentru fiecare obiect, vom extrage diferite caracteristici pe care sistemul trebuie să le analizeze folosind un algoritm de învățare.
Cu ajutorul unui algoritm de învățare, suntem capabili să demonstrăm etichetele fiecărui obiect detectat în imaginea de intrare. Toate acestea se realizează Modulului Caracteristic în cadrul căruia se realizează cele două operații:
Extracție
Selecție
Pixel data este convertit într-o reprezentare de nivel superior dacă forma, mișcarea, culoarea, textura, și configurația feței sau a caracteristicilor faciale obținute prin extracție vor putea fi utilizate pentru clasificare ulterioară.
Așadar, avem descriptorul obiectului nostru; un descriptor este o caracteristică care descrie un obiect, acești descriptori folosindu-se pentru instruire. Pentru a face acest lucru, trebuie creat un set mare de date de caracteristici, în cazul în care sunt preprocesate sute, mii și milioane de imagini.
În această lucrare, sistemul de recunoaștere a expresiilor faciale utilizează Haar Cascade Clasifier.
3.5 Modulul Haar Cascade este un modul complex în cadrul căruia se execută operațiile enumerate mai sus.
Fig 3.5 Fragment de cod din modulul de recunoaștere a expresiilor faciale
După efectuarea acestor module, se va trece la următorul modul în care se va face clasificarea propriu-zisă. Acest modul poartă numele de Cascade Training.
3.6 Modulul Cascade Training în cadrul acestui modul se face instruirea întregului sistem, sistemul devine capabil de a învăța parametrii necesari pentru a decide care etichetă specifică ar trebui să fie atribuită obiectului detectat.
Pentru fiecare obiect, se extrag diferitele caracteristici pe care sistemul trebuie să le analizeze folosind un algoritm de învățare.
Se colectează un set de imagini pozitive și negative (în cadrul modulului Colectare Imagini). Opencv_createsamples produce un set de date (probe pozitive) într-un format care este acceptat atât de opencv_haartraining cât și de opencv_traincascade (modul Creare Mostre). Ieșirea este un fișier cu extensia * .vec (modul Creare Fișiere binare), acesta este un format binar care conține imagini opencv_performance pentru evaluarea calității clasificatorilor, dar numai antrenat de opencv_haartraining. Pentru întocmirea raportului de performanță avem nevoie de o colecție de imagini, de numărul de obiecte găsite (modul Îmbinare fișiere), numărul de obiecte pierdute, numărul de alarme false și alte informații.
3.7.Modulul Generarea fișierelor XML avem o bază de date care conține mai mulți parametrii ai datelor inițiale. Acești parametrii sunt puși în fișiere cu extensia xml.
Informațiile din această bază de date sunt folosite în modulele denumite Creare funcțiiPython și Creare Funcții OpenCV. În cadrul acestui modul sunt folosite funcții din celelalte module, iar
Rezultatele finale ajung în modulul sistemul de recunoaștere a stărilor emoționale.
Am adus o contribuție în cadrul tuturor modulelor, în special în cadrul ultimelor module.
Fig 3.6 Fragment de cod din Python
Capturile în care se observă rezultatele le voi expune în capitolul scenariu de funcționare al aplicației.
3.8 Funcțiile sistemului
Modulele care prezintă o mai mare atenție vor fi prezentate. Ele sunt împărțite în sub module (amintite în paragraful de mai sus).
În continuare sunt expuse sub-modulele celor mai complexe module.
Primul element este reprezentat de imaginile capturate de camera web, care reprezintă intrările în sistem, sunt considerate intrări deoarece acestea reprezintă punctul de plecare și prin prelucrarea acestora, precum și prin adăugarea altor module o să poată fi realizate ieșirile/rezultatul, rezultat pe care la început am presupus ca îl voi obține.
Aceste imagini sunt supuse mai multor operații: preprocesare, segmentare, extracție și selecție pentru a ne asigura că imaginile nu sunt deformate, decupate și dacă conțin obiectul căutat.
După toate aceste operații, am folosit niște algoritmi de învățare, acești algoritmi fiind o altă componentă importantă a aceste aplicații prin care calculatorul este instruit în căutarea și găsirea anumitor obiecte (în cazul de față este vorba în primul rând de față iar mai apoi de restul elementelor care au un rol important în detecția stărilor emoționale).
Operațiile de preprocesare, segmentare, extracție și selecție sunt realizate în modulul Haar Cascade, un modul de bază din cadrul OpenCV.
Un alt modul important este Cascade Training asupra căruia voi insista pentru faptul că este unul foarte complex care conține la rândul său multe alte elemente sau sub module.
Pentru că am încercat să creez propriul clasificator am avut nevoie de mostre, ceea ce înseamnă că am avut nevoie și de o mulțime de imagini care conțin obiectul dorit (probă pozitivă) și mai multe imagini care nu conțin obiectul dorit (proba negativă). De câte imagini am avut nevoie? Și de câte imagini este nevoie pentru crearea unui astfel de clasificator indiferent de obiectul dorit? Numerele depind de o grămadă de factori, inclusiv de calitatea imaginilor, de obiectul dorit de recunoscut, de metoda de generare probelor precum și de puterea procesorului. Pentru crearea unui clasificator foarte precis este nevoie de mult timp și un număr foarte mare de probe. Clasificatorii făcuți pentru recunoașterea feței au fost creați de către cercetători cu mii de imagini pozitive.
După ce am colectat destule imagini, le-am decupat astfel încât numai obiectul nostru dorit să fie vizibil. Cele mai bune rezultate provin din imagini pozitive, care arată exact ca cele pe care le-am dori să le detecteze obiectul, cu excepția faptului că acestea sunt decupate astfel încât numai obiectul este vizibil.
După aceste operații, am colectat și imaginile negative. Pentru combinarea imaginilor pozitive și negative, am scris niște funcții în limbajul de programere C++ .
Asta înseamnă că fișierele cu extensia *.txt servesc ca o listă de eșantioane negative. Am folosit OpenCV: opencv_createsamples. Acest program oferă mai multe opțiuni pentru generarea de eșantioane formate din imagini de intrare și scoate la ieșire un fișier cu extensia *.vec, fișier pe care îl voi folosi la instruirea clasificatorului.
Am continuat cu generarea fișierului xml care reprezintă o bază de date pentru această aplicație din cauza faptului că el conține o serie de caracteristici folosite pentru compararea caracteristicilor din setul mare de poze cu poza realizată cu camera web.
Acest fișier/fișiere .xml (pentru că pot fi mai multe în funcție de numărul obiectelor pe care dorim să le detectăm) este importat într-un fișier cu extensia*.py
3.9 Structuri de date și fișiere
Lucrul cu clasificatori cascadă include două etape majore: de formare și de detecție. Etapa de detecție este descrisă în documentația modulului din cadrul OpenCV, de care am amintit în capitolele precedente. Pentru învățarea clasificatorului cascadă, în OpenCV există două aplicații: opencv_haartraining and opencv_traincascade. În etapa de formare avem nevoie de un set de probe pozitive și negative. Acestea se folosesc pentru crearea fișierelor finale, care au extensia .xml. Pentru a genera acesta fișiere am avut nevoie de alte fișiere cu diferite extensii pe care le-am obținut din probele pozitive și negative:
Fișiere cu extensia .txt
Fișiere binare cu extensia .vec
După colectarea imaginilor pozitive, acestea se decupează pentru a avea aceeași lungime și aceeași lățime și se plasează în directorul positive_images, imaginile având de asemenea și același format și nume .jpg.
Pentru a genera fișierul cu același nume ca și directorul și cu extensia .txt, am rulat scriptul positives.sh.
Acest fișier conține numele directorului de bază concatenat cu numele fiecărei poze în parte; astfel, numărul de linii al acestui fișier este egal cu numărul de poze pozitive care se găsesc în directorul positive_images.
Același procedeu l-am folosit și pentru a genera fișierul cu mostre negative, cu aceeași extensie.txt. Acest fișier se generează prin rularea scriptului negatives.sh conține informații pentru seturile de imagini negative.
Mai jos este expus modelul de fișier cu extensia .text pentru imaginile pozitive folosite în cadrul acestei aplicații.
./positive_images/0001.jpg
./positive_images/0002.jpg
./positive_images/0022.jpg
…
Fișierul cu extensia .text pentru imaginile pozitive arată ca în exemplul de mai jos:
./negative_images/0001.jpg
./negative_images/0002.jpg
./negative_images/0003.jpg
…
După generarea fișierelor cu extensia .txt, am generat fișiere binare cu extensia *.vec.
Prin rularea scriptului make_samples.sh se generează din imaginile pozitive și negative în directorul samples un fișier binar cu extensia *.vec.
Comenzile folosite pentru rularea scriptului dar și exemple care conțin fișiere *.vec sunt prezentate Fig 3.7
Fig 3.7 Comenzi și argumente pentru generare fișiere *.vec
După rularea scriptului make_samples.sh și generarea în directorul samples a fișierelor *.vec, urmează unirea tuturor fișierelor *.vec într-unul singur, acțiune care se realizează prin rularea scriptului mergevec_py\mergevec.bat. Rezultatul se copiază în directorul rădăcină.
Pentru generarea fișierelor cu extensia .xml (fișiere utilizate în cadrul modulelor funcții Python și funcții OpenCV pentru detectarea obiectelor) se rulează scriptul generate_cascade.sh .
În Fig 3.8 este prezentat un exemplu de fișier cu extensia .xml (o parte a fișierului, pentru că un fișier întreg poate să conțină zeci de mii de linii).
Fig 3.8 Fișier XML pentru detectarea diverselor obiecte
3.10 Înregistrarea evenimentelor
Folosirea mouse-ului cu Python și OpenCV este utilă pentru că utilizatorul poate decupa și salva imaginile de webcam, lucru ce apoi poate fi folosit și la logarea facială.
Fig3.9 Fragment de cod din Pyton pentru realizarea funcției crop
Pentru a procesa evenimentele de click , definim funcția “mouse_crop” . Oricând se întâmplă un eveniment de mouse, OpenCV va chema acest callback cu toate detaliile necesare
Pentru ca funcția noastră să fie chemată, trebuie să acceptăm 5 argumente:
event: Evenimentul care a avut loc (butonul stânga al mouse-ului apăsat, butonul stâng al mouse-ului eliberat, mișcarea mouse-ului etc.)
X: coordonata x a evenimentului.
Y: Coordonata y a evenimentului.
flags: flag-uri transmise de OpenCV.
param: orice parametri suplimentari furnizați de OpenCV.
“event == cv2.EVENT_LBUTTONDOWN ”verifică dacă a avut loc o apăsase de butonul stâng al mouse-ului. Dacă da, înregistrăm (x, y) -coordonatele evenimentului și indicăm că acum suntem în "modul de decupare".
În acest moment, tragem de regiunea dreptunghiulară a imaginii crop-uite. După terminare, eliberăm butonul stâng al mouse-ului .
Verificarea “event == cv2.EVENT_LBUTTONUP ” se ocupa de eliberarea butonului stâng al mouse-ului și actualizează lista de puncte de interes. În jurul acestor puncte de interes desenăm apoi dreptunghiuri.
Linia “cv2.setMouseCallback("frame", mouse_crop)” gestionează înregistrarea apelului funcției mouse_crop. Mai înainte însă trebuie sa chemăm cv2.namedWindow pentru a crea o fereastră si apoi să setăm callback-ul mouse-ului apelând cv2.setMouseCallback, furnizând fereastra " și acesta funcție callback.
Fig 3.10 Fragment de cod Python decupare mouse
Dacă apăsăm tasta “r” după selectarea regiunii de crop, se va reinițializa decuparea. Tasta “c”, ne va scoate din buclă și vom efectua trunchierea efectivă. Bucata decupată, “Poi” , va fi desenată într-o fereastră separată ca in figura Fig 3.11
Fig 3.11 Exemplu de poză decupată
4.Scenariu de functIonare al aplicatiei
4.1 Instalare
Fiecare utilizator va trebui să instaleze următoarele programe:
Python 3.4.4 pentru a putea rula aplicația și pentru a nu avea erori la compilare.
XAMPP Server pentru a putea rula ca și aplicație web
Opencv pentru a putea folosi această aplicație.
toate bibliotecile și pachetele prezentate în capitolul anterior.
4.2 Schema interfeței cu utilizatorul în scenariu de utilizare direct din cmd-ul din fișierul rădăcină.
Cunoscând intrările și ieșirile din sistem, se poate proiecta o schemă a interfeței cu utilizatorul. Așadar intrarea în blocul de interfață va fi reprezentat de capturile realizate de camera web. În momentul în care utilizatorul va rula fișierul cu extensia .py, se va porni camera web iar mai apoi se va deschide o fereastră în cadrul căruia se va realiza captura. Interfața are niște butoane cu ajutorul cărora se poate mări sau micșora imaginea, sau se poate închide. În poza realizată de cameră va apărea un dreptunghi care marchează fața, iar dacă utilizatorul este fericit, va mai apărea un dreptunghi care va marca zâmbetul și se va afișa mesajul „bucurie”, iar dacă utilizatorul nu este fericit, nu va mai apărea dreptunghiul care marchează zâmbetul și va apărea mesajul “tristete”.
Schema generală pentru interfață în scenariu de utilizare direct din cmd-ul din fișierul rădăcină.
este următoarea:
Fig 4.1 Schema generală pentru interfață în scenariu de utilizare direct din cmd-ul din fișierul rădăcină.
4.3 Scenariu de utilizare direct din cmd-ul din fișierul rădăcină.
Odată instalate programele de care este atâta nevoie, este timpul ca aplicația să fie utilizată în scopul pentru care a fost creată. Așadar fiecare utilizator după ce a instalat aceste programe și după ce a copiat pe calculatorul personal folder-ul care conține aplicația trebuie să efectueze următorii pași:
Să deschidă cmd-ul din fișierul rădăcină. Este indicat să folosească pentru aceasta Total Commander.
Pasul următor este asigurarea că este în folderul dorit.
După ce a fost făcută această verificare urmează tastarea în linia de comandă a comenzii: python3.4.4.bat , iar pe aceeași linie (cu spațiu) calea de la fișierul rădăcină până la fișierul opencv_test.py.
În cazul în care utilizatorul nu doreste să utilizeze interfața web el poate rula python3.4.4.bat
Utilizatorul ar trebui să vadă o fereastra asemenea celei in figura de mai jos:
Fig 4.2 Rulare comandă
Aplicația este folosită pentru a detecta o stare emoțională în funcție de trăsăturile feței, mai exact, în funcție de față, de poziția și forma gurii, nasului și gurii. Datorită acestei aplicații, starea acestuia poate fi detectată.
Va apărea o interfață extrem de simplă în care utilizatorul nu trebuie să facă mai nimic. Trebuie să privească la camera pentru a se realiza poza și eventual să zâmbească pentru a-i apărea mesajul cu:”Bucurie”.
Exemplele de mai jos vor convinge utilizatorul să folosească această aplicație.
Fig 4.3 Interfața cu utilizatorul (Bucurie)
Fig 4.4 Interfața cu utilizatorul(Tristete)
Utilizatorul poate mări fereastra, o poate ascunde sau închide, după cum dorește.
Aceasta aplicație poate fi așadar folosită gratuit, iar prin simpla generare a unui nou fișier xml, utilizatorul poate detecta orice obiect dorește, aplicația putând fi folosită în extreme de multe scopuri.
4.4 Schema interfeței cu utilizatorul în scenariu de utilizare prin intermediul interfeței web.
Fig 4.5 Schema generală pentru interfață în scenariu de utilizare prin intermediul interfeței web.
4.5 Scenariu de utilizare prin intermediul interfeței web
Interfața cu utilizatorul este una foarte simplă, pentru ca orice utilizator care nu are cunoștințe legate de programele în care s-a realizat această aplicație să poată să o folosească cu un minim de cunoștințe. Pentru dezvoltarea interfeței cu utilizatorul folosesc o interfață web implementată cu ajutorul limbajelor HTML-ului și JAVAScript.
Fig 4.6 Scenariu de utilizare prin interfata web.Meniu Principal Aplicatie Software
Fig 4.7 Recunoastere facială din poză.Incarcă poza
Fig 4.8 Recunoastere facială din poză. Alegere poza pentru identificare
Fig 4.9 Recunoastere faciala din poza.Identificare fete
Fig 4.10 Identificare fete
Fig 4.11Meniu Principal.Identificare Stare Emotionala
Fig 4.11Meniu Principal.Identificare obiect
Pentru a sublinia utilitatea acestei aplicații am extins aplicatia la doua exemple concrete in care aceasta ar putea fi utilizată.
4.5 Exdinderea Funtionalității – Magazin de fructe sau bijuterii
4.5.1 Magazin de fructe
Folosind același proces de training al clasificatorului, aplicația poate fi extinsă către nevoi mai practice, cum ar fi recunoașterea obiectelor din magazin în vederea împiedicării furtului.
Avem nevoie de un număr suficient de mare poze al obiectului, spre exemplu o banană sau un măr.
Este nevoie de un număr minim de 50 pentru a genera probe pozitive cu care OpenCV poate lucra. De asemenea, este important ca în cele 50 de imagini iluminatul și fundalul să fie diferit ca în Fig 4.12
Fig 4.12 Exemple de poze făcute unui măr în care fundalul și iluminatul să fie diferit
Pașii prezentați în capitolul anterior pentru generarea fișierelor pozitives.txt, negatives.txt și folosirea clasificatorului rămân aceeași. Se obține pentru fiecare obiect urmărit câte un fișer *.xml
Exemplu cu imaginea recunoașterii obiectuale rezultate :
Fig 4.13 Identificare fructe
Imagini NEGATIVE
Acum avem nevoie de imaginile negative, cele care nu prezintă o banană sau un măr (imagine care nu conține obiectul care trebuie identificat). Dacă trebuie să pregătim un clasificator foarte precis, este nevoie de o mulțime de imagini negative care arată exact ca cele pozitive, cu excepția faptului că nu conțin obiectul pe care vrem să-l recunoaștem. Spre exemplu dacă vrem să detectăm semne de oprire pe pereți, imaginile negative ar fi în mod ideal o mulțime de imagini ale zidurilor. Poate chiar și cu alte semne.
Avem nevoie de cel puțin 600 de poze care conțin imaginile negative. Întradevăr obținerea manuală a acestora durează mult.Varianta mai rapidă este să luăm un fișier video și să extragem cadrele ca imagini. În felul acesta putem obține 600 de fotografii destul de repede.
Pentru clasificatorul de banane am folosit fotografii aleatorii și câteva fotografii din fundal unde am fotografiat banana mai devreme, deoarece clasificatorul OpenCV ar trebui să poată identifică o banană în aproape orice imagine.
Odată ce avem imaginile, le punem pe toate în folderul negative_images al depozitului și folosim
Find pentru a salva lista de căi relative la un fișier:
Fig 4.10 Folosirea funcției find folosită pentru a salva lista de căi relative la un fișier
CREAREA PROBELOR
Cu imaginile pozitive și negative putem genera probe din ele, pe care le vom folosi pentru formarea în sine. Avem nevoie de probe pozitive și negative. Din fericire, avem deja probele negative. Conform documentației OpenCV despre mostrele negative:
"Probele negative sunt luate din imagini arbitrare. Aceste imagini nu trebuie să conțină obiectele care urmează să fie detectate. Eșantioanele negative sunt enumerate într-un fișier special. Este un
Fișier text în care fiecare rând conține un nume de fișier imagine (relativ la
Directorul fișierului descriptiv) a imaginii eșantionului negativ. "[7]
Aceasta înseamnă că negatives.txt va servi ca o listă de eșantioane negative. Dar avem încă nevoie de eșantioane pozitive și există multe modalități diferite de a le obține, care toate duc la rezultate diferite în ceea ce privește exactitatea clasificatorului instruit.
Vom folosi o metodă care nu necesită prea multă pregătire sau un număr mare de imagini pozitive sau negative. Vom folosi un instrument OpenCV : opencv_createsamples. Acest instrument oferă mai multe opțiuni cu privire la modul de generare a probelor din imaginile de intrare și returnează un fișier * .vec pe care îl putem folosi apoi pentru a instrui clasificatorul nostru.
Opencv_createsamples generează un număr mare de probe pozitive din imaginile noastre pozitive, prin aplicarea transformărilor și distorsiunilor. Deoarece se poate transforma atât de mult dintr-o singură imagine până când nu mai este o versiune diferită, avem nevoie de un mic ajutor pentru a obține un număr mai mare de eșantioane din numărul nostru relativ mic de imagini de intrare.
Următorul lucru pe care trebuie să-l facem este să fuzionăm fișierele * .vec pe care le avem acum în directorul de mostre.
OpenCV oferă două aplicații diferite pentru instruirea unui clasificator Haar: opencv_haartraining și opencv_traincascade. Vom folosi opencv_traincascade, deoarece reduce timpul necesar pentru analizare .
Fig 4.14 Fragment de cod folosit pentru citirea diverselor obiecte
Acest cod este destul de simplu: se schimbă inputFiles astfel încât acesta să conțină căile spre fișierele care includ obiectul pe care dorim să-l detectăm și să-l marcăm, apoi se va executa functia. Acesta va citi în inputFiles specificate cu OpenCV și va încerca să detecteze obiecte cu clasificatorul cascadă.
Dacă OpenCV a detectat unul sau mai multe obiecte într-unul din fișierele de intrare, acestea vor fi marcate cu un dreptunghi verde ca în figura 4.12 sau figura 4.13
Fig 4.15 Identificarea unui mar
Fig 4.16 Identificarea unei banane
4.5.2 Magazin de inele de logodnă și verighete.
La fel ca și în cazul magazinului de fructe avem nevoie de un număr suficient de mare poze al obiectului, în acest caz inel sau verighetă.
Este nevoie de un număr minim de 50 pentru a genera probe pozitive cu care OpenCV poate lucra. De asemenea, este important ca în cele 50 de imagini iluminatul și fundalul să fie diferit.
Astfel dacă cineva va încerca să fure un inel în timpul în care atenția vanzatorului este distrasă de un alt client aplicația va detecta acest lucru și va putea stoca aceste informații și poze într-o bază de date de unde vor putea fii accesate ulterior .
Fig 4.17 Identificarea unui inel
Concluzii și contribuții personale
Concluzii
În această lucrare s-a urmărit implementarea unei aplicații care să poată recunoaște stările emoționale ale unei persoane.
Detecția automată a fețelor în imagini digitale este inclusă ca funcționalitate în camerele foto digitale, aplicațiile de recunoaștere a fețelor incluse în sisteme de securitate, acestea sunt numai câteva dintre cele mai la îndemână exemple.
Am ales să implementez și desigur am implementat acest sistem de recunoaștere, pentru că până în ziua de azi, s-au implementat foarte puține astfel de sisteme și pentru că personal mi s-a părut foarte interesantă această idee, precum și toți algoritmii și științele care stau în spatele acestui sistem extrem de complex.
Modulele implementate sunt toate funcționale, aplicația întreagă este funcțională, aceasta fiind testată atât de mine cât și de alți utilizatori. Nu au apărut probleme în timpul utilizării. Modul de utilizare nu a ridicat probleme nimănui, aceasta datorându-se interfeței care este una simplă și prietenoasă cu utilizatorul.
Am realizat această aplicație pentru mine dar și pentru alți utlizatori care doresc să o încerce.
Știm că cele mai importante proprietăți ale unei aplicații software sunt: flexibilitatea, reutilizabilitatea și faptul dacă aceasta este generică sau nu. Aplicația realizată de mine este generică, flexibilă deoarece prin simple modificări făcute în cadrul acesteia devine funcțională pentru orice proiect.
Contribuți personale
In timpul pe care l-am petrecut dezvoltand aceasta aplicație, mi-am aprofundat cunoștintele în materie de limbaje de programare, învatand astfel limbaje de programare precum Python, JavaScript, JQuery și am avut ocazia de a folosi tehnologii noi, care sunt foarte utlizate în acest domeniu precum XAMPP, PHP, HTML
Pentru dezvoltarea aplicației și aducerea acesteia în acest stadiu am lucrat în total 4 luni de zile, cumuland peste 1000 de linii de cod.
Perspective de viitor
Ca și perspective de dezvoltare ulterioară a aplicatiei aș dori să dezvolt modulul de recunoaștere facială care să contină și un modul audio iar in momentul în care persoana este identificată în locul apariției mesajului pe ecran aceasta informație să fie difuzată. Aplicabilitatea în acest caz ar fi pentru persoanele cu deficiente de vedere ar știi cine este persoana din fața camerei și starea emoțională a acesteia.
De fiecare dată când utlizatorul vrea să recunoască o nouă stare, sau să detecteze un nou obiect, eu ar trebui să-i generez un fișier cu extensia .xml pe care să-l încarc în scriptul de Python, pentru ca el să nu aibă altceva de făcut decât să ruleze scriptul.
Voi lua un exemplu concret și anume: în momentul în care utlizatorul dorește să afle starea sa sau a altor persoane sau dorește să detecteze anumite obiecte, el nu trebuie să prelucreze imaginile sau să caute să vadă ce este în spatele acestei aplicații, ce algoritmi se ascund și de către cine au fost inventați, trebuie doar să ruleze un script, urmând pașii descriși și exemplificați în capitolul anterior.
De asemenea aplicația prin poate aduce un plus în securitatea cibernetică prin schimbarea metodelor de securitate bazate pe user/password sau PIN prin introducerea ca și sistem de logare în diferitele aplicații web/site-uri prin recunoaștere facială (scazând astfel riscul de a pierde informații confidentiale prin metodele de phishing).
Bibliografie
[1]”Robust Real-Time object detection”, International Journal of Computer Vision, vol.57 P. Viola, M. Jones, 2004
[2]”Facial Action Coding System- A technique for the measurement of facial movement” P. Ekman, M. Jones, 2012
[3]”Face recognition-Feature versus templates” R Brunelii, T Poggio, 2015
[4]http://python.net/~gherman/propaganda/tut-ro/tut-ro.pdf
[5]http://sightcorp.com/downloads/Automatic%20Facial%20Emotion%20Recognition.pdf
[6]Affective Computing by Rosalind W. Picard
[7]http://www.w3schools.com/xml/xml_whatis.asp
[8] http://vechi.upg-ploiesti.ro/col/ldumitrascu/pdf/xml/XML.pdf
[9] https://en.wikipedia.org/wiki/Affective_computing
[10]http://www.journals.elsevier.com/computer-vision-and-image-understanding
[11] OpenCV by Example
[12] http://docs.opencv.org/2.4/doc/user_guide/ug_traincascade.html
[13] http://qt-project.org/doc/
[14] Affective Computing by Rosalind W. Picard
[15]http://www.slideshare.net/dragosacostachioaie/mediul-de-programare-multiplatforma-qt
[16] http://ro.wikipedia.org/wiki/Structur%C4%83_de_date
[17]http://qt-project.org/doc/qt-4.8/qdeclarativeintroduction.html
[18] http://zetcode.com/gui/pyqt4/introduction/
[19] http://portal.fke.utm.my/fkelibrary/files/chaijialiang/2015/1300_CHAIJIALIANG2015.pdf
[20] http://coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html
[21] http://rria.ici.ro/ria2013_2/art03.pdf
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: Coordonator Știintific: Absolvent: Șef Lucrări dr ing Neculoiu Giorgian Andreea NUȚĂ București 2017 Aplicație software de recunoaștere a stărilor… [305994] (ID: 305994)
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.
