Proiect de disertație [306675]

[anonimizat] a oboselii șoferului

Coordonator științific Absolvent: [anonimizat]. [anonimizat]

2018

Anexa 2 (TO DO)

DECLARATIE DE ONESTITATE ACADEMICA (TO DO)

Tabel de figuri

Figură 1.1 – Peisajul tehnologiei automotive 12

Figură 1.2 – Mașină autonomă ([anonimizat]) 13

Figură 1.3 – Mașină electrică (Tesla Model X) 14

Figură 1.4 – Mașină hibridă (Hybrid Synergy Drive) 14

Figură 1.5 – Mașină clean Diesel (Audi R8 V12 TDI) 14

Figură 1.6 – Vehicul cu celule de combustibil (FCV) 15

Figură 2.1 – Sensul transmiterii informațiilor 19

Figură 3.1 – Microsoft LifeCam HD-3000 20

Figură 3.2 – Samsung Galaxy S8 21

Figură 4.1 – Schema bloc a sistemului de detecție a oboselii șoferului 23

Figură 4.2 – Panoul de comandă WinPython 24

Figură 4.3 – Meniu înregistrarea distribuției WinPython 24

Figură 4.4 – Adăugarea de pachete în WinPython 25

Figură 4.5 – Dezinstalare pachete în WinPython 26

Figură 4.6 – Jupyter Lab WinPython 27

Figură 4.7 – WinPython Windows PowerShell 28

Figură 4.8 – Setare 1 (OpenCV 2.4.13) 29

Figură 4.9 – Setare 2 (OpenCV 2.4.13) 30

Figură 4.10 – Setare 3 (OpenCV 2.4.13) 30

Figură 4.11 – Creare proiect (Android Studio) 32

Figură 4.12 – Proiect nou Android (Android Studio) 32

Figură 4.13 – Setare SDK minim (Android Studio) 33

Figură 4.14 – Alegere dispozitiv targetat (Android Studio) 34

Figură 4.15 – Creare dispozitiv virtual (Android Studio) 34

Figură 4.16 – [anonimizat] (Android Studio) 35

Figură 4.17 – Adăugare activitate (Android Studio) 35

Figură 4.18 – Tip-urile zilei (Android Studio) 36

Figură 4.19 – Sincronizarea proiectului 36

Figură 4.20 – Procesul de Build al proiectului 36

Figură 4.21 – [anonimizat] 37

Figură 4.22 – Consola Run 37

Figură 4.23 – Itemii execuției proiectului 38

Figură 4.24 – Logcat-ul proiectului 38

Figură 4.25 – Indexurile celor 68 de coordonate (x,y) – harta detectorului de repere 40

Figură 4.26 – Notificarea audio a unității de comandă și control 45

Figură 4.27 – Modul de trimitere a mesajelor folosind Firebase Cloud Messagingâ 48

Figură 4.28- Notificare în altă aplicație 50

Figură 4.29- Notificare singulară (aplicația mobilă) 51

Figură 4.30 – Notificare multiplă (aplicația mobilă) 51

Figură 4.31 – Interfață utilizator (aplicația mobilă eyeDrive) 51

Figură 4.32 – [anonimizat] 52

Figură 4.33 – Ecran de apelare (in interiorul aplicației mobilă) 52

Figură 5.1 – Detecția feței și a componentelor structural ale feței în imagine (un subiect) 52

Figură 5.2 – Detecția feței și a componentelor structurale ale feței în imagine (doi subiecți) 53

Figură 5.3 – Detecția oculară (testare inițială) – privire în față 54

Figură 5.4 – Șofer adormit (testare inițială) – poziția 1 54

Figură 5.5 – Șofer adormit (testare inițială) – poziția 2 55

Figură 5.6 – [anonimizat] 55

Figură 5.7 – [anonimizat] 56

Figură 5.8 – [anonimizat] 56

Figură 5.9 – [anonimizat] 1 57

Figură 5.10 – [anonimizat] 2 57

Figură 5.11 – Erori conexiune script Python 59

Introducere

Proiectul are ca scop construcția unui sistem de monitorizare și detecția a oboselii șoferilor în trafic. Aceasta va fi dotat cu o cameră atașată unui computer. Astfel, având vedere artificială, se dorește ca acest sistem să aducă o îmbunătățire siguranței transportului de persoane.

În acest lucrare se prezintă inițial o parte teoretică, în care este analizată problematica siguranței în lumea automotive, apoi analiza proiectului va fi detaliată cu arhitectura sistemului în scop. Va fi descris modul de construcție a sistemului de monitorizare și detecție, fiind incluse testele efectuate pentru dezvoltarea acestuia. De asemenea, lucrarea de față cuprinde concluzii și dezvoltări ulterioare pe baza acestui sistem.

Introducere în lumea automobilelor

Astăzi, mai mult ca oricând, tehnologia joacă un rol deosebit de important în industria globală a automobilelor. Transportul conectat, experiența automotive inteligentă, eficiența îmbunătățită a combustibililor reprezintă doar câteva dintre tehnologiile actuale, în continuă dezvoltare.

Producătorii de automobile sunt nevoiți să inoveze în permanența experiența utilizatorilor de automobile, datorită presiunii deosebite a societății. Această presiune provine din preocupările de mediu, a globalizării și ritmul alert de schimbare al societății.

Inginerii din domeniul automotive sunt preocupați de a dezvolta produse care să își mențină utilitatea și în viitor. Prin urmare, este vital ca expertiza acestora să fie pertinentă și să cuprindă perspectivele mai multor tehnicieni vizați în domeniu.

Ingineria bazată pe simulare ajută la dezvoltarea produselor într-un mediu fără riscuri. Această modalitate de dezvoltare a produselor este rapidă și nu implică riscuri la fel de mari ca testarea efectivă a acestora. Simularea ajută la scurtarea timpului de la proiectare la realizarea prototipului.

Fiecare an aduce cu sine numeroase inovații și descoperiri. Astfel, în anul 2017 putem enumera următoarele produse în materie de automotive:

Hakkapeliitta 9

Condusul în condiții de gheață pe șosea a fost întotdeauna o sarcină dificilă chiar și pentru șoferii experimentați. De aceea, această anvelopă de iarnă are în componența sa două tipuri diferite de șuruburi de oțel. Cele medii sunt triunghiulare, cu o margine teșită care crește aderența în timpul accelerării și frânării, iar celelalte sunt în formă de Y pentru a așezare mai bună pe asfalt.

2018 Ford GT

Pentru a putea funcționa la condiții de viteză, mașinile trebuie să îndeplinească o serie de criterii și să țină cont de toate legile fizicii implicate. Astfel, mașina ar trebui să apuce pavajul pe rând, dar să prindă aerul pe drepte. Pentru a raspunde acestor nevoi concurente, Ford GT isi schimba forma. O camă din aripile sale din spate se poate roti, îngrășind profilul spoilerului pentru o aderență mai aerodinamică. Când se merge la maximum de mile pe oră, aripa se retrage și cama se rotește din nou, astfel încât să nu se oprească aerul alunecând până la 216 mile pe oră.

Nuviz

Această invenție a revoluționat experiența motocicliștilor. Aceștia trebuiau să se uite în jos pentru a privi cadrele și ecranele care oferă indicații tehnice precum viteză, hartă etc. Totul se schimbă datorită lui Nuviz, care aduce aceste informații la nivelul ochilor. Astfel, în cască de protecție este proiectată o imagine, al unei hărți și chiar al direcțiilor pas cu pas. De asemenea, are o camă de acțiune care captează fotografii și videoclipuri de la călătorie.

Aplicație „Do not disturb”

Distragerea șoferilor pe șosea a ucis 3,477 de persoane în 2015. Pentru utilizatorii telefoanelor mobile cu sistem de operare iOS, compania Apple a dezvoltat o aplicație care să îi țină focusați. La pornirea aplicației, telefonul va detecta mișcarea automobilului sau va urmări undele Wi-Fi din apropiere. Ecranul rămâne neagru, notificările devin silențioase și orice mesaj primit va genera un răspuns automat de refuz. [16]

Definiții și clasificări ale tehnologiei auto

Ingineria automobilelor este o ramură a ingineriei care se ocupă cu tot ce ține de automobile și practici pentru a le propulsa. Automobilul este un vehicul condus de un motor cu combustie internă și este utilizat pentru transportul pasagerilor și bunuri pe teren. Automobilul poate fi, de asemenea, definit ca un vehicul autonom.

Tehnologia automobilelor descrie domeniul divers de tehnologie de integrare în vehicule sau mașini autopropulsate.

Tehnologia pentru automobile (numită și tehnologia auto) este pur și simplu intersecția dintre transportul auto și tehnologiile inovatoare. Aceasta acoperă un grup foarte divers de tehnologii și are numeroase subcategorii, dintre care multe sunt industrii întregi, cum ar fi automobilele electrice.

Figură 1.1 – Peisajul tehnologiei automotive

Sursa: [23]

Dorința societății de a fi mereu conectată, asociată cu eficiențele aduse o dată cu noile tehnologii, s-a dovedit a fi o relație sinergică atât pentru companiile auto, cât și pentru cele de tehnologie. Inovațiile precum mașinile hibride și mașinile electrice ecologice și conectivitatea Bluetooth pentru mâini libere pentru a vorbi la telefon, păstrând ambele mâini pe volan au schimbat transportul auto pe termen nedefinit. După cum se presupune, domeniul tehnologiei auto se preconizează că va continua să crească și să se dezvolte cu mijloace mai eficiente și mai sigure de transport, cum ar fi autovehicule autonome. [19]

Domeniul auto este atât de larg încât necesită o clasificare a ramurilor sale. Astfel, se poate clasifica în:

In-Car: se referă la tehnologiile folosite de către pasagerii automobilului. Sunt incluse castile Bluetooth fără mâini pentru telefoanele mobile, navigația și sistemul multimedia de entertainment al mașinii.

Motor și trenul de rulare: se referă la tehnologiile folosite în mecanica și propulsia autovehiculului. Ultimii zeci de ani au adus cu sine o creștere accelerată a inovațiilor în materie de mecanisme ale motorului etc., dând naștere la o varietate de noi tehnologii:

Mașini autonome self-driving (Figura 1.2)

Figură 1.2 – Mașină autonomă (Google self-driving project)

Sursa: [23]

Mașini electrice (Figura 1.3)

Figură 1.3 – Mașină electrică (Tesla Model X)

Sursa: [19]

Mașini hibride (Figura 1.4)

Figură 1.4 – Mașină hibridă (Hybrid Synergy Drive)

Sursa: [22]

Mașini bazate pe diesel clean (Figura 1.5)

Figură 1.5 – Mașină clean Diesel (Audi R8 V12 TDI)

Sursa: [19]

Vehicul cu celule de combustibil (FCV) (Figura 1.6)

Figură 1.6 – Vehicul cu celule de combustibil (FCV)

Sursa: [19]

Infrastructura tehnologiilor: se referă la tehnologiile folosite în transportul auto, dar nu este legată de acesta în mod automat. Unele dintre cele mai prolifice forme ale tehnologiei auto din domeniul infrastructurii sunt:

Aplicații de sharing a călătoriilor, precum Uber sau Lyft;

Stații de încărcare a vehiculelor electrice;

Orașe inteligente conectate.

Inovații în domeniul siguranței automobilelor

Controlul în timp real al aplicațiilor critice de siguranță reprezentă o provocare pe termen lung pentru ingineri. Frecvența schimbării produselor de pe piața auto și standardele industriale din ce în ce mai sofisticate obligă

Funcțiile aplicațiilor devin din ce în ce mai complexe, iar standardele industriale necesită concepte de siguranță funcționale mai sofisticate atât pe piețele auto, cât și pe cele industriale. Freescale a introdus programul SafeAssure pentru a ajuta producătorii de sisteme să realizeze cu mai multă ușurință conformitatea cu viitoarea Standarde Internaționale de Standardizare (ISO) 26262 și standardele existente ale Comisiei Electrotehnice Internaționale (IEC) 61508. Designerii de sisteme pot conta pe soluțiile incluse în programul SafeAssure al Freescale pentru a se ridica la condiții dificile și pentru a fi susținute de documentația necesară și expertiza în materie de siguranță, reducând timpul necesar dezvoltării sistemelor de siguranță.

Descrierea lucrării

Capitolul 2 prezintă scopul și problematica proiectului, fiind creată o schiță a cerințelor arhitecturii. De asemenea, este inclus managementul proiectului.

Capitolul 3 conține detalii referitoare la componenta hardware a proiectului. Este descrisă funcționarea și rolul fiecărei componente implicate.

În capitolul 4 sunt incluse componentele software ale proiectului. Astfel, sunt descrise software-urile folosite și sunt descrise programele folosite.

În cadrul capitolului 5 sunt prezentate testele efectuate în diferite condiții de lumină.

Capitolul 6 este destinat concluziilor și dezvoltărilor ulterioare. De asemenea, sunt prezentate noile tehnologii în materie de siguranță în domeniul autovehiculelor.

Analiza proiectului

Oboseala șoferului și distragerea atenției în timpul călătoriei sunt principalele cauze ale accidentelor rutiere. În ultimii ani, mai multe sisteme de monitorizare a conducătorilor auto au fost propuse pentru a monitoriza activitățile șoferului, în scopul evitării accidentelor. Majoritatea sistemelor existente au structură hardware specializată încorporată și sunt prezente, în mare parte, în vehiculele de lux.

Scopul acestei lucrări este de a realiza un sistem inteligent de monitorizare a oboselii și distragerii șoferului în timpul călătoriilor, utilizând adaptarea șabloanelor adaptive și stimularea adaptivă.

Experimentele sunt realizate cu Python și modul OpenCV integrat, componente care pot fi accesate prin intermediul programului WinPython. Rezultatele experimentului arată că este detectată distragerelor șoferului cu o mare precizie în diferite vehicule și locații ale camerei.

Analiza problemei

De-a lungul timpului au existat numeroase abordări, metode, tehnici și soluții menite să trateze problema detectării figurilor umane în imagini, astfel încât rezultatele să fie cât mai fiabile, precise și performante. Primul sistem de detecție facială a fost dezvoltat în anii '70, în anii '90 fiind necesară o focusare pe updatarea metodelor și tehnicilor de detecție folosite, ca prim pas în detecția automată.

Din punctul de vedere al încadrării ca domeniu, recunoașterea facială face parte din soluțiile care targetează detectarea claselor de obiecte, presupunând localizarea acestora în imagini, considerând condiții de iluminare diferite, orientări și poziționări diverse, scalare și alte particularități.

Totuși, aceasta sarcină a detecției faciale rămâne o cerință dificil de implementat, din cauza complexității feței umane, imposibil de definit considerând niște parametrii cu valori anume, varietatea acestora fiind practic infinită. Complexitatea acestui task nu stă doar în complexitatea feței umane, ci și în varietatea modurilor posibile în care pot apărea figurile umane în imagini 2-D, considerând condiții de înclinare, orientare, intensitatea luminii, cadrul în care apare subiectul ș.a.m.d diferite.

O altă cerință în materie de detecție facială constă în recunoașterea facială în timp real. Au fost implementate diverse metode ce și-au propus acest lucru, realizând mai mult sau mai puțin cu succes. „Performanța sistemelor de detecție a fețelor este dată de două componente: rata/procentul fals-pozitivelor (confuziilor-raportări false ca fețe ale unor regiuni din imagini care nu conțin în realitate o față), precum și rata/procentul fals-negativelor (rateurilor – regiuni ale imaginilor care în realitate conțineau o față, dar care nu au fost raportate ca atare). Pentru un sistem cât mai general, fiabil și robust, acestea trebuie să fie ambele cât mai mici, ideal tinzând spre zero fiecare.” [3]

Unii din factorii care pot influența rata de succes a recunoașterii faciale automate sunt:

Poziția, inclinația și orientarea feței umane (a caracteristicilor faciale) în scop;

Expresia facială a subiectului (geometria feței poate fi influențată de aceasta);

Condiții de iluminare (pentru condiții de noapte, detecția este mai anevoioasă, uneori imposibilă), prezența diferitelor surse de lumină, umbre etc.;

Cadrul în care se încearcă recunoașterea facială (dacă există mai mulți subiecți în cadru, alte elemente disturbatoare);

Prezența sau absența anumitor componente structurale ale feței (prezența mustății, a ochelarilor) etc. Aici se poate menționa și cazul în care anumite componente ale fețe sunt opturate/acoperite din diferite motive;

Performanța camerei cu care este surprinsă imaginea/videoului (lentila și senzorul influențează modul în care imaginea este captată).

Un șofer care adoarme la volan pierde controlul asupra vehiculului, acțiune care duce adesea la un accident cu un alt vehicul sau cu obiecte staționare. Pentru a preveni aceste accidente devastatoare, starea somnolenței șoferului ar trebui monitorizată.

Pentru monitorizarea somnolenței șoferilor, s-au implementat următoarele măsuri:

Măsuri pe bază de vehicul

Sunt monitorizate în mod constant un număr de valori, inclusiv abaterile de la poziția benzii, mișcarea volanului, presiunea asupra pedalei de accelerație etc. și orice modificare a acestora care traversează un prag specific indică o probabilitate semnificativ crescută ca șoferul să fie somnoros.

Măsuri comportamentale

Comportamentul conducătorului auto, inclusiv căscarea, închiderea ochilor, clipirea ochilor, poziția capului etc., este monitorizată printr-o cameră foto și șoferul este avertizat dacă sunt detectate oricare dintre aceste simptome de somnolență.

Măsuri fiziologice

Corelația dintre semnalele fiziologice (electrocardiograma (ECG), electromiograma (EMG), electrooculograma (EoG) și electroencefalograma (EEG)) și somnolența șoferului au fost studiate de mulți cercetători.

Detectarea clipirii oculare este importantă în sistemele responsabile cu monitorizarea vigilenței operatorului uman, de exemplu, în sistemele care subiectul trebuie să privească la ecran fără să clipească, pentru interfețele de calculator care facilizează comunicarea pentru personele cu dizabilități sau pentru protecția anti-spoofing în sistemele de recunoaștere a feței.

Metodele de detecție a oboselii se înpart în două ramuri: active și pasive. Metodele active au un grad mare de precizie, însă acestea sunt destul de scumpe și intruzive (de exemplu, camerele cu infraroșu și alte dispozitive iluminante, ochelari speciali pentru monitorizarea ochilor, dispozitive care pot fi purtate). Spre deosebire de metodele active, cele pasive implică preluarea de imagini de la distanță de către o cameră standard.

Multe metode de detecție automată propuse se bazează pe detecția clipirii într-o secvență video. Alte metode se bazează pe o estimare a mișcării în regiunea oculară.

Cea mai folosită metodă de detecție este cea bazată pe detectorul Viola-Jones, care detectează fața și ochii. Apoi, mișcarea zonei ochiului este estimată prin fluxul optic, prin urmărirea rară a acestuia sau prin diferențierea intensității cadru cu cadru sau prin pragul adaptiv. Această monitorizare este urmată de decizia dacă ochii sunt acoperiți sau nu de pleoape.

O abordare diferită este de a deduce starea ochiului care se deschide dintr-o singură imagine, cum ar fi de ex. prin potrivirea corelației cu șabloanele deschise și închise ale ochilor, o proiecție euristică a intensității imaginii orizontale sau verticale pe regiunea ochiului, un model parametric care se potrivește pentru a găsi pleoapele sau modele de formă activă.

Algoritmul propus estimează pozițiile punctului de referință, extrage o singură proporție scalară – aspect ochi (EAR) – caracterizând deschiderea ochiului în fiecare cadru. În cele din urmă, un clasificator SVM detectează clipirea ochilor ca un model al valorilor EAR într-o fereastră temporală temporară. [2]

Specificarea cerințelor arhitecturii

Pentru a îndeplini sarcinile propuse, sistemul de detecție și monitorizare a oboselii trebuie să fie capabil să:

Să monitorizeze mișcările șoferului;

Să detecteze schimbările în comportamentul șoferului;

Să detecteze clipirea și să contorizeze aceasta;

Să notifice șoferul în momentul în care detectează adormirea acestuia prin:

Unitatea de comandă și control;

Prin dispozitivul mobil cu sistem de operare Android.

Figură 2.1 – Sensul transmiterii informațiilor

Managementul proiectului

Pentru realizarea proiectului a fost necesară întocmirea unui plan de management. Astfel, am considerat următoarele etape:

Documentarea privind software-urile necesare îndeplinirii sarcinilor propuse;

Instalarea Python;

Instalarea modulelor necesare realizarea funcționării sistemului folosind WinPython: OpenCV, dlib, SciPy etc;

Crearea părții software folosind Python și a modulelor necesare;

Crearea parții hardware prin realizarea conectării componentelor necesare;

Testarea și identificarea problemelor configurației sistemului de detecție și alarmare a oboselii șoferilor.

Componenta hardware a sistemului de detecție și monitorizare a oboselii șoferului

Proiectul constă în prelucrarea datelor obținute de la webcam, în scopul detecției oboselii șoferului. Apoi, sistemul trimite notificări către șofer, cu scopul atenționării acestuia.

Așadar, componentele care fac posibilă realizarea acestui proiect sunt:

Unitate de comandă și control;

Webcam;

Telefon mobil cu sistem de operare Android.

Unitatea de comandă și control

Unitatea de comandă și control folosită este laptopul. Pentru dezvoltarea aplicației a fost folosit un laptop Dell XPS 15, având ca sistem de operare instalat Windows 10, procesor 2.2 GHz Intel Core i7 si camera Web HD (720p). Pe acesta a fost instalată distribuția open-source WinPython, mediu în care a fost dezvoltată aplicația în scop.

Pentru testele inițiale, a fost folosită camera web HD incorporată a laptopului.

Camera Web Microsoft LifeCam HD-3000

Aceasta cameră True HD oferă filme luminoase și pline de culoare, care pot fi partajate cu ușurință și postate în diferite site-uri de soocializare, precum Messenger, Facebook, YouTube și Twitter.

Acest periferic permite o atașare simplă la monitor, acest lucru realizându-se cu baza sa de atașare universală flexibilă. Funcționează excelent pentru cei care calatoresc, asigurând sunet foarte clar captat de microfonul omnidirecțional incorporat cu anulare a zgomotului acustic.

Figură 3.1 – Microsoft LifeCam HD-3000

Sursa: [21]

Tehnologia TrueColor asigura luminozitate si culori de calitate superioară în aproape toate condițiile de iluminare, inclusiv lumină redusă și retroiluminare. Senzorul HD 720p asigură redare video pe ecran lat 16:9 la maximum 30 de cadre pe secundă.

Specificațiile tehnice superioare ale acestui dispozitiv au condus la alegerea acestuia pentru a testa aplicația în condiții reale de funcționare.

În al doilea rând, posibilitatea atașării acestuia pe bordul mașinii datorată flexibilității a reprezentat un avantaj.

Telefon mobil cu sistem de operare Android

Telefonul mobil folosit pentru realizarae acestui sistem este Samsung Galaxy S8. Samsung este prima companie care are un smartphone bazat pe noul chipset de top Snapdragon 835. Qualcomm a apelat la fabricile Samsung care pot produce chipset-uri pe arhitectură de 10nm, iar în schimb, Samsung beneficiază de o perioadă de exclusivitate pentru acest model. În anumite regiuni însă, Samsung va oferi Galaxy S8 echipat cu un chipset proprietar, Exynos 8895, care în primele teste pare să fie chiar mai puternic decât modelul Snapdragon. Istoric, versiunea cu Exynos a telefoanelor Samsung se comercializează în România în mod exclusiv.

Samsung a ales o configurație cu 4 GB memorie RAM, 64 sau 128 GB spațiu de stocare, cameră foto „dual pixel” de 12 megapixeli cu stabilizaare optică cu filmare în 4K la 60 de cadre pe secundă și un acumulator de 3.000 mAh pentru varianta „mică”, cu display de 5,8 inchi, sau de 3.500 mAh pentru S8+ cu display de 6,2 inchi.

Figură 3.2 – Samsung Galaxy S8

Sursa: [24]

Display-ul are format neobișnuit de 18,5:9, cu rezoluție de 2.960 x 1.440 pixeli în ambele variante. Acesta este numit „Infinity Display” și are ramă vizibilă în jurul său doar sus și jos, lateralele fiind curbate. Telefonul este acoperit cu sticlă Gorilla Glass 5 pe ambele părți, iar butoanele fizice sunt prezente doar pe rama metalică. Astfel, butonul Home a fost integrat în partea de jos a display-ului, sub acesta, unde se găsește o porțiune „Force Touch”, iar senzorul de amprentă s-a mutat pe spate, lângă camera foto principală. Tot pe spate este poziționată și suprafața de încărcare wireless prin standardul Qi, asemeni modelelor precedente. Nu în ultimul rând S8 este rezistent la apă și praf, fiind certificat cu IP68. [15]

Construcția sistemului de detecție și monitorizare a oboselii șoferului

Sistemul propus are componente hardware și software precum camera mobilă și Android SDK. Ambele componente sunt integrate împreună pentru a înregistra video cu șoferul în timp real și apoi pentru a le procesa pentru detecția în timp real a ochilor. Acest sistem are toate avantajele în sistemele de detecție a oboselii șoferului, cum ar fi urmărirea rapidă și în timp real a ochilor, interferența externă a iluminării este limitată, o mai mare robustețe și o toleranță de precizie pentru mișcarea rapidă a capului/feței. Scopurile principale ale acestui sistem sunt de a se asigura că șoferul se află în stare de veghe în timpul condusului, conducătorul auto se simte confortabil și contribuie la reducerea numărului de accidente.

Pentru a realiza detecția și monitorizarea oboselii șoferului folosind Android și OpenCV, componentele hardware necesare sunt: unitate de comandă și control (laptopul), telefon mobil dotat cu sistem de operare Android (Samsung) și Android SDK.

Componenta software a sistemului de detecție și monitorizare a oboselii șoferului. Notificare și alarmare

Software-ul folosit

Pentru realizarea sistemului am utiilizat software-urile: WinPython, OpenCV și Android Studio.

Figura 4.1 prezintă fluxul de lucru complet al sistemului de monitorizare a driverului, bazat pe OpenCV. Oboseala șoferului și detectarea ochiului se efectuează în mai multe etape.

Camera video captează video-ul la calitate HD. Videoclipul este înregistrat la o viteză de 30 cadre pe secundă. Rezoluțiile acestor cadre sunt reduse la 320×180, iar imaginile color sunt convertite în imagini de dimensiune gri pentru reduce puterea de procesare, ceea ce are drept rezultat o prelucrare de mare viteză.

OpenCV oferă un set de mostre pentru dezvoltatorii Android. Aceste mostre arată cum OpenCV poate fi folosit atât din Java, cât și din nivelul nativ de Android. Există două grupe de probe: mostre pentru Java și C ++ OpenCV API și un grup de aplicații eșantion. Primul grup este numit "Tutorial #" și ia în considerare aspectele importante pentru un începător: folosind OpenCV în Java și C ++, care lucrează cu camera, amestecând ambele apeluri Java și C ++ la OpenCV într-o singură aplicație.

Sample-ul pentru detecția feței – este cea mai simplă implementare a funcției de detectare a feței pe Android. Acesta acceptă două moduri de execuție: disponibil în mod implicit pachetul Java pentru clasificatorul cascadă și apel JNI manual realizat la o clasă nativă care acceptă urmărirea. Chiar și versiunea Java este capabilă să arate aproape de performanța în timp real pe un dispozitiv Google Nexus One. [5]

WinPython

WinPython este o distribuție gratuită portabilă open source a limbajului de programare Python pentru Windows XP / 7/8, conceput pentru oamenii de știință, care suportă atât versiunile Python 2, cât și Python 3 pe 32 de biți și 64 de biți. [6]

Panoul de control WinPython (Figura 4.1) are două funcționalități principale:

Gestionarea pachetelor instalate;

Permite înregistrarea distribuției WinPython în Windows.

Figură 4.2 – Panoul de comandă WinPython

Figură 4.3 – Meniu înregistrarea distribuției WinPython

Înregistrarea distribuției locale WinPython va permite:

Asocierea extensiilor de fișiere (.py, .pyc, .pyo) cu interpretorul Python;

Înregistrarea WinPython ca o distribuție standard Python;

Adăugarea pictogramelor în Windows Explorer;

Modificarea fișierelor cu tab-ul Edit cu IDLE și Edit cu Spyder pentru fișierele cu extensia .py.

Figură 4.4 – Adăugarea de pachete în WinPython

Pentru a instala pachete se pot descarca arhivele ( fișiere cu extensia.tar și .gz) și se pot selecta pentru a fi încarcate în panoul de comandă (Figura 4.3). Unele pachete necesită compilare, astfel încât sunt necesare pachete precompilate. Pachetul Numpy, folosit și în lucrarea de bază, necesită precompilare.

Pentru a vizualiza pachetele instalate, se comută pe tab-ul „Uninstall packages” în WinPython, de unde se poate face și dezistalarea acestora (Figura 4.4).

Figură 4.5 – Dezinstalare pachete în WinPython

Un beneficiu al utilizării distribuției WinPython îl reprezintă testarea funcțiilor și a codului în Python în Jupyter Lab.

JupyterLab este un mediu interactiv de dezvoltare pentru lucrul cu notebook-uri, cod și date. Cel mai important, JupyterLab are suport complet pentru notebook-urile Jupyter. În plus, JupyterLab permite utilizatorilor folosirea editoarelor de text, a terminalelor, vizualizarea diferitor tipuri de fișiere și alte compoente software.

Figură 4.6 – Jupyter Lab WinPython

Am folosit acest tool pentru a testa funcționarea secvențelor de cod, fiind returnate și erorile generate de eventualele greșeli de erori prezente în cod. JupyterLab oferă un nivel ridicat de integrare între fișierele tip document, activități și notebook-uri.Utilizatorii JupyterLab au posibilitatea să:

Ruleze interactiv documente bazate pe kernel sub forma unor fișiere text (Markdown, Python, R, LaTeX etc.) în orice nucleu Jupyter.

Ruleze cod interactiv preluate direct din fișiere text încarcate (.py, .R, .md, .tex, etc);

Să conecteze o consolă de cod care să permit testarea în mod real a acesteia, fără a încarca inutil spatial de stocare al notebook-ului cu fișiere updatate des;

Editeze fișiere cu posiblitatea de preview (JSON, CSV, Markdown etc);

Să reordoneze după bunul plan componența notebook-ului (să modifice ordinea fișierelor, să redenumească, să copieze etc).

De asemenea, tool-ul JupyterLab este construit astfel încât customizarea acestuia să fie facilă și ușor de realizat. Modulului de bază I se pot instala alte extensii, pe lângă extensiile de bază prezente deja în core-ul programului.

Terminalul de comandă pus la dispoziție de WinPython este prezentat în Figura 4.6.

Figură 4.7 – WinPython Windows PowerShell

OpenCV

OpenCV (Open Source Computer Vision Library) este o bibliotecă software de tip open-source, utilizată pentru aplicații ce presupun vederea artificială și prelucrarea de imagini. OpenCV a fost construit pentru a oferi o infrastructură comună pentru aplicații de vedere artificială și pentru a accelera utilizarea percepției mașinii în produsele comerciale. Fiind un produs sub licența BSD, OpenCV face ușor pentru întreprinderi să utilizeze și să modifice codul.

Biblioteca are mai mult de 2500 de algoritmi optimizați, incluzând un set cuprinzător de algoritmi pentru vederea artificială, cât și pentru prelucrarea imaginilor în timp real. Acești algoritmi pot fi folosiți pentru a detecta și recunoaște fețele, pentru a identifica obiecte, clasifica acțiunile umane în înregistrări video, pentru detectarea mișcării camerei și a obiectelor, pentru a extrage modele 3D ale obiectelor. De asemenea, acești algoritmi produc imagini 3D folosindu-se de camere stereo, suprapun imagini pentru a produce o rezoluție de înaltă calitate a unei imagini, găsesc imagini similare dintr-o bază de date de imagini, elimină ochii roșii din imaginile realizate cu ajutorul flash-ului, urmăresc mișcările ochilor, pot recunoaște și stabili markeri într-un peisaj pentru le suprapune cu realitatea augumentată, etc. OpenCV are mai mult de 47 de mii de oameni în comunitatea de utilizatori, iar numărul estimat de download-uri depășește 7 milioane. Biblioteca este utilizat pe scară largă în companii, grupuri de cercetare și de organisme guvernamentale. [18]

Pentru instalarea software-ului OpenCV versiunea 2.4.13.:

am accesat site-ul http://opencv.org/, introducând în caseta de căutare „opencv 2.4.13.” și am descărcat varianta de program pentru Windows, pentru arhitectura pe 64 biți.

După instalare:

am accesat setările computerului. Am făcut acest lucru urmând pașii: My Computer -> Properties -> Advanced system settings.

Figură 4.8 – Setare 1 (OpenCV 2.4.13)

Sursa: [20]

după accesare, scopul este de a adăuga variabilele mediului, care vor fi folosite de OpenCV (Advanced System Settings -> Environment Variables -> New).

Figură 4.9 – Setare 2 (OpenCV 2.4.13)

Sursa: [20]

În căsuța respectivă, am introdus „OPENCV_DIR” la „Variable name” și locația: ”C\opencv\build” la secțiunea Variable value.

apoi, a trebuit să modific variabilele sistemului (Environment Variables -> selectare „Path” -> Edit), punând la Variable value: %OPENCV_DIR%\x86\vc11\bin.

Figură 4.10 – Setare 3 (OpenCV 2.4.13)

Sursa: [20]

În acest mod s-a realizat instalarea OpenCV. [20]

Android Studio

Android este o platformă software și un sistem de operare pentru dispozitive și telefoane mobile bazată pe nucleul Linux, dezvoltată inițial de compania Google, iar mai târziu de consorțiul comercial Open Handset Alliance. Android permite dezvoltatorilor să scrie cod gestionat în limbajul Java, controlând dispozitivul prin intermediul bibliotecilor Java dezvoltate de Google. Aplicațiile scrise în C și în alte limbaje pot fi compilate în cod mașină ARM și executate, dar acest model de dezvoltare nu este sprijinit oficial de către Google. [4]

Pentru trimiterea notificărilor către dispozitivul Android se va folosi programul Android Studio. Astfel, am accesat site-ul web: https://developer.android.com/studio/ [25], de unde am descărcat programul software Android Studio 3.1.3 for Windows 64-bit (758 MB).

„Aplicațiile Android sunt construite ca o combinație de componente care pot fi invocate individual. De exemplu, o activitate este un tip de componentă de aplicație care oferă o interfață de utilizator.

Activitatea "principală" (main) este cea care începe atunci când utilizatorul pune în funcțiune pictograma aplicației, însă aceasta poate accesa o activitate diferită din alte locuri, cum ar fi de la o notificare sau chiar de la o altă aplicație. Alte componente, cum ar fi receptoarele și serviciile de difuzare, permit de asemenea aplicației să efectueze sarcini de fundal fără o interfață de utilizator.” [26]

Un alt avantaj al lucrării cu Android Studio este faptul ca permite adaptarea componentelor în funcție de dispozitivul pe care este încărcată aplicația. Diferențele pot sta în rezoluția aplicației etc. De asemenea, dacă în funcționarea aplicației este nevoie de un alt hardware, de exemplu, un webcam, atunci programul poate interoga dispozitivul cu privire la acesta, pe timpul rulării programului.

Crearea unui proiect Android

În fereastră „Welcome to Android Studio” se selectează „Start a new Android Studio project”.

Figură 4.11 – Creare proiect (Android Studio)

În fereastră nouă deschisă, se apasă: File > New Project. Apoi, în fereastra respectivă, se aleg numele proiectului, numele domeniului și se selectează device-urile targetate.

Figură 4.12 – Proiect nou Android (Android Studio)

Figură 4.13 – Setare SDK minim (Android Studio)

app> java> com.example.myfirstapp> MainActivity: Aceasta este activitatea principală (punctul de intrare pentru aplicația dvs.). Când construiți și executați aplicația, sistemul lansează o instanță a acestei activități și încarcă aspectul acesteia.

app > res > layout > activity_main.xml: Această activitate definește aspectul (layout-ul) pentru interfața de utilizare. Aceasta conține un element TestView cu textul „Hello, world!”

app> manifeste> AndroidManifest.xml: Fișierul AndroidManifest.xml descrie caracteristicile fundamentale ale aplicației și definește fiecare componentă a acesteia.

Gradle Scripts > build.gradle: Există două fișiere cu această denumire: un fișier aparținând proiectului, cel de-al doilea modulului „app”. Fiecare modul are propriu fișier build.gradle.

Rularea aplicației

pe un dispozitiv atașat

Pentru rulare, se atașează un dispozitiv, Samsung Galaxy S8, în proiectul de față, prin intermediul unui cablu USB. În setările telefonului, se urmează pașii: System -> About Phone -> press sever times Build number option -> Developer Options -> Enable USB Debugging. Astfel, la conectarea cablului, dispozitivul va fi detectat (Figura 4.14).

Figură 4.14 – Alegere dispozitiv targetat (Android Studio)

pe un emulator

Pentru rularea pe un emulator, se apasă pe modulul app din fereastra în care se vizualizează componentele proiectului și apoi: Run>Run.

Figură 4.15 – Creare dispozitiv virtual (Android Studio)

În Figura 4.12 sunt prezentate opțiunile disponibile: se pot seta diverse dispozitive (TV, dispozitiv mobil, dispozitiv pentru purtare și tabletă), având predefinite rezoluțiile acestora.

Figură 4.16 – Selectarea API-ului (Android Studio)

Figură 4.17 – Adăugare activitate (Android Studio)

La deschiderea unui proiect, utilizatorului îi sunt oferite sfaturi (tips) pentru o dezvoltare mai facilă (Figura 4.18).

Figură 4.18 – Tip-urile zilei (Android Studio)

Rularea proiectului se generează prin apăsarea butonului Run. Acesta genereaza build-uirea proiectului, care constă în compilarea proiectului și instalarea APK-ului.

Există numeroase instrumente de monitorizare ale proceselor ce vor fi rulate în cadrul unei aplicații.

Înainte de build, proiectul se sincronizează. Dacă informațiile sunt corecte, consola Sync va afișa mesajul de succes din Figura 4.19.

Figură 4.19 – Sincronizarea proiectului

Astfel, procesul de Build se poate urmări într-o fereastră separată, așa cum se poate observa în Figura 4.20. Toate fișierele APK create sunt salvate în nume-proiect/nume-modul/ build/outputs/apk/.

Figură 4.20 – Procesul de Build al proiectului

Evenimentele principale ale proiectului sunt listate în consola Event Log, în figura 4.21 fiind prezentate evenimentele succedate în cazul unui build realizat cu succes. Mesajul afișat pentru succes este: „Gradle sync finished in …”, specificându-se durata procesului de build (1 minut si 14 secunde, în acest caz).

Figură 4.21 – Event log-ul proiectului

În consola de rulare Run (Figura 4.22) se pot urmări toate procesele, încercările de conexiuni, erori etc., care țin de dispozitivul mobil.

Figură 4.22 – Consola Run

Pentru a vedea lista de aplicații ToDos, se privește în colțul din stânga jos al ferestrei Android Studio. Dacă este deschis, utilizatorului i se va oferi o vizualizare a listei cu toate to-do-urile și opțiunile pentru a naviga către fișierele în care se află în proiect (Figura 4.23).

Figură 4.23 – Itemii execuției proiectului

Fereastra Logcat din Android Studio afișează mesaje de sistem, spre exemplu în cazul apariției unei colecții de gunoi și mesaje adăugate la aplicație cu clasa Log. Afișează mesaje în timp real și păstrează un istoric, astfel încât utilizatorul să poată vizualiza mesaje mai vechi (Figura 4.24). În partea din stânga sus a ferestrei este înregistrat automat dispozitivul folosit, iar în centru sus este specificat serviciul Google folosit.

Pentru a filtra informația afișată în funcție de interes, se pot crea filtre, nivele de priorități, afișarea doar a rezultatelor codului aplicației și căutare în log. În mod implicit, logcat afișează doar mesajele de jurnal pentru aplicația care rulează pe dispozitiv.

Figură 4.24 – Logcat-ul proiectului

Programe folosite

4.2.1. Programarea în WinPython

Bibliotecile Python și OpenCV

pip este un sistem de management al pachetelor Python folosit pentru instalarea și gestionarea pachetelor scrise în Python. Numeroase pachete pot fi accesate din sursa default a pachetelor și instalate folosind pip. Începând cu versiunea Python 3.4, acesta este inclus by default în toate installerele binare Python.

Un avantaj major al lui pip este ușurința interfeței liniei de comandă, ceea ce face instalarea pachetelor software Python la fel de ușor ca și emiterea unei comenzi:

pip install some-package-name

Un mediu virtual este un mediu semi-izolat ce permite utilizatorului să creeze setări customizate pentru cerințele unei aplicații anume, permite instalarea pachetelor fără a realiza o instalare pe întreg sistemul.

Instrumentul folosit pentru crearea unui mediu virtual se numește venv și face parte din suita Python începând cu versiunea Python 3.3.

virtualvenv reprezintă o versiune precentă instrumentului de creare de medii virtuale venv. Folosirea acestuia este permisă versiunilor de până la Python 3.4., versiuni ce nu permit instalarea tool-ului venv și nici nu beneficiază de instalarea automată a tool-ului pip.

Bibliotecile sunt colecții de coduri prin intermediul cărora este realizată conectarea ușoară la senzori, afișaje, module, etc.

Se include pachetul SciPy, responsabil cu calcularea distanței euclidiene dintre punctele de referință ale deschiderii ochilor cu scopul calculării deschiderii ochilor (eye ratio). Acest pachet (SciPy) este folosit în toate programele ce au în scop vederea articială, procesarea imaginilor.

Pentru detecția feței și a componentelor feței a fost inclusă librăria imutils. Această librărie include o serie de funcții ajutătoare procesării de imagini, cum ar fi translația, rotirea, redimensionarea, scheletarea și afișarea imaginilor Matplotlib cu OpenCV și Python 2.7 și Python 3. [12]

Includerea acestei librării solicită ca o prerechizită instalarea pachetelor științifice NumPy, SciPy, Matplotlib și OpenCV. După includerea acestora, se instalează pachetul imutils în Python astfel:

pip install imutils

OpenCV-ul cuprinde multe librării. Fiecare dintre ele se ocupă de o altă zonă sau abordare în direcția de procesare a imaginii. Înainte de a utiliza oricare dintre acestea, este necesar ca mai întâi sî se includă fișierele header în care se declară conținutul fiecărui modul individual.

Pentru proiectul în scop am folosit versiunea Python 3.6.5, aceasta fiind cea de-a cincea ediție de întreținere a Python 3.6. Seria Python 3.6 conține multe caracteristici noi și optimizări.

Python este un proiect de dezvoltare open-source, astfel aceasta are o comunitate activă, focusată pe contribuții și update-uri. Avantajul dezvoltării acestui proiect este faptul că software-ul este disponibil open source pentru alți dezvoltatori. Acest fapt contribuie la o colaborare eficientă a contribuabililor, pentru rezolvarea bug-urilor și nu numai.

4.2.1.1. Detecția conturului feței

Detecția feței și a componentelor acesteia constau în două etape.

Detectarea reperelor faciale se încadrează ca fiind un subgrup a problemei de predicție a formelor. Având o imagine de intrare, un predictor de formă încearcă să localizeze punctele cheie de interes de-a lungul formei.

Detectorul de reper facial inclus în biblioteca dlib este o implementare a articolului „ One Millisecond Face Alignment with an Ensemble of Regression Trees” realizat de Kazemi and Sullivan (2014).

Metoda constă în:

Existența unui set de antrenament de repere facială etichetate pe o imagine. Imaginile sunt prelucrate astfel încât coordonatele (x,y) ale structurilor faciale să fie marcate manual.

Probabilitatea distanței dintre perechile de pixeli de intrare.

Considerând setul de antrenament, un ansamblu de arbori de regresie sunt antrenați să estimeze pozițiile reperelor faciale ținând cont de intensitatea pixelilor, nu de vreun proces

Având în vedere aceste date de antrenament, un ansamblu de arbori de regresie este instruit să estimeze pozițiile reperului facial direct din intensitățile pixelilor (adică nu are loc o "extragere a caracteristicilor").

Detectorul de repere preinstruit în interiorul bibliotecii dlib este utilizat pentru a estima locația a 68 (x, y) coordinate, care vor reprezenta o hartă pentru structurile faciale de pe față.

Figură 4.25 – Indexurile celor 68 de coordonate (x,y) – harta detectorului de repere

Aceste adnotări fac parte din setul de date de 68 de puncte iBUG 300-W pe care a fost pregătit predictorul de referință facială. [13]

Pentru realizarea detecției conturului a fost folosită metoda histogramei gradienților orientați și detectarea feței SVM liniare.

Descriptorii de tip histogramă a orientării gradienților, sau descriptori HOG, sunt descriptori de trăsături folosiți în viziunea artificială și în procesarea imaginilor în scopul detecției obiectelor. Aceasta tehnică se bazează pe numărarea apariției gradienților orietați în porțiuni localizate într-o imagine.

„Trăsăturile HOG au fost introduse de Navneed Dalal și Bill Triggs care au dezvoltat și au testat mai multe variante de descriptori HOG, cu diferite organizări spațiale, diferite metode de calcul a gradientilor și diferite metode de normalizare.

Ideea esențială care stă la bază descriptorilor HOG este că aspectul local și formă unui obiect într-o imagine poate fi descrisă de distribuția intensității gradientilor și de distribuția orientării muchiilor. Implementarea acestor descriptori poate fi obținută prin împărțirea imaginii în regiuni conexe mai mici, numite celule, și calcularea, pentru fiecare celulă, a histogramei orientării muchiilor (sau a direcției gradientilor) pe bază pixelilor aparținând celulei. Combinarea histogramelor din celule reprezintă descriptorul imaginii. Pentru o mai bună performanță, histogramele locale pot fi normalizate prin calcularea unei măsuri a intensității pe o regiune mai mare a imaginii, numită bloc, și apoi folosind această măsură pentru normalizarea tuturor celulelor din acel bloc. Această normalizare are că efect o invariantă sporită la schimbarea iluminării, sau la umbre.” [27]

Submodulul face_utils.py inclus în pachetul imutils se folosește îndeosebi în recunoașterea facială. Astfel, acest script include funcțiile rect_to_bb și shape_to_np necesare detecției:

# importa pachetele Python necesare detectiei somnolentei

from collections import OrderedDict

import numpy as np

import cv2

Regiunile faciale pot fi accesate printr-o simplă indexare Python astfel:

Gura poate fi accesată prin punctele [48,68];

Sprânceana dreaptă poate fi accesată prin punctele [17,22];

Sprânceana stângă poate fi accesată prin punctele [22,27];

Ochiul drept poate fi accesat prin punctele [36,42];

Ochiul stând poate fi accesat prin punctele [42,48];

Nasul poate fi accesat prin punctele [27,35];

Bărbia poate fi accesată prin punctele [0,17.

Acești indecși sunt codați în dicționarul FACIAL_LANDMARKS_IDXS al librăriei imutils:

# defineste un dictionar al indecsilor, astfel incat sa fie creata o harta # pentru identificarea componentelor structurale faciale

FACIAL_LANDMARKS_IDXS = OrderedDict([

("mouth", (48, 68)),

("right_eyebrow", (17, 22)),

("left_eyebrow", (22, 27)),

("right_eye", (36, 42)),

("left_eye", (42, 48)),

("nose", (27, 36)),

("jaw", (0, 17))

])

def rect_to_bb(rect):

# prelucreaza forma patrata preluata de libraria dlib si converteste

# in formatul (x, y, w, h) folosit de OpenCV

x = rect.left()

y = rect.top()

w = rect.right() – x

h = rect.bottom() – y

# returneaza un tuplu de (x, y, w, h)

return (x, y, w, h)

def shape_to_np(shape, dtype="int"):

# initializeaza lista de coordonate (x,y)

coords = np.zeros((68, 2), dtype=dtype)

# bucleaza cele 68 de coordonate faciale si

# creeaza tupluri de coordonate (x,y)

for i in range(0, 68):

coords[i] = (shape.part(i).x, shape.part(i).y)

# returneaza lista coordonatelor (x,y)

return coords

Detectorul de repere a dlib-ului va returna un obiect de formă care conține coordonatele 68 (x, y) ale regiunilor faciale.

Se include astfel modulul imutils cu submodulul face_utils în scriptul de recunoaștere facială.

Modulele importate necesare scriptului de detecției sunt:

from scipy.spatial import distance as dist

from imutils.video import VideoStream

from imutils import face_utils

from threading import Thread

import numpy as np

import playsound

import argparse

import imutils

import time

import dlib

import cv2

Pentru a calcula raportul distanțelor dintre reperele verticale ale ochilor și distanțele dintre reperele orizontale ale acestora se folosește funcția eye_aspect_ratio:

def eye_aspect_ratio(eye):

# calculeaza distanta euclidiana dintre

# cele doua seturi de coordonate (x,y) verticale

A = dist.euclidean(eye[1], eye[5])

B = dist.euclidean(eye[2], eye[4])

# calculeaza distanta euclidiana dintre coordonatele orizontale (x,y)

C = dist.euclidean(eye[0], eye[3])

# calculeaza raportul de marime al ochilor

ear = (A + B) / (2.0 * C)

# returneaza raportul de marime al ochilor

return ear

Valoarea returnată (ear) va fi aproximativ egală atunci când ochii sunt deschiși, iar valoarea acesteia va scădea rapid către zero atunci când subiectul clipește.

Dacă ochiul este închis, raportul mărimii ochilor va rămâne din nou aproximativ constant, dar va fi mult mai mic decât raportul atunci când ochiul este deschis.

P entru rularea programului, este necesar ca linia de comandă să includă următoarele argumentele opționale:

–shape-predictor: însoțește calea către detectorul de repere faciale a modulului dlib.

–alarm (argument opțional): alături de comandă se specifică calea către un audio de intrare care să fie folosit ca alarmă.

–webcam: controlează inputul video al camerei incorporate/ USB.

Definim variabila EYE_AR_THRESH , care exprimă deschiderea ochilor. Dacă valoarea acesteia scade sub prag, se va începe numărarea cadrelor în care persoana are ochii închiși.

În cazul nostru, am setat: EYE_AR_THRESH = 0.3 .

Dacă numărul cadrelor în care subiectul are ochii închiși depășește EYE_AR_CONSEC_FRAMES = 25, atunci se va declanșa alarma. Acest parametru se poate modifica pentru a face mai sensibilă sau mai puțin sensibilă detecția clipitului.

Se definește variabila COUNTER, care numără cadrele pentru care deschiderea ochilor este sub pragul agreat (subiectul a adormit). Când aceasta depăsește EYE_AR_CONSEC_FRAMES, atunci valoarea booleană a variabilei ALARM_ON=True și se activează alarma audio.

Biblioteca dlib este însoțită de un detector de repere bazat pe metoda histogramelor orientate pe gradienți și de un predictor de repere faciale inițializate astfel:

print("[INFO] Se creaza predictorul de repere faciale…")

detector = dlib.get_frontal_face_detector()

predictor = dlib.shape_predictor(args["shape_predictor"])

Prin urmare, pentru a extrage regiunile ochilor dintr-un set de repere faciale, trebuie pur și simplu să cunoaștem indicele corect al regiunii (Figura 4.1). Utilizarea acestor indecși fac extragerea matricei zonei fiecărui ochi mult mai ușoară:

# identificare indici faciali corespunzatori ochiului stâng si

# ochiului drept

(lStart, lEnd) = face_utils.FACIAL_LANDMARKS_IDXS["left_eye"]

(rStart, rEnd) = face_utils.FACIAL_LANDMARKS_IDXS["right_eye"]

Având toate aceste componente necesare definite, se începe preluarea de date video astfel:

Se inițializează fluxul de date video VideoStream cu indexul „webcam”:

# pornire fluxul video de date

print("[INFO] Se initializeaza preluarea de imagini…")

vs = VideoStream(src=args["webcam"]).start()

time.sleep(1.0)

Se preiau cadrele video din thread-ul în timp real, se redimensionează și se convertesc în alb negru:

# buclare cadre din fluxul video

while True:

# captureaza cadre din thread-ul video, redimensioneaza

# converteste in alb-negru

Variabila frame citește următorul cadrul, îl redimensioneaza la 450 de pixeli și îl transformă în alb negru:

frame = vs.read()

frame = imutils.resize(frame, width=450)

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

Aplică detectorul facial al bibliotecii dlib ce detectează fețele prezente în fiecare cadru alb negru:

# detecteaza fetele din cadrul alb negru

rects = detector(gray, 0)

Se inițializează detecția zonelor importante ale feței folosind detectorul de repere faciale:

# bucleaza detectia fetei

for rect in rects:

# determina reperele faciale pentru regiunea fetei, apoi

# converteste coordonatele faciale (x, y) intr-o matrice folosind

# matricea NumPy

Pentru fiecare față găsită în cadrul alb negru se aplică detectorul de repere faciale și se convertesc într-o matrice folosind resursa NumPy.

shape = predictor(gray, rect)

shape = face_utils.shape_to_np(shape)

Din matricea NumPy se pot extrage coordonatele (x,y) ale ochilor, ca apoi să fie determine raportul de mărime pentru fiecare ochi.

# extrage coordonatele ochiului stang si al ochiul drept,

# apoi foloseste aceste coordonate pentru a determina raportul de marime al ochilor

leftEye = shape[lStart:lEnd]

rightEye = shape[rStart:rEnd]

leftEAR = eye_aspect_ratio(leftEye)

rightEAR = eye_aspect_ratio(rightEye)

# media raportului de aspect al ochilor

ear = (leftEAR + rightEAR) / 2.0

Se vizualizează conturul ochilor din cadre folosind funcția cv2.drawContours:

# calculare corpul convex pentru ochiul stang si drept, apoi

# vizualizeaza fiecare dintre ochi

leftEyeHull = cv2.convexHull(leftEye)

rightEyeHull = cv2.convexHull(rightEye)

cv2.drawContours(frame, [leftEyeHull], -1, (0, 255, 0), 1)

cv2.drawContours(frame, [rightEyeHull], -1, (0, 255, 0), 1)

Notificarea audio

Pentru aceasta se folosește modulul playsound, care conține un singur lucru – funcția (numită și ea) playsound.

Aceasta necesită un argument – calea spre fișierul audio dorit. Acesta poate fi un fișier local sau un URL. Există un al doilea argument opțional, block, care este setat la True în mod implicit. Setarea la Fals face ca funcția să funcționeze asincron.

Modulul playsound se instalează folosind comanda:

pip install playsound

Definirea funcției audio se face prin comenzile:

def sound_alarm(path):

# activeaza alarma audio

playsound.playsound(path)

Notificarea audio folosind unitatea de comandă și control se realizează prin fișierul audio atașat Figurii 4.11.

Figură 4.26 – Notificarea audio a unității de comandă și control

Detecția somnolenței și alertarea șoferului

Astfel, metoda de detecție a feței presupune verificarea raportului de mărime; dacă acesta se situează sub pragul minim de clipire (ear<0.3), atunci variabila COUNTER se va incrementa:

# verifica daca raportul de marime al ochilor se situeaza sub pragul

# stabilit al clipitului; daca se incadreaza,

# atunci incrementeaza counter-ul de cadre

if ear < EYE_AR_THRESH:

COUNTER += 1

# daca ochii sunt inchisi suficient timp, astfel incat

# nr. de cadre e egal cu valoarea predefinita a EYE_AR_CONSEC_FRAMES,

# atunci alarma se va activa

if COUNTER >= EYE_AR_CONSEC_FRAMES:

# daca alarma nu este activa, activeaza

if not ALARM_ON:

ALARM_ON = True

# verifica daca a fost furnizata calea catre

# un fisier audio, iar daca a fost furnizata,

# porneste alarma audio in background

if args["alarm"] != "":

t = Thread(target=sound_alarm,

args=(args["alarm"],))

t.deamon = True

t.start()

# afiseaza urmatorul mesaj pe cadru video

cv2.putText(frame, "TREZESTE-TE!!!!", (10, 30),

cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)

# daca raportul de marime al ochilor se situaza

# peste pragul clipirii, atunci reseteaza contorul

# si opreste alarma

else:

COUNTER = 0

ALARM_ON = False

În thread-ul video, se desenează conturul ochilor și se afișează valoarea raportului de marime al ochilor:

# deseneaza conturul ochilor

# afiseaza valoarea raportului de ochi

cv2.putText(frame, "EAR: {:.2f}".format(ear), (300, 30),

cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)

# afiseaza thread-ul video

cv2.imshow("Thread-ul video al soferului", frame)

key = cv2.waitKey(1) & 0xFF

Dacă se apasă tasta „q”, thread-ul video se va opri:

# daca se apasa tasta ‘q’, iesi din thread-ul video

if key == ord("q"):

break

# inchide toate ferestrele

cv2.destroyAllWindows()

vs.stop()

Programarea în Android Studio

Notificarea șoferului prin aplicația mobilă Android

Pentru a trimite notificări utilizând platforma Firebase, se importa modulul FCMNotification:

from pyfcm import FCMNotification

Folosind FCM, se poate notifica o aplicație client că e-mailurile noi sau alte date sunt disponibile pentru sincronizare. Se pot trimite notificări pentru a reda și a reține utilizatorul.

Astfel, se realizează conexiunea la API-ul proiectului Firebase:

push_service = FCMNotification(api_key="AIzaSyBIFl4Mah7AOyxroUJzXOAavl_L7t62AFk")

#AAAA_s53xuM:APA91bG_G6zC8cHPIPHlMT8pk4-HQOQexHXerZ5VQYUiKUd_2HWaGC9kq3ltofpswRkbPvCkyd7bmpOeSThGiie26gGqvdxdtZPWATV27NKm9ARmp1HS4cy5R5Pgrv3dRT69AYBpetu9")

Se specifică token-ul aplicației client pentru a realiza conexiunea cu aceasta. Se pot furniza mai multe token-uri corespunzătoare mai multor dispozitive pentru trimiterea notificărilor. Astfel, asignăm variabilei registration_id token-ul dispozitivului targetat:

registration_id = "dD4L5nJbWM0:APA91bFRQbw5SpbjBsTxBhJAx3kFfVFnPk88ZUNY5xYvNKuvRJJ4kegpv2Q86v_1gLwPGPJHfnnQuTR8RWEbzeaqAIygHbObKpQzjk7eEkeOp84XpuBaMrOAgUGDvcxSQ9P6Gttqwa7y"

Aplicația client va primi următoarele informații prin comanda push_service.notify_single_device și, de asemenea, va afișa în linia de comandă rezultatul trimiterii notificărilor:

message_title = "AM DETECTAT SOMNOLENTA!!!"

message_body = "Trezeste-te, ai inceput sa atipesti!"

result = push_service.notify_single_device(registration_id=registration_id, message_title=message_title, message_body=message_body)

print (result)

Serviciul de trimitere de notificări folosind platforma Firebase este detaliat în secțiunea 4.3.2.2.

Implementarea modulului FCM folosind platforma Firebase

Firebase este un serviciu de tip backend care a devenit platformă de dezvoltare a aplicațiilor mobile și web, dezvoltată inițial de Firebase Inc. în 2011 și achiziționată de Google în 2014. Permite stocarea datelor utilizatorilor în timp real în baza sa de date și apoi sincronizarea acestora între utilizatori. Această platformă oferă multe tool-uri, printre care se numără: bază de date în timp real, notificări push, Firebase Analytics, Firebase Authentication, Firebase Cloud Messaging, Firebase Storage, Firebase Storage, Firebase Hosting, Firebase Test Lab pentru Android, Firebase crash reporting, Firebase notification, Firebase App Indexing, etc.

Platforma Firebase a integrat o parte dintre produsele deja existente ale Google, dar a și dezvoltat noi instrumente, în general destinate platformelor mobile (Android, iOS), precum: configurare la distanță, laborator de testare (Test Lab), link-uri dinamice (Dynamic Links), crash, AdMob.

S-a dorit integrarea serviciilor necesare dezvoltării de aplicații mobile în platforma Firebase, astfel încât dezvoltarea să fie accesibilă mai ușor.

Firebase Cloud Messaging (FCM) este o soluție de mesagerie inter-platformă care permite furnizarea în mod fiabil și fără costuri a mesajelor. Utilizând FCM, este posibilă notificarea unei aplicații client că e-mailurile noi sau alte date sunt disponibile pentru sincronizare. Pentru cazuri de utilizare, cum ar fi mesajele instant, un mesaj poate transfera o încărcătură a mesajului de până la 4KB către o aplicație client. [9]

O implementare FCM include două componente principale pentru trimiterea și primirea mesajelor:

Un mediu de încredere, cum ar fi funcțiile Cloud Functions pentru Firebase sau un server de aplicații pe care să se construiască, să se targeteze și să se trimită mesaje.

O aplicație client pentru iOS, Android sau web (JavaScript) care primește mesaje.

Figură 4.27 – Modul de trimitere a mesajelor folosind Firebase Cloud Messagingâ

Pot fi trimise mesaje prin intermediul SDK-ului de administrare sau al API-urilor HTTP și XMPP. Pentru a testa sau pentru a trimite mesaje de marketing sau de angajament cu ajutorul unei direcționări puternice și al unei analize puternice, se poate utiliza și compozitorul Notificări.

Implementarea soluției bazate pe FCM presupune următorii pași:

Setarea FCM SDK-ului

Un SDK (abr. engl. Software Development Kit – Trusă de dezvoltare a programelor) este un set unelte folosite de un programator pentru a scrie programe pentru un anumit sistem de operare, platformă hardware sau pachet de programe existent. SDK-urile conțin de regulă biblioteci sau API-uri apelabile de către programatori. Unele SDK-uri pot veni cu compilatoare, depanatoare și alte unelte. Acestea au de regulă interfețe cu utilizatorul relativ spartane, astfel încît unii programatori preferă să le folosească în combinație cu medii de dezvoltare.

Dezvoltarea aplicației client

Constă în adăugarea gestionării mesajelor, a logicii de abonare la subiecte sau a altor funcții opționale pentru aplicația.client. În timpul dezvoltării, se pot trimite mesaje de testare din tab-ul de notificări.

Dezvoltarea aplicației server

Admin SDK este folosit pentru a crea logica de trimitere ca logica pentru a vă autentifica, a crea cereri de trimitere, a gestiona răspunsurile etc. [9]

Integrarea platformei Firebase în Android și trimiterea notificărilor

Etapele integrării platformei Firebase în mediul Android și adaugarea mesageriei cloud constau în:

Integrarea platformei Firebase în aplicația Android:

Acest lucru se poate realiza folosind asistentul Firebase disponibil în Android Studio sau în mod manual. Pentru modalitatea manuală de setare a modulului Firebase în aplicație, se urmăresc următorii pași:

Se crează un proiect Firebase în consola Firebase.

Se descarcă fișierul de configurări generat automat în urma creării proiectului (google-services.json), iar acesta se copiază în folderul modulului app/ al proiectului.

Se adaugă SDK-ul în fișierul de configurări build.gradle al proiectului, pentru a include plugin-ul corespunzător google service și repozitorul Google’s Maven:

buildscript {

// …

dependencies {

// …

classpath 'com.google.gms:google-services:4.0.1' // google-services plugin

}

}

allprojects {

// …

repositories {

// …

maven {

url "https://maven.google.com" // Google's Maven repository

}

}

}

Apoi, în app/build.gradle se adaugă plugin-ul corespunzator google service-ului prin instrucțiunea:

apply plugin: 'com.google.gms.google-services' [10]

Setarea aplicației Android ca și client al mesajeriei cloud a Firebase (Firebase Cloud Messaging):

Considerând platform Firebase deja instalată, se urmăresc următorii pași:

Se adaugă dependența FCM în fișierul de configurări app/build.gradle:

Implementation 'com.google.firebase:firebase-messaging:17.0.0'

Se editează fișierul de execuție (AndroidManifest.xml), adăugând următoarele:

Serviciul FirebaseMessagingService. Acesta este necesar pentru orice mod de trimitere sau primire a mesajelor în aplicații, în afara mesajelor trimise în aplicații care rulează în background.

Serviciul FirebaseInstanceIdService, folosit pentru a targeta anumit dispozitiv/dispozitive.

Canalul default de notificări folosit de FCM este default_notification_channel_id, existând posibilitatea setării altui canal de notificări.

Pentru recepționarea mesajelor pe aplicația mobilă, chiar dacă aceasta rulează în background, se va include serviciul FirebaseMessagingService, având incluse apelurile recursive onMessageReceived și onDeletedMessages.

Timpul aproximativ de recepționare a mesajelor este de aproximativ 10 secunde de la trimitere.

Pentru adăugarea acestui serviciu de mesagerie, se vor include în fișierul de execuție următoarele linii de cod:

<service

android:name=".MyFirebaseMessagingService">

<intent-filter>

<action android:name="com.google.firebase.MESSAGING_EVENT"/>

</intent-filter>

</service>

Figură 4.28- Notificare în altă aplicație

Figură 4.29- Notificare singulară (aplicația mobilă)

Figură 4.30 – Notificare multiplă (aplicația mobilă)

Figură 4.31 – Interfață utilizator (aplicația mobilă eyeDrive)

Figură 4.32 – Ecran de apelare și token-ul aplicației

Figură 4.33 – Ecran de apelare (in interiorul aplicației mobilă)

Testarea sistemului și dezvoltări ulterioare

Detecția feței și a componentelor structurale ale feței în imagini

Figură 5.1 – Detecția feței și a componentelor structural ale feței în imagine (un subiect)

Figură 5.2 – Detecția feței și a componentelor structurale ale feței în imagine (doi subiecți)

Detecția oboselii unui șofer

Rezultatul final dorit este realizarea unui detector de reper facial care poate fi folosit pentru a detecta reperele faciale în timp real, cu predicții de înaltă calitate.

Testarea sistemului s-a desfășurat în două etape:

Testarea inițială, care s-a efectuat într-un mediu cu luminozitate medie, potrivit pentru funcționarea sistemului. S-a testarea corectitudinea transmiterea informațiilor de la sistemul de măsură, către unitatea de comandă și control, iar apoi către dispozitivul Android.

Figură 5.3 – Detecția oculară (testare inițială) – privire în față

Figură 5.4 – Șofer adormit (testare inițială) – poziția 1

Figură 5.5 – Șofer adormit (testare inițială) – poziția 2

Testarea sistemului în condițiile propuse, în mașină, cu luminozitate medie este prezentată în continuare.

Detecția feței când șoferul este treaz:

În urma testelor efectuate, pentru subiectul ales, EAR-ul rezultat corespunzător ochilor deschiși este de aproximativ EAR = 0.37 (Figura 5.3).

Figură 5.6 – Detecția oculară – privire în față

Pentru privirea în lateral (stânga/dreapta), EAR-ul atinge valori între 0.34 și 0.41 (Figura 5.4 și Figura 5.5).

Privirea în lateral (stânga, dreapta):

Figură 5.7 – Detecția oculară – privire în stânga

Figură 5.8 – Detecția oculară – privire în dreapta

Sistemul recunoaște adormirea ca fiind momentul în care EAR-ul scade sub pragul specificat. În cazul analizat, valoarea de prag este setată la EAR=0.30. Astfel, când aceasta valoare scade, sistemul consideră că șoferul a ațipit. În Figura 5.6 și Figura 5.7 se poate observa că valorile deschiderii ochilor poate varia în funcție de poziția șoferului.

Figură 5.9 – Șofer adormit – poziția 1

Figură 5.10 – Șofer adormit – poziția 2

În cazul în care unitatea de control și comandă și dispozitivul mobil nu au acces la internet, atunci codul va returna erori ca în Figura 5.8:

During handling of the above exception, another exception occurred:

…………………………………………………..

File "F:\WinPython\python-3.6.5.amd64\lib\site-packages\urllib3\connection.py", line 150, in _new_conn

self, "Failed to establish a new connection: %s" % e)

urllib3.exceptions.NewConnectionError: <urllib3.connection.VerifiedHTTPSConnection object at 0x000001A8EF5020F0>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed

File "C:\Users\Kristina\AppData\Roaming\Python\Python36\site-packages\requests\adapters.py", line 440, in send

timeout=timeout

File "F:\WinPython\python-3.6.5.amd64\lib\site-packages\urllib3\util\retry.py", line 388, in increment

raise MaxRetryError(_pool, url, error or ResponseError(cause))

urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='fcm.googleapis.com', port=443): Max retries exceeded with url: /fcm/send (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x000001A8EF5020F0>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed',))

File "sistem_monitorizare_sofer.py", line 133, in <module>

exec(open("./sendnotif.py").read())

…………………………………………………………………

File "C:\Users\Kristina\AppData\Roaming\Python\Python36\site-packages\requests\adapters.py", line 508, in send

raise ConnectionError(e, request=request)

requests.exceptions.ConnectionError: HTTPSConnectionPool(host='fcm.googleapis.com', port=443): Max retries exceeded with url: /fcm/send (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x000001A8EF5020F0>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed',))

Figură 5.11 – Erori conexiune script Python

Notificarea audio prin unitatea de comandă și control

Notificarea audio prin unitatea de comandă și control a sistemului se realizează prin alarma sonoră detaliată în secțiunea 4.2.1.2. Această alarmă este menită să alerteze și să trezească șoferul.

Notificarea audio și push notifications prin dispozitiv Android

Notificarea audio a șoferului prin intermediul dispozitivului Android a fost detaliată în secțiunile 4.1.3 și 4.3.2.

Concluzii

Concluziile care pot fi trase după efectuarea analizei, proiectării, testării și evaluării din estimarea oboselii șoferului și proiectarea sistemului de detecție a somnolenței sunt descrise după cum urmează. Cu această rată de exactitate a aplicației în detectarea somnolenței, această aplicație poate fi implementată în timp real pentru a reduce rata accidentelor rutiere datorită șoferilor somnoroși și poate ajuta șoferii să rămână trezi când conduc, dând un avertisment atunci când conducătorul auto este somnoros.

Factori precum distanța și direcția de la cameră la ochi vor afecta achiziția imaginii. Aplicația are dificultăți în detecția ochilor în momentul în care distanța față de camera este prea mică sau prea mare. Aplicația funcționează cel mai bine când distanța dintre ochi este de aproximativ 50 cm. Cea mai bună direcție este de la ochii inferior, deoarece lumina vine din spate. Această aplicație susține teoria că timpul mediu de închidere a ochilor de persoană somnoros este mai mare de 400ms, în timp ce timpul de închidere a ochilor persoanei normale este mai mic de 400ms.

Anexe

Similar Posts

  • Introducere… 4 [627944]

    CUPRINS Introducere………………………………………………………………………………………………………….. 4 Capitolul 1 GENERALITĂȚI DESPRE NAVELE REMORCHERE 1.1.Descrierea generală a navelor de tip remorcher…………………………………………………………… 5 1.2.Tipuri de remorchere……………………………………………………………………………………………….. 5 1.3.Propulsia remorcherelor…………………………………………………………………………………………… 6 1.4.Sisteme de propulsie……………………………………………………………………………………………….. 6 1.5.Remorcherele cu linie de axe……………………………………………………………………………………. 6 1.6.Remorchere azimutale……………………………………………………………………………………………… 7 1.7.Remorchere tractor azimutale……………………………………………………………………………………. 8 1.8.Remorchere tractor Voith Scheider…………………………………………………………………………….. 8 1.9.Formele remorcherelor……………………………………………………………………………………………. 9 1.10.Instalația de remorcaj……………………………………………………………………………………………. 9 1.11.Stabilitatea remorcherelor………………………………………………………………………………………….

  • Nr. 1231 110.06.2014REGIA NATIONALA A PADURILOR – ROMSILVA [601965]

    Nr. 1231 110.06.2014REGIA NATIONALA A PADURILOR – ROMSILVA Administra{ia Parcului Natural Gridigtea Muncelului – Cioclovina R.A. RO 330091 Deva, Aleea Parcului, nr.2l,Tel.lFax: (004) 0254 211569 e-mai I : [anonimizat], web : http ://www. gradiste.ro REFERAT ASUPRA CONTINUTULUI TF,ZEI DE DOCTORAT INTITULATA: ,,CERCETARI PENTRU tNTNNTAREA UryU! PARC NATIONAL IN ZONA RARAA.GIAMALAU "- tn domeniul Silviculturd, elaboratd…

  • VETERINARĂ ION IONESCU DE LA BRAD DIN IAȘI [610171]

    UNIVERSITATEA DE ȘTIINȚE AGRICOLE ȘI MEDICINĂ VETERINARĂ “ION IONESCU DE LA BRAD” DIN IAȘI FACULTATEA DE AGRICULTURĂ LUCRARE DE DISERTAȚIE Coordonator științific, Șef lucr. Dr. Dan BODESCU Absolvent: [anonimizat] – Claudiu ABABEI 2019 UNIVERSITATEA DE ȘTIINȚE AGRICOLE ȘI MEDICINĂ VETERINARĂ “ION IONESCU DE LA BRAD” DIN IAȘI FACULTATEA DE AGRICULTURĂ SPECIALIZAREA ADMINISTRAREA AFACERILOR AGRICOLE EFICIENȚA…

  • Specializarea: INGINERIE ECONOMICĂ ÎN AGRICULTURĂ [310361]

    [anonimizat]: [anonimizat]: Andrei Radu Iova Absolventă: [anonimizat] -2017- CUPRINS ANEXE……………………………………………………………………………………………… Introducere “[anonimizat]: pentru unii este un spațiu periferic al activității agricole sau o zonă a naturii unde se află sate și comune; [anonimizat]. Se poate afirma că spațiul rural este o [anonimizat]: are o economie bazată pe folosirea resurselor naturale și pe producția de bunuri…

  • Natura este o arta inca necunoscuta omului.- Alexander Pope [302283]

    INTRODUCERE ”Natura este o arta inca necunoscuta omului.„- [anonimizat]. De ce Twitter? Deoarece în urma cutremurului din 2011 și a [anonimizat] a [anonimizat] a [anonimizat]. [anonimizat] a [anonimizat], [anonimizat], [anonimizat] a putea evalua riscurile cu care se confruntă și pentru a decide asupra contramăsurilor aplicabile. [anonimizat], foarte relevantă pentru persoanele care locuiesc în imediata apropiere…