Software pentru recunoașterea activităților fizice zilnice folosind senzori de mișcare [302155]
[anonimizat], Optoelectronică și Nanotehnologii (ETC ‒ MON)
Conducători științifici: Absolvent: [anonimizat]. [anonimizat]. Matei-Șerban MIHALACHE
2019
Introducere
Lucrarea de față urmărește două subiecte și tendințe de actualitate în tehnologie: Internet of Things ([anonimizat]) și Machine Learning ([anonimizat]). [anonimizat], unul obiectiv: contextul macroeconomic.
Domeniu IoT influențeaza puternic atât politicile marilor companii de profil (e.g. Intel, Intel's Make it Wearable), cât și rolul și importanța informației (se introduce noțiunea de margine de profit a informației). Până în 2035 se estimează o influență a IoT de 3% [anonimizat] o înjumătățire a [anonimizat] a seriviciilor de conectivitate datorită dezvoltărilor tehnologiilor 5G și a alternativelor de tip LPWA. Aceste estimări sunt predictibile datorită gamei mari de aplicabilitate actuală: [anonimizat], fluidizarea transportului public până la dispozitive biometrice care permit diagnosticări sau prevenții medicale.
Complemetar achiziției de informație apare necesitatea procesării și utilizării sale finale: un sistem care să poată identifica și lua decizii (uneori și crea anumite tipuri de conținut) în urma învățării din situațiile anterioare. Randamentul unui astfel sistem va fi dictat în primă fază de densitatea și cantitatea de informație disponibilă. Avantajul primar al informației devine astfel cantitatea. [anonimizat], [anonimizat], funcționarea în timp real.
[anonimizat] a activităților fizice zilnice pe baza semnalelor captate de la senzori inerțiali de tip MEMS (accelerometru și giroscop). [anonimizat], implementarea proiectului să fie o dovadă a [anonimizat] a sprijinului adus în orice domeniu de activitate sau situație.
Informația biometrică în tehnologia MEMS
Tehnologia MEMS. Senzori inerțiali.
Tehnologia MEMS reprezintă principala paradigmă de proiectarea a micro-sistemelor (senzori, actuatori, structuri, circuite electronice) în tehnologia circuitelor integrate cu detalii microscopice și complexități ridicate.
Fig 1.1 Micro-structură mecanică: [anonimizat] (detaliul tehnologic devine comparabil cu latura cristalului de siliciu) imprimă incertitudini asupra inerției componentelor mobile sau anumitor proprietăți fizice. Un exemplu potrivit îl reprezintă polisiliciul, material familiar în industria circuitelor integrate, al cărui comportament electro-mecanic este neglijat la nivel macroscopic, însă devine important în cadrul elementelor cu mișcări de ordiunul picometrilor. Tehnicile de fabricație și proiectare ale structurilor de micro-senzori variază față de cele ale circuitelor integrate clasice, accentul fiind pus pe definirea de elemente mecanice micronice sau sub-micronice de tipul grinzi (cantilever), membrane, mase suspendate, cavități. Așadar, evoluția proceselor de micro-fabricație a structurilor MEMS a fost strâns legată de cunoașterea proprietăților de material ale siliciului, modul de depunere a straturilor de siliciu și corodarea acestora pentru obținerea elementelor mecanice necesare.
Consecințele scalării la nivel microscopic reprezintă aspectul cel mai important în stabilirea limitelor de miniaturizare ale dispozitivelor. Se iau în considerare principii de scalare și efecte fizice care la scară macroscopică sunt evidet neglijabile:
Forța de frecare poate depășii forța inerțială.
Forțele electrostatice și atomice nu sunt neglijabile.
Transportul termic este dificil (disipare de căldură lentă).
Dependența proprietăților de material de dimensiune.
Testarea post-siliciu a circuitului se poate face doar în mediu protejat și implică un proces lent și costisitor.
Detectarea mărimii în cauză se poate face în două moduri:
Prin efect piezorezistiv (Fig 1.2 (a)): sistem cu un singur grad de libertate, cu o masă suspendată de o structură de tip grindă (cantilever) pe care este montat un piezorezistor și a cărei inerție influențează semnalul piezoelectric.
Prin efect capacitiv (Fig 1.2 (b)): sistem capacitiv care măsoară variațiile capacității dintre o masă mobilă și un electrod conductiv fix.
Fig 1.2 Structură tipică de traductor MEMS: (a) Design piezorezitiv (b) Design capacitiv
În proiectul de față vor fi utilizați senzorii MEMS inerțiali, senzori mecanici capabili de măsurători inerțiale de precizie statice (gravitaționale) și dinamice (vibrații sau mișcări) pornind de la structuri microscopice în siliciu. Un senzor inerțial traduce accelerația liniară (accelerometru) sau viteza unghiulară (giroscop), în general pe fiecare axă a sistemului de coordonate cartezian, oferind o măsură a poziției sau orientării unui obiect. Un senzor inerțial nu măsoară direct mărimile în cauză, ci forța inerțială datorată acestora. Metodele de măsurare sunt numeroase, în continuare fiind expusă cea caracteristică tehnologiilor MEMS.
Pe o axă de coordonate, măsurarea accelerației se face conform Principiului al II-lea al mecanicii newtoniene: forța (F) care acționează asupra unui corp, atașat de un resort, îi imprimă o accelerație (ẍ) direct proporțională cu ea și invers proporțională cu masa corpului (m).
F = m ∙ ẍ (1.1)
Accelerometrele de tip MEMS sunt dispozitive inerțiale liniare compacte, în general tri-axiale, de înaltă fidelitate ce pot reprezenta mijlocul cel mai rapid de sesizare a mișcării și posturii entității ce le poartă prin observarea ratei de variație în timp a vitezei. Această rată poate fi exprimată fie prin metrii pe secundă la pătrat (m/s2), fie prin forța-G, echivalentul accelerației gravitaționale a Pământului.
Valoare accelerației este determinată prin intermediul unei structuri capacitive integrate (on-chip capacitor) mobile, variația inerțială a unei armături mobile (mass) prinsă de un resort (spring) se transpune în variație a capacității față de armăturile fixe (fixed plates). Variația capacității este convertită la rândul ei în semnal de natură electrică.
Pentru giroscop principiul de funcționare este bazat pe efectul Coriolis ce acționează asupra corpurilor (cu masă m) aflate într-un sistem de referință în mișcare de rotație (cu viteza unghiulară ω) și care se deplasează cu viteza v.
Fc = -2 ∙m ∙ (ω ∙ v) (1.2)
De asemenea, giroscopul este un dispozitiv inerțial compact, de această dată unghiular, în general tri-axial. Oferă informație despre rata de schimbare a vitezei unghiulare în timp a unui subiect sau obiect. Această rată este în general exprimată ca grade pe secunda (deg/s).
Valoarea variației vitezei unghiulare este determinată tot prin structuri capacitive integrate, dar care urmăresc schimbări unghiulare: pentru o masă rezonantă ce se mișcă într-o anumită direcție, cu o anumită viteză unghiulară aplicată asupra sa, apare o forță Coriolis de sens opus ce cauzează un deplasament în structura capacitivă internă. Variația capacității este transpusă în variație de semnal electric.
Folosirea simultană a celor doi senzori, urmărind același fenomen, devine superioară folosirii individuale, fiecare senzor asigurând compensarea erorilor celuilalt, un plus de stabilitate și precizie. Această abordare, găsită adesea sub denumirea de sensor fusion, se regăsește inclusiv în politica producătorilor de a integra cei doi senzori într-un singur sistem IMU (Inertial Measurement Units), inclusiv cu blocuri de filtrare, achiziție, stocare sau comunicație. Astfel, un cip MEMS nu reprezintă doar un sistem de dimensiuni reduse, cu consum mic de putere, ci și unul complex și ușor configurabil pentru tipul de aplicație în care este folosit.
Scăderea costurilor acestor siteme se datorează, pe lângă factorului tehnologic (creșterea gradului de integrare, avansul procesului de micro-fabricație), popularității crescânde a dispozitivelor sau aplicațiilor care le includ (smartphone, automotive, bio-medicină) și a căror evoluție a depins într-o măsură de acestea.
Fig 1.5 Primul accelerometru comercial de la Analog Devices (1990): (a) Capsulă de dimensiuni mai mici de 1 cm2 (b) Structura capacitivă microscopică cu armăturile aferente, adâncime de 60 µm
Astfel apare necesitatea integrării senzorilor în sisteme inteligente care să rezolve aspectele de inter-conectivitate, prelucrarea eficientă a datelor, stocarea și folosirea ulterioară a acestora. Paradigma IoT devine așadar un scop în sine, nu doar un mijloc de rezolvare a situațiilor, și va cuprinde evoluțiile modulelor hardware, senzori și actuatori, microcontrolere și microprocesoare și arhitecturi software optime.
Senzori inerțiali în aplicații biometrice. Detectarea activităților fizice.
Se observă că în cazul atașării unui IMU pe corpul unui subiect, acesta oferă informații biometrice ce pot fi folosite in scopul identificării poziției, orientării sau a dinamicii mișcării proprii prin identificarea de modele (patterns) de mișcare. Validitatea acestui tip de informație este confirmată de o serie de studii, în domeniul autentificării prin profil biometric folosind senzori inerțiali (sensor-based) în detrimetul metodei clasice de analiză de imagine (vision-based), al cărui grad de realism este scăzut, identificarea activităților se poate face doar într-un context controlat (luminozitate ridicată, cooperarea subiectului). În plus, dimensiunile, costul și consumul de putere reduse ale senzorilor îi face potriviți pentru integrarea în articole vestimentare (senzori purtabili) pentru urmărirea activităților fizice ale unui subiect uman. Alături de un canal de comunicație fără-fir și o sursă de alimentare care să îi ofere autonomie, un IMU reprezintă o platformă compactă de achiziție de date biometrice ideală produselor fitness de urmărire a activităților și efortului fizic, dar și aplicațiilor medicale specifice (urmărirea activităților necontrolate, accidentărilor sau căzaturilor ale unui pacient, analiza în timp real a cazurilor de Parkinson, epilepsie etc).
Activitățile fizice zilnice pot fi grupate calitativ în funcție de complexitatea analizei și mediul în care sunt observate. Clasificările ce urmează vizează în special activitățile mecanice, acestea putând fi descompuse în secvențe complet caracterizate de valoarea forțelor inerțiale pe cele trei direcții. Activitățile involuntare sunt urmărite în special în aplicațiile medicale prezentate în paragraful precedent. De asemenea, condițiile și circumstanțele de urmărire ale activităților trebuie să fie naturale, deoarece activitatea urmărită în mediu controlat constrânge funcțioanarea ulterioară. Se poate observa scăderea acurateței unui sistem de detecție de la 95,8%, în validarea activităților exclusiv în laborator, la 66,7% pentru cele din mediu real.
Fig 1.6 Clasificarea activităților fizice
Cu ce ajută cunoașterea activității? Reprezintă în primul rând răspunsul firesc la studiile oferite de Organizația Mondială a Sănătății, conform cărora cel puțin 10% din populația planetei suferă de obezitate. Un astfel de sistem le-ar aduce medicilor sau nutriționiștilor un avantaj considerabil în urmărirea și gestionarea activităților pacienților pe de o parte, însă poate fi și un mijloc de auto-prevenție individuală a uneia dintre cauzele principale ale obezității: sedentarismul. Este evident că doar o astfel de abordare nu este suficientă în rezolvarea problemei în cauză, însă poate oferi un reper stabil și un punct de vedere obiectiv de la care se poate porni.
Pe de altă parte noțiunea de dispozitiv purtabil (uneori și sub denumirea de computer purtabil) are o mare aplicabilitate în vederea interfațării automatizărilor tehnologice cu utilizatorul și personalizarea serviciilor în funcție de activitățile acestuia.
Analiza unitatilor de masura inertiale (IMU)
Stabilirea configuratiei sistemului
Numărul de sisteme IMU montate pe subiect și zonele de montare ale acestora depind puternic de tipul de aplicație și de gama de activități urmărite (numărul de activități ce pot fi detectate și precizia sistemului crește proporțional cu numărul de sisteme montate). Spre exemplu, s-a observat că anumite zone (șold, încheietură, antebraț, piept, picior) pot duce la detectarea particularităților dintre anumite activități comune: mers, alergat, poziții statice, coborât și urcat scări. O astfel de gamă de activități va fi urmărită și în lucrarea de față.
Fig 1.7 Valorile accelerației înregistrare pe axa de mișcare pentru diferite activități
Alegerea unui singur sistem IMU în cazul aplicaților ce nu necesită precizie ridicată pare o soluție de compromis ideală. Se rezolvă totodată aspectele legate de cost, complexitatea achiziției, durata procesării și analizei efective, dar și o problemă de ordin practic: conectarea unui număr mare de astfel de sisteme (în ciuda gradului mare de integrabilitate) pe zone diferite ale corpului uman poate duce la limitări sau constrângeri ale mișcărilor în sine. Astfel se definește zona de montare pe corp a senzorului ca punct sensibil.
Tehnica ferestruirii
Semnalele inerțiale provenite de la IMU sunt în majoritatea cazurilor digitale, datorită susceptibilității scăzute la zgomot a comunicațiilor digitale (SPI, I2C). Configurația sistemului influențează analiza prin frecvența de eșantionare și gama de lucru a convertorului analogic-digital, prin rezoluția măsurătorii, dar și prin ferestrele de semnal (și gradul de suprapunerea al lor) pe care se vor observa semnalele. De multe ori, acești factori sunt omiși sau influența lor este minimizată, cu excepția dimensiunii ferestrelor de semnal.
Tehnica ferestruirii este recurentă în domeniul prelucrării semnalelor digitale sau în statistică și presupune extragerea unui segment finit de semnal sau informație. Fereastra de semnal digital reprezintă așadar eșantioanele de semnal disponibile și se obține înmulțind eșantioanele semnalului original cu un anumit tip de funcție matematică (dreptunghiulară, Hanning, Kaiser, Blackman, triunghiulară etc).
Pentru că ferestruirea presupune înmulțire în timp a semnalului cu o anumită funcție, aceasta se reflectă în frecvență prin convoluția spectrului semnalului analizat cu spectrul funcției matematice (exemplu: spectrul funcției dreptunghiulare este o funcție de tip sinus cardinal). Este evident astfel că metoda ferestruirii are, prin dimensiunile și tipul ferestrelor alese, un rol categoric în analiza spectrală. Influențează spectrul de frecvențe a semnalului analizat prin împrăștiere spectrală (spectral leakage), în cazul în care nu este cuprins un multiplu de perioade de semnal, sau erori de amplitudine (picket fence). Însă acestea nu fac obiectul aplicației de față. Astfel că vom considera cazul simplu al analizei pe ferestre dreptunghiulare, unde dimensiunea este în principal dictată de natura semnalului urmărit.
Fig 1.8 Achiziționarea unei ferestre dreptunghiulare de semnal și transpunerea efectelor în frecvență
În aplicația de față, ferestruirea presupune împărțirea semnalului achiziționat în subdviziuni, care vor fi analizate individual și pe baza cărora se va face clasificarea. Fereastra de semnal trebuie sa aibă o durată care să faciliteze colectarea de informație completă, dar și compactă. Duratele mici ale ferestrei ar putea însemna colectarea precară de informație despre activitatea în desfășurare. Pe de altă parte, o fereastră de semnal exagerată ar putea înregistra mai mult decât o singură activitate. O dimensiune a ferestrelor de 1-2 secunde, cu sau fără grad de suprapunere (între 40%-50%), a avut succes în studii anterioare,, de detectare a mișcărilor urmărite. Se pot alege ferestre disjuncte atunci când e de dorit reducerea erorilor de detecție în cazul momentelor de tranziție între mișcări. Însă, dacă tranziția în sine reprezintă un factor definitoriu al mișcării sau pierderea de infromație, oricât de puțină, nu este acceptată, se poate introduce un grad de suprapunere între ferestre consecutive.
Fig 1.9 Achiziție cu ferestre suprapuse de semnal
Achiziția cu ferestre disjuncte reprezintă o particularitate a cazului din figura de mai sus pentru care zona de suprapunere este zero.
Analiza comparativă a parametrilor de semnal
Influența diferiților factori este în general observată aposteriori. O astfel de analiză este accesibilă datorită numărului considerabil de colecții de date deja înregistrate pentru diferite activități, diferiți senzori cu frecvențe de eșantionare și rezoluții diverse. Există lucrări ce identifică seturi de date existente alături de contextul experimental și dezvoltă comparații statistice între ele.
Fig 1.10 Caracteristicile senzorilor folosiți în colecțiile de date urmărite
Se observă că seturile de date sunt înregistrate fie de la module IMU externe, fie de la senzori inerțiali integrați în telefoane sau brățări inteligente. Toți senzorii inerțiali sunt triaxiali cu interfețe digitale (I2C sau SPI), semnalul inerțial fiind cunatizat pe un anumit număr de biți (12, 16, 20, 26). Accelerometrele pot lucra la diferite niveluri de sensibilitate (±2g, ±5g, ±8g, ±16g). Pentru giroscop sensibilitatea standard este de ±2000ș/s. Gama de lucru restrânsă oferă rezoluție mai bună, ceea ce este ideal pentru detectarea particularităților între mișcări. Gamele de lucru largi sunt utile pentru urmărirea vitezei sau a creșterilor bruște în accelerație (vârfuri de accelerație cauzate de impact), ceea ce nu este chiar necesar pentru aplicația de față.
Alături de alte considerații, se observă că influența frecvenței de eșantionare este minimă (nu se urmăresc analize spectrale), o frecvență de 50 Hz fiind suficientă pentru o detecție performantă. Frecvența de eșantionare poate fi aleasă într-o gamă largă, însă cu anumite considerente, și este determinată de capacitatea de lucru a senzorului în sine sau a sistemului de operare, în cazul senzorilor integrați în alte sisteme. Trebuie însă luat în considerare aspectul că la frecevențe de eșantionare scăzute (5 Hz) se pierd anumite particularități de frecvență înaltă mai ales pentru mișcări de dinamică mai puternică, iar forma de undă în timp pierde din integritatea vârfurilor de tensiune (în Fig 1.11 (jos)).
Fig 1.11 (sus) Date achiziționate cu o frecvență de 50 Hz
(jos) Date re-eșantionate la o frecvență de 5 Hz
Limita inferioară a gamei de frecevențe de eșantionare poate fi determinată așadar de gama de mișcări urmărite. Pentru majoritatea activităților zilnice banda de frecvențe a semnalului inerțial este în principal de 0.3-3.5 Hz. Se observă că frecevența de eșantionare de 5 Hz discutată mai sus nu ar îndeplini condiția Nyquist nici măcar pentru activitățile uzuale. Se caută în general frecvențe de eșantionare superioare pentru a păstra o marjă de eroare considerabilă, dar care să nu implice supra-eșantionarea inutilă a semnalului. Supra-eșantionarea ar duce la îngreunarea proceselor de transmitere efectivă a datelor și procesare acestora. O frecvență de eșantionare aleasă potrivit reduce numărul de eșantioane achiziționate și totodată efortul computațional final al sistemului.
Colecția de date MobileFall&MobileAct, va fi folosită ca prim reper cantitativ. Datele sunt colectate de la un modul IMU montat pe piept. Colecția este divizată în funcție de tipul de mișcare urmărit:
MobileFall: urmărește tipuri de căzături.
MobileAct: urmărește șapte tipuri de activități comune (lucru la computer, repaus, mers, coborât scări, urcat scări, vorbit în timpul mersului, vorbit din poziție statică).
Colecția MobileAct prezintă date colectate de la cincisprezece participanți folosind un Samsung Glaxy S3 ce are integrat un modul inerțial LSM330DLC (accelerometru triaxial și giroscop triaxial). Detaliile despre utilizarea datelor respective vor fi reluate în partea de descriere a implementării.
Translatarea semnalului inerțial brut în informație consistentă
Clasificarea informației și abordarea statistică
Consistența informației oferite de senzorii inerțiali în domeniul biometric este evidentă. Însă informația inerțială intrinsecă necesită prelucrări potrivite și extragerea unor parametrii și caracteristici de semnal utile. Se va urmări ca în continuare să fie găsiți parametrii potriviți, procedeu care găsit sub denumirea de extragere de parametrii (features extraction).
Semnalul, fiind o cantitate fizică ce transportă informație, se poate clasifica în funcție de gradul de incertitudine asupra informației respective:
Semnale deterministe: semnale cu caracteristici (amplitudine, frecevnță, fază) determinabile pe o anumită perioadă. Pot fi exprimate sub formă analitică sau ca tabele de valori. Valoarea semnalului este cunoscută în orice moment de timp, ceea ce face ca informația transmisă să nu fie de interes sau să fie previzibilă.
Semnale aleatoriu: semnale de natură aleatoare cu parametrii ce pot varia aleator. Gradul mare de incertitudine asupra informației face ca informația transmisă să fie importantă. Semnalele nedeterministe sunt abordate statistic.
Semnale inerțiale sunt prin natura lor aleatorii, astfel că teoria probabilității reprezintă unealta cea mai bună de modelare și analiză a acestor fenomene. Se caută extragerea unor parametrii statistici care să ofere cât mai multe informații despre particularitatea activității observate. În continuare se va analiza calitatea și eficiența estimatorilor statistici pentru semnalul inerțial digital (eșantionat și cuantizat de un convertor analog-digital cu o frecvență de eșantionare fs, respectiv o cuantizare pe n biți) observat pe ferestre dreptunghiulare de N eșantioane.
Atunci când nu există informații solide despre semnal (origine și evoluție), semnalul va fi modelat ca o variabilă aleatoare și va fi descris statistic. Descrierea statistică se face printr-o serie de mărimi statistice calculate pe un număr finit de înregistrări, deoarece nu există situația fizică de a avea acces la toate realizările particulare ale variabilei respective. Semnalul de interes este considerat ca fiind:
Staționar sau cvasi-stationar (este generat de un sistem cu prorietăți ce nu se modifică în timp sau pe anumite intervale de timp).
Ergodic (media statistică coincide cu media temporară sau, cu alte cuvinte, putem descrie semnalul având acces doar la un număr limitat de eșantione – realizări particulare). În practică se presupune că semnalul cu care se lucrează este ergodic, numărul de eșantioane achiziționate fiind suficient pentru o caracterizare statistică.
Noțiunea de staționaritate poate fi împărțită în:
Staționaritate în sens strict
Staționaritate în sens larg
Staționaritatea în sens strict este o noțiune aproape imposibil de verificat într-o situație reală. Staționaritatea în sens larg presupune ca pentru semnalul de interes media să fie constantă în timp și funcția de autocorelație să varieze doar în funcție de deplasare. Aceasta din urmă prezintă interes pentru aplicațiile reale, deoarece semnalele staționare în sens larg pot fi complet descrise de momentele statistice de ordin unu și doi.
Trăsături de semnal
Metoda de analiză asupra informației inerțiale nu este atât analiză statistică, cât este estimare parametrică (sunt accesibile doar un număr finit de eșantioane pentru observarea semnalului). Mărimile statistice prezentate sunt astfel determinate ca estimate. Analiza semnalului presupune extragerea informației statistice și de frecvență, având ca scop final înțelegerea procesului în care a fost generat semnalul, în exemplul de față: mișcarea care a generat o anume variație a semnalului inerțial.
Clasificarea finală a semnalului extras este direct legată de caracteristicile (features) extrase pe fiecare axă în parte și fiecare senzor.
Caracterizare statistică
Media statistică a semnalului inerțial este un prim estimat care oferă cea mai bună informație asupra acțiunii forței gravitaționale, caracteristicilor statice și poziției senzorului, deci și a subiectului în cauză. Media presupune însumarea tuturor punctelor colectate într-o fereastră de achiziție și împărțirea sumei la dimensiunea ferestrei.
(2.1)
Unde reprezintă valoarea eșantionului curent pentru unul dintre semnalele inerțiale pe o anume axă de coordonate.
Media reprezintă fizic componenta continuă a semnalului inerțial pe axa respectivă. Scopul ei fundamental este de a discrimina poziția subiectului, fiind suficientă pentru observarea activităților statice. Pentru activități dinamice însă extragerea singulară a mediei nu este de ajuns.
Varianța (dispersia) reprezintă momentul de ordin doi al unui semnal. Varianța oferă o măsură a împrăștierii valorilor unui semnal pe un set de măsurători. Deviația standard este o mărime derivată din varianță, reprezentând radicalul valorii varianței. Deviația standard este mărimea folosită mai des în statistică, măsurând împrăștierea în jurul unei valori medii. Astfel că media influențează direct atât estimatul varianției, cât și al deviației standard. Valoarea dispersiei sau a deviației standard poate fi interpretată în contextul de față ca o variație a valorii forței inerțiale în jurul unei valori statice de reper, devenind astfel un estimat potrivit în detectarea naturii activității: statică sau dinamică.
(2.2)
Dispersia oferă o metodă de observație asupra axei de deplasare în cazul activităților dinamice. Mersul sau alergatul implică mișcare pe axa orizontală ceea ce se va reflecta într-o valoare mare a dispersiei pe axa respectivă și o valoare a dispersiei mai mică pe axa verticală. De asemenea, valoarea dispersiei poate ajuta și la discriminarea între activitățile dinamice în sine: pentru exemplul anterior este de așteptat ca mersul să aibă o dispersie mai mică pe axa de mișcare în comparație cu alergatul.
Dispersia izolează influența accelerației gravitaționale de mișcarea în sine. Pentru a păstra însă componenta statică (gravitațională) se poate extrage media pătratică (Root Mean Square) pentru fiecare semnal.
(2.3)
Pentru un semnal de medie nulă deviația standard este chiar media pătratică.
De asemenea cele trei estimate pot fi determinate și pentru vectorii de magnitudine, câte unul pentru fiecare semnal inerțial.
(2.4)
(2.5)
Unde , , ,, , reprezintă valorile de amplitudine ale semnalelor pe cele trei axe pentru accelerometru, respectiv giroscop.
Caracterizare în frecvență
De cele mai multe ori particularitățile dintre mișcări pot fi determinate mai bine observând caracteristica de frecvență a semnalului. Analiza în frecvență necesită însă o creștere considerabilă a efortului computațional, lucru ce nu este de dorit de multe ori în aplicațiile în timp real. Se poate face un compromis între acuratețea finală a sistemului și durata de procesare astfel încât una să nu o limiteze pe cealaltă. Deoarece extragerea parametrilor se face în cazul de față pe o mașină de calcul de uz general care implică de obicei unități de procesare multiple și performante se poate urma calea obținerii unor valori de acuratețe ridicate.
Pentru a vedea comportamentul în frecvență al unui semnal nedeterminist nu se mai poate folosi transformata Fourier, ci spectrul de putere. Spectrul de putere, sau densitatea spectrală de putere, se determină ca fiind transformata Fourier a funcției de autocorelație, conform teoremei Wiener–Khinchin, în cazul în care semnalul este staționar în sens larg. Numele de densitate spectrală de putere sugerează că estimatul oferă informații asupra distribuției puterii într-un spectru de frecvențe.
Alura spectrului de putere este dată de variația semnalului. Un spectru de putere comprimat în origine aparține unui semnal ce variază lent (implică componente de frecvență joasă). Pe de altă parte, unui semnal cu variații rapide îi corespunde un spectru de putere întins spre frecvențe înalte. Pentru un semnal de tip zgomot alb, cu variații rapide, spectrul de putere se întinde în toată banda de frecvențe (densitatea de putere este constană). Un zgomot ideal nu este fizic realizabil pentru că ar implica un spectru de putere infinită. Aceste observații sunt evidente pornind de la forma funcției de autocorelație.
Pentru a înțelege mai bine acest fapt se definește funcția de autocorelație ca fiind gradul de similitudine dintre un semnal și el însuși deplasat. Astfel că, pentru semnalele cu variații lente, funcția de autocorelație tinde să fie constantă, deoarece nu apar variații considerabile odată cu deplasarea semnalului. Se poate spune că există un grad mare de similitudine între semnalul original și deplasatul lui. Pentru semnalele cu variații rapide (semnalele de natură aleatoare) autocorelația tinde spre un impuls îngust în origine (Fig 2.1), semnalul devine decorelat cu el însuși pe măsură ce deplasarea este mai pronunțată. O astfel de funcție, care ideal reprezintă funcția impuls unitate, are ca echivalent în frecvență un spectru ce se întinde spre frecvențe înalte.
Fig 2.1 Funcția de autocorelație și spectrul de putere asociat pentru : (a) un semnal slab corelat cu el însuși deplasat (b) Cazul limită al zgomotului alb
Pentru că obținerea spectrului de putere înseamnă calcularea unui estimat (având un număr finit de eșantioane disponibile), în domeniul prelucrării digitale a semnalului s-au dezvoltat două metode de obținere a acestuia:
Metoda neparametrică
Periodgrama
Bartlett
Welch
Metoda parametrică
Metodele neparametrice nu sunt atât de comune și nu vor fi abordate în lucrarea de față. Metodele parametrice presupun ca spectrul de putere să fie calculat doar pe cele N eșantioane înregistrate.
Periodgrama constă în reducerea funcției de autocorelație la o convoluție în timp pe eșantioanele semnalului și aplicarea transformatei Fourier pentru obținerea spectrului de putere. Convoluția în timp se transpune în produs în frecvență. Astfel că periodgrama reprezintă o metodă de estimare a spectrului de putere dicrect din eșantioanele semnalului.
, (2.6)
Periodgrama are însă neajunsul de a fi un estimat neconsistent al spectrului de putere, nu se îmbunătățește odată cu creșterea numărului de eșantioane achiziționate (varianța rezultatului nu scade). Factorul de calitate al periodgramei rămâne constant, ceea ce exprimă independența performanțelor metodei de numărul de date achiziționate.
(2.7)
Pentru această problemă apare soluția propusă de metoda Bartlett: se împarte setul de N eșantioane disponibile în K subseturi de lungime fixă M.
(2.8)
Pentru fiecare subset se determină spectrul de putere prin metoda periodgramei, iar în final se mediază cele K periodgrame obținute. Se observă o scădere de K ori a varianței periodgramei. Păstrând M fix și crescând numărul de eșantioane achiziționate, N, de asemenea crește K, deci scade varianța estimatului și acesta devine consistent. Scăderea varianței estimatului este aleasă în detrimentul scăderii rezoluției în frecvență.
(2.9)
Unde și sunt spectrele de putere estimate cu periodgramă, respectiv metoda Bartlett.
Metoda Welch vine ca o generalizarea a metodei Bartlett. Principiul de bază este același, numai modul de segmentare a setului inițial poate diferi: pe subseturile pot fi suprapuse și ferestruite (segmentate) cu o funcție fereastră. Se observă că metoda Bartlett este o particularizare a metodei Welch pentru segmente disjuncte (fără suprapunere) și segmentate cu fereastră dreptunghiulară.
Metoda Welch aduce și ea compromisul varianță-rezoluție al metodei Bartlett, care însă poate fi gestionat prin modificarea suprapunerii subseturilor și a funcțiilor fereastră folosite. Această metodă se găsește deja implementată în multe biblioteci de prelucrarea a semnalelor digitale, iar unele detalii despre alegerea parametrilor metodei vor fi reluate în partea practică a lucrării.
Pe lângă valorile propriu-zise din spectrul de putere, un alt parametru este reprezentat de suma acestora și oferă un estimat al puterii totale pentru un proces fizic. Pot fi extrași si parametrii statistici (medie, deviație standard) pentru estimatul desității de putere spectrală.
Descompunere Wavelet
Descompunerea Wavelet reprezintă o unealtă comună în aplicațiile de reducere de zgomot sau compresie (FBI Wavelet/Scalar Quantization Standard), dar mai ales de analiză de semnal acustic, biologic (ECG, EMG), ultrasonic.
Analiza Fourier reprezintă metoda clasică de analiză asupra unui semnal prin translatarea punctului de observație din domeniul timp în domeniul de frecvență. Însă acest fapt aduce dezavantajul de a pierde conținutul din domeniul timp: se cunoaste comportamentul de frecvență, dar este imposibil de precizat când apare un anumit eveniment particular în timp. Apariția evenimentelor particulare (tranziții, întreruperi) devine importantă în cadrul semnalelor nestaționare. Pentru astfel de semnale este nevoie de o altă abordare care să includă atât observarea comportamentului de frecvență, cât și apariția acestor particularități.
O astfel de abordare este reprezentată de analiza Wavelet. Analiza Wavelet presupune analiza de frecvență locală pe intervale de timp foarte înguste, urmărindu-se comportamentul de frecvență pentru fiecare eveniment de timp. În mod practic, acest procedeu este realizat similar analizei Fourier prin descompunerea semnalului într-o serie de componente fundamentale. Pentru că semnalele analizate sunt nestaționare componenta fundamentală trebuie să aibă o alură specifică (formă iregulată în contrast cu forma netedă a unui sinus, componenta fundamentală a analizei Fourier). O astfel de componentă este reprezentată de o funcție de tip wavelet-principal (mother wavelet) cu două proprietăți: suport finit și medie zero. În plus pot fi caracterizate și de ortogonalitate și simetrie.
Alegerea funcției wavelet-principal depinde puternic de alura semnalului analizat. Au fost dezvoltate studii în acestă direcție, pentru a determina similaritatea între semnalul analizat și funcția wavelet-principală printr-o abordare cantitativă. Până acum nu există un standard de selecție a funcției wavelet-principal, selecția se poate face observând rezultatele folosirii unui anume tip. Există serii de familii de funcții Wavelet (Haar, Daubechies, Coiflet, Morlet) a căror utilitate în aplicații specifice este studiată constant.
Astfel că, în analiza Wavelet, alegerea funcției wavelet-principal este în principal dependentă de semnalul analizat și constituie primul criteriu de performanță al analizei. În lucrul cu semnale inerțiale familia funcțiilor wavelet-principal Daubechies (db) este reprezintă un punct de reper datorită varietății de ordine disponibile, dar și a experimentelor ce îi confirmă utilitatea.
Fig 2.2 Funcții wavelet-principal Daubechies de diferite ordine
Transformata Wavelet se obține prin scalarea (alungirea și comprimarea) funcției wavelet-principal (ψ) și translatarea acesteia peste semnalul original (f). Rezultatul transformatei este reprezentat de coeficienții Wavelet ce sunt funcție de scalarea și poziționarea funcției wavelet-principal.
(2.10)
, scalare ∈ \{0}, pozitie ∈ , reprezintă funcția wavelet-principal () translatată și scalată. Se normalizează cu pentru a asigura independența de gradul de scalare.
(2.11)
Transformata Fourier: descompunere în sinusoide de diferite frecvențe. Transformata Wavelet: descompunere în funcții wavelet-principal scalate și deplasate
Transformarea Wavelet rezultă într-o funcție care e localizată în domeniul real, dar și în spațiul Fourier. Cel mai adesea se poate reprezenta într-un sistem tridimensional cu coeficienții în funcție de deplasare (timp) și gradul de scalare al funcției wavelet-principal.
Calcularea coeficienților Wavelet este un procedeu anevoios, implicând putere de calcul mare și un set vast de date de ieșire. Devine necesară introducerea unui transformate Wavelet rapide. Transformata Wavelet poate fi divizată în:
Transformată Wavelet discretă (DWT)
Transformată Wavelet pachet (WPT)
Transformată Wavelet continuă (CWT)
De interes pentru aplicația de față este transformata Wavelet discretă.
Orice semnal poate fi descompus prin filtrare trece-jos într-o parte de frecvențe joase (aproximării) și prin filtrare trece-sus într-una de frecvențe înalte (detalii). Numele celor două părți sunt sugestive. Coeficienții de tip aproximare oferă informație despre alura semnalului (identitatea). Coeficienții de tip detaliu oferă informație despre particularitățile semnalului (nuanța). Cei din urmă sunt asociați de obicei cu componentele de tip zgomot.
Fig 2.5 Schema de descompunere Wavelet. Semnalul S trece printr-un banc de filtrare (FTJ + FTS) și rezultă în coeficienții de aproximare, respectiv detaliu
Se observă că schema de descompunere este alcatuită din două filtrări concomitente asupra aceluiași semnal. Trecerea semnalului prin bancul de filtre și obținerea celor două seturi de coeficienți reprezintă un nivel de descompunere. Coeficienții filtrelor sunt dați de tipul de funcție wavelet-principal aleasă pentru analiză.
Fig 2.6 Funcția Daubechies 2 (db2) și coeficienții filtrelor trece-jos (Lprime), respectiv trece-sus asociate (Hprime)
Descompunerea poate continua succesiv considerând coeficienții de aproximare curenți pe post de eșantioane de semnal de intrare în nivelul următor.
Fig 2.7 Exemplu de descompunere Wavelet pe 4 niveluri
Numărul maxim de niveluri de descompunere ale unui semnal (Jmax) poate fi stabilit prin relația:
(2.12)
Unde N reprezintă dimensiunea semnalului (numărul de eșantioane), iar NW este dat de filtrul de descompunere asociat funcției wavelet-principal aleasă.
Pentru un semnal de N eșantioane, din filtrările trece-jos și trece-sus rezultă câte N coeficienți pentru fiecare. Este necesară o decimare pentru fiecare set de coeficienți, pentru ca în final numărul de coeficienți de aproximare și detaliu să coincidă cu numărul de eșantioane ale semnalului. Descompunerea Wavelet vin astfel cu avantajul păstrării dimensiunii informației inițiale, independent de numărul de niveluri de descompunere.
Fig 2.8 Numărul de coeficienți rezultat în lipsa (stânga) și în prezența (dreapta) decimării
Transformata Wavelet discretă presupune o astfel de filtrare a semnalului în detalii și aproximări, decimarea corespunzătoare și posibilitatea de continuare recursivă a procedeului pe coeficienții de aproximare ai nivelului curent. În final, descompunerea Wavelet pe mai multe niveluri rezultă într-un număr compact de coeficienți ce descriu semnalul inițial într-o manieră timp-frecvență, putând fi identificate evenimente de timp ce aduc modificări în caracteristiac de frecvență.
Sistem neliniar de predicție
Introducere. Paradigme.
Este necesar ca din setul de caracteristici extrase din semnalul inerțial să fie prezisă clasa de mișcare observată. Atunci când semnalul observat nu se poate reprezenta doar printr-o statistică de ordin doi sau sistemul care îl produce este puternic neliniar, sistemul de predicție poate fi implementat eficient printr-o rețea neurală.
Rețelele neuronale artificiale (rețelele neurale) reprezintă sisteme computaționale care, pe baza învățării din situații anterioare, oferă o configurație capabilă de răspunsuri și predicții corecte pentru un anumit vector de date de intrare. Caracteristica fundamentală ce trebuie urmărită în proiectarea unui astfel de sistem este generalizarea comportamentului astfel încât acesta să fie capabil de răspunsuri valide pentru date noi de intrare.
Celula de bază a unui rețele neurale este reprezentată de un neuron artificial (perceptron). Orice perceptron are un set de n intrări. Fiecare intrare este ponderată, adică i se atribuie o anumită importanță în cadrul percepronului respectiv. Perceptronul sumează cele n intrări ponderate, iar ieșirea acestuia este nenulă (activată) când suma depășește un anumit prag.
Fig 2.9 Modelul matematic al unui perceptron
Ieșirea unui perceptron (Y) poate fi scrisă ca rezultatul funcției de activare () pentru valoarea egală cu suma ponderată a intrărilor (xi) în perceptron:
(2.13)
Perceptronul clasic prezentat mai sus are ca funcție de activare funcția matematică treaptă. De asemenea, se pot folosi și alte funcții de activare. Funcția sigmoidă (logistică) este un astfel de funcție, reprezentând o treaptă mai netedă, pentru care mici modificări în ponderile neuronilor rezultă în mici modificări asupra ieșirii. Avantajul funcției sigmoidă este reprezentat de faptul că este derivabilă continuu, lucru necesar în ajustarea ponderilor. O astfel de funcție sigmoidă are expresia și alura de mai jos:
(2.14)
Fig 2.10 Reprezentarea grafică a funcției sigmoide
Se poate scrie funcția generală a perceptronului i cu N intrări ce are ca funcție de activare funcția sigmoidă astfel:
(2.15)
Unde xi și wi reprezintă intrările în perceptron, respectiv ponderile acestora.
Clasificator multistrat (MLP)
O tipologie clasică de rețea neurală este rețeaua de tip multistrat (MLP) cu cel puțin trei straturi succesive de perceptroni interconectați. Dimensiunea primului strat este dată de dimensiunea vectorului de intrare, iar neuronii din primul strat sunt diferiți prin lipsa ponderilor sau a funcțiilor de activare, rolul lor fiind doar de a translata intrarea respectivă spre următoarele noduri. Dimensiunea stratului de ieșire este dată de numărul claselor urmărite, fiecare nod fiind asociat unei clase.
Straturile intermediare între intrare și ieșire se numesc straturi ascunse, deoarece rezultatul acestora nu este direct accesibil. O rețea cu mai mult de un strat ascuns reprezintă o rețea neurală adâncă. Performanțele rețelei cresc odată cu creșterea complexității structurale (număr de straturi ascunse, număr de perceptroni – numiți aici noduri ale rețelei – pe fiecare strat).
Fig 2.11 Exemplu de structură clasică MLP
Învățarea presupune ajustarea ponderilor nodurilor astfel încât rețeaua să realizeze buna predicție conform datelor de intrare. Acest lucru este posibil dacă funcția globală a rețelei modelează cât mai bine comportamentul sistemului urmărit.
Totalitatea ponderilor rețelei reprezintă coeficienții rețelei. Ajustarea acestor coeficienți se poate face prin învățare supervizată sau nesupervizată. Învățarea nesupervizată nu face obiectul lucrării de față. Învățarea supervizată reprezintă procesul prin care, pornind de la un set de date de antrenare (vectorul de intrare alături de ieșirea corectă), ponderile sunt ajustate conform minimizării erorii între ieșirea prezisă și ieșirea corectă. Aplicațiile de învățare supervizată pot fi grupate în:
Clasificare: se urmărește gruparea în categorii la ieșire în funcție de datele de intrare.
Regresie: se urmărește generarea unei valori reale la ieșire în funcție de datele de intrare.
Lucrarea de față urmărește problema de clasificare a activităților fizice.
Inițial, coeficienții rețelei au valori aleatoare. Datele de antrenare, vectori de intrare alături de ieșirile corecte, sunt trecute prin rețea. La fiecarea trecere a unui set de date se observă răspunsul calculat al rețelei (predicția) și se compară cu răspunsul corect. Astfel se determină costul rețelei, mai exact eroarea pătratică medie, și gradientul aferent. Algoritmul de ajustare presupune scăderea coeficienților în funcție de gradient până la atingerea unui punct de minim global pentru funcția cost.
Fig 2.12 Reprezentarea grafică a funcției cost
Ajustarea coeficienților se face prin propagare inversă a erorii (backpropagation), astfel că straturile mai apropiate de ieșire vor fi mai puternic influențate de gradientul erorii. Antrenarea se face în mai multe epoci, datele de antrenare trecând de mai multe ori prin rețea. O epocă de antrenare presupune trecerea tuturor datelor prin rețea și ajustarea parametrilor după fiecare set. Sunt necesare mai multe epoci de antrenare, repetarea antrenării cu aceleași date, deoarece în fiecare nouă epocă coeficienții rețelei sunt diferiți, generând un răspuns diferit și astfel o nouă ajustare.
Pentru că se dorește generalizarea modelului, în etapa de antrenare se urmărește evitarea situațiilor de supra-antrenare (overfitting), când modelul este bun pentru setul de date particulare de antrenare, însă nu poate oferi raspuns corect pentru date de intrare noi. Detaliile ce privesc alegerea configurației rețelei, gestionarea setului de date pentru antrenarea și validarea acesteia și stabilirea anumitor hiper-parametrii de model vor fi discutate în prezentarea implementării.
În final, după atingerea valorilor optime pentru coeficienți, rețeaua neurală oferă forma finală a funcției de dependență între intrare și ieșire. Avantajul net al folosirii rețelelor neurale în detrimentul filtrelor adaptive sau al sistemelor de predicție liniară este că acestea pot modela sisteme neliniare, ceea ce este adesea necesar în practică.
Sistem inerțial de achiziție
Concept
Sistemul global propus urmărește clasificarea de activități fizice în funcție de semnalele inerțiale preluate de la senzori de tip MEMS (accelerometru, giroscop) conectați pe corpul subiectului. Semnalele inerțiale ar trebui să ofere informații consistente despre poziția și tipul de mișcare al subiectului. Se va urmări detectarea unei game predefinite de activități.
Studiile relative temei propuse abordează două metode de recunoaștere: pornind de la semnale inerțiale sau de la imagini în contextul sistemelor vision-based. Cea din urmă este în general mult mai complexă și necesită mai multe resurse, fiind nevoie de o cantitate de informație considerabilă. Se pune astfel problema prezentată încă din introducere sub denumirea de margine de profit a informației, când valoarea unui tip de informație scade în raport cu alt tip de informație, mult mai comprimat, mai ușor de stocat și mai ușor de prelucrat, și care, în pricipiu, poate îndeplini același rol.
Pentru că se cunoaște tipul de informație necesară (semnal inerțial) și configurația de montare implementarea sistemului necesită trei sub-sisteme:
Un modul multi-cip (MCM) cu cele două tipuri de MEMS integrate: un accelerometru pe 3 axe și un giroscop pe 3 axe. Modulul de senzori va asigura informația inerțială necesară.
Un SOC compact care să integreze un cip Wi-Fi de tip ESP8266. Acesta va asigura fluxul de date de la senzori la platforma finală în mod wireless.
O mașină de lucru (PC) care primește fluxul de date, le prelucrează, extrage anumiți parametrii și prin intermediul sistemul de clasificare (realizat anterior) detectează semnalele MEMS.
Alegerea celor trei sub-sisteme este parțial individuală, ținându-se cont doar de anumite caracteristici ale fiecăruia ce ar facilita inter-conectarea ulterioară. Este necesar ca sub-sistemele să fie compacte, fiabile, cu consumul de putere redus și să facilitarea programarea lor, astfel încât din integrarea finală să rezulte un sistem principal în sensul IoT.
Module hardware
Unitate inerțială de măsură (IMU)
Se alege un modul multi-cip ce integreză accelerometru 3D și giroscop 3D sub aceeași capsulă (3x3x1mm). MPU-9250 este un sistem încapsulat (SiP – System in Package) ce combină două cipuri: o versiune anterioară de MPU, MPU-6500 cu accelerometru și giroscop, și cu compas digital (magnetometru pe trei axe) AK8963. Cel din urmă nu este folosit în aplicația de față.
Caracteristici generale:
Trei convertoare analog-digital pe 16 biți pentru cele trei mărimi măsurate electric. Frecvență de eșantioanare variabilă pentru convertoare (1 kHz, 8 kHz, 32 kHz).
Interfață digitală (magistrală de comunicație I2C).
Factori de sensibilitate variabili:
±250, ±500, ±1000, and ±2000°/sec gamă de lucru pentru giroscop
±2g, ±4g, ±8g, and ±16g gamă de lucru pentru accelerometru
Gama de lucru variabilă prin configurarea registrelor de 8 biți asociate (registrele 27 și 28).
Tabel 3.1 Registrele de configurație pentru giroscop (sus) și accelerometru (jos) și câmpurile de biți
Comunicație cu registrele interne (pentru programare) la 400 kHz prin I2C sau 1 MHz prin SPI.
Gamă de tensiuni de alimentare: 2.4 V – 3.6 V.
Sistem de filtrare de semnal integrat. Filtre trece-jos cu frecvențe de tăiere variabile asociate fiecărui convertor analog-digital.
Mod de lucru low-power.
Disponibil prin cofigurația primilor patru biți din registrul 30 sau prin registrele de Power Management 1 și 2 (registrele 107 și 108).
Tabel 3.2 Registrul de control al modului low-power pentru accelerometru
Tabel 3.3 Caracteristicile electrice ale MPU-9250
Modul WiFi ESP8266
Modulul WiFi folosit este Huzzah ESP8266 de la Adafruit. Are un procesor ESP8266 de la Espressif de 80 MHz, WiFi încorporat și stivă TCP/IP, antenă compactă on-board.
Fig 3.2 Modul ESP8266 Huzzah Adafruit
Caracteristici generale:
UART cu level shifter pe RX. TX are ieșire în logică 3.3 V.
Alimentare cu regulator la 3.3 V. Consum de curent de până la 250 – 500 mA la pornire.
O intrare analogică (nivel maxim de 1 V).
9 pini de uz comun ce pot fi configurați ca SPI sau I2C. Curent maxim pe pinii GPIO de 12 mA.
Pre-programat cu NodeMCU ce rulează un interpretor fie de Lua, fie de Python.
Principalul avantaj al modului ESP ales este firmware-ul NodeMCU ce oferă simplitate de conectare și programare prin interfața serială. Conexiunea se poate face direct într-un emulator de terminal serial (PuTTY). Este recunoscută versiunea de firmware și se poate accesa interpretorul de Lua.
Fig 3.3 Sesiune de comunicație serială PuTTY pe portul COM7 cu baud rate de 9600 biți/secundă
Pentru că Lua este un interpretor mai puțin uzual, se dorește încărcarea un firmware ce rulează MicroPython, o distribuție mai restrânsă de Python, cu module și funcționalități specifice hardware-ului pe care rulează. Fișierul binar de firmware MicroPython este disponibil în trei versiuni open-source, două pe 1024 kb și una pe 512 kb, și se încărcă direct în memoria flash (prin interfața serială UART) a dispozitivului după activarea modului boot-loader.
Modul de boot-loader este configurabil prin pinul GPIO 0. GPIO 0 are o rețea internă de pull-up, care determină după reset intrarea în mod de lucru normal al modulului. Dacă pinul GPIO 0 e menținut la nivel de 0 (prin conectarea directă a pinului fizic la masă sau prin apăsarea unui buton asociat) în timpul reset-ului, MPU-9250 va intra direct în mod de boot-loader.
Fig 3.4 Pinul de uz general 0 determină modul de lucru
După încărcarea versiunii de firmware modulul poate fi direct programat prin interfața serială UART, fie prin PuTTY, fie prin ESPlorer, un IDE dezvoltat special pentru NodeMCU.
Fig 3.5 Platforma ESPlorer versiunea 0.2.0 ce suportă interpretor Lua sau MicroPython și comenzi AT
Pentru instalarea de module MicroPython noi apare următoarea situație. Versiunea de firmware curentă vine cu o implementare de funcționalitate Python pip-install sub forma unei biblioteci upip. Funcția de instalare implementată în upip accesează însă o adresă web inactivă pentru colecția de pachete Python (pypi.python.org). Ca alternativă de rezolvare se poate încerca modificarea firmware-ului sau folosirea unui terminal client WebREPL pentru încărcarea directă a fișierului cu modulul MicroPython și instalarea din sursa locală.
WebREPL folosește o conexiune web socket ca protocol de transfer. Poate lucra și pe conexiuni low-level UART, SPI, I2C, însă are ca utilitate primară folosirea în conexiunea de rețea wireless. Constă în două sub-protocoale: protocol de terminal și protocol de transfer de fișiere sau control.
Se activează din NodeMCU prin comunicația serială serverul WebREPL și i se atribuie o parolă conexiunii deschise. Se conectează mașina de lucru la socketul web cu NodeMCU și se face transferul fișierului în cauză printr-un client WebREPL în browser.
Fig 3.6 Se activează funcționalitatea WebREPL de pe ESP8266
Fig 3.7 (stânga) Se conectează NodeMCU cu PC (dreapta) Client WebREPL în browser
Interconectarea hardware și software a modulelor
Cele două dispozitive, MPU-9250 și modulul ESP8266, vor comunica direct prin interfața digitală de I2C. Protocolul serial I2C reprezintă o comunicație prin două fire între un sistem de tip master și unul sau mai multe sisteme slave. Sistemele slave au asociate câte o adresă unică necesară identificării de către master. Transferul de face în pachete de 8 biți cu rate de transfer 100 kbiți/secundă în arhitecturile inițiale sau 400 kbiți/secundă în arhitecturile actuale (Fast mode).
Protocolul I2C este simplu de implementat, cu doar două fire de comunicație. SCL pentru ceasul serial și SDA pentru datele seriale. Ambele necesită o rețea rezistivă de pull-up la alimetare. În acest mod orice microcontroler poate comunica cu un dispozitiv prin I2C chiar dacă nu are interfață specifică.
Comunicația I2C între cele două sisteme este facilitată prin existența unui driver I2C pentru MPU-9250 implementat într-o bibliotecă MicroPython. Astfel că registrele MPU-9250 pot fi adresate direct prin driver-ul I2C. MPU-9250 comunică în cofigurație de slave cu microcontrolerul master ESP8266.
Fig 3.8 Configurația master-slave între ESP8266 și MPU-9250
Modulul Huzzah ESP8266 prezintă 9 pini de uz general ce pot fi configurați pentru interfețele digitale. Astfel că trebuie definiți pinii de protocol I2C la nivel fizic, pentru firul de clock (SCL) și pentru firul de date (SDA), prin intermediul unui obiect de tip I2C. La apelarea constructorului cu parametrii respectivi, se va face maparea fizică a firelor de I2C pe pinii GPIO 4 și 5.
Fig 3.9 Configurarea I2C
Pinul GPIO 4 al modulului ESP se va conecta la pinul SDA al modulului MPU-9250, iar pinul GPIO 5 al modulului ESP la pinul SCL al modulului MPU-9250.
Fig 3.10 (sus) Asamblarea celor două module pe o placă de prototipare
(jos) Conectarea unui modul USB-to-TTL pentru programarea prin UART
Se crează un obiect de tip MPU6500 – accelerația exprimată în forță-G (echivalentul a 9.8 m/s2) și viteza unghiulară în grade/secundă prin configura – și o instanță de clasă MPU9250. Comunicația și instanțierile sunt corecte dacă senzorul a fost identificat (se poate citi valoarea 0x75 în registrul 117 WHOAMI).
Fig 3.11 Configurarea MPU-9250
În constructorul clasei MPU6500 intervalele de variație pentru accelerometru și giroscop sunt cele minime (±2g și ±2000°/sec).
Achiziția de date se face în buclă atât timp cât pinul GPIO 0 este setat. Se oprește achiziția când butonul asociat pinului GPIO 0 este apăsat (vezi rolul GPIO 0 în capitolul Modul WiFi ESP8266). Valorile la ieșirea accelerometrului și giroscopului sunt membri publici în obiectul definit mai sus. Se împachetează valorile într-un mesaj de tip string. Mesajul este convertit într-un obiect bytes. Conversia din string în bytes a mesajului reprezintă procedeul de codare necesar transmiterii de text sub formă de cod ASCII sau UTF-8.
Fig 3.12 Construirea mesajului cu date inerțiale
Stabilirea unei conexiuni la rețea
ESP8266 are trei moduri de operare:
Stație WiFi (WiFi Station, STA).
Punct de acces WiFi (Access Point, AP).
Cele două concomitent.
Modul STA este folosit pentru a conecta modulul la o rețea WiFi printr-un punct de acces (router). Modulul ESP8266 are beneficiul de a salva într-o memorie nevolatilă datele despre ultima conexiune astfel încât conexiunea se poate face automat după reboot.
Un punct de acces (AP) este reprezentat de un dispozitiv ce oferă acces la o rețea WiFi altor dispozitive (stații). ESP8266 prezintă funcționalitatea AP în lipsa unei interfețe fizice de conexiune prin cablu. Acest mod de lucru reprezintă un soft-AP. Pentru configurarea modului de operare și a conexiunii WiFi se folosește modulul Python network.
Fig 3.13 Configurarea conexiunii WiFi și a modului de operare
Numele rețelei wireless (SSID – Service Set Identifier) și cheia de securitate sunt definite ca variabile globale (ssid, respectiv password). Se crează o instanță de interfață WLAN (sta_if) cu mod de operare WiFi Station.
Funcția do_connect() reprezintă procedura de conectare la rețea. Se verifică dacă nu există deja conexiune la rețea. În caz contrar, se activează interfața STA, se încearcă conexiunea cu datele rețelei (ssid și password), se verifică dacă a fost stabilită conexiunea. Bucla se execută atât timp cât nu s-a reușit o conexiunea în limita a 20 de secunde.
Scriptul MicroPython este încărcat în memoria flash ca fișier boot.py care este rulat imediat după reboot. Se urmărește consumul de curent din alimentare la reboot pentru alegerea unei surse de alimentare corespunzătoare. Circuitul este alimentat de la o sursă de alimentare DC Agilent E3631a.
Se conectează o sondă de curent pe firul de alimentare și o sondă de tensiune pe pinul de alimentare. Se urmărește pe osciloscop semnalul de reboot pe alimentare (VDD, galben) și consumul de curent (I_VDD, mov). Curentul de pornire (start-up current) este semnificativ, ajunge la un vârf de aproximativ 3 A. Alimentarea comună a sistemului se va face cu o baterie de litiu de 3.6 V și 3600 mAh.
Fig 3.15 Consumul mediu de funcționare al circuitului (74 mA)
Până în această etapă sistemul de achiziție este integrat (comunicație prin inerfață digitală între IMU și modulul WiFi) și conectat la o rețea WiFi. În subcapitolul următor se va prezenta comunicația prin socket a sistemului actual cu mașina de calcul pe care se va implementa prelucrarea datelor inerțiale
Socket de comunicație
Se va folosi în continuare termenul de limbă engleză socket în detrimentul echivalentului românesc soclu mai puțin sugestiv.
Protocol TCP/IP. Model client-server.
Funcționalitatea rețelei Internet se bazează pe un sistem de protocoale din stiva TCP/IP (Transport Control Protocol/Internet protocol). Protocoalele TCP/IP sunt utilizate de obicei pentru comunicația în rețea printr-un socket. Socketul reprezintă cel mai simplu mod de a realiza comunicația între două mașini.
Protocoalele TCP/IP la nivelul de transport pot fi implementate prin TCP (Transmission Control Protocol) sau UDP (User Datagram Protocol). Protocolul UDP asigură viteze de transfer mari, însă nu asigură siguranța și conformitatea livrării datelor (datagramelor) sau evitarea duplicării acestora. Protocolul TCP compensează aceste neajunsuri, ceea ce îl validează pentru folosirea în cadrul aplicației.
Socketul se poate defini ca un punct terminal virtual în comunicația dintre două computere într-o rețea, neavând suport hardware. Noțiunea de socket apare pentru prima dată în 1971 la MIT sub forma de identificator de port în comunicația mașină-mașină în cadrul rețelei ARPA. Între timp socket-ul s-a standardizat ca un API în sistemul de operare BSD în 1983, devenind în final socket de tip Berkeley. Pentru a înțelege mai bine conceptul de socket se introduce modelul client-server, principala aplicație a acestuia.
Modelul client-server este o structură de aplicație în care există două entități:
Serverul ce furnizează o resursă sau un serviciu.
Clientul ce utilizează resursa sau serviciul respectiv.
Modalitatea de conectare între un server și un client este un socket. Crearea unui socket server implică următoarele primitive TCP:
Crearea socket-ului (socket()).
Legarea socket-ului de un port (bind()).
Așteptarea pasivă pentru a stabili o conexiune (listen()).
Acceptarea unei conexiuni de la un client (accept()).
Trimitere sau primire de mesaje (send() sau recv()).
Închidere socket (close()).
Crearea unui socket client implică următoarele primitive TCP:
Crearea socket-ului (socket()).
Legarea socket-ului de un port (bind()). Nu este necesară pentru client.
Conectarea la un server pentru a stabili o conexiune (connect()).
Trimitere sau primire de mesaje (send() sau recv()).
Închidere socket (close()).
Fig 3.16 Arhitectură de socket TCP
Programare socket în Python
Python oferă un API ce adresează direct toate apelurile de sistem necesare. API-ul de socket devine un mecanism util de trimitere de mesaje într-o rețea (o formă de comunicare inter-proces). După stabilirea conexiunii WiFi la o rețea, calea de comunicare între sistemul de achiziție (MPU-9250 și placa WiFi ESP8266) și mașina de calcul (PC) este conexiunea între două socket-uri deschise pe cele două sisteme: socket client pe sistemul de achiziție și socket server pe mașina de calcul.
Modulul Python socket asigură acces la o interfața ce transcrie apelurile de sistem Unix într-o manieră de programare obiect-orientată.
Socket server (implementare)
Fig 3.17 Definirea adresei IPv4 și a portului de comunicație
Sunt definite ca variabile globale (HOST, respectiv PORT) adresa IPv4 a mașinii de calcul (localhost) și portul deschis. Este recomandat ca valoarea portului ales să fie mai mare ca 1023, să fie un port neprivilegiat.
Fig 3.18 Instanțierea obiectului socket server
Este instanțiat un obiect de tip socket într-o structură de tip with pentru asigurarea gestionării automate a resursei (obiectului s). Nu va mai fi nevoie de o ștergere explicită a obiectului. Parametrii constructorului sunt conformi familiei de adrese (AF_INET pentru adrese IPv4) și a tipului de socket.
Socket-ului creat îi sunt asociate o interfață de rețea specifică și un port anterior definite prin metoda bind(). Listen() validează serverul pentru acceptarea de conexiuni.
Serverul este blocat și asteaptă o conexiune de la un client (accept()). Când un client se conectează returnează un obiect nou de tip socket reprezentând conexiunea și un tuple ce reține adresa clientului. Se citește și decodează fluxul de date trimis de client atât timp cât nu este primit un mesaj de oprire.
Socket client (implementare)
Programarea socket-ului client începe cu aceleași definiri ale adresei gazdă și a portului deschis.
Fig 3.19 Instanțierea obiectului socket client
Se extrag informații despre adresa (getaddrinfo()) sub forma unui tuple de dimensiune 5 (addr). Din addr care se extrage din prima adresă validă doar adresa IP și portul serverului.
Se instanțiază un obiect de tip socket, iar pentru acesta se stabilește o legătură prin conectarea la server. Fluxul de date e trimis spre server (sendall()) în bucla condiționată de valoarea pinului GPIO 0 (vezi subcapitolul precedent). La schimbarea valorii pinului GPIO 0 este transmis mesajul de oprire.
Probleme de buffering și sincronizare
Soluția server-client prezentată anterior este teoretic funcțională, însă pentru în utilizarea în condiții de lucru real (limitări de viteză a rețelei, sisteme ce rulează la frecvențe diferite, latențe CPU, server mai lent decât clientul sau invers) apar anumite probleme de transmitere incorectă a datelor. Un socket TCP este un flux de octeți. Prin apelul unei funcții send (sau sendall) sunt trimiși mai mulți octeți pe fluxul respectiv. Însă la recepție, prin apelul funcției recv, pot fi citiți fie toți octeții trimiși, fie doar o anumită parte în funcție de sincronizarea dintre cele două primitive.
Funcția recv primește ca parametru (bufsize) numărul maxim de octeți ce pot fi citiți de pe fluxul de comunicație:
Numărul de octeți trimiși la un moment dat nu este fix, ci variază în funcție de lungimea mesajului string trimis (cate un octet pe caracter din string). Astfel că nu poate fi controlată nici dimensiunea maximă a datelor recepționate. Spre exemplu, pentru două transmiteri succesive (una de 40 de octeți și una de 60 de octeți) prin send, la recepție printr-un singur recv pot fi primiți primii 40 de octeți, 100 de octeți sau orice alt număr de octeți.
Soluția finală propusă implementează, pe lângă transmiterea efectivă a mesajelor (octeților de date), un mecanism de separare a acestora (încorporarea în mesaj a informațiilor despre unde începe sau se termină un mesaj, lungimea acestuia). Trebuie definit un protocol propriu de transmisie care să faciliteze citirea corectă la recepție.
Fig 3.20 Implementarea protocolului în socket client
În bucla din client pe langă mesajul propriu-zis este trimis în prealabil și un pachet ce conține lungimea mesajului ce va fi trimit. Modulul Python struct este folosit pentru conversia valorilor în structuri C reprezentate ca string-uri. Împachetarea în structuri C adaugă octeți suplimetari (padding bytes) pentru aliniament în memorie, aliniament valabil și la despachetare. Metoda pack returnează un string ce conține valoarea lungimii mesajului ce va fi transmis împachetat sub un format network big-endian la o dimensiune de 4 octeți (unsigned int).
Pe partea de server:
Fig 3.21 Decodarea protocolului în socket server
Este nevoie de o funcție recvall echivaletă sendall deja implementată în modulul socket. Funcție obligă citirea unui buffer complet de dimensiune predefinită prin parametrul count.
Recv_one_message reprezintă funcția de citire a mesajului din fluxul de octeți. În lengthbuf este stocată sub structură dimensiunea mesajului de la client ce va fi recepționat. Se extrage (despachetează) din structură dimensiunea. Se citesc de pe fluxul de date atâția octeți cât este valoarea dimensiunii.
Diagrama sistemului
Fig 3.22 Diagrama bloc a sistemului de achiziție
Sistem de prelucrare și clasifcare
Colectarea de date inerțiale
Scopul final al proiectului este de a realiza clasificarea mișcărilor în funcție de semnalele captate de la accelerometru și giroscop. Orice astfel de sistem necesită o bază de date cu date pentru antrenare și validare (vezi subcapitolul Clasificator multistrat (MLP)). Datele vor fi prelucrare în prealabil și vor fi extrase trăsături corespunzătoare pe baza cărora se vor face antrenarea și validarea sistemului (vezi subcapitolul Trăsături de semnal).
Sunt urmărite șapte tipuri de mișcări statice și dinamice: stat în picoare (STA, standing), așezat pe scaun (SIT, sitting), întins (LAY, laying), mers (WLK, walking), urcat scări (STU, stairs up), coborât scări (STD, stairs down), genoflexiuni (SQT, squatting). Mișcările vor fi înregistrate de la cinci subiecți ce vor avea montat pe piept modulul de achiziție.
Fig 4.1 (stânga) Poziționarea conformă a sistemului de achiziție pe corpul subiectului
(dreapta) Trăsături corporale ale subiecților alături de numărul de de seturi de mișcare colectate
Colectarea va totaliza un număr de aproximativ 45 – 55 de seturi de achiziție pentru fiecare mișcare. Durata unui set de achiziție poate varia de la 7-12 de secunde (pentru mișcări limitate de contextul fizic de achiziție, e.g. urcat sau coborât scări) până la 20-25 de secunde (pentru mișcările statice).
Fig 4.2 Distribuția mișcărilor pentru fiecare subiect (indicatorul subiectului corespunde oridinii din figura anterioară)
Achiziția semnalelor de la accelerometru și giroscop a început în momentul în care un subiect se afla în desfășurarea activității urmărite. De asemenea, a fost finalizată înainte de încetarea activității, pentru a anula posibilitatea înregistrării momentelor de tranziție ca parte a mișcării. Începerea și oprirea achiziției (deschiderea și închiderea socket-ului de comunicație) este determinată de butonul asociat pinului GPIO 0 de pe dispozitivul ESP8266.
În etapa de înregistrare a mișcărilor s-a urmărit premiza din începutul subcapitolului Senzorii inertiali in aplicatii biometrice de detectare a activitatilor fizice: este necesar ca activitățile urmărite să fie naturale și cât mai diverse, colectate de la mai mulți indivizi, în circumstanțe de mediu variante. O colecție de date cât mai diversificată pe o anumită temă asigură cu siguranță o generalizare mai bună.
Fig 4.3 Fluxul de date primit pe mașina de calcul la rularea scriptului de server
Fluxul de date din figura de mai sus este înregistrat pentru o activitate de tip stat pe scaun (SIT). Coloanele sunt ascociate accelerațiilor pe axele X, Y, Z și vitezelor unghiulare pe axele X, Y, Z. Fiind o activitate statică se observă că pe axa X, axa verticală în configurația de montare a dispozitivului, accelerația este imprimată doar de forța de gravitație. Pe axa Z valorile depind poziția particulară a subiectului. Pentru că activitatea este una statică, valorile vitezei unghiulare sunt neglijabile.
Prelucrarea digitală a semnalului
Extragerea de trăsături definitorii pe ferestre de semnal
Proiectarea sistemului de prelucrare a datelor inerțiale se face în concordanță cu următoarea diagramă bloc:
Fig 4.4 Diagrama bloc a sistemului de prelucrare a datelor inerțiale
Un set de date înregistrat este stocat într-un fișier CSV (Comma-Separated Values) pentru ușurința manipulării ulterioare prin biblioteca Python pandas. Colectarea datelor va rezulta o structura de foldere pentru fiecare activitate în parte. Un folder conține fișierele CSV cu seturile de date înregistrate.
Fig 4.5 Parcurgerea structurii de fișiere și ferestruirea semnalelor
Codul Python parcurge structura de foldere de activitate, iar pentru fiecare folder citește pe rând fiecare fișier CSV sub forma unui dataframe (pd.read_csv). Din dataframe se vor extrage ferestre de dimensiune noOfAcquiredSamples eșantioane cu o suprapunere de 50%. Din fiecare astfel de fereastra de date se extrag șase liste diferite pentru fiecare mărime în parte (trei accelerații, trei viteze unghiulare). Se va apela funcția de extragere de trăsături, featuresExtraction, cu cele șase liste ca parametrii. Funcția determină parametrii discutați în capitolul Translatarea semnalului inerțial brut în informație consistentă. Va returna o listă de 198 de trăsăturile extrase (statstice, de frecvență și coefiecienți Wavelet pe patru niveluri de descompunere) pentru fereastra curentă ce va fi adăugată în fișierul feats2sec.txt deschis pentru folderul actual.
Pentru extragerea trăsăturilor de semnal este nevoie de o serie de pachete Python.
pywt: modul de software open-source ce implementează majoritatea funcționalităților legate de transformata Wavelet.
numpy: unul dintre pachetele fundamentale pentru aplicații științifice. Aici este utilizat pentru că are deja implementată funcția de calcul a deviației standard.
matplotlib.pyplot: pentru reprezentări grafice preluate din Matlab.
matplotlib.mlab: pentru funcții Matlab compatibile în Python. Utilizat pentru funcția de calcul a spectrului de putere.
Fig 4.6 Funcția de extragere a trăsăturilor
Funcția primește ca parametrii, valorile de la accelerometru și giroscop (pentru fereastra respectivă) sub formă de liste (Ax, Ay, Az, Gx, Gy, Gz). Este inițializată o listă goală (features) în care vor fi stocate toate valorile trăsăturilor extrase. Vor fi prezentate trăsăturile extrase din vectorii de accelerație (Ax, Ay, Az). Pentru valorile de la giroscop se urmează aceeași pași.
Pentru început se determină vectorul de magnitudini pentru accelerație, pentru care se vor extrage aceleași trăsături statistice.
Fig 4.7 Extragerea trăsăturilor statistice
Se extrag trăsăturile statistice (medie, medie pătratică și deviație standard) pentru fiecare vector de accelerație pe fiecare axă. Determinarea spectrului de putere pentru fiecare vector de semnal presupune apelarea funcției plt.psd cu următorii parametrii: vectorul de semnal (Ax, Ay, Az), numărul de puncte în care se va calcula transformata Fourier, frecvența de eșantionare la care a fost achiziționat semnalul și un ultim parametru (detrend=mlb.detrend_none) ce impune ca din spectrul de putere rezultat să nu fie eliminată componenta continua.
Fig 4.8 Extragerea trăsăturilor de frecvență
Spectrul de putere este Pxx determinat prin metoda Welch de mediere a periodgramelor. Tot în apelul funcției plt.psd pot fi specificați și alți parametrii (tipul de fereastră de analiză, gradul de suprapunere). Din spectrul de putere rezultat sunt determinați aceiași parametrii statistici (medie, medie pătrăatică și deviație standard). În plus, se determină și suma valorilor din spectru, ce oferă o cantitate a energiei semnalului analizat. Tot în vectorul de caracteristici sunt salvate și primele 20 de valori din spectrul de putere pentru fiecare axă (în total 60 de valori).
Fig 4.9 Extragerea trăsăturilor de frecevență suplimentare
Se determină coeficienții de detaliu și aproximare pentru o descompunere Wavelet pe patru niveluri, folosind o funcție wavlet-principal de tip Daubechies 2.
Fig 4.10 Extragerea coeficienților Wavelet
Coeficienții Wavelet pentru fiecare nivel sunt adăugați la vectorul de trăsături ca sumă de pătrate. În final, în fiecare folder de activitate se va găsi câte un fișier feats2sec.txt conținând trăsăturile pe fiecare fereastră de semnal din toate seturile înregistrate împreună cu eticheta activității.
Fig 4.11 Numărul de ferestre extrase pentru fiecare activitate
(Numărul de trăsături pentru antrenarea clasificatorului)
Se observă că setul de trăsături este ușor disproporționat, activitățile statice sunt mai numeroase, deoarece procesul de înregistrare a fost mai facil.
Normalizarea setului de trăsături
Normalizarea setului de trăsături este o etapă intermediară între extragerea de trăsături definitorii din datele analizate și antrenarea unui clasificator în funcție de acestea. Reprezintă transformarea setului de date astfel încât valorile să aparțină unei distribuții de probabilitate normale standard (distribuție Gaussiană de medie 0 și varianță 1). Importanța ei provine din două aspecte:
Este o distribuție la care se supun majoritatea proceselor naturale (e.g. difuzia moleculară, conducția termică, distribuția înălțimilor într-o societate).
Este foarte ușor de manipulat statistic și matematic.
Fig 4.12 Distribuție normală (medie nulă și varianță 1)
Parametrii unei distribuții normale sunt media și varianța (dispersia). Media definește tendința centrală a distribuției și valoarea la care se află vârful de probabilitate. Varianța sau dispersia, uneori se folosește mărimea derivată – deviația standard –, arată modul în care variază valorile în jurul mediei sau cât de împrăștiată este distribuția. Pentru o astfel de distribuție de medie nulă și varianță 1, majoritatea valorilor (99.73%) se regăsesc în intervalul [-3, 3].
În general, normalizarea datelor implică unui soi de relaționare între date prin raportarea la o medie comună cu o anumită dispersie a valorilor. În particular, pentru aplicațiile ce includ rețele neurale, normalizarea prealabilă a datelor de antrenare este necesară. Astfel se evită situațiile de ill-conditioning în etapa de antrenare. Toate valorile variază în aceeași gamă ceea ce garantează stabilitatea modelului și convergența parametrilor rețelei. În caz contrar, în lipsa normalizării, o trăsătură ce are o varianță comparabil mai mare decât a celorlalte v-a domina puternic estimatorul. Situația ar putea forța estimatorul să aprecieze doar trăsătura de intrare respectivă și restul să fie neglijate.
Pentru început toate fișierele cu trăsături sunt concatenate într-un fișier global. Normalizarea se va face pe datele din acest fișier încărcate (într-un dataframe big_frame), pe fiecare trăsătură independent. Din sub-modulul Python sklearn.preprocessing se folosește clasa de StandardScaler. Se instanțiază un obiect de tip preprocessing.StandardScaler. Clasa conține două metode de transformare a unui set de date sub formă normalizată. Ambele primesc ca parametru setul de date sub formă de array numpy:
Fit ce calculează media și varianța (actualizează atributele scale_ și mean_), dar nu modifică direct setul de date. Setul de date poate fi modificat ulterior prin metoda transform.
Fit_transform ce face atât calculul de medie și varianță cât și modificarea setului de date.
Fig 4.13 Scalarea trăsăturilor extrase
Prima buclă for parcurge structura de foldere de activități și adaugă fiecare dataframe cu trăsături într-o listă de dataframe-uri (dfs). Pe lista dfs se face o concatenare, ignorând indexul, într-un dataframe mare (big_frame). Pentru că metodele de lucru ale clasei StandardScaler necesită ca parametru un array numpy, se face conversia de la dataframe la array numpy (features = big_frame.values). Normalizarea nu se face direct pe acest array deoarece conține o coloană cu etichetele de activitate (labels).
Se extrage coloana de etichete, iar pe array-ul rămas (features_without_label) se face normalizarea. La datele normalizate se adaugă coloana de etichete anterior extrasă și se salvează informația în fișier. Acestea vor reprezenta datele de antrenare și validare ale clasificatorului. De asemenea, se va salva si obiectul de tip StandardScaler (cu atributele scale_ și mean_ actualizate) prin metoda pickle.
Fig 4.14 Salvarea obiectului StandardScaler prin pickle
După finalizarea clasificatorului, obiectul va fi reîncărcat în alt script (cu aceeași stare) și pe baza lui se va face transformarea la distribuția standard pentru trăsăturile extrase în timp real.
Implementarea clasificatorului
Keras API
Keras reprezintă unul dintre cele mai rapide API-uri de nivel-înalt folosite pentru prototiparea de rețele neurale. Prototiparea rapidă a unui model de rețea neurală este asigurată prin funcții accesibile utilizatorului (mediu user-friendly), modularitate (orice model poate fi privit ca o secvență de module independente interconectate), extensibilitate (pot fi create funcționalități potrivite oricărei cercetări științifice noi), compatibilitate totală Python (crearea de modele nu necesită fișiere de configurație separate, tot codul necesar este scris în Python).
Este capabil să ruleze pe un nucleu de Tensorflow, Theano sau CNTK și de asemenea poate rula fără probleme fie pe un CPU, fie pe un GPU. Cel mai adesea, modelele Keras sunt construite pe o funcționalitate de nucleu Tensorflow.
Tensorflow este poate cel mai comun framework folosit pentru aplicațiile de machine learning. Principalul avantaj al acestui nucleu îl reprezintă performanțele computaționale obținute pe diferite platforme de lucru. Intel și Google au dezvoltat asiduu distribuții de Tensorflow puternic optimizare pentru lucrul pe CPU (Intel® Math Kernel Library for Deep Neural Networks, Intel® Deep Learning Boost):
Optimizări hardware prin introducerea de noi seturi de instrucțiuni vectoriale, ce cresc performanțele procesorului la execuția simultană a mai multor instrucțiuni într-un singur ciclu de ceas.
Orice rețea neurală scrisă într-un limbaj de nivel-înalt, precum Python, este translatată într-un graf de execuție. Aici apar majoritatea optimizărilor software.
O mare parte din aceste optimizări se găsesc în distribuțiile Tensorflow din Anaconda.
Majoritatea utilizatorilor novici de Tensorflow îl găsesc însă relativ dificil de utilizat din cauza paradigmei de programare declarative sau a complexității de configurare. Astfel apare necesitatea folosirii API-ului Keras care să faciliteze lucrul cu Tensorflow, fără sacrificiu din performanțe.
Keras este folosit în principal pentru crearea de modele secvențiale, strat cu strat (layer-by-layer). Alternativ, se pot crea și modele funcționale, ce oferă o flexibilitate mai bună pentru modele complexe unde un strat poate fi inter-conectat la ieșire sau intrare cu mai mult de un singur strat. Se pot crea rețele reziduale (structură de tip piramidal) ca rezultat al modelului funcțional. În situația de față se folosește modelul secvențial, cel mai utilizat pentru aplicațiile de deep-learning.
Fig 4.15 Modulele Python folosite în continuare
Arhitectura modelului de clasificator
Configurarea modelului de rețea MLP devine o problemă de configurare individuală a straturilor componente și organizarea acestora. Straturile sunt stivuite secvențial, ieșirea stratului precedent legată la intrarea celui curent.
O rețea MLP conține cel puțin un strat ascuns. Pentru straturile ascunse (hidden layers) se folosesc straturi de tip dens pentru care intrărilor li se aplică o operație liniară (funcția de grad 1 de sumare a intrărilor ponderate). Rezultatele operațiilor liniare sunt conectate la ieșire printr-o funcție de activare neliniară comună tuturor nodurilor din stratul respectiv.
Funcția de redresoare (ReLU – Rectified Linear Unit) este folosită adesea ca funcție de activare, având performanțe mai bune în antrenarea rețelelor cu straturi ascunse decât funcții precum sigmoidă sau tangenta hiperbilocă. Funcția redresoare oferă răspuns nenul doar pentru suport pozitiv, astfel că utilitatea funcției redresoare este prezentă însă doar în cazul în care gama valorilor de intrare în rețea este este pozitivă. Pentru cazul prezentat, în care trăsăturile de intrare au fost adaptate la o distribuție gaussiană de medie nulă și varianță 1, gama valorilor de intrare se întinde aproximativ de la -3 la 3. Funcția redresoare nu poate performa în cazul de față. Se rămâne astfel la alegerea funcției sigmoide.
A crea arhitectura modelului de rețea neurală presupune decizii asupra asupra numărului de straturi și a formei acestora (număr de noduri pe strat), dar și a altor hiper-parametrii.
Straturile de intrare și ieșire au o formă dată de dimensiunea vectorului de trăsături, respectiv de dimensiunea vectorului de răspuns. Dacă rețeaua este folosită în configurație de regresor (Regression Predictive Modeling), când se dorește modelarea funcției de transfer din intrările raportate la o singură ieșire continuă, stratul de ieșire va avea un singur nod. Însă pentru configurația de clasificator avem în stratul de ieșire fie un singur nod (ce cuprinde tot vectorul de ieșire), fie câte un nod pentru fiecare clasă urmărită.
Pentru straturile ascunse nu există reguli de modelare. În general, procedeul de modelare a straturilor ascunse este într-o bună parte empiric. Numărul de straturi ascunse este ales în funcție de performanțele pentru aplicația în cauză. Pentru un set de date care deja este separat liniar inclusiv un singur strat ascuns adăugat nu este de folos. Unii autori presupun că doar un singur strat ascuns este arhi-suficient, iar numărul de neuroni poate fi media dintre dimensiunea intrării și cea a ieșirii.
Din dorința de a avea un model de rețea neurală adâncă vom folosi două straturi ascune. Dimensiunea stratului ascuns curent va avea o valoare între stratul anterior și cel următor.
Fig 4.16 Arhitectura MLP propusă
Codul Python ce apelează funcționalitățile Keras este sugestiv. Exceptând stratul de intrare (input), straturile ascunse și cel de ieșire sunt create ca straturi dense de anumite dimensiuni (84 și 48 de noduri pentru straturile ascunse, respective 7 noduri pentru fiecare clasă de la ieșire). Straturile sunt legate direct la stratul anterior (primul strat adânc), fie printr-o metodă de dropout. Folosind dropout sunt dezactivați aleatoriu neuroni dintr-un strat (20-50% dintre neuroni) astfel ca rețeaua să se adapteze cât mai general (nu ajunge să se bazeze doar pe anumiți neuroni sau configurații particulare), dar și mult mai repede. Primul parametru al funcției dropout este probabilitatea de dezactivarea a neuronilor raportată la o distribuție Bernoulli si reprezintă unul dintre hiper-parametrii rețelei neurale.
Fig 4.17 (a) Configurația normală a rețelei neurale (b) Configurația rețelei după aplicarea metodei dropout
Funcția de activarea a stratului de ieșire (activation='softmax') este puțin mai specială. Stratul de ieșire conține câte un nod pentru fiecare clasă ce se vrea prezisă. Fiecare nod va oferi la ieșire probabilitatea ca din vectorul de intrare să rezulte clasa asociată. Această funcționalitate este asigurată de funcția softmax, ce translatează scorurile claselor (valorile modurilor înainte de funcția de activare) într-un vectori de valori probabilistice.
Fig 4.18 Exemplu de răspuns al funcției softmax
Răspunsul funcției softmax la apelul cu un anumit vector de scoruri este limitat doar de algoritmii asociați aritmeticii în virgulă mobilă.
Fig 4.19 Compilarea modelului MLP
Se instanțiază obiectul de tip model pe structura de straturi construită anterior și se compilează. La compilare pot fi controlați anumiți hiper-parametrii:
Algoritmul de optimizare a ponderilor pentru minimizarea funcției cost. Adam (Adaptive Moment Estimation) este un astfel de algoritm stochastic, foarte eficient din punct de vedere computațional și foarte restrâns ca memorie necesară. Reprezintă o extensie la algoritmul de instruire bazată pe gradient.
Funcția de cost (loss function) ce măsoară eroarea între valorile reale și cele prezise. În etapa de antrenare se urmărește minimizarea ei. Entropia încrucișată (crossentropy) măsoară divergența între cele două distribuții de probabilitate.
Metrica după care se stabilesc performanțele unui model. Este similară cu funcția cost cu excepția că rezultatul metricei nu este folosit pentru antrenare.
Validare încrucișată
Validarea încrucișată este procesul ce asigură validarea arhitecturii de rețea pe întreg setul de date. Validarea încrucișată de tip k-Fold (k-Fold Cross-Validation) este o metodă folosită mai ales pentru seturi de date restrânse.
Presupunem ipotetic că avem un set de 100 de vectori de date de intrare. Cea mai simplă abordare presupune împărțirea setului de date într-un set de antrenare a modelului și unul de testare a acestuia. Se aleg anumite procente, de obicei 80% din setul inițial pentru antrenare și 20% pentru testare. Poate apărea următoarea problemă: dacă o clasă este disproporționat concentrată în setul de test față de cel de intrare. Devine astfel necesar ca antrenarea și testarea să fie făcute pe toți vectorii de intrare, aici apare metoda de validare încrucișată ce presupune pașii următori.
Primul pas este reprezentat de alegerea lui k ce reprezintă numărul de grupuri în care va fi divizat setul. Presupunem un k egal cu 5, astfel că setul de date va fi împărțiti în 5 sub-seturi a câte 20 de date, însă după ce datele vor fi amestecare aleatoriu. Pentru fiecare sub-set se urmărește menținerea sa pentru testarea modelului rezultat din antrenarea cu restul de 4 (k-1) sub-seturi. Se obțin ponderile modelului după antrenare, iar din setul de validare se obține performanța modelului. Aceaste operații sunt făcute iterativ pentru toate cele 5 (k) sub-seturi. În final performanța arhitecturii este dată de medierea performanțelor pe cele 5 (k) iterații.
Fig 4.20 Segmentarea datelor de antrenare și validare
Sunt încărcate datele din fișierul CSV de trăsături într-un array numpy. Datele sunt amestecate. Se împarte setul de date în 5 subset-uri egale (5-Fold Cross-Validation). Cele 5 sub-seturi vor fi adăugate pe rând într-o listă (kSegments). Variabila booleană segmentationPass va indica dacă segmentarea s-a făcut corect sau nu.
Fig 4.21 Diagrama procedurii de validare încrucișată 5-fold
Fig 4.22 Modelarea iterativă pe segmentele extrase
Prin metoda model.fit modelul instanțiat este antrenat un anumit număr de epoci (epochs) cu o anumită dimensiune a slotului de date (batch_size). Numărul de epoci este un hiper-parametru definit ca numărul de interații de antrenare pentru tot setul de date de antrenare. Stabilește de câte ori să treacă același set de date prin rețea. Necesitatea re-antrenării cu aceleași date apare deoarece coeficienții rețelei se modifică permanent, astfel că rețeaua va răspunde diferit la aceleași date de la fiecare epocă.
Dimensiunea slotului de date (batch_size) este un hiper-parametru ce stabilește numărul de date (trăsături) care sunt observate înainte de actualizarea propriu-zisă a coeficienților rețelei. Se trece prin toate cele N iterații (dimensiunea batch size), se fac predicțiile, se observă eroarea. Dupa toate iterațiile se face adaptarea coeficienților. Cei doi hiper-parametrii, numărul de epoci și dimensiunea slotului de date, se aleg astfel încăt să se evite posibile supra-antrenări (overfitting). Un număr exagerat de epoci ar particulariza rețaua doar pentru datele respective, pentru că ar fi mult prea antrenată din datele în cauză. Dimensiunea slotului de date dacă este mult prea mică, se va face prea des optimizare și se va ajunge iar în situația de particularizare a rețelei. În cazul în care dimensiunea slotului este prea mare, se poate ajunge în situația ca rețeaua să își adapteze foarte puțin sau chiar deloc coeficienții. În general se alege o valoare de comrpomis pentru cei doi hiper-parametrii, în cazul de față 50 de epoci de antrenare cu o dimensiune a slotului de date de 32.
După etapa de antrenare a rețelei cu cele 4 (k-1) sub-seturi, se evaluează modelul curent, prin metoda model.evaluate, cu sub-setul de validare curent. Se salvează performanțele modelului și se trece la următoarea iterație.
Evaluarea performanțelor
Performanța globală a modelului poate fi direct observată din valorile acurateței și a mărimii complementare, rata de eroare. Acuratețea reprezintă raportul dintre numărul de intrări clasificare correct și numărul total de intrări. Complementar, rata de eroare reprezintă raportul dintre numărul de intrări clasificate greșit și numărul total de intrări.
Pentru arhitectura curentă valorile acurateței și a ratei de eroare sunt salvate la fiecare iterație de validare încrucișată. După cele 5 iterații vom avea următoarele 5 perechi rata de eroare – acuratețe, deci o rata de eroare medie de 20.98% și o acuratețe medie de 93.62%.
Fig 4.23 Evoluția celor două mărimi de-a lungul iterațiilor de validare încrucișată
Se observă că modelul este performant chiar de la prima iterație (acuratețe de aproximativ 91.4%), însă devine considerabil mai performant după toate cele 5 iterații.
Pentru evaluarea performanței modelului se introduc o serie de metrice observate pe matricea de confuzie (metrice de confuzie). Matricea de confuzie reprezintă tabelul de clasificări prezise de model pentru vectorii de evaluare. Matricea de confuzie oferă pentru fiecare clasă numărul de predicții, corecte sau greșite, facute în fiecare dintre clase. Dimensiunea matricei este de , unde n este numărul de total clase. Pentru aplicația de față, matricea de confuzie va avea 7 linii cu 7 coloane.
Fig 4.24 Funcția de reprezentare grafică a matricei de confuzie
Se calculează matricea de confuzie a clasificatorului. Din biblioteca de metrice a modulului Python sklearn este importată funcția de calcul a matricei de confuzie (confusion_matrix). Pentru setul de date de validare, se apelează funcția cu ieșirile reale (y_test), cele prezise (y_pred) și lista de etichete pentru toate clase urmărite. Matricea de confuzie se reprezintă grafic într-un sistem bidimensional sugestiv.
Fig 4.25 Exemplu de matrice de confuzie pentru aplicația curentă
Din matricea de confuzie din figura de mai sus am putea trage concluzia că unele clase, precum cele de așezat pe scaun (SIT) sau întins (LAY), sunt prezise mult mai bine decât restul. Problema este că aceste clase au un număr mai mare de date de antrenare, astfel că și numărul de date prezise este considerabil mai mare decât al celorlalte. De aici apare discrepanța respectivă. Se alege scalarea fiecarărei clase din matricea de confuzie în raport cu numărul total de date de antrenare din clasa respective, astfel că fiecare clasă din matricea de confuzie se va raporta la indici între 0 și 1.
Fig 4.26 Scalarea matricei de confuzie
Se obțin matricele finale scalate:
Fig 4.27 Matricele de confuzie scalate pentru fiecare iterație de validare încrucișată
Pentru fiecare clasă în parte se poate reprezenta următorul tabel de predicție particular:
Tabel 4.1 Tabel de predicție
Se reduce problema la o clasificare binară: setul de date face sau nu parte din clasa respective. Pe axa orizontală este reprezentată valoarea reală (Actual) a clasei: Pozitive dacă face parte din clasă respectivă sau Negative dacă nu face parte din clasa respectivă. Pe axa vertical este reprezentată valoarea prezisă (Predicted) a clasei: Pozitive dacă a fost prezisă în clasă respectivă sau Negative dacă nu a fost prezisă în clasa respectivă. Astfel apar patru situații:
True Positive (TP): arată câte date au fost identificate corect drept clasa respectivă.
False Positive (FP): arată câte date au fost identificate greșit drept clasa respectivă.
False Negative (FN): arată câte date au fost identificate greșit drept în afara clasei respective.
True Negative (TN): arată câte date au fost identificate corect drept în afara clasei respective.
True Positive și True Negative sunt clasificări corecte, False Positive și False Negative sunt clasificări greșite. Pe baza acestor patru situații, pentru fiecare clasă, se definesc următoarele metrice de confuzie:
Acuratețea (Accuracy): Definită și în începutul subcapitolului, acuratețea este abilitatea clasificatorului de a face predicții corecte, relativ la toate predicțiile făcute.
(4.1)
Precizia (Precision): Este abilitatea clasificatorului de a nu prezice ca Pozitiv un caz care este Negativ.
(4.2)
Rapel (Recall): Este abilitatea clasificatorului de a prezice toate cazurile dintr-o anumită clasă.
(4.3)
Scorul F1: Reprezintă media armonică dintre Precizie și Rapel.
(4.4)
Pentru modelul dezvoltat au rezultat următoarele metrice medii provenite din cele observate pe toate cele 5 iterații pentru fiecare clasă:
Fig 4.28 Metricele de confuzie (precizie, rapel, F1) pentru pentru fiecare clasă
Se observă din indicii de performanță că modelul face o clasificare excelentă pentru majoritatea claselor, mai puțin pentru clasele de mișcări statice de tip stat pe scaun și stat în picioare. Poziționarea unui singur modul inerțial pe piept fiind insuficietă pentru diferențierea celor două. Astfel că cele două clase vor fi compactate într-una singură de tip repaus.
Indicii de performanță validează modelul proiectat astfel că acesta va fi salvat într-un fișier de date cu format ierarhizat (fișier cu extenise .h5).
Integrarea în timp real a sistemului
Pentru funcționarea sistemului în timp real este necesară integrarea etapelor de achiziție, extragere de trăsături, normalizare și clasificarea prin rețeaua antrenată.
Fig 4.29 Diagrama bloc a sistemului de prelucrare și aclasificare în timp real
Principalul obiectiv urmărit la integrarea proceselor în timp real este paralelizarea firelor de execuție astfel încât să existe o independență între achiziție, prelucrarea de date și clasificare.
Dacă considerăm întreg sistemul proiectat ca lucrând într-un singur proces, fiecare fir de execuție (achiziție, prelucrare, clasificare) reprezintă un thread ce îndeplinește o anumită acțiune la un moment dat. Rularea simultană a thread-urilor poate fi gestionată folosind primitivele modulului Python threading.
Fig 4.30 Modulul folosit pentru paralelizarea firelor de execuție
Rularea unui thread independent se face prin crearea unei instanțe Thread (process) și începerea activității acesteia (process.start()). Instanța process se crează pe un obiect țintă apelabil, în cazul de față processData, alături de argumentele de apelare. Obiectul apelabil processData este o funcție definită mai sus, în corpul căreia se regăsește codul de prelucrare a datelor inerțiale. Singura diferență față de implementarea precedentă a acestei etape este reprezentată de faptul că semnalul nu este citite dintr-un fișier de tip CSV și ferestruit, ci sunt trimise direct ferestrele de semnal de pe fluxul de comunicație.
Fig 4.31 Apelarea thread-ului de procesare de date din fluxul de comunicație
Pentru normalizarea trăsăturilor după etapa de procesare este necesară încărcarea obiectului de tip StandardScaler salvat anterior prin metoda pickle. Normalizarea se va face prin metoda transform a obiectului încărcat (standard_scaler).
Fig 4.32 Încărcarea obiectului StandardScaler
După ce se realizează normalizarea setului de trăsături se poate apela modelul de rețea construit. Este nevoie ca și acesta să fie încărcat și, în plus, mai trebuie urmărit un aspect. Apelarea modelului de rețea se va face la sfârșitul funcției processData.
Fig 4.33 Apelarea modelului de rețea MLP
Funcția processData reprezintă un thread executat în paralel și apelat din funcția de achziție principală. Astfel că fiecare thread va apela funcția de predicție a obiectului model(model.predict) în mod concurent. În aplicațiile de multithreading este nevoie să se compileze manual în prealabil funcția de predicție prin model._make_predict_function() pentru a evita aceste situații de concurență. Compilarea modelului presupune rularea acestuia pe GPU o dată la început, pentru a evita timpii primei rulări și încărcarea resurselor. După compilare modelul poate fi apelat din orice thread (este thread safe).
Fig 4.34 Compilarea prealabilă a modelului MLP
Pentru a facilita experiența utilizatorului cu aplicația finală se construiește o interfață grafică. Se folosește modulul Python de dezvoltare grafică Tkinter. Tkinter oferă o serie facilități de programare orientate pe evenimente (event-driven programming): butoane, indicatoare de text, meniuri. Acest tip de programare presupune crearea unei aplicații ce rulează în buclă infintă și care așteaptă apariția unui eveniment. Un eveniment apare la acționarea unui control din aplicația grafică (e.g. apăsarea unui anumit buton) și este asociat unei anumite funcții de comandă.
Fig 4.35 Instanțierea obiectului tkinter
Pentru inițializarea unei aplicații tkinter este nevoie de crearea unei instanțe la clasa de bază Tk (Tkinter Widget). Pe instanța respectivă se va construi interfața grafică într-o clasă proprie de tip GUI. Instanța de Tkinter Widget va fi rulată în buclă.
Fig 4.36 Definirea clasei de interfață grafică
În constructorul clasei GUI se definește geometria interfeței și anumite elemente grafice (butoane și etichete). Fiecare element grafic reprezintă o instanță de obiect, la definirea căreia se alege configurația elementului (culori de fundal, color text, text, aliniere), dar și metoda ce va fi apelată la apariția unui eveniment cauzat de acesta. Elementrul grafic este plasat în interfață prin metoda place ce primește ca argumente dimensiunile elementului și poziția relativă.
Fig 4.37 Aspectul inițial al interfeței grafice
Butonul conn_button este responsabil de inițierea evenimentului de conectare prin socket la modulul de achiziție. În capitolele precedente s-a observat că pentru conectarea prin socket este nevoie de apelarea unei metode de asteptare a conexiunii (listen) ce blochează aparent execuția programului. Aici apare o contradicție cu faptul că interfața grafică necesită o execuție în buclă infinită continua. Astfel că, la apelul metodei listen, programul va îngheța și interfața grafică se blochează. Soluția este reprezentată de crearea unui fir de execuție separat pentru gestionarea paralelă a conectării socket. În plus, comunicația între firul de execuție creat și aplicația grafică se va face printr-o structură de comunicație inter-proces de tip coadă.
Fig 4.38 Paralelizarea funcției asociate butonului de conectare
La apăsarea butonului de conectare este apelată metoda connection asociată. Butonul este dezactivat pentru a nu mai putea genera evenimentul de conectare ulterior. Este creată o instanță de coadă (queue) prin care se va face comunicația inter-proces. Se crează un fir de execuție pentru funcția de conectare (connectThread) în care se așteaptă apariția unui client pentru socket-ul server și se transmite pe coadă o semnalizare pentru interfața grafică. În ultima linie a funcției connection este aplelată funcția listen_on_queue care verifică o data la 100 de milisecunde dacă este ceva scris în coadă. În situația în care a fost transmis mesajul de conectare se schimbă culoarea butonului de conectare și apare în interfața grafică un text sugestiv, dar și un buton suplimentare de vizualizare sub formă grafică a mișcărilor observate până la un anumit moment.
Fig 4.39 Interfața grafică înainte (stânga) și după (dreapta) conectare
Butonul de vizualizare deschide o nouă fereastră în care este afișat istoricul activităților clasificate până în momentul respectiv. Etichetele mișcărilor clasificate și momentele de timp la care s-a făcut clasificarea sunt salvate anterior într-un dicționar.
Fig 4.40 Metoda de vizualizare a istoricului de activități
Fig 4.41 Fereastra de vizualizare a istoricului activităților
Concluzii
Implementarea unui astfel de sistem de recunoaștere a activităților fizice a presupus în primul rând integrarea unor concepte și metodologii noi. Pentru că fiecare etapă de proiectare este puternic corelată de restul etapelor, un sistem fiabil și funcțional poate fi obținut doar prin respectarea fiecăreia în parte.
Principalul avantaj al implementării prezentate este reprezentat de gestionarea unei statistici relativ restrânse. Au fost obținute performanțe comparabile cu cele ale unor aplicații ce manipulează colecții de date inerțiale mult mai vaste și diversificate. Inclusiv colectarea de date inerțiale proprii reprezintă o contribuție personală și un efort pentru susținerea unui sistem autarhic. Alegerea colectării de date, în detrimentul folosirii unei colecții publice deja existente, a venit și ca o constrângere hardware. Un model bun de rețea neurală trebuie antrenat pe același format de date ca cel al achiziției în timp real, iar pentru modulul inerțial folosit nu există colecții de date înregistrate sau unele similare cu aceeași frecvență de eșantionare sau precizie de biți.
Compensarea statisticii reduse se face prin extragerea unor trăsături consistente din semnalele de la accelerometru și giroscop. Acest lucru a fost posibil prin tehnici de prelucrare digitală a semnalului. Extragerea unui set larg de parametrii statistici și a comportamentului de frecvență oferă informație superioară calitativ. Prin prelucrarea fiecărei fereastre de semnal este asociat un set de 198 de trăsături, ceea ce aduce instant un plus densității de informație necesară antrenării modelului de rețea neurală.
Modelul de perceptron multi-strat este unul compact, cu doar două straturi ascunse de 84, respectiv 48 de neuroni. Alegerea potrivită a hiper-parametrilor de model și a modului de antrenare a adus un plus arhitecturii. S-a ținut cont și de faptul că aplicația de clasificare rulează pe un sistem de calcul de uz general, cu anumite limitări de performanță, astfel că proiectarea modelului s-a făcut pe un nucleu de învățare supervizată specific. A fost folosită o distribuție de Anaconda cu o serie de module Python open-source extrem de utile în orice aplicație științifică. Codul scris a urmărit să îndeplinească unele principii generale: simplitate, modularizare, sugestivitate și claritate.
Pe lângă succesul implementării, abordarea de față poate reprezenta și un punct de reper pentru proiecte sau dezvoltări ulterioare în această direcție. Astfel a fost îndeplinită și rezoluția impusă în partea introductivă prin care, pe lângă funcționalitatea finală, se urmărește ca proiectul să reprezinte un exemplu de tratare hardware-software a conceptelor expuse.
Lista figurilor
Fig 1.1 Micro-structură mecanică: motor în tehnologie MEMS în comparație cu un fir de păr [2] 4
Fig 1.2 Structură tipică de traductor MEMS [4]: (a) Design piezorezitiv (b) Design capacitiv 5
Fig 1.3 Accelerometru cu masa atașată prin resoarte de cadrul de referință 5
Fig 1.4 Modul în care apar rotațiile pe cele trei axe ale giroscopului 6
Fig 1.5 Primul accelerometru comercial de la Analog Devices [6] (1990): (a) Capsulă de dimensiuni mai mici de 1 cm2 (b) Structura capacitivă microscopică cu armăturile aferente, adâncime de 60 µm 6
Fig 1.6 Clasificarea activităților fizice 7
Fig 1.7 Valorile accelerației înregistrare pe axa de mișcare pentru diferite activități 8
Fig 1.8 Achiziționarea unei ferestre dreptunghiulare de semnal și transpunerea efectelor în frecvență [14] 9
Fig 1.9 Achiziție cu ferestre suprapuse de semnal 9
Fig 1.10 Caracteristicile senzorilor folosiți în colecțiile de date urmărite [18] 10
Fig 1.11 [19] (sus) Date achiziționate cu o frecvență de 50 Hz 11
Fig 2.1 Funcția de autocorelație și spectrul de putere asociat pentru [24]: (a) un semnal slab corelat cu el însuși deplasat (b) Cazul limită al zgomotului alb 15
Fig 2.2 Funcții wavelet-principal Daubechies de diferite ordine [26] 17
Fig 2.3 Aspect comparativ între transformata Fourier și cea Wavelet [26] 18
Fig 2.4 Reprezentarea tridimensională a coeficienților transformatei Wavelet 18
Fig 2.5 Schema de descompunere Wavelet. Semnalul S trece printr-un banc de filtrare (FTJ + FTS) și rezultă în coeficienții de aproximare, respectiv detaliu 19
Fig 2.6 Funcția Daubechies 2 (db2) și coeficienții filtrelor trece-jos (Lprime), respectiv trece-sus asociate (Hprime) 19
Fig 2.7 Exemplu de descompunere Wavelet pe 4 niveluri 19
Fig 2.8 Numărul de coeficienți rezultat în lipsa (stânga) și în prezența (dreapta) decimării 20
Fig 2.9 Modelul matematic al unui perceptron 21
Fig 2.10 Reprezentarea grafică a funcției sigmoide 21
Fig 2.11 Exemplu de structură clasică MLP 22
Fig 2.12 Reprezentarea grafică a funcției cost [30] 23
Fig 3.1 Capsula MPU-9250 cu diagrama asociată pinilor [45] 25
Fig 3.2 Modul ESP8266 Huzzah Adafruit 26
Fig 3.3 Sesiune de comunicație serială PuTTY pe portul COM7 cu baud rate de 9600 biți/secundă 27
Fig 3.4 Pinul de uz general 0 determină modul de lucru 28
Fig 3.5 Platforma ESPlorer versiunea 0.2.0 ce suportă interpretor Lua sau MicroPython și comenzi AT 28
Fig 3.6 Se activează funcționalitatea WebREPL de pe ESP8266 29
Fig 3.7 (stânga) Se conectează NodeMCU cu PC (dreapta) Client WebREPL în browser 29
Fig 3.8 Configurația master-slave între ESP8266 și MPU-9250 29
Fig 3.9 Configurarea I2C 30
Fig 3.10 (sus) Asamblarea celor două module pe o placă de prototipare 30
Fig 3.11 Configurarea MPU-9250 30
Fig 3.12 Construirea mesajului cu date inerțiale 31
Fig 3.13 Configurarea conexiunii WiFi și a modului de operare 32
Fig 3.14 Consumul de curent din alimentare la pornirea circuitului 32
Fig 3.15 Consumul mediu de funcționare al circuitului (74 mA) 33
Fig 3.16 Arhitectură de socket TCP [35] 34
Fig 3.17 Definirea adresei IPv4 și a portului de comunicație 35
Fig 3.18 Instanțierea obiectului socket server 35
Fig 3.19 Instanțierea obiectului socket client 36
Fig 3.20 Implementarea protocolului în socket client [37] 37
Fig 3.21 Decodarea protocolului în socket server [37] 37
Fig 3.22 Diagrama bloc a sistemului de achiziție 38
Fig 4.1 (stânga) Poziționarea conformă a sistemului de achiziție pe corpul subiectului 39
Fig 4.2 Distribuția mișcărilor pentru fiecare subiect (indicatorul subiectului corespunde oridinii din figura anterioară) 40
Fig 4.3 Fluxul de date primit pe mașina de calcul la rularea scriptului de server 40
Fig 4.4 Diagrama bloc a sistemului de prelucrare a datelor inerțiale 41
Fig 4.5 Parcurgerea structurii de fișiere și ferestruirea semnalelor 42
Fig 4.6 Funcția de extragere a trăsăturilor 43
Fig 4.7 Extragerea trăsăturilor statistice 43
Fig 4.8 Extragerea trăsăturilor de frecvență 43
Fig 4.9 Extragerea trăsăturilor de frecevență suplimentare 44
Fig 4.10 Extragerea coeficienților Wavelet 44
Fig 4.11 Numărul de ferestre extrase pentru fiecare activitate 45
Fig 4.12 Distribuție normală (medie nulă și varianță 1) 45
Fig 4.13 Scalarea trăsăturilor extrase 46
Fig 4.14 Salvarea obiectului StandardScaler prin pickle 47
Fig 4.15 Modulele Python folosite în continuare 48
Fig 4.16 Arhitectura MLP propusă 49
Fig 4.17 (a) Configurația normală a rețelei neurale (b) Configurația rețelei după aplicarea metodei dropout 50
Fig 4.18 Exemplu de răspuns al funcției softmax 50
Fig 4.19 Compilarea modelului MLP 50
Fig 4.20 Segmentarea datelor de antrenare și validare 51
Fig 4.21 Diagrama procedurii de validare încrucișată 5-fold 52
Fig 4.22 Modelarea iterativă pe segmentele extrase 52
Fig 4.23 Evoluția celor două mărimi de-a lungul iterațiilor de validare încrucișată 53
Fig 4.24 Funcția de reprezentare grafică a matricei de confuzie 54
Fig 4.25 Exemplu de matrice de confuzie pentru aplicația curentă 54
Fig 4.26 Scalarea matricei de confuzie 55
Fig 4.27 Matricele de confuzie scalate pentru fiecare iterație de validare încrucișată 55
Fig 4.28 Metricele de confuzie (precizie, rapel, F1) pentru pentru fiecare clasă 56
Fig 4.29 Diagrama bloc a sistemului de prelucrare și aclasificare în timp real 57
Fig 4.30 Modulul folosit pentru paralelizarea firelor de execuție 57
Fig 4.31 Apelarea thread-ului de procesare de date din fluxul de comunicație 58
Fig 4.32 Încărcarea obiectului StandardScaler 58
Fig 4.33 Apelarea modelului de rețea MLP 58
Fig 4.34 Compilarea prealabilă a modelului MLP 59
Fig 4.35 Instanțierea obiectului tkinter 59
Fig 4.36 Definirea clasei de interfață grafică 60
Fig 4.37 Aspectul inițial al interfeței grafice 60
Fig 4.38 Paralelizarea funcției asociate butonului de conectare 61
Fig 4.39 Interfața grafică înainte (stânga) și după (dreapta) conectare 62
Fig 4.40 Metoda de vizualizare a istoricului de activități 62
Fig 4.41 Fereastra de vizualizare a istoricului activităților 63
Lista tabelelor
Tabel 3.1 Registrele de configurație pentru giroscop (sus) și accelerometru (jos) și câmpurile de biți 23
Tabel 3.2 Registrul de control al modului low-power pentru accelerometru 24
Tabel 3.3 Caracteristicile electrice ale MPU-9250 24
Tabel 4.1 Tabel de predicție 53
Lista acronimelor
IoT – Internet of Things
ANN – Artificial Neural Network
MEMS – Microelectromechanical Systems
MLP – Multilayer Perceptron
LPWA – Low Power Wide Area
MCM – Multi-Chip Module
SoC – System-on-Chip
PC – Personal Computer
IMU – Inertial Measurement Unit
API – Application Programming Interface
CPU – Central Processing Unit
API – Graphics Processing Unit
IPv6 – Internet Protocol version 6
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: Software pentru recunoașterea activităților fizice zilnice folosind senzori de mișcare [302155] (ID: 302155)
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.
