Translator Limbaj Mimico Gestualdocx
=== Translator limbaj mimico-gestual ===
UNIVERSITATEA TEHNICĂ „Gheorghe Asachi” din IAȘI
FACULTATEA DE AUTOMATICĂ ȘI CALCULATOARE
DOMENIUL: CALCULATOARE
SPECIALIZAREA: CALCULATOARE ÎNCORPORATE
LUCRARE DE DISERTAȚIE
Coordonator științific
Conf. dr. Ing. Mihai Horia Zaharia
Ingineri diplomați
Marian-Constantin Curcan
Victor Brătoiu
Iași, 2016
UNIVERSITATEA TEHNICĂ „Gheorghe Asachi” din IAȘI
FACULTATEA DE AUTOMATICĂ ȘI CALCULATOARE
DOMENIUL: CALCULATOARE
SPECIALIZAREA: CALCULATOARE ÎNCORPORATE
Translator limbaj mimico-gestual
LUCRARE DE DISERTAȚIE
Coordonator științific
Conf. Dr. Ing. Mihai Horia Zaharia
Masteranzi
Marian-Constantin Curcan
Victor Brătoiu
Iași, 2016
DECLARAȚIE DE ASUMARE A AUTENTICITĂȚII
LUCRĂRII DE DISERTAȚIE
Subsemnatul, CURCAN MARIAN-CONSTANTIN, legitimat cu CI seria MZ nr. 394461, CNP [anonimizat], autorul lucrării „Translator limbaj mimico-gestual ”, elaborată în vederea susținerii examenului de finalizare a studiilor de masterat, organizat de către Facultatea de Automatică și Calculatoare din cadrul Universității Tehnice „Gheorghe Asachi” din Iași, sesiunea iunie a anului universitar 2015-2016, luând în considerare conținutul Art. 34 din Codul de etică universitară al Universității Tehnice „Gheorghe Asachi” din Iași (Manualul Procedurilor, UTI.POM.02 – Funcționarea Comisiei de etică universitară), declar pe proprie răspundere, că această lucrare este rezultatul propriei activități intelectuale, nu conține porțiuni plagiate, iar sursele bibliografice au fost folosite cu respectarea legislației române (legea 8/1996) și a convențiilor internaționale privind drepturile de autor.
DECLARAȚIE DE ASUMARE A AUTENTICITĂȚII
LUCRĂRII DE DISERTAȚIE
Subsemnatul, BRĂTOIU VICTOR, legitimat cu CI seria MZ nr. 337346, CNP [anonimizat], autorul lucrării „Translator limbaj mimico-gestual”, elaborată în vederea susținerii examenului de finalizare a studiilor de masterat, organizat de către Facultatea de Automatică și Calculatoare din cadrul Universității Tehnice „Gheorghe Asachi” din Iași, sesiunea iunie a anului universitar 2015-2016, luând în considerare conținutul Art. 34 din Codul de etică universitară al Universității Tehnice „Gheorghe Asachi” din Iași (Manualul Procedurilor, UTI.POM.02 – Funcționarea Comisiei de etică universitară), declar pe proprie răspundere, că această lucrare este rezultatul propriei activități intelectuale, nu conține porțiuni plagiate, iar sursele bibliografice au fost folosite cu respectarea legislației române (legea 8/1996) și a convențiilor internaționale privind drepturile de autor.
Translator limbaj mimico-gestual
Curcan Marian-Constantin
Brătoiu Victor
Rezumat
Lucrarea de disertație își propune crearea unui dispozitiv fix capabil să monitorizeze și să interpreteze semnele și gesturile unei persoane cu deficiențe de vorbire, traducându-le în format text. Dispozitivul se dorește a fi practic un traducător din limbajul semnelor în limbaj scris. Tema lucrării este de actualitate și se încadrează în domeniul tehnologiilor asistive, deoarece poate ajuta în mod concret la reintegrarea persoanelor surdo-mute în societate, reprezentând liantul necesar acestora de a se descurca, comunica și relaționa în cadrul unei societăți.
În realizarea obiectivului lucrării de cercetare, ce constă în interpretarea corectă și eficientă a semnelor sau gesturilor făcute de un utilizator, am luat în considerare utilizarea unui senzor Kinect de la Microsoft ce dispune printre altele, de o cameră RGB și o cameră de adâncime cu ajutorul cărora se poate urmări și interpreta în timp real mișcările unui utilizator, având la dispoziție în fiecare secundă, treizeci de cadre captate.
Analizând atât individual fiecare cadru în parte, cât și în strânsă concordanță cu celelalte
cadre, se poate cataloga mișcarea făcută ca fiind un semn, un gest, sau o succesiune de semne. Validarea semnelor și gesturilor se realizează accesând o bază de date prestabilită, încărcată și interpretată prin intermediul unui Model Markov cu observații discrete . În urma experimentelor și antrenării modelului matematic, se generează un dicționar , care poate fi utilizat pentru a înțelege ideile exprimate de persoanele ce comunică gestual.
Rezultatul acestui proiect de cercetare se poate pune în practică, oferind locuri de muncă într-un cadru public, persoanelor cu deficiențe de vorbire și poate fi dezvoltat pentru creșterea acurateții funcționării sau extins către alte domenii de activitate.
Introducere
Ultimele decenii sunt martore ale avansării accelerate ale tehnologiei pe plan mondial, ce s-a infiltrat în vaste domenii, precum cel medical, unde se manifestă în mod deosebit necesitatea utilizării dispozitivelor care își asumă rolul de a facilita și îmbunătăți modul de viață al persoanelor cu diverse dizabilități fizice.
Această direcție de dezvoltare constituie ramura tehnologiilor asistive c sunt reprezentate de orice dispozitiv, instrument, echipament sau sistem tehnic, întrebuințat de persoanele cu dizabilități sau deficiențe fizice, produse special pentru prevenirea, compensarea, monitorizarea, înlăturarea sau neutralizarea efectelor disfuncțiilor, limitărilor activităților și restricțiilor de participare . joacă un rol semnificativ în rândul persoanelor cu limitări funcționale, oferindu-le acestora o modalitate de a comunica fără a fi dependente de alte persoane și șansa de a se întoarce la o viață activă și productivă în cadrul societății. O parte din aceste persoane este reprezentată de persoanele cu deficiențe de auz sau vorbire, a căror principală metodă de exprimare o constituie limbajul mimico-gestual. Proiectarea și implementarea unui instrument sau dispozitiv ce reprezintă liantul dintre acest tip de persoane și restul societății, capabil să traducă semnele și gesturile unui utilizator în limbaj scris, face obiectul lucrării de față.
Titlul acestei lucrări este „Translator limbaj mimico-gestual” și explorează tema tehnologiilor asistive care, în strânsă concordanță cu observatorii artificiali ai lumii înconjurătoare aflați sub influența factorului antropic, numiți senzori, are ca obiectiv înregistrarea și interpretarea gesturilor și semnelor voite și controlate ale unui utilizator în ideea redării unui echivalent în format text al intențiilor acestuia, cu scopul de a se putea face înțeleși de ceilalți indivizi din cadrul societății.
Problema studiată are în vizor crearea unui mediu de comunicare între persoanele cu deficiențe de exprimare și persoanele care nu cunosc limbajul semnelor utilizat de acestea. Această barieră lingvistică poate fi doborâtă prin realizarea unui translator între cele două limbaje menționate. În realizarea obiectivului lucrării de cercetare, ce constă în interpretarea corectă și eficientă a semnelor sau gesturilor făcute de un utilizator, am luat în considerare utilizarea unui senzor Kinect de la Microsoft ce dispune printre altele, de o cameră RGB și o cameră de adâncime cu ajutorul cărora se poate urmări și interpreta în timp real mișcările unui utilizator, având la dispoziție în fiecare secundă, treizeci de cadre captate.
Analizând atât individual fiecare cadru în parte, cât și în strânsă concordanță cu celelalte cadre, se poate cataloga mișcarea făcută ca fiind un semn, un gest, sau o succesiune de semne. Validarea semnelor și gesturilor se realizează accesând o bază de date prestabilită, ce conține litere, cuvinte sau expresii, cunoscându-se faptul că limbajul semnelor este un limbaj secvențial, ca cel vorbit, prin care un individ își exprimă ideile într-o ordine bine stabilită. În urma experimentelor și antrenării modelului matematic pentru a suporta cuvinte și expresii cât mai complexe, se generează un dicționar în adevăratul sens al cuvântului, ce poate fi utilizat pentru a înțelege instantaneu ideile exprimate de persoanele ce comunică non-verbal.
Adevărata provocare inițiată de acest proiect o constituie interpretarea semnelor și gesturilor în mod corect, într-un interval de timp cât mai scurt, pentru a fi traduse ulterior în format text, favorizându-se în acest mod crearea unui dialog cursiv între persoanele ce folosesc în exprimare limbajul semnelor și cele care folosesc vorbirea.
Rezultatul acestui proiect de cercetare se poate pune în practică, oferind locuri de muncă într-un cadru public, persoanelor cu deficiențe de vorbire și poate fi dezvoltat pentru creșterea
funcționării sau extins către alte domenii de activitate. Tipul de cercetare propus de această lucrare este susținut de o abordare empirică ce se centrează prioritar pe o relevanță practică, colectând date și fapte direct observabile și se alătură unei abordări experimentale, prilejuite de un nivel ridicat de control asupra variabilelor din cadrul contextului dat, fiind permisiv și față de manipularea condițiilor de realizare a studiului ce face obiectul lucrării de față, dar încurajează totodată extinderea ideii către vaste direcții de dezvoltare.
În continuare, detaliile privind construirea aplicației vor fi prezentate pe baza următoarei structuri: în capitolul 2. Fundamentare teoretică vor fi detaliate conceptele utilizate în implementarea aplicației, tehnologiile și produsele existente pe piață folosite în traducerea gesturilor conturate de un utilizator. Capitolul 3, intitulat Proiectarea aplicației, are rolul de a prezenta atât componentele hardware și software utilizate de către aplicație, cât și analiza arhitecturală a aplicației prezentând modulele generale ale aplicației și modul de comunicare dintre acestea. Capitolul 4, Implementarea aplicației, este semnificativ pentru descrierea generală a implementării soluției, a interfeței cu utilizatorul și a ciclului de funcționare a programului. Analiza performanțelor algoritmilor utilizați și diferitele rezultate experimentale vor fi reliefate în Capitolul 5, Testarea aplicației și rezultate experimentale. Capitolul intitulat Concluzii concentrează ideile principale ale lucrării și expune motivațiile și contextul alegerii acestei teme. Ultimul capitol, Bibliografie, are rolul de a indexa toate referințele științifice utilizate în studiul și analiza acestei probleme.
Fundamentare teoretică
Acest capitol își propune inițierea cititorului în domeniul abordat și familiarizarea acestuia cu noțiunile tehnice prezentate neexhaustiv și concret, la nivel teoretic. În cadrul capitolului vor fi expuse considerente privind motivul alegerii temei și orientarea cercetărilor către o anumită categorie socială, precum și date teoretice ce țin de :
Rezultate anterioare obținute în abordarea aceleiași teme
Aplicații existente însoțite de diverse tehnologii de actualitate
Tehnologia aleasă, detaliile și principiile fizice și matematice ce stau în spatele funcționării dispozitivului hardware utilizat.
La finele acestui capitol vor fi prezentate așteptările și obiectivele propuse spre a fi îndeplinite de aplicație.
Necesitatea dezvoltării unui traducător din limbajul semnelor
Se estimează că aproximativ 360 de milioane de oameni din întreaga lume suferă de pierderea auzului, incluzând o treime din populație cu vârste ce depășesc 65 ani . O însemnată parte din aceste persoane suferă de afecțiuni congenitale, ceea ce implică faptul că pentru aceste persoane sunetul este o necunoscută totală, iar pentru a se exprima și pentru a putea fi înțeleși, ei trebuie să se bazeze pe alte canale de comunicare. Pentru persoanele cu profunde probleme de auz sau vorbire, pe lângă limbajul scris, principala formă de comunicare o constituie limbajul semnelor. Adevăratul impediment există atunci când o persoană ce utilizează limbajul semnelor dorește să comunice cu o persoană ce nu cunoaște acest limbaj, iar ca dialogul să aibă loc este nevoie de o terță persoană ce se află pe post de traducător. Acest fapt este ușor inconvenient deoarece, pe lângă efortul depus, există riscul distorsionării intenției emițătorului, ce nu va putea fi pe deplin înțeles de interlocutor.
Având în vedere procentul ridicat de astfel de persoane defavorizate și existența pe piață a tehnologiilor necesare, se impune așadar concentrarea atenției, efortului și resurselor de care dispunem în crearea unui dispozitiv capabil să interpreteze și să traducă în timp real gesturile și semnele realizate de un utilizator surdo-mut.
Limbajul mimico-gestual sau limbajul semnelor
Comunicarea umană este un proces complex de transmitere a informațiilor de la emițător către receptor folosind un canal de comunicare și un cod. Limbajul non-verbal reprezintă aproximativ 93% din comunicare și are rolul de a oferi elemente în plus pentru a facilita transmiterea mesajului. Mimica și gesticulația sunt sisteme complexe și depind de factori psihologici și socio-culturali.
Fiecare persoană ce prezintă deficiențe de auz limbajul mimico-gestual (LMG), prin care aceasta își poate exprima nevoile sau ideile. Asemenea altor mijloace de comunicare, limbajul mimico-gestual reprezintă un procedeu prin care persoanele deficiente pot interacționa din punct de vedere social și permite o comunicare normală și completă cu ajutorul căreia acestea se pot integra mai ușor în societate. Majoritatea acestor persoane, în special cele deficiente de auz folosesc sporadic vorbirea articulată preferând utilizarea limbajului mimico-gestual pentru comunicarea cotidiană din cadrul vieții lor sociale .
Spre deosebire de modelele fonetice transmise acustic, un limbaj mimico-gestual este un limbaj care utilizează în principal comunicarea gestuală pentru a transmite o idee sau o însemnătate. Acest lucru poate implica simultan combinarea formelor degetelor, mâinilor, brațelor sau corpului cu expresii faciale pentru a exprima în mod fluent gândurile unui vorbitor. Limbajele semnelor împărtășesc multe similitudini cu limbile vorbite, orale, care depind în primul rând de sunet, motiv pentru care lingviștii le consideră pe ambele limbaje naturale, dar de asemenea există diferențe semnificative între limbajul semnelor și cel vorbit. Adesea aceste limbaje sunt confundate în mod eronat cu limbajul corpului, care este un al comunicării non-verbale. Deși limbajul semnelor a fost dezvoltat cu precădere oriunde au existat comunități de oameni surzi, acesta este de asemenea folosit de către oameni care pot auzi, dar nu pot vorbi .
O concepție comună, dar greșită este că limbajul semnelor este unul internațional, unificat la nivel mondial, dar realitatea arată că fiecare țară are în general propriul său limbaj, iar unele au chiar mai multe, chiar dacă există multe similitudini între diferite limbaje ale semnelor, fie ele din aceeași țară sau nu.
În jurul lumii sunt în folosință sute de limbaje mimico-gestuale distincte ce stau la baza comunităților locale de oameni cu deficiențe de auz, unele dintre ele obținând de-a lungul timpului o formă de recunoaștere juridică, în timp ce altele nu au niciun statut .
În pofida deosebirilor dintre limbajele gestuale ale fiecărei țări, există unele fenomene istorice care fac ca unele limbaje gestuale din țări neînvecinate, să fie mai mult legate între ele decât altele. Astfel, deși în Anglia și Statele Unite limba vorbită este engleza, limbajele gestuale din aceste țări (American Sign Language – ASL și British Sign Language – BSL) sunt diferite, dar interesant este faptul că ASL este mai apropiat de limbajul gestual francez, decât cel englez. Pe teritoriul României limbajul mimico-gestual nu este identic peste tot. Deși acesta coincide preponderent, există semne și gesturi diferite, nu doar la nivel regional, dar chiar la nivel de grupuri. Mulți dintre cei deficienți de auz sunt creativi în ceea ce privește elaborarea unor strategii proprii de comunicare prin folosirea mimicii și gesturilor, de unde și diversitatea semnelor (Figura 2.1.)
Elementele gesturilor și învățarea folosirii limbajului mimico-gestual
Informația transmisă pe cale vizuală, prin intermediul limbajului gestual, este alcătuită dintr-un amalgam de factori, precum mișcarea, expresia facială și corporală, folosirea spațiului de gesticulare și gesturi. Gesturile presupun aceleași sarcini ca și cuvintele vorbite. Limbajele gestuale sunt formate din semne și gesturi care formează propoziții și fraze atunci când sunt combinate.
În ciuda faptului că unele gesturi sunt standardizate, acestea diferă puțin în funcție de vârsta celor care folosesc limbajul gestual sau de zona geografică în care aceștia activează. Asemenea cuvintelor, gesturile pot avea diferite semnificații în context, fiind realizat în mai multe variante, pentru a reda conotații sau nuanțe diferite.
În limbajul mimico-gestual pot exista grade diferite de apropiere față de obiectul reprezentat, gesturile putând fi percepute în mod vizual pe o scară mergând de la pictorial spre abstract.
Dacă gesturile ar fi numai pictoriale, mesajele ar putea fi înțelese de către oricine, fără dificultate și nu ar mai trebui învățate.
Gesturile de origine pictorială pot fi executate în trei feluri :
degetele sau toată mâna imită conturul formei obiectului ( perete, casă, drum, obiect curbat, tubular rotund)
se imită apucarea și manevrarea obiectului (cană -,,a bea”, sertar -,,a deschide un sertar”, brichetă -,,a aprinde bricheta”, automobil -,,a conduce un autoturism”)
mâna însăși poate constitui un obiect sau o parte a lui, de ex. ,,ibric”-,,a turna din ibric”, ,,foarfecă”-,,a tăia cu foarfeca” .
În mimico-gesticulație, aceleași semn poate reprezenta simboluri diferite, în funcție de semnele sau gesturile învecinate, pe care vorbitorul le face adițional. Acesta este cazul omonimelor. Unele gesturi sunt produse cu o singura mână (gesturi uni-manuale) iar altele sunt executate cu ambele mâini (gesturi bi-manuale).
Limbajului mimico-gestual se poate învăța mai ușor, datorită mai multor factori prielnici. De exemplu, anumite semne au forme similare și în anumite cazuri pur și simplu reproduc mișcarea sau imită forma obiectului reprezentat.
În comunicarea mimico-gestuală persoanele deficiente de auz se pot folosi de mai multe categorii de semne sau gesturi: naturale, artificiale, indicatoare:
semne (gesturi) naturale (care sunt legate de obiect prin însăși aspectul lor); de exemplu semnul pentru casă- “are acoperiș”; cocoș- “are creastă”, gâscă- se imită mersul legănat al gâștei);
semne artificiale (pentru întuneric- trecerea mâinii prin fața ochilor în semnul de “este opac”, “negru”). Acestea implică o convenționalitate mai mare;
dactilemele (semne digitale care imită mai mult sau mai puțin literele alfabetului);
semne indicatoare (indicarea obiectelor care se află în câmpul vizual al celor care discută în timpul comunicării ) .
Multe gesturi oferă o imagine vizuală corespunzătoare ideilor, obiectelor sau mișcărilor pe care le reprezintă. De pildă, obiectele pot fi reprezentate prin conturul sau forma lor, prin modalitatea de manevrare a acestora, sau prin combinarea acestor procedee.
Dacă unele gesturi exprimă idei complicate, altele sunt foarte ușor de reprodus și de înțeles, fiind evidente, reprezentând lucrurile după forma lor. De pildă, degetele curbate sunt de obicei folosite să reprezinte obiecte curbate precum o minge, un pahar sau suprafețele curbate ale acestora. Prin convenționalitatea dobândită, aceste gesturi pot reprezenta orice obiect, iar informații suplimentare despre acesta pot fi oferite datorită modificării gesturilor.
Contextul joacă un rol deosebit de important în distingerea diferitelor semnificații ale unui gest. Așa cum cuvintele pot avea semnificații diferite în funcție de context, așa și gesturile diferă după felul cum sunt executate, după poziția plasării sau direcția mișcării. De pildă, cu ajutorul gestului ,,lumină”, se poate reprezenta o lustră (poziția spre tavan), o veioză (schimbarea poziției spre jos) sau razele soarelui .
Un gest bine executat este format din patru elemente. Pentru ca gestul să traducă semnificația corectă este necesar ca fiecare din aceste elemente să fie realizat corect și exact, altfel semnificația lui se schimbă radical.
Figura 2.2. Gestul pentru cuvântul „bicicletă”
în limbajul mimico-gestual american – Lifeprint.com
Aceste elemente sunt :
Mișcarea mâinii în spațiu – mișcarea unui gest poate fi îndreptată:
către gesticulator sau dinspre el (nivel de adâncime);
în sus sau în jos (nivel vertical) – Figura 2.2.;
spre stânga sau spre dreapta (nivel orizontal) – Figura 2.3.;
într-o singură direcție sau înainte-înapoi.
Figura 2.3. Gestul pentru cuvântul „familie”
în limbajul mimico-gestual american – Lifeprint.com
Configurația degetelor – constituie forma pe care o ia palma sau degetele în configurarea unui gest – Figura 2.4.
Figura 2.4. Gestul pentru cuvântul „ridicare”
în limbajul mimico-gestual american – Lifeprint.com
Așezarea mâinii în spațiu sau locul de articulare în relație cu capul sau pieptul persoanei care face gesturi. Locul de articulare reprezintă locul unde se face gestul. Pot fi distinse următoarele locuri de articulare :
în spațiul neutru, de exemplu, un loc în fața gesticulatorului (de ex. o casă, o cameră). Părțile gesturilor produse în spațiul neutru sunt acelea care se pot face astfel încât pot fi plasate în acel spațiu, în același loc și în aceleași relații unele față de altele ca și cum gesticulatorul poate să arate mai târziu unde au fost plasate – Figura 2.5.;
pe fața gesticulatorului;
pe corpul gesticulatorului;
pe mâna pasivă, numai în cazul gesturilor care se fac cu ambele mâini.
Figura 2.5. Gestul pentru cuvântul „familie”
în limbajul mimico-gestual american, poziția de început – Lifeprint.com
Orientarea palmei (sus-jos, stânga-dreapta). Direcția în care se mișcă palma și degetele în relație cu corpul gesticulatorului prezintă o importanță deosebită. De pildă, două forme ale mâinii pot fi aceleași dar direcțiile diferite în care se mișcă mâinile pot să le dea semnificații aparte sau opuse. În limbajul gestual există un număr limitat de poziții legate de orientarea mâinii – Figura 2.6 .
Figura 2.6. Gestul pentru cuvântul „toți”
în limbajul mimico-gestual american, poziția de început – Lifeprint.com
Pentru folosirea limbajului dactil, trebuie ținut cont de câteva aspecte :
Mâna trebuie ținută la nivelul umărului preferabil cu palma spre exterior.
Dactilemele trebuie făcute cu grijă.
Fiecare literă trebuie executată în același loc. Dacă se dorește dactilarea unui cuvânt ce conține o literă dublă cum ar fi de exemplu “înnoptat” sau “aceea” a doua literă trebuie făcută puțin mai la dreapta .
Rezultate anterioare
Domeniul recunoașterii gesturilor a cunoscut încă de la începutul ultimului deceniu al secolului trecut mai multe abordări care s-au evidențiat în ceea ce privește interfața cu utilizatorul în cadrul a două tipuri de sisteme: unul bazat pe recunoaștere vizuală și procesare grafică (, , , , , ), iar celălalt bazat pe recunoaștere senzorială(, ), ce presupune echiparea utilizatorului cu un set de mănuși acoperite cu senzori, ce generează un set de semnale în urma mișcării mâinilor.
Avantajele și dezavantajele acestor abordări sunt împărțite. Dacă sistemul bazat pe folosirea unor mănuși senzoriale este adesea costisitor, dar rezultatele sunt mai precise, cel bazat pe recunoașterea vizuală este mai complex și suferă de cele mai multe ori de carențe, luând în calcul faptul că acest sistem este dependent de condițiile de mediu. Cert este că ambele abordări necesită antrenarea în prealabil a unui sistem matematic, sprijinit de o bază de date ce conține seturile de gesturi, iar acuratețea rezultatelor este direct proporțională cu dimensiunea bazei de date, în special cu numărul și repetărilor gesturilor introduse.
Din punct de vedere istoric, recunoașterea gesturilor a început prin inventarea sistemelor bazate pe purtarea unor mănuși speciale menite să culeagă informații referitoare la mișcarea și flexarea degetelor și a mâinilor prin intermediul unui set de senzori aplicați la încheieturile degetelor – Figura 2.7.
Figura 2.7. Senzori plasați pe mână –
Luând în considerare evoluția acestor sisteme, se disting două categorii principale :
Active, ce presupun o varietate de senzori poziționați pe mănușă, care culeg informații referitoare la poziționarea mâinii și a degetelor în spațiu și le transmit unui dispozitiv prin intermediul tehnologiei cu fir sau fără fir. Aceste sisteme prezintă dezavantajul de constrângere și diminuare a dexterității si abilității utilizatorilor – Figura 2.8.
Figura 2.8. Mănușă cu senzori atașați – tweedegolf.nl
Pasive, ce presupun colorarea unor porțiuni esențiale a mănușii pentru a facilita detectarea degetelor de către un dispozitiv extern, precum o cameră de filmat. Aceste sisteme nu necesită existența vreunui tip de senzor și nu limitează flexibilitatea utilizatorilor – Figura 2.9.
Figura 2.9. Mănușă cu degete de colorație diferită și modul de detecție a acestora –
Odată ce tehnologia a avansat, permițând calculatoarelor o putere de calcul și de procesare mai mare, direcția de dezvoltare a acestor dispozitive s-a orientat către cealaltă categorie și anume cea a procesării video. Aceasta presupune instalarea unei camere video 2D îndreptată către utilizator cu scopul de a urmări și capta cadre succesive și de a la compara cu un set de date prestabilit. Însă în cazul gesturilor complexe ce implică mișcări ale mâinilor spre și
dinspre camera video, detectarea acestora nu se poate face cu o acuratețe ridicată deoarece din punctul de vedere al senzorului, imaginea rămâne aproape neschimbată.
Vogler și Metaxas (, ) au încercat să înlăture această dilemă prin amplasarea unor trei camere ortogonale pentru a capta imagini din trei unghiuri diferite și a compune ulterior imaginea, creând un efect tridimensional – Figura 2.10.
Rezultatele experimentale au ilustrat că acuratețea recunoașterii gesturilor a crescut cu un procent semnificativ.
Figura 2.10. Proiecție ortogonală a corpului utilizând trei camere –
Istoria recentă susține cu argumente creșterea accelerată a tehnologiei pe plan mondial, fapt dovedit de cercetătorii chinezi care au reușit să finalizeze in anul 2012 un proiect menit să traducă limbajul chinezesc al semnelor utilizând senzorul Kinect de la Microsoft.
Figura 2.11. Modul de traducere și comunicare în limbajul
semnelor chinezesc descris în –
Sistemul prototip este capabil să recunoască și ințeleagă gesturile făcute de un utilizator și să le convertească în limbaj scris și vorbit și invers, în sensul că sistemul are în componență și un
avatar care convertește sunetul recepționat în gesturi corespunzătoare limbajului mimico-gestual chinezesc (Figura 2.11.). Acest proiect face parte dintr-o categorie de dispozitive revoluționară deoarece se bazează pe Natural User Interface, ceea ce înseamnă că utilizatorul nu este constrâns sau nevoit să poarte niciun fel de echipament adițional în scopul transmiterii informațiilor referitoare la gesturile sau semnele realizate, într-un mod cât mai corect .
Senzorul Kinect
Introdus ca un răspuns la tehnologiile existente în industria consolelor de jocuri video, dispozitivul Kinect (Figura 2.12) lansat de compania Microsoft s-a dorit a fi inițial un supliment pentru Xbox 360, însă potențialul etalat de acesta, sau mai bine zis de tehnologia revoluționară de care dispune, ce se încadrează în zona Natural User Interface, a determinat creatorii să lanseze în anul 2011 o versiune similară pentru Windows 7, însoțită de un SDK cuprinzător, pentru a încuraja dezvoltarea de aplicații software, având la dispoziție librăriile necesare. Introducerea acestuia a stârnit interes în diverse domenii, în special în comunitatea de robotică.
Tehnologia care stă la baza dispozitivului Kinect a fost inventată și dezvoltată de o companie deținută de Microsoft și constă într-o colecție de tehnici utilizate pentru a produce o imagine bidimensională ai cărei pixeli corespund cu distanța obiectelor aflate în fața senzorilor. Acest lucru este posibil în principal datorită unui proiector infraroșu și a unui sistem ce permite reconstrucția tridimensională a imaginii captate de o cameră video. Utilizând acest sistem, pot fi interpretate gesturi specifice, ușurând modul de manevrare al utilizatorului întrucât nu este necesară prezența vreunui dispozitiv adițional.
Figura 2.12. Senzorul Microsoft Kinect
Senzorul Kinect este un dispozitiv sub forma unei bare orizontale conectată la un mic pedestal prin intermediul unui pivot motorizat, cu rază maximă de acțiune pe verticală de ±27° și
este proiectat să fie poziționat de-a lungul, dedesubt sau deasupra unui ecran video. În interiorul carcasei sunt adăpostite următoarele componente hardware ce susțin principalele funcționalități:
cameră video RGB care stochează trei canale de date într-o rezoluție de 1280×960, ce face posibilă captarea de imagini video color cu o viteză de aproximativ 30 cadre pe secundă.
Un emițător și un senzor de adâncime infraroșu. Ansamblul constă într-un proiector laser infraroșu combinat cu un senzor monocrom, care capturează un flux video tridimensional în condiții de lumină ambientală. Emițătorul emite o serie de fascicule de lumină ce respectă un anumit tipar, iar senzorul de adâncime citește poziția fasciculelor de lumină reflectate înapoi, ce sunt ulterior convertite în informație privind distanța la care se află anumite obiecte (Figura 2.13).
Figura 2.13. Proiecție fascicule în spectrul infraroșu pentru detecția adâncimii –
Raza de detecție a senzorului de adâncime este ajustabilă, senzorul Kinect oferind posibilitatea autocalibrării în funcție de poziția obiectelor de interes aflate în imediata apropiere.
Un vector de patru microfoane pentru captura sonoră. Datorită poziționării acestora, este posibilă, pe lângă înregistrarea audio, detectarea locației de unde se produce sunetul și direcția undelor audio.
Un accelerometru pe trei axe, ce poate fi utilizat pentru determinarea orientării senzorului Kinect.
Figura 2.14. Structură internă Senzor Kinect
Algoritmul matematic după care este calculată și refăcută imaginea captată constă în alegerea unui punct particular din tiparul de referință și compararea atât a poziției lui în scena
observată, cât și a celor opt puncte unice care îl înconjoară. Odată ce disparitatea a fost detectată, aceasta poate fi folosită împreună cu lungimea focală a camerei infraroșu pentru a calcula adâncimea acelui punct în cadrul scenei observate. Acest proces se repetă pentru fiecare punct din tiparul referențiat (Figura 2.15) .
Figura 2.15. Sintetizarea algoritmului matematic folosit în detecția adâncimi
Kinectul pentru Windows este puțin diferit față de cel creat inițial pentru Xbox 360, principala diferență fiind distanța minimă tolerată la care obiectele pot fi identificate cu succes și anume 40 cm pentru Windows față de 80 cm pentru Xbox. Din punct de vedere hardware, pentru a putea fi folosit împreună cu un computer, dispozitivul Kinect are nevoie de un cablu adaptor special, deoarece modul de conectare prin USB diferă (Figura 2.16).
Figura 2.16. Cablu adaptor pentru senzorul Kinect
configurat pentru sistemul de operare Windows
Din punct de vedere software, SDK-ul pune la dispoziție o serie de funcționalități ce facilitează dezvoltarea aplicațiilor și manevrabilitatea dispozitivului Kinect. Cele mai importante sunt listate în tabelul următor :
Tabelul 2.1.Funcționalități senzor Kinect
Cea mai accesată funcționalitate este cea a obținerii pe baza fluxului de date captate de senzorul de adâncime a unui set de puncte cheie ce indică scheletul unui utilizator (cap, stern, umeri, coate, încheieturile mâinilor, palmele, coloană, șolduri, genunchi). În același cadru sunt acceptați doi utilizatori (Figura 2.17).
Figura 2.17.Detecție schelet utilizator
Starea senzorului Kinect este descrisă de următoarele proprietăți :
Tabelul 2.2. Proprietăți senzor Kinect
Modelul Markov cu stări ascunse
Modelul Markov cu observații discrete este un tip de model stochastic bazat pe FSM și are o aplicabilitate sporită în domenii precum recunoașterea vocală, a scrisului de mână, sau a limbajului mimico-gestual. Acesta reprezintă o colecție de stări interconectate prin tranziții. Fiecare tranziție are asociată o pereche de procente care indică probabilitatea sistemului de a tranzita în starea respectivă, și probabilitatea valorii de ieșire, dintr-o anumită stare, referitoare la emiterea unui simbol dintr-un alfabet finit, bine stabilit. Altfel spus, un lanț Markov numit și proces Markov discret sau model Markov observabil poate fi văzut ca o mașină de stări finite cu stări, aflându-se exact într-una din stări la un moment dat. La intervale regulate de timp, sistemul modelat își va schimba starea în funcție de probabilitatea asociată stării curente, fie într-o stare diferită, fie înapoi în starea curentă .
O restricție importantă a lanțului Markov este aceea că probabilitatea tranzitării într-o anumită stare este dată de starea curentă și nu de starea anterioară. Determinarea faptului că o secvență de observații se potrivește modelului implică calcularea probabilității unei stări i la un moment de timp t după următoarea formulă (1):
(1)
Dacă putem calcula această probabilitate marginală în fiecare pas al unei secvențe, putem prezice stările ascunse și determina în ce măsură setul de date implicat urmărește modelul ilustrat. Probabilitatea modelului de a fi într-o stare specifică la timpul și probabilitatea tranziției din starea în starea la timpul poate fi estimată prin următoarele formule (2), (3):
(2)
(3)
În final, modelul va încapsula aceste probabilități într-o matrice de tranziție A și o matrice de emisie B. După calcularea probabilităților marginale, se poate re-estima acești parametri ai modelului folosind un algoritm de optimizare propus de Baum și Welch ce constă în două ecuații de actualizare alpha și beta (4), (5):
(4)
(5)
În continuare va fi prezentat un exemplu simplist care monitorizeză starea vremii, ilustrând funcționarea modelului Markov. Să presupunem trei stări notate cu S1, S2, S3, fiecare din ele având asociată o serie de probabilități tranzitorii, ca în figura următoare:
Figura 2.18. Diagramă de stări pentru un model Markov –
Matricea de probabilități a tranzițiilor dintre stări este:
(6)
O probabilitate poate fi calculată pentru orice secvență de observații O. Să presupunem că schimbarea stărilor se va efectua în fiecare zi, iar evenimentul va fi observabil pe parcursul a șapte zile. Dacă prima zi este însorită, o eventuală secvență de stări va arăta în felul următor:
O = { S3, S3, S1, S3, S2, S2, S2 }, ( t = 1, 2, … ,7 ) (7)
Probabilitatea pentru O poate fi calculată astfel :
(8)
unde este probabilitatea inițială ca vremea să fie însorită, ceea ce a fost presupus de la început. Notația generală pentru această probabilitate este:
(9)
Pentru a putea fi aplicat în probleme mai complexe, precum recunoașterea vocală, a scrisului de mână, sau a limbajului semnelor este nevoie de un model mai puțin restrictiv. În aplicațiile ce implică recunoașterea semnelor, senzorul care joacă rolul observatorului primește un flux video ce conține mișcarea continuă a unei mâini cu o secvență intermitentă de gesturi (Figura 2.19). Pentru a detecta realizarea unui gest anume, este necesară construcția unei rețele de stări ce conțin semne caracterizate de o componentă spațio-temporală. Ca gestul să fie validat se impune condiția realizării gestului pornind și oprindu-se în anumite stări caracterizate de puncte spațiale. Ca să fie recunoscut, gestul trebuie să treacă prin toate stările impuse, sau să aibă o probabilitate ridicată să se afle în acestea. Pentru a obține un grad ridicat de succes în ceea ce privește recunoașterea gesturilor, trebuie realizată antrenarea unei baze de date cuprinzătoare, care să acopere diverse scenarii și să fie destul de indulgentă în ceea ce privește probabilitățile gestului de a se afla într-o anumită stare.
Figura 2.19. Gest discretizat în puncte spațiale ce pot fi procesate de o rețea Markov –
Așteptări și obiective aplicație
Aplicația își propune traducerea gesturilor și semnelor în limbaj scris pe baza dicționarului limbajului mimico-gestual românesc, lucru ce se înfăptuiește prin detecția și interpretarea gesturilor desenate în spațiu de către un utilizator ce întâmpină probleme de comunicare, ce aparțin unui alfabet restrâns de cuvinte.
Printre obiectivele principale ale aplicației se numără :
Antrenarea unei baze de date care conține seturi de gesturi
Posibilitatea îmbunătățirii bazei de date și acordării unui feedback în funcție de gestul detectat și propus de aplicație, și intenția utilizatorului.
Detectarea în timp real a gesturilor realizate
Obținerea unei ridicate rate de succes în ceea ce privește acuratețea rezultatelor
Posibilitatea configurării și ajustării anumitor valori de interes
Persistarea datelor introduse în sistem
Accesarea și vizualizarea graficelor și statisticelor referitoare la rezultatele obținute
Funcționarea sistemului în condiții optime
Proiectarea aplicației
Acest capitol își propune descrierea modului de proiectare a aplicației, oferind informații conceptuale, referitoare la impus de tema aplicației și se va pune accent pe realizarea aplicației la nivel abstract și nu pe detalii de implementare, subiect ce urmează a fi tratat în capitolul următor.
Aplicația menționată, care va avea rol de translator din limbajul mimico-gestual în limbajul natural, a fost proiectată să funcționeze optim în cadrul sistemului de operare Windows, fiind structurată în două nivele distincte: nivelul grafic și nivelul de procesare logică. Aceste două nivele, se împart la rândul lor în mai multe sub-module cu roluri foarte bine definite, organizând aplicația, din punct de vedere arhitectural, într-o aplicație multi-nivel. Într-o aplicație , se întâlnesc în general patru nivele arhitecturale, a căror dispunere logică este descrisă în următoarea schemă:
Figura 3.1. Structură arhitectură multi-nivel
Structurarea în acest fel a aplicației permite o modularizare mult mai eficientă din punct de vedere al modului de implementare a funcționalității, nivelele fiind independente unele de altele, iar modul de comunicare realizându-se abstract, la nivel de interfețe. Cele patru nivele arhitecturale au următoarele semnificații:
Nivelul de prezentare
Acesta este nivelul superior din cadrul arhitecturii, cu acesta interacționând utilizatorul în momentul rulării aplicației. Acesta afișează date importante pentru utilizator și comunică rezultatele interacțiunii cu acesta la nivelele inferioare.
Nivelul de servicii
Acest nivel are rolul de a abstractiza accesul la nivelul de logică al aplicației, punând la dispoziție o interfață de acces pentru acesta. Acest nivel nu implementează structuri logice, ci doar coordonează și monitorizează procesele ce se derulează la nivele interioare .
Nivelul de logică
Reprezintă nivelul principal de procesare a interacțiunilor superioare, acesta conținând toată logica necesară pentru îndeplinirea obiectivelor și funcționalității aplicației.
Nivelul de date
Nivelul cel mai inferior din cadrul oricărei aplicații multi-nivel, având rolul de a accesa resure persistente: baze de date, sisteme de fișiere și de a oferi datele citite din aceste resurse la un nivel superior. În general accesul la acest nivel se face cât mai abstract posibil pentru a preveni dependențele de ordin funcțional de acest nivel.
Arhitectura multi-nivel reprezintă o abodare generică pentru modul de implementare și definire a unei aplicații, dar pentru o implementare concretă, s-au definit în timp mai multe paradigme de arhitectură. Dintre cele mai utilizate paradigme, cea mai cunoscută este paradigma MVC (Model View Control) (Figura 3.2).
Figura 3.2. Arhitectura Model View Control
Acest model are rolul de a decupla nivelul interfeței grafice de cel al logicii de procesare și de calcul, pe baza unei structuri alcătuite din trei componente: model, controler și view. Componenta view (care este echivalenta nivelului de prezentare din modelul multi-nivel) are rolul de a afișa datele în timp real pe interfața grafică a aplicației. Această componentă nu interacționează în mod direct cu nivelul de logică, toate cererile venite de la utilizator fiind dirijate prin componenta controler. Utilizatorul interacționează, prin intermediul interfeței grafice, cu funcționalitățile expuse de acest modul. Acest modul este echivalentul nivelului de servicii, menționat anterior în arhitectura multi-nivel. Pe lângă funcția de interacțiune externă, această componentă trebuie să ia decizii pe cont propriu luând în considerare cererile venite de la utilizator și să transmită aceste cereri la nivelul de logică reprezentat de componenta model. Prin acest procedeu de abstractizare al nivelelor aplicației, modelul poate avea o implementare izolată, logica acestuia fiind decuplată de cea a interfeței grafice. Componenta model unifică într-un singur modul, nivelele 3 și 4 din cadrul arhitecturii multi-nivel. Principalul dezavantaj al paradigmei MVC este dat de faptul ca se introduc etaje de redirectare a fluxului de date, ducând la apariția codului suplimentar necesar pentru realizarea legăturii între componentele implicate.
Din acest model arhitectural s-a rafinat, special pentru limbajele de programare puse la dispoziție de Microsoft, paradigma Model View Presenter (MVP) (Figura 3.3).
Figura 3.3. Arhitectura Model View Presenter
În acest model, componenta Presenter toată logica necesară funcționării corecte a interfeței grafice. Toate invocările și cererile utilizatorului sunt redirectate din component view în componenta presenter. La prima vedere, între paradigm Model View Controller și Model View Presenter nu par să existe foarte multe diferențe evidente. Totuși, în cazul celei de a doua paradigme, nivelul view este cât se poate de elementar și simplist, nivelul presenter fiind cel ce realizeaza comunicarea dintre view și model. În acest fel, nivelele view și model sunt decuplate
unul de cealalt. Atunci când modelul execută operații și lansează evenimente, modulul presenter se conectează la aceste evnimente și notifică view-ul de schimbări. Modelul view fiind pasiv, acesta expune metode de set folosite de presenter pentru a notifica interfața grafică. De asemenea, componenta presenter are rolul de a implementa logică pentru componente și evenimente UI (atunci când se apasă un buton, text box, etc.). În cazul aplicațiilor implementate în limbajul de programare C#, componentele view și presenter sunt strâns legate între ele la nivel de integrare în aplicație. În următoarea figură, se poate observa la nivel sintetic, diferențele între modul de comunicare efectuat de arhitectura Model View Control și paradigm Model View Presenter:
Figura 3.4. Comparație între arhitecturile Model View Controller și Model View Presenter
Aplicația implementată în această lucrare este implementată pe baza paradigmei Model View Presenter, menționată anterior. Componenta model, cu rolul de logică și procesare, este reprezentată de mai multe module, cu funcționalități distincte. Acestea au roluri variate dar vitale pentru captarea și interpretarea gesturilor.
Astfel, nivelul model este alcătuit din:
serviciul de acces la baza de date (se poate observa moștenirea din modelul arhitectural multi-nivel – nivelul de date)
serviciul de control al detecției gesturilor
serviciul de control al procesării grafice
serviciul de gestionare a senzorului de detecție
serviciul de interpretare a gesturilor
Comunicarea dintre aceste servicii este realizată de către nivelul presenter iar datele returnate sunt afișate în interfața grafică. Datorită faptului ca detecția și interpretarea gesturilor sunt niște operațiuni consumatoare de timp și de putere de procesare, aplicația este una de tip multi-threading, în care operațiile se execută pe fire de procesare diferite, pentru a nu afecta experiența utilizatorului aplicației. De asemenea, s-a urmărit și un grad de portabilitate al
aplicației, datele de recunoaștere a gesturilor, cât și librăriile de procesare fiind complet detașate de implementarea efectivă a programului.
Figura 3.5. Structura modularizată a aplicației bazată pe arhitectura MVP
În continuare vom prezenta în detaliu modul de proiectare al modulelor aplicației.
Serviciul de acces în baza de date
Acest serviciu este echivalentul nivelului de acces la date prezentat la începutul capitolului, în cadrul modelului arhitectural multi-nivel. Acesta are rolul de a accesa, pentru scriere și pentru citire, o bază de date în care sunt descrise, într-un mod generic, diferitele gesturi pe care aplicația translator le poate recunoaște și interpreta. Acest serviciu are rolul de a persista, de-alungul a mai multe sesiuni de training și detecție succesive, datele înregistrate în colaborare cu restul componentelor din cadrul modelului aplicației.
3.1.1. Structura bazei de date
Pentru a putea descrie modul de gestionare și de acces a datelor din baza de date, trebuie să fie înțeles mai întâi modul de descriere a unui gest în cadrul funcționării aplicației. Astfel, un gest este considerat o secvență de cadre în timp captate de către senzorul de detecție.
Un cadru este de poziționarea membrelor corpului în timpul efectuării gestului (Figura 3.6).
Figura 3.6. Discretizarea unui gest în cadre
Ne dorim ca aplicația să funcționeze la nivel abstract ca un dicționar de gesturi regăsite în limbajul mimico-gestual, astfel încât baza de date va trebui sa conțină atât lista de cuvinte suportate cât și descrierea lor la nivel de cadre efectuate. Astfel, baza de date va avea următoarea structură conceptuală:
Figura 3.7. Structura conceptuală a bazei de date cu gesturi
Se poate observa că avem nevoie de o listă de gestur suportate, care va fi unică pentru baza de date. Aceasta va conține numele gestului (care ulterior va fi afișat în timpul antrenamentului/detecției) și index-ul acestuia pentru a putea indexa și accesa diferite structuri generate în timpul utilizării bazei de date. Un gest menționat în lista de gesturi poate avea unul sau mai multe gesturi de antrenament care descriu mișcarea punctelor cheie a corpului în spațiu. Acest lucru se poate observa și în diagram structurală a bazei de date, între lista de gesturi și setul de gesturi existând o relație de tipul “unul la mai mulți” [1:*]. Un set de gesturi poate conține unul sau mai multe cadre descriptive, aceste două entități îndeplinind o relație de tipul „mai mulți la mai mulți” [*:*]. Lista de coordonate, care descrie fiecare cadru în parte, va fi definită ulterior în documentație, atunci când vom descrie implementare acestui modul.
3.1.2 Accesul la baza de date
Modul în care accesul la baza de date se realizează în timpul execuției programului este cel mai bine descris de diagrama de activitate descrisă în Figura 3.8 Se poate observa că încărcarea conținutul bazei de date se face asincron pe un thread dedicat. Acest lucru se faptului că la un număr mare de gesturi și de seturi de antrenare pentru un gest baza de
date poate avea multe intrări iar încărcarea ei poate consuma timp de procesor. Atunci când încărcarea a luat sfârșit, modulul de acces al bazei de date aruncă un eveniment către nivelele superioare pentru a notifica sfârșitul operației. Ca o îmbunătățire și operația de scriere ar putea fi mutată pe un thread dedicat (în cazul implementării curente, acest lucru nu a fost necesar încât accesul la nivel de fișier este suficient de rapid încât este insesizabil pentru utilizator).
Figura 3.8. Diagrama de activitate pentru operațiunea de acces la baza de date de gesturi
Serviciul de control al detecției gesturilor
Acesta este unul din cele mai complexe servicii prezente în aplicație, întrucât acesta are rolul de a controla atât antrenarea cât și detecția în timp real a gesturilor făcute de către un utilizator. La nucleul acestui modul stă notificarea venită din exterior, de detecție a unui cadru gestual. Cele două scenarii principale suportate de către acest modul, antrenarea și detecția în timp real,
reprezintă de fapt două fluxuri de utilizare diferite în cadrul aplicației. În continuare vom descrie fiecare flux de utilizare în mod detaliat.
3.2.1. Antrenarea gestuală a modelului matematic
Antrenarea modelului matematic folosit pentru detecție presupune înregistrea unui gest și introducerea acestuia în baza de date, generând astfel o buclă de învățare care poate fi activată sau nu în timpul antrenării. Atunci când utilizatorul pornește înregistrarea unui gest, aceste este stocat, temporar, într-o listă de cadre descriptive ( celei de la Figura 3.1). Atunci când înregistrarea a luat sfârșit, secvența înregistrată poate fi adăugată într-o baza de date în memoria RAM sau poate fi introdusă în bucla de învățare, realizându-se detecția gestului pe baza modelului matematic. În cazul activării buclei de învățare, se poate valida rezultatul calcului matematic, verificând dacă gestul a fost recunoscut cu succes. Daca rezultatul este unul pozitiv, noul set de cadre este introdus în baza de date. Altfel, setului de cadre îi este asignat cuvântul dorit și introdus în baza de date. Acest procedeu poate fi repetat de mai multe ori, până se ia decizia de oprire a buclei de înregistrare și învățare.
Figura 3.9. Diagrama de activitate pentru operațiunea de antrenare a modelului matematic
După cum se poate observa în Figura 3.9, atunci când un cadru este disponibil în sistem, aceste se validează cu ajutorul unei frecvențe. Acest lucru se realizează din simplul fapt că uneori frecvența senzorului poate fi mult mai mare decât frecvența de segmentare a gesturilor în cadrul modelului matematic.
Detecția în timp real a gesturilor
Detecția gesturilor efectuate de către utilizator se bazează, ca și în scenariul de mai sus, pe secvențele de cadre stocate temporar în cadrul serviciului de control al detecției gesturilor. Acest scenariu va fi cel mai des întâlnit în cadrul utilizării aplicației. Astfel, utilizatorul va porni detecția și în timp ce va efectua gesturi din mimico-gestual, aplicația, prin intermediul acestui serviciu, va interpreta cadrele detectate.
Este foarte important de menționat faptul, că spre deosebire de etapa de înregistrare a gesturilor, în care controlul era absolut asupra cadrelor și a modului în care acestea erau gestionate în interiorul fluxului de date, în acest caz detecția se va face continuu, singurul mod în care aceasta poate fi stopată este ori din interiorul interfeței grafice ori prin efectuarea unui gest de repaus. Din punct de vedere funcțional, etapa de detecție va porni atunci când acest scenariu va fi activat din interfața aplicației și atunci când utilizatorul va avea o poziție a corpului diferită de o poziție de repaus, neutră, total diferită de orice alt gest suportat de către modulul de detecție.
De asemenea, o altă diferență față de scenariul anterior este dată de faptul că utilizatorul nu va mai efectua un singur gest individual, ci va efectua o succesiune de gesturi ce alcătuiesc o frază ce va trebui detectată. Acest scenariu ridică problema segmentării cadrelor înregistrate în timpul detecției pentru a putea identifica începutul și sfârșitul gesticulării unui cuvânt din cadrul frazei. Modulul de control al detecției propune o soluție de rezolvare a acestei probleme. În schema din Figura 3.10, este reprezentată tranziția succesivă dintre trei gesturi reprezentate discret, la nivel de cadru, pe axa timp. În timpul efectuării gesturilor, există o perioadă de tranziție între gesturi reprezentate de cadrele G1i-2, G1i-1, G1i, G21.
Figura 3.10. Discretizarea unei secvențe de trei gesturi în cadre distincte
Modulul de control pornește de la premiza că aceste cadre menționate anterior vor fi foarte asemănătoare, deoarece acestea se regăsesc la sfârșitul efectuării oricărui gest diferit de gestul de repaus. Astfel, vom denumi în continuare o secvență de cadre ca fiind stabilizată atunci când coordonatele punctelor cheie din interiorul fiecărui cadru vor avea o deviație standard mult mai mică decât un prag impus de către utilizatorul programului. Atunci când în timpul detecției o secvență de cadre devine stabilizată, modulul de control va notifica modelul matematic să realizeze o detecție pentru a identifica gestul efectuat. Principalii factori care vor decide eficacitatea segmentării secvențelor de cadre sunt așadar pragul sub care valoarea deviației standard va fi calculată și lungimea structurii de date în care cadrele ce urmează a fi stabilizate sunt stocate.
Pe lângă acest scenariu generic, în timpul detecției, aplicația poate detecta și gesturi numerice. Pentru aceasta, modulul de control va interoga modulul grafic de fiecare dată când poziția corpului va fi încadrată într-un gest distinct, în care vizibilitatea mâinilor va fi maximă, iar numărarea degetelor de la fiecare mână să fie eficient (Figura 3.11).
Figura 3.11. Diagrama de activitate pentru operațiunea de detecție în timp real a gesturilor
Serviciul de interpretare a gesturilor
Acest serviciu are roluri bine definite, acelea de a antrena cât și a efectua detecția gesturilor realizate de către utilizator. Aceste funcționalități sunt realizate prin intermediul modelului matematic Markov, cu tranziții ascunse, sintetizat în cadrul implementării acestui serviciu. În continuare vom prezenta cele două funcționalități și modul lor de funcționare.
Antrenarea modelului matematic se realizează prin procesarea datelor primite din încărcarea bazei de date și antrenamentul realizat de către utilizator. Experimental, se poate observa că antrenarea bazei de date este o operațiune de durată, întrucât modelul matematic trebuie să proceseze o foarte de mare de informații de antrenament. Pentru a nu bloca firul de execuție principal, pe care se află instanța serviciului de interpretare a gesturilor, operațiunea de antrenare va fi executată pe un fir de execuție paralel.
Figura 3.12. Diagrama de activitate pentru funcționalitatea modului de interpretare
Atunci când această operațiune își va termina execuția, modulul de interpretare va notifica modulele clienți, interesate de rezultate. Ca date de intrare pentru operația de antrenare a modelului matematic, se va furniza lista de gesturi suportate, pentru a ști cu exactitate numărul de clase distincte și colecția de seturi de coordonate cu datele de antrenament.
Detecția gesturilor va fi realizată doar pe baza datelor și operației de antrenament, realizate anterior detecției. Spre deosebire de faza de antrenament, detecția are nevoie ca date de intrare doar de o secvență de cadre, asupra căreia se va aplica algoritmul de detecție implementat de modelul matematic sintetizat în modulul de interpretare. În urma detecției, modulul va returna către modulele interesate atât rezultatul clasificării cât și o tabelă de probabilități în care se vor putea inspecta probabilitățile asignate tuturor claselor de gesturi returnate. Asemănător secvenței de antrenament, identificarea gestului efectuat poate fi o operațiune de durată atunci când modelul matematic este foarte bine antrenat, astfel încât detecția va fi mutată pe un fir de execuție dedicat, diferit de firul principal. Acest comportament se poate observa în diagrama de activitate din Figura 3.12.
Serviciul de control al senzorului de detecție
Acest modul reprezintă unul din cele mai importante componente ale aplicației, având un rol central, toate datele vehiculate în cadrul sistemului având originea în detecția și interpretarea preliminară efectuate la acest nivel. Acest modul va furniza celorlalte module funcționale (modulul de control al detecției gesturilor și serviciul de control al procesării grafice) două fluxuri de date în care se vor regăsi poziția corpului utilizatorului, de la brâu în sus cât și cadre oferite de către senzorul de adâncime pentru detecția mâinilor.
Principala clasă de date vehiculată de acest serviciu va reprezenta poziția corpului utilizatorului de la brâu în sus. S-a ales această încadrare în spațiu pentru ca gesturile din limbajul mimico-gestual se realizează strict prin mișcarea brațelor și a trunchiului, cât și prin faptul ca se urmărește optimizarea algoritmilor, prin reducerea dimensiunilor datelor transmise. Clasa care va reprezenta utilizatorul în cadrul acestui serviciu va avea o colecție de coordonate spațiale pentru fiecare punct cheie din cadru. Aceste puncte cheie vor avea un amplasament ca în Figura 3.13:
Figura 3.13. Punctele cheie din cadrul de detecție a corpului utilizatorului
Atunci când senzorul va detecta utilizatorul în spațiul de detecție, această clasă va fi populată iar modulele client vor fi notificate de faptul ca avem un cadru disponibil. Principalul beneficiar al acestei funcționalități îl reprezintă desigur clasa de control al detecției gesturilor.
O altă funcționalitate expusă de acest modul este stream-ul de adâncime, folosit în mod direct de către clasa de procesare grafică pentru interpretarea mâinilor utilizatorului. Cum se va observa și ulterior, clasa de procesare grafică va trebui să detecteze mâinile utilizatorului pentru a identifica cât mai precis numărul de degete din cadrul gestului numeric. Înainte de a transmite aceste date la modului de control al procesării grafice, stream-ul de adâncime va trebui trunchiat pentru a elimina informațiile irelevante pentru detecție și care ar putea aduce impedimente pentru identificarea cu succes a datelor.
Figura 3.14. Modalitatea de optimizare și trunchiere a distanțelor în cazul captării stream-ului de adâncime.
Astfel, în raport funcțional cu modulul grafic, se vor introduce două limite pentru adâncime maximă și respectiv minimă în care se va interpreta stream-ul de adâncime. Modul de funcționare în acest caz este descris în Figura 3.14.
Atunci când un cadru de adâncime este detectat, acesta este procesat intern înainte de a le transmite la nivelele superioare. Astfel acest cadru va fi mai întâi transformat din sistemul de coordonate ale senzorului în coordonate din sistemul spațial. Mai apoi acest cadru va fi limitat pe baza valorilor impuse dmin și dmax și mai apoi transformat într-o imagine binară, în care obiectele din cadru vor fi evidențiate pentru detecție.
Figura 3.15. Diagrama de activitate pentru modulul de control al senzorului
Serviciu control procesare grafică
Acest serviciu, este unul secundar, care are ca rol detecția gesturilor numerice din limbajul mimico-gestual. Acest modul va procesa fluxul de date venit de la camera de adâncime a senzorului. Detecția numărului degetelor se va face pe baza procesării grafice. Astfel, algoritmul propus este unul clasic în cazul recunoașterii formelor și se bazează pe calculul convexității unui obiect. În continuare vom prezenta etapele principale ale acestui algoritm.
Pas 1. Transformarea binare în imagine
Acest pas are rolul de a transforma matricea binară generată de către modulul de control al senzorului într-o imagine validă pentru procesare grafică.
Figura 3.16. Transformarea binare de adâncime într-o imagine validă
Pas 2. Aplicarea unui filtru laplacian
Acest pas are rolul de post procesare, pregătind imaginea pentru detecția contururilor mâinilor. După cum se poate observa în Figura 3.17, filtrul laplacian evidențiază regiunile în care intensitatea imaginii se schimbă, evidențiind astfel conturul preliminar din imagine.
Figura 3.17. Aplicarea unui filtru laplacian asupra rezultatului de la pasul 1
Pas 3. Extragerea contururilor
Acest pas are ca rol extragerea contururilor din imagine folosind algoritmul de extragere a contururilor din lucrarea .
Figura 3.18. Extragerea contururilor folosind algoritmul descris in [23]
Pas 4. Extragerea poligonului convex
Acest pas are rolul de a extrage poligonul convex, ce urmăreșe principalele puncte de definiție ale contururilor anterior detectate. Algoritmul utilizat este descris în lucrarea .
Figura 3.19. Extragerea poligonului convex din contururile detectate la pasul 3
Pas 5. Detecția defectelor de convexitate
Acest ultim pas este și cel mai important, deoarece pe baza poligonului de convexitate anterior calculat, sistemul grafic va extrage toate defectele de convexitate.
Figura 3.20. Detecția defectelor de convexitate din rezultatul pasului 4
Implementarea aplicației
Aplicația a fost proiectată să funcționeze în cadrul sistemului de operare Windows 7 (din cauza restricțiilor impuse de SDK-ul senzorului Kinect), astfel limbajul de programare ales pentru implementare a fost Microsoft C#.
În Figura 3.5, s-au conturat, într-un mod structurat principalele module ale aplicației, module definite în faza de proiectare. Cum faza de proiectare este strâns legată de cea de implementare,
arhitectura proiectată a fost translată în module efective, subliniind astfel trasabilitatea între etapele de arhitectură și design. Această analogie directă se poate observa și în Figura 4.1, unde, într-o diagramă de clase parțială, sunt evidențiate principalele clase ale aplicației. Astfel, se poate observa următoarea analogie între modulele proiectate și clasele aplicației:
Tabelul 4.1. Analogia între modulele proiectate și clasele aplicației
La nivelul implementării, arhitectura Model View Presenter, menționată ca și principala structură de proiectare a aplicației, este sintetizată foarte ușor prin intermediul interfeței de tip Windows Forms. Aceasta este unul din cele mai utilizate template-urile de proiect C#, pe lângă cele din Windows Presentation Foundation. Astfel, cele cinci module principale ale aplicației sunt inițializate într-un nivel comun de interfață grafică și logică funcțională, echivalent nivelului presenter din arhitectura MVP. Acest nivel, încapsulat în form-ul principal al aplicației are rolul de a inițializa modulele, de a le interconecta și de a redirecționa apelurile bidirecționale între interfața grafică și module și invers. Acest mod de abstractizare decuplează interfețele, oferind în perioada de testare a aplicației, mai ales prin testarea unitară, o capacitate mai mare de diagnoză.
În continuare vor fi descrise într-o manieră detaliată modul de implementare a tuturor modulelor ce alcătuiesc structural aplicația. Pentru fiecare modul, va fi evidențiată și explicată funcționalitatea de bază atât prin intermediul diagramelor de clasă și de secvență, cât și prin exemple extrase din codul sursă.
Figura 4.1. Diagrama de clase cu principalele module ale aplicației
Implementarea modulului de control al senzorului
Rolul acestui modul, așa cum a fost menționat și în capitolul anterior, este atât de a asigura controlul senzorului Kinect cât și de a emite informațiile detectate de acesta către modulele interesate. Pentru a accesa și controla senzorul Microsoft Kinect, este nevoie de instalarea API-ului pus la dispoziție de către producător. În urma instalării librăriei în sistem, aceasta trebuie referențiată în cadrul proiectului de dezvoltare. După efectuarea acestei operații, se va regăsi această librarie în sistemul de referințe al proiectului (Figura 4.2).
Figura 4.2. Sistemul de referințe al proiectului după încărcarea API-ului Kinect
Pentru a putea folosi funcționalitățile și proprietățile puse la dispoziție de către această librărie, namespace-ul librăriei trebuie inclus în codul sursă, așa cum este ilustrat în următoarea secțiune de cod:
using Microsoft.Kinect;
Clasa care va conține întreaga implementare a modulului de control al senzorului se numește KinectHandler. Așa cum se poate observa în diagram de clase din Figura 4.1, clasa KinectHandler conține trei obiecte (sensor, coordinateMapper și skeletonData) cu specificator de acces privat, folosite pentru a accesa și controla componenta Kinect. Dintre aceste trei componente, cea mai importantă este instanța obiectului sensor. După cum se poate observa în următoarea secțiune de cod, acest obiect este de tipul KinectSensor.
/// <summary>
/// The Kinect sensor.
/// </summary>
private KinectSensor sensor;
Proprietățile acestei clase au fost descrise în tabelele din subcapitolul 2.5. Senzorul Kinect (Tabelul 2.1, Tabelul 2.2).
La inițializarea acestui serviciu, instanța obiectului sensor va fi obținută dintr-un container static de obiecte, de tipul KinectSensor, puse la dispoziție de către API (KinectSensor.KinectSensors). Din aceste obiecte vom selecta doar cele care au statusul KinectStatus.Connected, condiție necesară mai ales dacă în sistem se vor regăsi mai multe dispozitive Kinect. Această selecție se va face în modul următor:
foreach (var potentialSensor in KinectSensor.KinectSensors)
{
if (potentialSensor.Status == KinectStatus.Connected)
{
this.sensor = potentialSensor;
}
}
Dacă instanța senzorului obținut este validă (nenulă), urmează a se seta diferite opțiuni de configurare și comunicare folosite pe parcursul algoritmului de control. După cum s-a menționat în capitolul 3, Proiectarea aplicației, acest modul va pune la dispoziție fluxul de date captat de camera de adâncime și cadrele cu scheletul utilizatorului detectat, date care vor ajunge la modulul de procesare grafică respectiv modulul de detecție și interpretare a gesturilor. Pentru a activa aceste funcționalități, în etapa de inițializare, se vor accesa o serie de proprietăți specifice.
Stream-ul de date care va conține scheletul utilizatorului va fi abstractizat sub forma unui obiect membru al clasei KinectSensor, KinectSensor.SkeletonStream. Pentru a activa această funcționalitate, va trebui apelată metoda enable expusă de obiectul menționat.
this.sensor.SkeletonStream.Enable();
Atunci când un cadru va fi disponibil, obiectul SkeletonStream va emite un eveniment de tipul SkeletonFrameReady, care va conține datele disponibile. Deoarece acest eveniment va trebui redirecționat către nivelele superioare ale aplicației, vom conecta un eveniment propriu, local, care va fi expus pe interfața publică a modulului.
this.sensor.SkeletonFrameReady += this.Sensor_SkeletonFrameReady;
Analog, se va proceda și pentru datele venite de la senzorul de adâncime. Obiectul care va abstractiza senzorul de adâncime este dat de clasa KinectSensor.DepthImageStream. Pentru a activa acest obiect, este necesară apelarea metodei Enable expusă de acesta. Spre deosebire de clasa SkeletonStream, apelul funcției Enable pentru DepthImageStream necesită un argument, DepthImageFormat, argument ce indică rezoluția camerei de adâncime. În cazul aplicației noastre, pentru a obține performanțe mai bune în procesarea grafică, am optat pentru o rezoluție de 320 x 240 cu o frecvență de detecție de 30 de cadre pe secundă.
this.sensor.DepthStream.Enable(DepthImageFormat.Resolution320x240Fps30);
Pentru a notifica modulul de procesare grafică, se va redirecționa de asemenea evenimentul de DepthFrameReady către nivelele superioare.
this.sensor.DepthFrameReady += this.Sensor_DepthFrameReady;
Modulul de control al senzorului pune la dispoziție, prin intermediul metodelor publice, posibilitatea de a porni și a opri dispozitivul Kinect. Pentru a putea obține date atât de la camera de adâncime cât și cadre cu scheletul utilizatorului, se impune apelarea metodei de pornire a senzorului. Această metodă va seta o variabilă internă, privată, cu scopul de a putea valida operațiile ulterioare.
/// <summary>
/// Start the Kinect sensor.
/// </summary>
/// <returns>True if the sensor was started successfully, false otherwise.</returns>
public bool StartKinectSensor()
/// <summary>
/// Stop the Kinect sensor.
/// </summary>
/// <returns>False if the sensor is stopped, true otherwise.</returns>
public bool StopKinectSensor()
Atunci când un cadru cu scheletul utilizatorului este disponibil, în implementarea clasei, se va apela o metodă de callback, cu scopul de a valida și a preprocesa cadrul obținut. Astfel, se va urma o implementare descrisă de următoarea diagramă de secvență (Figura 4.3):
Figura 4.3. Diagrama de secvență ce se execută la aparția unui cadru ce conține scheletul unui utilizator
În această diagramă se poate observa că atunci când un cadru este validat (nenul și conține cel puțin un schelet monitorizat) acesta suferă o operație de transpunere. Coordonatele scheletului, atunci când cadrul este emis inițial, nu sunt specifice spațiului utilizatorului, ci au o transpunere internă, rezultată din algoritmii de procesare a API-ului senzorului Kinect. De aceea, pentru a le reprezenta în spațiul tridimensional, într-un mod corect, se va apela metoda MapSkeletonToSpace. Această metodă, pe baza unui obiect de tipul CoordinateMapper menționat anterior, ca fiind un membru privat al clasei), va transpune fiecare încheietură componentă și relevantă în spațiul 3D. Odată ce cadrul a fost preprocesat, acesta va fi transmis
mai departe atât componentei de control a detecției cât și interfeței grafice pentru a afișa scheletul.
Pe lângă cadrele cu scheletul utilizatorului, acest modul pune la dispoziția serviciului de procesare grafică și cadre de adâncime detectate de senor. Precum s-a menționat în subcapitolul 3.4. Serviciul de control al senzorului de detecție și în Figura 3.14, cadrul de adâncime va suferi o etapă de preprocesare pentru a transforma valorile adâncimilor într-o matrice binară, în care indecșii vor reprezenta coordonatele spațiale iar valorile elementelor coordonata de adâncime. Astfel, din cadrul de adâncime obținut prin intermediul notificării menționate mai sus, vom extrage datele brute.
short[] depthData = new short[depthFrame.PixelDataLength];
depthFrame.CopyPixelDataTo(depthData);
Odată extrase aceste date, vom accesa doar biții care ne vor indica distanța către obiectele din zona de interes. Acestea vor fi stocate și returnate pentru a le utiliza în continuare. Accesarea distanței se va face printr-o operație de shiftare asupra distanței curente din cadru cu o mască prestabilită în API.
for (int i = 0; i < distances.Length; i++)
{
// Remove player data.
distances[i] = depthData[i] >> DepthImageFrame.PlayerIndexBitmaskWidth;
}
Având vectorul cu distanțe generat, acesta va fi introdus într-o matrice, în care se va respecta următoarea regulă de introducere: dacă distanța curentă se află între limitele impuse, în matrice vom introduce valoarea True, altfel vom introduce valoarea False.
if (minimumDistance <= distances[index] &&
distances[index] <= maximumDistance &&
distances[index] != -1
)
{
binaryDistanceMatrix[i][j] = true;
}
else
{
binaryDistanceMatrix[i][j] = false;
}
Această matrice va fi utilizată pentru a notifica modulul de procesare grafică, prin apelul funcției OnBinaryDistanceMatrixReady(), ce va transmite un eveniment către nivelele superioare.
Implementarea modulului de control al detecției gesturilor
Modulul curent este responsabil de monitorizarea și interpretarea gesturilor executate de utilizator cu scopul de a fi corelate cu un dicționar de cuvinte pentru a fi traduse. Acest modul este divizat în ideea existenței a două scenarii, oferind utilizatorului atât posibilitatea creării și dezvoltării unei baze de date robuste ce reflectă trasarea gesturilor înregistrate în prealabil, cât și segmentul de detecție propriu-zisă a gesturilor conturate.
Utilizatorul are opțiunea de introduce cuvinte în baza de date într-un mod repetitiv, gesticulând în fața senzorului Kinect și indicând cuvântul aferent. Într-un stadiu mai avansat al antrenării sistemului, mai cu seamă atunci când există suficient de multe informații introduse în baza de date, utilizatorul poate selecta un alt mod de învățare, în care primește un feedback din partea modulului de interpretare a gesturilor cu privire la detectarea gestului executat, având posibilitatea validării sau invalidării rezultatului obținut.
Al doilea scenariu este cel de detecție continuă a gesturilor, în care utilizatorul execută gesturi separate de o secvență de delimitare, care sunt procesate și interpretate conform datelor introduse în sistem în cadrul antrenării.
În interfața publică expusă de acest modul sunt prezente două metode ce vor controla una din principalele funcționalități, înregistrarea gesturilor:
/// <summary>
/// Starts the recording of a gesture.
/// </summary>
public void StartRecording()
/// <summary>
/// Stops the recording of a gesture.
/// </summary>
/// <param name="gestureName">The gesture name specified in the combo box.</param>
public void StopRecording(string gestureName)
Apelând aceste metode se va seta un parametru intern, privat, care va specifica dacă o sesiune de înregistrare este în progres.
Conform diagramei de secvență din Figura 4.4, principalul canal de comunicare cu celelalte module îl reprezintă metoda de callback SkeletonAvailable. În momentul apelului, se face o verificare pentru a se stabili faza în care se află modulul. Astfel, daca o sesiune de înregistrare este în progres, cadrele venite de la modulul de control al senzorului sunt stocate într-o structură temporară de tipul List<Upper2DSkeleton> currentFrameSequence. Această listă are ca tip de bază clasa Upper2DSkeleton, o clasă ce reprezintă abstractizarea la nivel de cod a cadrului ce conține scheletul unui utilizator. Clasa are ca membrii punctele cele mai reprezentative pentru gesturile din limbajul mimico-gestual, puncte ce reprezintă încheieturile de la brâu în sus: Spine, ShoulderCenter, Head, ShoulderRight, ShoulderLeft, ElbowRight, ElbowLeft, WristRight, WristLeft, HandRight și HandLeft. Coordonatele acestor puncte sunt stocate în structuri de tipul ColorImagePoint, structură de coordonate 2D specifică senzorului Kinect.
Captarea cadrelor ce conțin scheletul utilizatorului poate fi setată să se facă cu o anumită frecvență predefinită, pentru a optimiza algoritmul de detecție și de interpretare a gesturilor. Dacă se dorește activarea buclei de învățare pentru modelul matematic, în momentul opririi sesiunii de înregistrare lista ce conține secvența temporară de cadre pentru gestul înregistrat este
trimisă către modulul de gestiune al modelului matematic pentru detecție. Atunci când răspunsul este returnat de la modulul matematic, răspunsul va fi adăugat în setul de date curent.
GestureSet gestureSet = new GestureSet();
gestureSet.dataSet = new List<Upper2DSkeleton>(this.currentFrameSequence);
gestureSet.gestureName = gestureName;
if (this.GesturesList.ContainsKey(gestureName) == false)
{
this.GesturesList.Add(gestureName, this.GesturesList.Count);
}
this.GestureSetList.Add(gestureSet);
Cea de a doua funcționalitate suportată de acest modul este acela de a realiza detecția în timp real a gesturilor utilizatorului. Asemănător cu secvența de înregistrare, secvența de detecție poate fi declanșată din exterior, prin intermediul interfeței publice a modulului. Pentru a nu fi nevoie decât de un singur utilizator în controlarea acestei etape, s-a decis introducerea unei poziții speciale, poziția de repaus. Aceasta este una naturală pentru utilizator, cea cu mâinile lângă corp. Această verificare se face prin intermediul metodei SkeletonInRestPosition, care returnează valoarea True dacă utilizatorul se află în poziția de repaus, sau False dacă realizează un gest diferit de poziția de repaus. Validarea se realizează comparând coordonatele încheieturilor mâinilor cu poziția relativă a zonei centrale a scheletului:
bool isSkeletonInRest = (skeleton.WristLeft.Y > skeleton.Spine.Y) &&
(skeleton.WristRight.Y > skeleton.Spine.Y) &&
(skeleton.WristRight.X – skeleton.Spine.X < this.RestPositionThreshold) && (skeleton.Spine.X – skeleton.WristLeft.X < this.RestPositionThreshold);
Dacă utilizatorul execută un gest diferit de cel de repaus următoarea etapă din secvența logică constă în verificarea stabilizării gestului așa cum a fost menționat în subcapitolul 3.2.3. Detecția în timp real a gesturilor. Algoritmul de stabilizare se bazează pe o coadă de stabilizare ce va avea o lungime bine definită și care va fi actualizată de fiecare dată când un cadru este disponibil:
this.gestureStabilizationQueue.Enqueue(e.skeleton);
Atunci când această coadă este plină se face verificarea stabilizării printr-un algoritm matematic, ce primește ca și date de intrare coada de stabilizare pe care se va face verificarea și pasul de stabilizare. Pentru fiecare coordonată a punctelor cheie a ambelor mâini (încheietură și cot) a fiecărui cadru din coada de stabilizare se calculează o deviație standard a valorilor spațiale. Dacă această deviație este mai mare decât pasul de stabilizare dat ca argument de intrare, atunci se poate concluziona că una dintre mâini încă se mai află într-o mișcare sesizabilă.
Validarea stabilizării reprezintă pentru secvența de control a detecției un eveniment declanșator a calcului secvenței curente, în acest fel făcându-se segmentarea frazelor făcute de către utilizator în mod continuu.
Figura 4.4. Diagrama de secvență pentru metoda de callback apelată când un cadru cu scheletul utilizatorului este disponibil
Implementarea modulului de interpretare a gesturilor
Acest modul are principalul rol de a implementa modelul Markov cu tranziții discrete menționat în capitolele 2 și 3. Modelul matematic a fost implementat prin intermediul framework-ului Accord.NET, un framework axat pe învățare automată (eng. Machine learning). Acest framework este integrat în mediul de dezvoltare pentru limbajul C# =, Visual Studio, prin intermediul unui pachet funcțional. Instalarea acestui pachet s-a făcut prin intermediul manager-ului de pachete disponibil în Visual Studio, NuGet.
Modulul, la nivel conceptual este descris în Figura 3.9, unde se poate observa că modelul matematic primește o secvență de intrare formată dintr-un set de coordonate, iar ca și rezultat de ieșire returnează un vector de probabilități. Această funcționalitate este expusă și la nivel de interfață publică:
/// <summary>
/// Method used to compute a probability response for a certain gesture from the given frame list and gesture list.
/// </summary>
/// <param name="gestureList">The gesture list dictionary.</param>
/// <param name="frameListToCompute">The frame list used as input for the computation.</param>
/// <param name="response">The response of the computation.</param>
/// <returns>The index of the detected gesture.</returns>
public int Compute(Dictionary<string, int> gestureList, List<Upper2DSkeleton> frameListToCompute, out double response)
Pentru a nu încărca firul de execuție principal, introducerea setului de date în modelul Markov și calculul pe baza căruia modelul matematic oferă ca date de ieșire vectorul de probabilități, se realizează pe fire de execuție separate:
/// <summary>
/// Background worker thread used for gesture computation and detection.
/// </summary>
private BackgroundWorker computeBackgroundWorker;
/// <summary>
/// Background worker thread used for gesture learning and training.
/// </summary>
private BackgroundWorker learnBackgroundWorker;
/// <summary>
/// Initializes a new instance of the MarkovHandler class.
/// </summary>
public MarkovHandler()
{
this.computeBackgroundWorker = new BackgroundWorker();
this.computeBackgroundWorker.DoWork += this.ComputeBackgroundWorker_DoWork;
this.computeBackgroundWorker.RunWorkerCompleted += this.ComputeBackgroundWorker_RunWorkerCompleted;
this.learnBackgroundWorker = new BackgroundWorker();
this.learnBackgroundWorker.DoWork += this.LearnBackgroundWorker_DoWork;
this.learnBackgroundWorker.RunWorkerCompleted += this.LearnBackgroundWorker_RunWorkerCompleted;
}
Modelul matematic primește ca date de intrare seturile de gesturi persistate în baza de date simulată de un fișier în format .xml, reprezentate de cadre succesive ale corpului uman, surprinse de senzorul Kinect. Pentru ca algoritmul recunoașterii gesturilor să funcționeze, este nevoie de învățarea modelului matematic în prealabil. Prin intermediul datelor de intrare, modelul Markov este modelat, apelându-se metoda de învățare HiddenMarkovClassifier. Run(). Aceasta primește ca argumente o matrice tridimensională, ce are în componență seturile de date, reprezentate de cadrele gesturilor, cu componentele spațiale x și y și lista cuvintelor echivalente gesturilor respective. Numărul de stări prin care un gest executat trebuie să treacă, suficiente modelului Markov, este variabil. În funcție de valoarea acestui număr, modelul Markov poate fi mai permisiv sau dimpotrivă. Rezultatele experimentale au sugerat, prin realizarea unui echilibru între acuratețea recunoașterii gesturilor și viteza de execuție a programului, valoarea optimă la care modelul dă rezultate satisfăcătoare.
int states = 8;
Modelul matematic este acum pregătit să ofere rezultate, pe baza datelor introduse. Identificarea gesturilor executate de utilizator în fața senzorului Kinect, are loc accesând metoda HiddenMarkovClassifier.Compute(). Aceasta primește ca date de intrare setul de cadre înregistrate, ce poate reprezenta sau nu un cuvânt din dicționarul stabilit.
În vectorul valorilor de ieșire sunt prezente probabilitățile cuvintelor din dicționar de a se identifica cu gestul introdus spre a fi recunoscut. În funcție de valoarea acestor probabilități este ales de către model un cuvânt candidat, al cărui nume este afișat în aplicație.
La terminarea execuției ambelor funcții, sunt aruncate evenimente spre nivelele superioare ale aplicației.
/// <summary>
/// Method called when a computation operation has finished.
/// </summary>
/// <param name="e">The arguments of the event.</param>
protected virtual void OnComputeDone(ComputeDoneEventArgs e)
{
EventHandler<ComputeDoneEventArgs> handler = this.ComputeDone;
if (handler != null)
{
handler(this, e);
}
}
/// <summary>
/// Method called when a learning operation has finished.
/// </summary>
/// <param name="e">The arguments of the event.</param>
protected virtual void OnLearningDone(EventArgs e)
{
EventHandler handler = this.LearningDone;
if (handler != null)
{
handler(this, e);
}
}
Implementarea modulului de acces în baza de date
Acest modul deservește în principal scopului persistării datelor înregistrate pe parcursul mai multor sesiuni de antrenare în vederea accesării lor ulterioare pe baza cărora se pot detecta cu o precizie ridicată gesturile executate de utilizator. Din punctul de vedere al aplicației, aceste gesturi reprezintă o succesiune de cadre ce surprind poziția corpului utilizatorului la un anumit moment de timp.
Baza de date este reprezentată de un fișier cu extensia .xml și are următoarea structură :
La fișierului este descrisă lista de cuvinte introduse în baza de date, urmate de un identificator unic :
<Gestures>
<Gesture name=”nume_gest1” id=”0” />
<Gesture name=”nume_gest2” id=”2” />
<Gesture name=”nume_gest3” id=”3” />
…
</Gestures>
Apoi, pentru fiecare gest sunt listate succesiv cadrele captate de sensor, fiecare cadru fiind compus din punctele reprezentative ale corpului uman, caracterizate de coordonatele spațiale:
<Data>
<GestureSet>
<GestureName>”nume_gest1”</GestureName>
<FrameData>
<Head>
<X>”coord_x”</X>
<Y>”coord_y”</Y>
</Head>
…
</FrameData>
</GestureSet>
</Data>
Lucrul cu fișiere în format xml s-a datorat utilizării în aplicație a namespace-ului dedicat:
using System.Xml;
Pentru a persista datele introduse în baza de date, de la o sesiune la alta, este necesară salvarea acesteia și implicit a fișierului cu extensia .xml. Aceasta se realizează prin apelarea metodei publice SaveToDatabase, ce are ca parametrii calea către fișierul .xml, lista de gesturi ce trebuie salvată și setul de cadre corespunzătoare fiecărui gest :
/// <summary>
/// Method used to save gesture datasets to an external XML database file.
/// </summary>
/// <param name="databasePath">The path to the XML database file.</param>
/// <param name="gesturesList">The gestures list that needs to be saved.</param>
/// <param name="gestureSetList">The gesture set list that needs to be saved.</param>
public void SaveToDatabase(string databasePath, Dictionary<string, int> gesturesList, List<GestureSet> gestureSetList)
Scrierea în baza de date a fost realizată prin intermediul unui obiect de tip XmlWriter.
using (XmlWriter writer = XmlWriter.Create(databasePath, settings))
{
writer.WriteStartDocument();
}
Persistarea structurii fișierului .xml a fost realizată apelând metodele XmlWriter. WriteStartElement(), respectiv XmlWriter. WriteEndElement()
writer.WriteStartElement("Gestures");
foreach (KeyValuePair<string, int> gesture in gesturesList)
{
writer.WriteStartElement("Gesture");
writer.WriteAttributeString("name", gesture.Key);
writer.WriteAttributeString("id", gesture.Value.ToString());
writer.WriteEndElement();
}
writer.WriteEndElement(); // end Gestures
Pentru fiecare gest din lista de gesturi, s-a realizat scrierea în baza de date, cadru cu cadru, a tuturor punctelor cheie, de referință:
foreach (GestureSet gestureSet in gestureSetList)
{
writer.WriteStartElement("GestureSet");
writer.WriteElementString("GestureName", gestureSet.gestureName);
foreach (Upper2DSkeleton skeletonFrame in gestureSet.dataSet)
{
writer.WriteStartElement("FrameData");
//…
writer.WriteEndElement();
}
writer.WriteEndElement();
}
Încărcarea bazei de date se realizează asincron, pe un fir de execuție separat, prin intermediul unei variabile private, interne, de tipul BackgroundWorker:
/// <summary>
/// Background Worker object used to load the gestures database.
/// </summary>
private BackgroundWorker loadDatabaseWorker;
this.loadDatabaseWorker = new BackgroundWorker();
this.loadDatabaseWorker.DoWork += this.LoadDatabaseWorker_DoWork;
this.loadDatabaseWorker.RunWorkerCompleted += this.LoadDatabaseWorker_RunWorkerCompleted;
Atunci când încărcarea bazei de date a luat sfârșit, se notifică nivelele superioare ale aplicației pentru a semnala terminarea operației, prin emisia unui eveniment:
/// <summary>
/// Method that raises a new DatabaseLoaded event.
/// </summary>
/// <param name="e">The arguments passed to the event.</param>
protected virtual void OnDatabaseLoaded(DatabaseLoadedEventArgs e)
Modulul de gestionare a bazei de date joacă un rol deosebit de important în cadrul aplicației, deoarece oferă, pe lângă garanția persistării datelor, posibilitatea extinderii setului de informații în vederea creșterii rezultatelor.
Implementarea modulului de control al procesării grafice
Scopul principal al acestui modul este de a interpreta, prin intermediul unor algoritmi de procesare grafică, fluxul de date venit de la camera de adâncime și de a detecta gesturile numerice din limbajul mimico-gestual. Etapa de procesare grafică este executată prin intermediul librăriei EmguCV, o librărie cu rol de wrapper peste pachetul OpenCV.
Pentru implementare, s-a instalat versiunea 3.1 a librăriei EmguCV, care, asemănător cu librării dependente, trebuie referențiată în cadrul soluției proiectului. În urma adăugării acestei librării în cadrul soluției, în sistemul de referențiere se va regăsi referința modulului de procesare grafică Emgu.CV.World (Figura 4.5). Odată încărcat dll-ul librăriei EmguCV, namespace-urile librăriei trebuie incluse în codul sursă al clasei GraphicsHandler. Pentru funcționarea corectă a algoritmilor ce vor fi folosiți în secvența de execuție a acestui modul, din namespace-ul principal EmguCV se vor utiliza mai multe subcomponente dintre care menționăm: Emgu.CV.Enum (care conține principalele enumerații ale librăriei), Emgu.CV.Structure (în care se regăsesc principalele structuri de date folosite de algoritmii grafici) și Emgu.CV.Util, modul cu utilități folosite de către librărie.
Figura 4.5. Sistemul de referințe al proiectului după adăugarea dll-ului Emgu.CV
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using Emgu.CV.Util;
Din punct de vedere al datelor de intrare, acest modul primește prin intermediul unei notificări, de la modulul de control al senzorului Microsoft Kinect, o matrice binară. Această matrice, va avea setate elementele pe True, daca în cadrul camerei de adâncime se regăsește un obiect, sau False, dacă nu se detectează nici un obiect în raza de acțiune. În urma procesării acestei matrici, ca date de ieșire, modulul va returna o imagine în care se va evidenția rezultatul procesării grafice și, prin intermediul unui eveniment, numărul de degete identificate în matricea binară.
Astfel, prin intermediul interfeței publice pusă la dispoziție de modul, acesta poate fi notificat atunci când o matrice binară este disponibilă de la modulul de control al senzorului. Această metodă de callback are următoarea semnătură:
/// <summary>
/// Method called when a binary distance matrix is ready.
/// </summary>
/// <param name="sender">The sender of the event.</param>
/// <param name="e">The event arguments for the depth frame.</param>
public void OnBinaryDistanceMatrixReady(object sender, BinaryDistanceMatrixReadyEventArgs e)
Matricea binară va fi livrată prin intermediul argumentelor transmise la nivel de eveniment, argumente reprezentate de clasa BinaryDistanceMatrixReadyEventArgs, moștenită din clasa standard C#, EventArgs.
Prima etapa care se va execută imediat receptarea binare este să transformăm această matrice într-o imagine binară, de tipul Image<Gray, byte>, în care obiectele detectate în cadrul senzorului vor fi marcate în culoarea alb, iar restul cadrului va rămâne în culoarea negru. Acest lucru se va realiza prin intermediul unei instrucțiuni condiționale, în care elementele cu valoarea True vor primi intensitatea de gri cu valoarea 255, echivalent culorii alb în spațiul de culori grayscale.
result.Data[j, i, 0] = (byte)(binaryMatrix[j][i] == false ? 0 : 255);
Imediat după acest calcul, asupra imaginii binare trebuie aplicat un filtru laplacian, ce va avea rolul de a extrage, în formă brută, contururile eventualelor obiecte din cadru. Aplicarea acestui filtru se va face prin execuția următoarei secvențe de cod:
CvInvoke.Laplacian(inputImage, laplacianFilterOutputMat, DepthType.Cv8U);
Apelul funcției va primi ca argumente imaginea asupra cărei se dorește aplicarea filtrului, rezultatul filtrării și adâncimea spațiului de culori ai imaginii, corespunzători pentru imaginile grayscale. În urma acestei operații, din imaginea binară se va obține un rezultat asemănător cu cel din Figura 3.17. Ulterior acestui pas, asupa imaginii rezultate, se va aplica metoda EmguCV, CvInvoke.FindContours:
CvInvoke.FindContours(laplacianFilterOutputMat, contours, contoursHierarchy, RetrType.External, ChainApproxMethod.ChainApproxNone);
În urma acestui apel, se va returna un vector ce va conține toate contururile detectate în imagine cât și un vector cu ierarhia contururilor, ordonate mărime și relațiile dintre ele. Aceste rezultate vor fi returnate prin intermediul unor argumente de tip ieșire.
Premiza de la care pornește următoarea etapă este că la un moment dat, în cadru, se pot regăsi cel mult două obiecte, încercând astfel izolarea brațelor utilizatorului. Pentru a evidenția cele două obiecte, vom selecta, din vectorul de contururi returnate anterior, doar contururile ale căror arii au valorile cele mai mari, limitând selecția la două elemente.
În continuare, vom descrie procedeul de izolare și de numărare a degetelor pentru o singură mână, procesul fiind analog și pentru celălalt braț.
Primul pas constă în determinarea poligonului convex care încadrează conturul detectat pentru o mână. Această determinare se face prin apelul succesiv a două metode: prima metodă are rolul de a realiza o primă aproximare a poligonului, prin apelul funcției CvInvoke.ApproxPolyDP, aproximare realizată cu o anumită precizie pasată ca argument al funcției. Rezultatul acestei aproximări este rafinat imediat, prin cea de a doua metodă, ConvexHull, care va returna forma finală a poligonului convex ce încadrează cel mai bine mâna detectată. Rezultatul acestei succesiuni de metode apelate au ca rezultat o imagine asemănătoare ca cea reprezentată în Figura 3.19.
Ultima etapă constă în determinarea defectelor de convexitate a poligonului convex raportat la conturul detectat în primele etape. Astfel, defectele de convexitate se vor suprapune cu spațiile dintre degete, iar punctele de conexiune ale acestor vor reprezenta vârfurile degetelor.
CvInvoke.ConvexityDefects(polyFirstContour, hullFirstPoints, firstConvexityDefects);
În urma apelului funcției de detecție a defectelor, ConvexityDefects, se va returna o matrice ce va conține coordonatele defectelor și punctele ce descriu poziția vârfurilor degetelor. Dacă matricea returnată este validă, se va realiza încă o etapă de post-procesare a coordonatelor, în cazul în care se vor returna puncte de convexitate invalide. Astfel, vor fi luate în considerare doar punctele care au poziționarea dispusă mai sus, pe axa Y, peste defectele de convexitate.
Dacă această condție este validate, atunci se va incrementa un index intern pentru fiecare punct valid. Acest index poate fi returnat la cerere prin intermediul unui eveniment.
Testarea aplicației și rezultate experimentale
Punerea în funcțiune a sistemului
Sistemul este alcătuit în așa mod încât tranzitarea acestuia într-o stare funcțională să se realizeze într-un număr redus de pași. În vederea punerii în funcțiune a sistemului se vor lua în calcul următoarele considerente :
Conectarea senzorului Kinect la o sursă de alimentare externă de 220 V, acesta având un transformator care reglează tensiunea la 5 V.
Conectarea senzorului Kinect la o platformă software pe care rulează aplicația prin USB.
Startarea aplicației software
Apăsarea butonului de Start Depth Stream, ce declanșează captarea fluxului video de la senzor.
Apăsarea butonului de Start Detection, ce introduce datele colectate în modelul Markov.
Utilizarea sistemului
Sistemul poate fi utilizat în aproape orice condiții, fiind independent de mediu și zgomot, singurul impediment constituindu-l lumina ambientală care, pentru valori ridicate poate periclita buna funcționare a aplicației și obținerea unor rezultate precise.
Testarea sistemului
De-a lungul implementării și dezvoltării sistemului au fost efectuate numeroase teste, concentrate în special pe condițiile de bună funcționare a întregului ansamblu, de la distanța la care trebuie să stea utilizatorul față de senzor, până la amănunte ce țin de implementarea software. Elementele ce au necesitat testarea exigentă a sistemului au fost reprezentate, pe rând, de :
Camera de adâncime a senzorului Kinect
În urma experimentelor, s-a determinat distanța optimă la care trebui să gesticuleze utilizatorul și s-a constatat că în condiții de luminozitate ridicată sau chiar discontinuă, sistemul nu oferă randament maxim. De asemenea, trebuie menționat că sistemul nu este construit pentru a suporta mai mulți utilizatori și de aceea, dacă o persoană va interveni în cadru, sistemul își va înceta activitatea.
Pivotul motorizat al senzorului Kinect
S-a dorit în acest sens observarea unghiului de acțiune al camerelor dispuse orizontal pe dispozitivul Kinect
Algoritmul software utilizat
Această porțiune a ocupat cea mai mare parte în cadrul testării, acest lucru stând la temelia aplicației și influențând în mod decisiv așteptările și obiectivele aplciației. Testarea a fost prezentă încă de la începutul implementării și a însoțit-o pe tot parcursul acesteia, abordându-se și respectându-se un model bine organizat, cu pași prestabiliți. A fost testat intens și în mod susținut algoritmul de învățare și detectare a gesturilor, creând mai multe baze de date, în care au fost introduse atât gesturi care reprezintă cuvinte simple, cât și gesturi sau expresii mai complicate.
Interfața cu utilizatorul
Interfața cu utilizatorul reprezintă un aspect important, dar nu decisiv în contextul funcționării sistemului. Au fost urmărite aspecte privind permisivitatea față de utilizator, în vederea dezactivării anumitor butoane, în funcție de starea în care se află programul. Interfața a fost testată urmărind în special cazuri extreme în care sistemul poate intra la un moment dat.
Cele mai utilizate tipuri de testare au fost stress testing și smoke testing, iar în ceea ce privește utilizatorul, pe parcursul dezvoltării aplicației s-a folosit metoda white-box, iar în final, sistemul va putea fi testat prin metoda black-box.
Rezultate experimentale
Întreaga perioadă de implementare a fost dublată și susținută de o fază de testare și experimentare, ce s-a dovedit a fi extrem de utilă în vederea detectării limitărilor sistemului și a punctelor slabe. Totodată, au fost notate o serie de observații referitoare la performanțele algoritmilor utilizați și rezultatele obținute în urma rulării acestora.
În ceea ce privește senzorul Kinect, s-a constatat că buna funcționare a acestuia este condiționată de gradul de luminozitate al ambientului. De asemenea, distanța minimă la care un utilizator trebuie să efectueze gesturi pentru a fi recunoscute, este de aproximativ 80 cm, iar distanța maximă de 4m.
Un alt caz de funcționare îndoielnică este atunci când lumina ambientală nu este constantă în raza de acțiune a senzorului infraroșu.
Mai jos (Figura 5.1) este prezentată o imagine reprezentativă a funcționării aplicației, ce ilustrează o captură a interfeței cu utilizatorul , în stadiul prematur al antrenării modelului matematic. În partea stângă sunt afișate punctele cheie ce alcătuiesc scheletul unui utilizator, în partea de jos este afișată baza de date ce conține cuvintele antrenate, iar în partea dreaptă este afișat un grafic ce monitorizează evoluția recunoașterii gesturilor, în ceea ce privește probabilitățile cu care acestea au fost detectate.
Figura 5.1. Interfața cu utilizatorul
Baza de date utilizată este alcătuită dintr-un număr restrâns de cuvinte. Acestea au fost alese din dicționarul limbajului mimico-gestual românesc și reprezintă cuvinte simple și uzuale, precum: “salut, mulțumesc, da, nu, la revedere”.
Pe măsură ce dimensiunea bazei de date crește, se poate observa în graficul următor (Figura 5.2) o îmbunătățire a rezultatelor obținute în urma rulării algoritmului de detecție.
Figura 5.2. Monitorizare rezultate algoritm de detecție
În figura următoare (Figura 5.3) este ilustrat rezultatul dat de algoritmul de detecție a gesturilor. Barele verticale sunt corespunzătoare probabilităților cu care cuvintele afișate corespund gestului realizat.
Figura 5.3. Grafic afisând rezultatul algoritmului de detecție
Un caz particular este ilustrat în figura următoare, Figura 5.4. Acesta reprezintă un scenariu în care gestul detectat de modelul Markov poate fi considerat a fi cuvintele afișate, ale căror probabilități de detecție sunt apropiate. Cu toate acestea, cuvântul ales este cel ce are probabilitatea mai mare.
Figura 5.4. Cuvinte detectate cu probabilități foarte apropiate
În această figură sunt prezentate probabilitățile cuvintelor cu care acestea au fost detectate în timp. Se poate observa cum unele cuvinte sunt descrise de gesturi destul de diferite față de celelalte, ceea ce face ca modelul Markov să funcționeze cu o rată de succes a detecției foarte ridicată. Alte gesturi necesită o antrenare mai solidă pentru a putea fi recunoscute mai bine. Acest caz este reprezentat de următoarele figuri, Figura 5.5, Figura 5.6.
Figura 5.5. Reprezentarea grafică a variației gradului de recunoaștere a unor cuvinte în timpul antrenării
Figura 5.7. Rezultat al detecției cu o gamă mai largă de probabilități nenule
Ultima ilustrează un caz în care gestul detectat a parcurs stări ce sunt conținute de mai multe gesturi. De aceea, am obținut aceste rezultate, în care probabilitățile sunt apropiate și destul de dispersate.
Rezultatele experimentale sunt satisfăcătoare și îndeplinesc obiectivele propuse de aplicație, întâmpinând anumite limitări și restricții impuse de funcționarea algoritmilor de detecție și a resurselor hardware folosite.
Elemente de configurare
Prezența elementelor configurabile este foarte importantă în cadrul unui sistem întrucât îi mărește raza de acțiune și oferă o mai bună libertate de funcționare, mai ales datorită parametrizării. Toate elementele sunt configurabile din interfața cu utilizatorul. Sistemul poate fi configurat atât din punct de vedere hardware, cât și software. Dispozitivul Kinect dispune de un pivot motorizat, ce influențează unghiul față de planul orizontal, ce poate fi modificat pentru a centra utilizatorul în cadrul de referință. Celelalte elemente de configurare sunt referitoare la parametrii algoritmului utilizat, dintre care amintim : numărul de stări impus de modelul Markov, distanța minimă și maximă la care se realizează detecția mâinilor , frecvența cu care se realizează captarea cadrelor, lungimea cozii de așteptare folosite pentru stabilizarea gesturilor.
Aspecte legate de fiabilitate / securitate
Sistemul are un model de fiabilitate serie, așa încât, defectarea oricărui modul conduce la defectarea întregului sistem. Pentru a îmbunătăți fiabilitatea, sistemul poate fi prevăzut cu o rezervă activă sau semi-activă, reprezentată de un dispozitiv Kinect adițional, care poate prelua sarcinile modulului vizat.
Pentru a îmbunătăți securitatea sistemului poate fi introdus un mecanism de oprire a alimentării atunci când tensiunea scade sub o anumită valoare de prag și induce sistemului un comportament care nu poate fi anticipat.
Structura modulară a sistemului permite înlocuirea imediată a componentelor avariate
și repunerea sistemului în funcțiune în timp util.
Concluzii
Bibliografie
[1]. ***. Kinect – Windows app development. Kinect – Windows app development. [Interactiv] [Citat: 19 05 2016.] https://developer.microsoft.com/en-us/windows/kinect.
[2]. Fosler-Lussier, E. Markov models and hidden Markov models: A brief tutorial. s.l. : International Computer Science Institute, 1998.
[3]. M. Santos, R.O. Teles. Assistive technologies. Cerebral Palsy Trainee Booklet For Parents and Teachers. 2010.
[4]. Vos, T., Barber, R.M., Bell, B., Bertozzi-Villa, A., Biryukov, S., Bolliger, I., Charlson, F., Davis, A., Degenhardt, L., Dicker, D. and Duan, L. Global, regional, and national incidence, prevalence, and years lived with disability for 301 acute and chronic diseases and injuries in 188 countries, 1990–2013: a systematic analysis for the Global Burden of Disease Study 2013. s.l. : The Lancet, 2015. pp. 743-800.
[5]. P., Yaffe. The 7% rule: fact, fiction, or misunderstanding. October 2011, Vol. Volume 2011, October.
[6]. ***. Să înțelegem ce este limbajul mimico-gestual. Să înțelegem ce este limbajul mimico-gestual. [Online] https://proedukat.wordpress.com/2012/02/15/sa-intelegem-ce-este-limbajul-mimico-gestual.
[7]. Lewis, M. Paul, Simons, Gary F. and Fennig, Charles D. "Deaf sign language", Ethnologue: Languages of the World (17th ed.). s.l. : SIL International, 2013.
[8]. F., Barbu. Limbaj gestual. Comunicare si interpretare. s.l. : Editura Lumen, 2011.
[9]. Simon, Lang. Sign Recognition with Kinect. Berlin : Freie Universitat, 2011.
[10]. Murakami K., Taguchi. H. Gesture recognition using recurrent neural networks. In Proceedings of the SIGCHI conference on Human factors in computing systems. s.l. : ACM, 1991. pp. 237-242.
[11]. Recognition of space-time hand-gestures using hidden Markov model. In ACM symposium on Virtual reality software and technology. Nam Y., Wohn K. 1996.
[12]. Vision based gesture recognition system with single camera. . s.l. : IEEE, 2000. Signal Processing Proceedings. Vol. 2, pg. 1351-1357.
[13]. Automatic translation of Arabic text to Arabic sign language. M., Mohandes. 2006. AIML Journal. Vol. 4, pp. 15-19.
[14]. Image-based and sensor-based approaches to Arabic sign language recognition. Mohandes, M., Deriche, M. and Liu, J. s.l. : IEEE Transactions, 2014. Human-Machine Systems. pp. 551-557.
[15]. A usability study on hand gesture controlled operation of in-car devices. Zobl, M., Geiger, M., Bengler, K. and Lang, M. s.l. : HCI, 2001. Abridged Proceedings. pp. 5-10.
[16]. Gesture recognition with a 3-d accelerometer. Wu, J., Pan, G., Zhang, D., Qi, G. and Li, S. s.l. : Springer Berlin Heidelberg, 2009. Ubiquitous intelligence and computing. pp. 25-38.
[17]. Historical Development of Hand Gesture Recognition. P., Premaratne. s.l. : Springer Singapore, 2014. pp. 5-29.
[18]. A framework for recognizing the simultaneous aspects of american sign language. Vogler, C. and Metaxas D. 2001. Computer Vision and Image Understanding. pp. 358-384.
[19]. Sign language recognition and translation with kinect. Chai, X., Li, G., Lin, Y., Xu, Z., Tang, Y., Chen, X. and Zhou, M. s.l. : IEEE, 2013. IEEE Conf. on AFGR.
[20]. MacCormick, John. "How does the kinect work?". "How does the kinect work?". [Online] http://users.dickinson.edu/~jmac/selected-talks/kinect.pdf.
[21]. Hall, Jonathan C. How to Do Gesture Recognition With Kinect Using Hidden Markov Models (HMMs). Creative Distraction. [Online] 12 22, 2011. http://www.creativedistraction.com/demos/gesture-recognition-kinect-with-hidden-markov-models-hmms/.
[22]. A revealing introduction to hidden Markov models. Stamp, M. s.l. : Department of Computer Science San Jose State University, 2004.
[23]. An HMM-based threshold model approach for gesture recognition. Lee, H.K. and Kim, J.H. s.l. : IEEE Transactions, 1999, Pattern Analysis and Machine Intelligence, pp. 961-973.
[24]. Fowler, M. Patterns of enterprise application architecture. s.l. : Addison-Wesley Longman Publishing Co., Inc., 2002.
[25]. Suzuki, S. Topological structural analysis of digitized binary images by border following. Computer Vision, Graphics, and Image Processing. 1985, pp. 32-46.
[26]. Sklansky, J. Finding the convex hull of a simple polygon. Pattern Recognition Letters. 1982, Vol. 1, pp. 79-83.
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: Translator Limbaj Mimico Gestualdocx (ID: 120483)
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.
