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
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: Proiect de disertație [306675] (ID: 306675)
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.
