Ș.l. dr Ing. Andrei TERNAUCIUC Răzvan VÎLCEANU [306629]
[anonimizat]: Student:
Ș.l. dr Ing. Andrei TERNAUCIUC Răzvan VÎLCEANU
Timișoara
2018
Lista figurilor
Figură 1. Semn de circulație inteligent [4] 11
Figură 2. Raspberry Pi Zero (stânga), Raspberry Pi A+ (centru), Raspberry Pi 2 model B (dreapta) 14
Figură 3. Consumul de curent al Raspberry Pi in timpul bootări [7] 16
Figură 4. Componente și porturi Raspberry Pi Zero [17] 16
Figură 5. Raspberry Pi Zero W [8] 17
Figură 6. Camera module v2.1 [8] 18
Figură 7. Python vs Java [13] 22
Figură 8. Input și Output pentru Python 2.x 23
Figură 9. Input si Output pentru Python 3.x 23
Figură 10. Exemplu pentru funcția Canny edge detection [19] 28
Figură 11. Exemplu pentru funcția cv2.blur și cv2.GaussianBlur 32
Figură 12. Exemplu pentru funcția cv2.Canny 32
Figură 13. Exemplu pentru funcția cv2.HoughLinesP 33
Figură 14. Exemplu pentru funcția c2.HoughCircles 34
Figură 15. Exemplu pentru funcția cv2.selectROI 35
Figură 16. Rezultatul algoritmului de testare a locurilor de parcare 39
Figură 17. Rezultatul detecției de colțuri suprapus cu detecția de linii 40
Figură 18. Rezultatul algoritmului pentru detecția automată a locurilor de parcare 42
Figură 19. Rezultatul algoritmului de detecție a cercurilor cu sensibilitate mică 44
Figură 20. Rezultatul algoritmului de detecție a cercurilor cu sensibilitate mare 44
Figură 21. Detecția cercurilor în lumină puternică 45
Anexa 1
Anexa 2
Sinteza lucrării
Lucrarea curenta a fost dezvoltată în cadrul Departamentului de Comunicații al Universității Politehnica din Timișoara. [anonimizat]: octombrie 2017- iunie 2018.
Lucrarea constă într-o metodă de detecție a locurilor libere de parcare printr-o imagine furnizată de o cameră atașată unui Raspberry Pi Zero W. [anonimizat].
Elementele folosite în realizarea acestei lucrări au fost:
[anonimizat] 3.6
[anonimizat]-computerul Raspberry Pi Zero W
[anonimizat]:
Introducere
Acest capitol cuprinde informații generale despre: Internet of Things și conceptul de Smart City. [anonimizat], [anonimizat].
Micro-computerul Raspberry Pi
Acest capitol cuprinde o descriere a micro-computerului Raspberry Pi Zero W, [anonimizat].
Pe lângă informațiile referitoare la Raspberry Pi Zero W, vor fi cuprinse și informații specifice modulului cameră.
3. [anonimizat].
4. Computer Vision
Acest capitol cuprinde o [anonimizat].
De asemenea vor fi prezente și exemple de module specializate în Computer Vision pe lângă cel folosit în dezvoltarea lucrării prezente.
5. OpenCV
Acest capitol cuprinde o prezentare pe larg a modulului specializat OpenCV,
informații despre funcțiile acestuia și detalierea funcțiilor folosite în realizarea lucrării în
concordanță cu particularitățile menționate în capitolul anterior.
6. Proiectarea aplicației
Acest capitol oferă detalii despre viziunea acestei aplicații, procesul de învățare, dar și despre ce a fost necesar în dezvoltarea acesteia
7. Dezvoltarea aplicației
În acest capitol se vor regăsii pașii făcuți pentru a duce aplicația într-un stadiu de prototip
funcțional. Se vor regăsii de asemenea si porțiuni de cod, capturi de ecran si exemple din
anumite stadii ale dezvoltării.
8. Testarea aplicației
Acest capitol cuprinde metodele de testare alese pentru aplicație, rezultatele
acestora, interpretarea rezultatelor, aspecte pro și contra și limitările aplicației.
9. Concluzii
Acest capitol cuprinde concluzionarea interpretări rezultatelor testelor rulate, indicații de folosire, alte metode de realizare ale lucrării și evidențierea motivelor alegerii metodei folosite.
De asemenea, tot în acest capitol, vor fi enumerate și câteva planuri de îmbunătățire și modificări viitoare stadiului de prototip.
Cap 1. Introducere
Conceptul de Internetul Lucrurilor a ajuns in lumina reflectoarelor in 2005 când Uniunea Internațională a Telecomunicațiilor (UIT) a publicat primul raport pe subiect. Raportul UIT adoptă o abordare cuprinzătoare și holistică sugerând că Internetul Lucrurilor va conecta obiectele lumii atât într-o manieră senzorială cât și inteligentă combinând evoluția tehnologică in identificarea elementelor, senzori și rețele de senzori wireless, sisteme încorporate și nanotehnologii.
Aceste sistemele inteligente au început să facă parte tot mai mult din viața contemporană cu scopul de a ușura și simplifica anumite aspecte ale acesteia. Toate acestea fiind posibile datorită internetului de mare viteza care permite comunicarea între dispozitive în timp real
Câteva exemple de astfel de sisteme inteligente ar fi:
Frigiderul capabil de managementul alimentelor
Cuptorul controlat printr-o aplicație mobilă
Termostatul controlat prin aplicație mobilă
Bec controlat prin aplicație mobilă
Optimizarea automată a traficului
Parcare care recunoaște locurile libere și transmite informația printr-o aplicație mobilă/web
Curenta lucrare se încadrează sub acest concept atât prin simpla sa funcționalitate, prin scopul îndeplinit și prin modul de comunicare cu utilizatorul.
În câteva cuvinte, proiectul, prezentat în paginile ce urmează, dorește să facă viața șoferilor din orașele cu trafic intens mai simplă prin înștiințarea acestora de locurile de parcare libere într-un anumit loc sau într-o anumită parcare.
Cap 1.1. Conceptul de Smart City
Permițând acces și interacțiune cu o largă gamă de dispozitive cum ar fi: electrocasnice, camere de supraveghere, senzori de monitorizare, display-uri, vehicule și așa mai departe, Internetul Lucrurilor va găzdui dezvoltarea unor aplicații care pot folosi cantități enorme și variate de date generate de obiecte pentru a furniza noi servicii cetățenilor, companiilor și administrațiilor publice.
Vorbind de un scenariu atât de complex, aplicațiile destinate pentru un Internet al Lucrurilor într-un context urban, este un interes particular, deoarece răspunde insistențelor multor guverne de a se adopta soluțiile oferite de Tehnologiile Informațiilor și Comunicațiilor (TIC) în managementul serviciilor publice, prin urmare, realizând conceptul de Oraș Inteligent (Smart City)
Cap 1.2. Nevoi identificate
Lumea secolului 21 este într-o continuă schimbare, schimbare care dorește să aducă, în principiu, ceva mai bun, ceva mai simplu și accesibil pentru populația planetei. În ultimii 20 de ani s-au schimbat atât de multe lucruri, procese, încât, cateodată, pare o provocare pentru cetățeanul de rând să țină pasul cu tot ce apare nou în materie de tehnologie.
Având în vedere această viteză a tehnologiei se urmărește tot mai mult un anumit set de aspecte secundare ale produselor dezvoltate, caracteristici precum durata de viață, rezistența în diferite condiții meteo, prețul fabricării etc., caracteristici care nu fac neapărat diferențe la modul de utilizare/funcționare, însă reprezintă o calitate mai bună și o flexibilitate mai mare în utilizare.
Timișoara este un oraș în plină dezvoltare din punctul de vedere al unui oraș inteligent, după conceptul de Smart City. Având în vedere mai multe aspecte precum infrastructura, industria și nivelul ridicat de populație cu competențe profesionale dezvoltate în domenii precum ingineria și IT&C, se poate lua în considerare implementarea unei astfel de aplicații la nivel local.
Deși este un oraș cu potențial, Timișoara este un oraș aglomerat din punct de vedere al traficului și al autovehiculelor, aglomerație care se poate descrie cel mai ușor prin parcări care deseori adăpostesc mai multe mașini decât numărul limită, străzi și intersecții blocate, mașini parcate pe trotuare sau spații verzi.
Nevoia unei astfel de aplicații vine din timpul pierdut în căutarea unui loc de parcare. Timpul petrecut în căutarea unui loc de parcare poate să difere în funcție de ora și zonă, însă principala problemă a acestui proces este generarea de trafic suplimentar, spre exemplu: un conducător auto intră într-o parcare cu speranța că va găsi un loc liber, nu găsește, iese din parcare și se îndreaptă spre o altă parcare, nu găsește loc liber nici în a 2-a parcare și se întoarce la prima parcare cu speranța că s-a eliberat un loc. În situația prezentată un autovehicul ,,se plimbă” pe străzi doar pentru a găsi un loc de parcare și în același timp își aduce contribuția la traficul generat. Traficul ar fi diminuat dacă nu ar mai exista astfel de autovehicule deoarece străzile ar putea fi folosite doar pentru a ajunge dintr-un punct A într-un punct B.
Cap 1.3. Scopul lucrării
Această lucrare propune o soluție fezabilă pentru reducerea traficului din orașele aglomerate, reducerea poluării, dar nu în ultimul rând pentru simplificarea unui proces efectuat de conducători auto zi de zi și anume căutarea unui loc de parcare. Scopul propriu-zis se constă în reducerea timpului căutării unui loc de parcare și mai buna distribuție a acestora.
Orașe precum Jacksonville (Florida), Dublin (Irlanda), Madrid (Spania), Berlin (Germania) deja beneficiază de sisteme inteligente de parcare cu ajutorul cărora optimizează gestionarea locurilor de parcare într-un mod mai eficient.
Această aplicație se încadrează în obiectivele necesare unui oraș inteligent și față de alte soluții precum senzori de greutate montați sub fiecare loc de parcare, sau metode care necesita aplicare pentru fiecare loc de parcare in parte, este o soluție relativ ieftină.
Cap 1.4. Problematica abordată
Ideea proiectului a venit în urma unor discuții între prieteni, unul dintre subiectele acesteia fiind frustrările generate de căutarea unui loc de parcare. Această idee a fost amplificată și de lipsa locurilor de parcare in Timișoara și de timpul, relativ lung, pierdut pentru găsirea unui loc de parcare.
După câteva zile de documentare pe această temă s-a format o imagine de ansamblu a ceea ce dorește a fi acest proiect și anume: o cameră de supraveghere îndreptată spre o parcare care să distribuie imagini live către un calculator pe care să ruleze algoritmul de identificare a locurilor de parcare libere, și tot calculatorul să transmit informația pe internet în timp real. După ceva timp, limitările au modificat câteva aspecte ale aceste idei și au dus-o la forma ce urmează: o platformă in miniatură cu 8 locuri de parcare și un raspberry pi care să preia imagini, să determine câte locuri sunt libere și câte sunt ocupate și în același timp să transmită această informație pe internet.
Cap 1.5. Motivația alegerii temei
Secolul XXI mai este numit și secolul vitezei pentru că tehnologia a avansat atât de mult încât a facilitat un mod de viață în care nimeni nu-și mai dorește să piardă timpul într-un mod inutil. Spre deosebire de trecut, unde o scrisoare ajungea de la expeditor la destinatar într-un număr de zile, acum un email poate traversa planeta aproape instant.
Toată această viteză a ajutat la creșterea productivității în sensul că acum nu se mai așteaptă după anumite lucruri, ci acestea se întâmplă mult mai repede. Așadar, puține sunt motivele pentru care putem considera ca timpul este pierdut, cum ar fi statul la anumite cozi, trafic, infrastructură nedezvoltată și, nu în ultimul rând, căutarea unui loc de parcare. Vestea bună este că tehnologia avansează pe zi ce trece și deja sunt în dezvoltare anumite metode pentru a reduce timpul pierdut în situațiile menționate anterior, cum ar fi ghișeele electronice, trafic gestionat automat și parcări inteligente.
Introducerea sistemelor electronice care să faciliteze eficiența și simplitatea vieții de zi cu zi a început cu magazinele online, unde cu ajutorul unui browser web și al unei conexiuni la internet vă puteți face cumpărăturile într-un mod destul de asemănător celui în care mergeți în magazin, alegeți produsul de pe raft, mergeți la casa de marcat, plătiți și vă întoarceți cu produsul acasă. Prin magazinele electronice e chiar mai simplu deoarece căutarea unui produs este făcută de un algoritm special proiectat pentru asta, plata se face direct din contul bancar sau la primirea produsului, iar produsul este adus direct la ușa dumneavoastră fără prea mult efort.
Lucrarea de față își propune să ofere o astfel de facilitate, însă într-o situație total diferită, și anume căutarea unui loc de parcare într-un oraș aglomerat. Imaginați-vă cum ar fi să știți la intrarea într-o parcare dacă aceasta dispune de locuri libere sau nu, sau într-o zonă aglomerată din oraș să existe indicatoare care vă pot ghida spre cel mai apropiat loc liber de parcare sau chiar să fiți notificat prin aplicația de navigație din bordul mașini dacă în apropierea dumneavoastră se află un loc liber de parcare.
Figură 1. Semn de circulație inteligent
Cap 1.6. Informații generale
Această lucrare se compune din mai multe elemente esențiale pentru buna funcționare și îndeplinirea scopului principal. Printre aceste elemente se numără următoarele: algoritmul de detecție, transmisia video live, raspberry pi-ul și camera acestuia și, desigur, o conexiune la internet.
Algoritmul de detecție a locurilor libere de parcare s-a construit în limbajul de programare Python 3.6.5 alături de modulul specializat de Computer Vision OpenCV 3.4.0. Pe lângă modulul specializat menționat anterior, s-au mai folosit și alte module pentru procesare numerică (NumPy), pentru generare de grafice (Matplotlib) și formatare de date (JSON).
Transmisia video live este furnizată de Raspberry Pi printr-un software care monitorizează semnalul primit de cameră numit “Motion”. Acest software deține mai multe funcții și operațiuni ce pot fi folosite împreună cu modulul cameră pentru Raspberry Pi dar ceea ce este important pentru această lucrare, este că acesta poate transmite video live, transformând Raspberryi Pi-ul într-un server de dimensiuni reduse. Transmisia, prin parametri impliciți, se face pe IP-ul Raspberryi Pi-ului prin portul 8081.
Cap 2. Micro-computerul Raspberry Pi
Raspberry Pi este un micro-computer, bazat pe un sistem de operare de tip Linux, capabil să îndeplinească mai multe funcții în același timp. Desigur, acesta fiind de dimensiuni reduse, performanțele sale nu sunt foarte mari, însă realizează cu brio operațiile necesare acestei lucrări.
Unul dintre avantajele majore ale Raspberry Pi este că este ieftin, față de un calculator personal, acesta poate ajunge până la 5% din preț, astfel poate fi folosit în diverse domenii precum educație, rețelistică, sau chiar proiecte complexe prin achiziționarea a mai multor unități și programarea acestora în scopul de a-și împărții resursele.
Cap 2.1. Istoria Raspberry Pi
Raspberry Pi a fost creat in februarie 2012 de către Raspberry Pi Foundation, inițial cu scopul de a promova și de a învăța lucruri de bază despre informatică în școli și licee din Marea Britanie. Inițial au fost lansate doua dispozitive, Model A și Model B, aceste calculatoare variau în specificații și capabilități.
Produsele erau atât de populare datorita prețurilor lor care variau între 25$ și 35$, eficiența și durabilitate, lucru care le-a făcut ușor de modificat și de a dezvolta proiecte pe ele.
În februarie 2014, Raspberri Pi Foundation, au raportat vinderea a 4.5 milioane de plăcuțe și curând după acest succes au lansat Model A+ și Model B+ care prevedeau mai mulți pini GPIO și funcționare la putere scăzută.
În 2015 a fost anunțat modelul Raspberry Pi 2 care avea un procesor cu frecvența mai mare cu 200Hz decât predecesoarele modele (700Hz) și capacitatea memoriei RAM dublată la 1GB.
Cap 2.2. Modele Raspberry Pi
Programarea e amuzantă. E enormă, plină de satisfacții și o distracție creativă. Frumusețea la Raspberry Pi este ca este un computer cu scop general de dimensiuni foarte mici (poate fi puțin mai încet decât unele aplicații rulate pe un sistem Desktop, dar mult mai bun la alte lucruri decât un calculator personal), deci poate face tot ce face un calculator personal. În plus, este destul de ieftin încât poate fi cumpărat cu banii de buzunar strânși în câteva zile.
Când cumperi un Raspberry Pi, cumperi, în principiu un Printed Circuit Board (PCB). Nici măcar nu include un alimentator sau sistem de operare. Pentru că Raspberry Pi utilizează tastatură si mouse standard USB, majoritatea setărilor sunt destul de simple, deci utilizatorul trebuie să se concentreze doar pe sarcinile specifice pentru Raspberry Pi.
Figură 2. Raspberry Pi Zero (stânga), Raspberry Pi A+ (centru), Raspberry Pi 2 model B (dreapta)
Există mai multe modele ale micro-calculatorului Raspberry Pi. Câteva dintre acestea sunt prezentate în figura de mai sus. Diferențele dintre ele sunt reprezentate în tabelul de mai jos:
Tabel 1. Specificații tehnice pentru diferite modele ale Raspberry Pi
Una dintre primele probleme care apar după achiziționarea unui Raspberry Pi este alegerea sursei de alimentare. Soluția acestei probleme se leagă de faptul ca specificațiile electrice specifice unei surse de alimentare potrivite pentru Raspberry Pi oferă o tensiune de 5V DC. Cantitatea de curent pe care sursa de alimentare trebuie să o livreze depinde de modelul Raspberry Pi-ului și de componentele periferice atașate acestuia. Cantitatea minimă de curent pe care ar trebui s-o livreze o sursa de alimentare este de 700mA
În cazul utilizării unei surse ce livrează, să zicem, un curent maxim de 2A, Raspberry Pi-ul nu v-a consuma mai multă electricitate decât în cazul unei surse de 700mA deoarece acesta consumă doar curentul de care are nevoie.
În figura de mai jos se poate observa diferența de curent consumat în timpul bootării între Raspberry Pi 2B si Raspberry Pi B
Figură 3. Consumul de curent al Raspberry Pi in timpul bootări
In continuare, după ce s-a ales sursa de alimentare, se adaugă perifericele dorite (mouse, tastatura, monitor). Mouse-ul și tastatura se conectează, în funcție de model, prin
USB sau microUSB, pentru monitor se foloește portul HDMI sau miniHDMI pentru versiunile zero.
Cap 2.3. Raspberry Pi Zero W
Raspberry Pi zero s-a dovedit a fi unul dintre cele mai populare și vândute modele din gama Raspberry Pi de când a ieșit pe piață în Noiembrie 2015. Totuși, mulți oameni credeau că îi lipsește o caracteristică foarte importantă: internet wireless integrat.
Raspberry Pi Zero W a fost lansat in februarie 2017 și, pe lângă predecesorul său, Raspberry Pi Zero, are internet wireless integrat. Specificațiile acestuia sunt următoarele:
802.11 b/g/n wireless LAN
Bluetooth 4.1
Bluetooth Low Energy (BLE)
1GHz, single-core CPU
512MB RAM
Mini HDMI
2X MicroUSB (alimentare + date)
Figură 5. Raspberry Pi Zero W [8]
Spre deosebire de modelul precedent unde antena era încapsulată într-un cip, Raspberry Pi Zero W are antena printată direct pe placa de circuite. Aceasta se poate observată în figura de mai sus in partea de jos a imaginii, sub procesor, cu o formă triunghiulară.
Cap 2.4. Raspberry Pi Camera
Modulul de cameră a fost oficial de către Raspberry Pi Foundation în 2013 sub numele Camera Module v1 iar in 2016 a fost lansat Camera Module v2, după cum îi spune și numele, acesta este o versiune îmbunătățită. Ambele modele au versiuni infraroșu, numite NoiR.
Acest modul oferă o alternativă la camerele web utilizate împreună cu calculatoarele personale, dar are și avantajul de a se transforma, împreună cu Raspberry Pi-ul într-o cameră de supraveghere cu anumite caracteristici precum activare la detecție de mișcare, transmisie live, stocare de imagini în cloud etc.
În următorul tabel sunt reprezentate specificațiile tehnice ale celor 2 camere:
Tabel 2 Comparație între Camera Module v1 și Camera Module v2
Lucrarea prezentă s-a realizat cu o cameră de tip Camera Module v1.3.
Cap 2.5. Sistemul de operare
Indiferent de cât de performante sunt componentele hardware ale lui Raspberry Pi, fără un sistem de operare, e doar o bucată de silicon, fibră de sticlă și alte câteva materiale. Existe câteva sisteme de operare diferite pentru Raspberry Pi, incluzând RISC OS, Pidora, Arch Linux și Raspbian.
Momentan Raspbian este cel mai popular sistem de operare bazat pe Linux pentru Raspberry Pi. Raspbian este un sistem de operare de tip open-source bazat pe Debian, acesta fiind modificat specific pentru Raspberry Pi.
Cap 3. Limbajul de programare Python
Originile limbajului Python se află în decembrie 1989, unde Guido van Rossum l-a creat dintr-un hobby ca pe un proiect la care să lucreze în perioada sărbătorilor de iarnă. Python s-a născut din limbajul ABC, un proiect terminat de Institutul de cercetare CWI din Olanda pentru care a lucrat si Rossum.
Unul dintre principalele puncta tari ale acestui limbaj a fost suportul său pentru multiple platforme și ușurința cu care s-a răspândit, o inovație vitală pentru zilele primelor calculatoare personale
Python este un limbaj de programare relative ușor de învățat, dar foarte puternic. Acesta are structuri de date de nivel înalt și o abordare simplă dar eficientă asupra programării orientate pe obiect. Sintaxa sa elegantă și scrierea dinamică, împreună cu natura sa interpretată, îl fac un limbaj ideal pentru scripting și aplicații rapide pentru majoritatea platformelor.
Spre deosebire de alte limbaje de programare, Python se remarcă cel mai rapid prin sintaxa sa minimalistă. Acest lucru îi oferă limbajului Python un avantaj față de alte limbaje când vine vorba de ușurința înțelegerii. În figura următoare este prezentată diferența dintre sintaxa limbajului Python și cea a limbajului Java printr-un program ce se găsește în partea introductivă a oricarei cărți sau a oricărui curs de programare, și anume clasicul program ce afișează pe ecran textul “Hello world!”
Figură 8. Python vs Java [13]
Limbajul Python permite scrierea unor programe foarte compacte și ușor de citit. Programele scrise în Python sunt în general mult mai scurte decât programe echivalente în C sau C++ din mai multe motive:
Datele de nivel înalt permit exprimarea de operații complexe într-o singură sintaxă
Gruparea sintaxelor se face prin indentare în loc de begin și end sau acolade
Declararea de variabile sau argumente nu este necesară
Principalele caracteristici ale limbajului Python sunt:
Open source
Extensibil
Interpretat
Portabil
Simplu
Minimalist
Multiparadigmă
Python este un limbaj în continuă dezvoltare, prin urmare este imbunătățit de creatorii acesutia periodic. Ultima versiune lansată este versiunea 3, însă și versiunea 2 este încă folosită în multe aplicații. Toate programele și porțiunile de cod din această lucrare sunt scrise în Python 3.6.
Python 3 are câteva diferențe față de versiunea 2, cele mai importante dintre acestea sunt legate de operatori de împărțire, funcția de print, ASCII/Unicode, xrange sau manipularea erorilor.
Pentru a exemplifica aceste diferențe am ales să folosesc funcția de print, deoarece este una dintre cele mai utilizate funcții dar și una dintre cele mai simple și ușoare de înțeles. În următoarele imagini se poate observa instrucțiunile date ambelor versiuni de Python și rezultatul furnizat de acestea în urma execuției instrucțiunilor.
În urma update-ului la versiunea 3 a limbajului Python, acesta nu mai permite două forme diferite de specificare a argumentelor funcției print ci necesită folosirea formei ce include argumentele funcției între paranteze rotunde.
La nivel global, limbajul de programare Python se clasează printre primele locuri ca și popularitate pe lângă Java, C++, .NET sau C# și este folosit în instituții de renume precum: YouTube, Dropbox, NASA, MIT, Instagram, Google etc.
Cap 4. Computer Vision
Ca oameni, percepem structura lumii din jurul nostru in trei dimensiuni cu ușurință. Gândiți-vă cât de vie este percepția tridimensională când vă uitați la o vază cu flori așezată pe o masă în fața dumneavoastră. Puteți deduce forma și transparența fiecărei petale sub diferite modele de lumină și umbră care se schimbă pe suprafața acesteia fără prea mult efort. Uitându-vă la o poza de grup, puteți număra și numi toate persoanele destul de ușor și chiar să le ghiciți emoțiile în funcție de expresiile faciale. Psihologii perceptuali au petrecut decade încercând să înțeleagă cum funcționează sistemul vizual uman, și chiar dacă aceștia pot concepe iluzii pentru a scoate în evidență anumite principii ale acestuia, o soluție completă în acest domeniu rămâne încă nedescoperită.
Cercetătorii în domeniul Computer Vision au dezvoltat în paralel tehnici matematice pentru recepția formelor și aparențelor tridimensionale ale obiectelor din imagini. În prezent avem tehnici de încredere care pot să calculeze un model 3D parțial al unui mediu înconjurător din mii de poze parțial suprapuse. Putem detecta o persoană mișcându-se într-un fundal complex. Putem chiar să găsim și să numim toate persoanele dintr-o fotografie. Totuși, lăsând la o parte tot acest avans, visul de a avea un calculator care să interpreteze o imagine la același nivel cu un copil de 2 ani, spre exemplu numărarea tuturor animalelor dintr-o poză, pare departe. De ce este vederea atât de dificilă? În mare parte este pentru că vederea este o problemă inversă, în care căutăm să recuperăm unele necunoscute care ne oferă o informație insuficientă pentru a specifica soluția deplină. Trebuie, așadar, să recurgem la modele probabilistice și bazate pe fizică pentru a dezambiguiza potențialele soluții. Oricum, să modelăm lumea vizuală cu toate complexitățile acesteia este mult mai greu decât, să zicem, să modelăm domeniul vocal care produce sunetele vorbite.
În Computer Vision se încearcă să se facă inversul, spre exemplu să descriem lumea pe care o vedem în una sau mai multe imagini și să reconstruim proprietățile acesteia, cum ar fi forma, lumina, și distribuția culorilor. Este extraordinar că oamenii și animalele fac asta fără niciun efort, în timp ce algoritmii de Computer Vision sunt atât de predispuși la erori.
Vestea bună este că Computer Vision este folosit într-o largă varietate de aplicații în lumea reală, care includ:
Recunoașterea caracterelor optice (OCR): citirea codurilor poștale scrise de mână pe scrisori și recunoașterea automata a numerelor de înmatriculare.
Inspecție de mașini: inspecții de calitate a unor componente folosind vedere stereo cu iluminare specializată pentru a măsura toleranțe sau căutarea de defecte în carcase de metal folosind raze X.
Construcție de modele 3D: construcție de modele 3D automata din imagini aeriene folosite in sisteme de navigație cum ar fi Google Maps, Bing Maps etc.
Imagistică medicală: înregistrări pre-operatorii și în timpul operațiilor sau efectuarea de studii pe termen lung pe morfologia creierului uman îmbătrânind.
Siguranța în automotive: detectarea de obstacole neașteptate, cum ar fi pietoni pe stradă, în condiții în care radar-ul nu funcționează corespunzător.
Mișcare în pereche: îmbinarea imaginilor generate de calculator (CGI) cu înregistrări de acțiune live prin urmărire de puncte caracteristice în video-ul sursă pentru a estima mișcarea tridimensională a camerei și formele mediului înconjurător. Asemenea tehnici sunt foarte des folosite la Hollywood în conceperea de filme.
Captura mișcării (mocap): folosirea de markere retro-reflectoare îm captura actorilor pentru animații pe calculator.
Supraveghere: monitorizare în caz de intruși, analiza traficului pe o autostradă, monitorizarea piscinelor în caz de înec.
Recunoaștere de amprentă și date biometrice: pentru autentificări automate sau unele sisteme de siguranță.
Cap 4.1. Module specializate pentru Computer Vision
Pentru a lucra și a dezvolta o aplicație sub conceptul de Computer Vison este recomandată folosirea unor anumite module specializate care au fost dezvoltate special pentru operații specifice domeniului. Aceste module conțin funcții de citire, afișare, salvare și prelucrare a imaginilor care operează algoritmi pe bază de pixeli și matrici de pixeli în moduri specifice pentru fiecare funcție în parte.
Printre modulele specializate în Computer Vision se numără următoarele:
SimpleCV: Un modul open source pentru aplicații de Computer Vision ce oferă acces la funcții puternice colectate din alte module, într-un cadru mai simplu de învățat și de înțeles.
Point Cloud Library (PCL): cadrul PCL este un proiect open source ce oferă o gamă largă de algoritmi pentru filtrare, reconstrucție de suprafață, segmentare etc.
Robot Operating System (ROS): este un întreg sistem de operare pentru scrierea de software pentru roboți include algoritmi specifici Computer Vision, în principiu pentru maparea suprafețelor și recunoașterea de obiecte.
scikit-image: este o librărie specializată pentru Computer Vision exclusivă pentru limbajul de programare Python.
OpenCV: este cel mai popular modul pentru Computer Vision la nivel global ce include foarte multe funcții și algoritmi specifice pentru Computer Vision și este dezvoltat în special pentru aplicații în timp real.
Cap 4.2. Funcții folosite în lucrarea prezentă
Pentru a putea ajunge la stadiul de prototip am efectuat multiple teste cu anumite funcții pentru a stabili care se pliază cel mai bine pentru îndeplinirea scopului acestei aplicații.
În continuare voi face o explicație introductivă legată de funcțiile de bază folosite în această lucrare:
Canny edge detection: această funcție detectează marginile obiectelor aflate în imagine. Algoritmul se bazează pe diferența de culoare (contrast) dintre pixeli învecinați. Rezultatul acestei funcții este o imagine în care marginile obiectelor sunt evidențiate prin culoarea alb, iar fundalul este transformat în negru.
Hough Circle Transform (HCT): este o metodă de extragere a cercurilor din imaginile digitale. Se bazează pe un algoritm care detectează cercurile în imaginile 2D folosindu-se de formula matematică a cercului:
Rezultatul acestei funcții este definit ca o lista ce conține coordonatele centrului cercului (a, b) și ale razei (r). Aceste coordonate sunt folosite de obicei pentru a folosi funcții pentru desenarea cercurilor pe imaginile folosite.
Region of interest (ROI): este o funcție ce preia o regiune dintr-o imagine în funcție de parametrii oferiți. Pentru o înțelegere mai ușoară, această funcție poate fi asemănată cu funcțiile de tip Crop din programe specializate în editare de imagini (Paint, Adobe Photoshop, GIMP)
Acestea au fost funcțiile “cheie” pe care le-am utilizat în dezvoltarea aplicației. Pe lângă acestea am mai fost folosite funcții pentru ajustarea imaginii (blur), ajustarea culorilor (color-> alb-negru), conversie, captură live, plasare de figuri geometrice pe imagine etc.
Cap 5. OpenCV
OpenCV( Open Source Computer Vision Library) este un modul software dedicat pentru Computer Vision și Machine Learning. Acesta a fost construit pentru a să ofere o infrastructură comună pentru aplicațiile de Computer Vision și să accelereze utilizare percepției mașinilor în produsele comerciale.
OpenCV are o gamă de peste 2500 algoritmi clasici și de ultimă oră atât pentru Computer Vision cât și pentru Machine Learning. Acești algoritmi pot fi utilizați pentru detecție și recunoaștere de fețe, identificare de obiecte, clasificarea mișcărilor umane în materiale video, urmărirea mișcarea obiectelor, extragerea de modele 3D ale obiectelor, îmbina imagini împreună pentru a crea imagini de rezoluții înalte, găsirea imaginilor similare dintr-o bază de date, eliminarea efectului de ochii roșii din fotografiile făcute cu bliț, urmărirea mișcărilor ochilor etc. OpenCV are o comunitate de peste 47.000 utilizatori și un număr estimat de descărcări ce depășește 14 milioane. Acest modul este folosit într-un mod extensiv în companii, grupuri de cercetare și organe guvernamentale.
Dezvoltate de companii precum: Google, Yahoo, Microsoft, Intel, IBM, Sony, Honda, Toyota, aplicațiile ce folosesc OpenCV sunt răspândite în toată lumea și pot fi recunoscute prin îmbinarea imaginilor din StreetView, detectarea intrușilor pe camerele de supraveghere in Israel, monitorizarea echipamentelor miniere în China, ajutarea roboților în identificarea și manipularea obiectelor la Willow Garage, detecția înecurilor în piscine în Europa, derularea de artă interactivă în Spania și New York sau inspectarea de etichete pe produsele din fabricile din toată lumea sau detecția facială în Japonia.
Modulul OpenCV are interfețe pentru C++, Java, Python și MATLAB și suportă Windows, Linux, Android și Mac OS. Acesta se inclină mai mult spre aplicații în timp real.
Cap 5.1 Funcțiile OpenCV
Pentru ca această lucrare să ofere o soluție reală, a fost nevoie de un algoritm care să determine dacă un anume loc de parcare, aflat în imaginile oferite de camera atașată Raspberry Pi-ului. Acest algoritm a fost dezvoltat în limbajul de programare Python folosind elemente din modulul OpenCV. În continuare vor fi prezentate funcțiile esențiale acestei aplicații împreună cu explicațiile aferente parametrilor acestora:
cv2.imread(‘imagine.jpg’, 0) – funcția folosită pentru încărcarea imaginilor în cod. Primul parametru este numele imaginii ce se dorește a fii încărcată, iar al doilea determină informația de culoare preluată, pentru alb-negru se folosește 0 și pentru color se folosește 1. Această funcție trebuie stocată într-o variabilă, spre exemplu: img=cv2.imread(‘imagine.jpg’,1)
cv2.imshow(‘imagine’, img) – funcția folosită pentru vizualizarea unei imagini. Primul parametru definește numele ferestrei în care va fi afișată imaginea, iar al doilea parametru specifică variabila în care este stocată imaginea ce se dorește a fi afișată.
cv2.imwrite(‘imagine.png’, img) – funcție folosită pentru salvarea imaginilor în directorul curent. Primul argument este numele cu care va fi salvată imaginea, iar al doilea parametru este sursa imaginii, sau variabila în care este aceasta stocată.
cv2.VideoCapture(0) – funcție folosită pentru captura continuă de imagine. Argumentul acestei funcții reprezintă camera de la care se preiau imaginile, acesta fiind 0, se percep imaginile de la o cameră integrată.
Funcții de desen: cv2.line(), cv2.circle(), cv2.rectangle, cv2.elipse(), cv.putText(). Aceste funcții oferă posibilitatea de a plasa obiecte grafice peste imagini cum ar fi linii, dreptunghiuri, cercuri, elipse și text. De obicei aceste funcții au următorii parametrii: imagine pe care se lucrează, coordonatele punctelor cheie, culoarea liniei formei desenate și grosimea acesteia. Aceste funcții sunt folosite pentru evidențierea anumitor zone din imagine.
cv2.blur(img, (5,5)) – funcție folosită pentru estomparea imaginilor și netezirea marginilor ascuțite. Această funcție este folosită pentru preprocesarea imaginilor deoarece face mai ușoară detecția de forme. Primul parametru este imagine pe care se lucrează, iar al doilea parametru reprezintă mărimea matricei nucleului, lucru care se poate traduce în mărimea matricei de pixeli care ia culoarea mediei culorilor tuturor pixelilor din ea. Această funcție este folosită de multe ori în pereche cu cv2.GaussianBlur() care are ca scop eliminarea zgomotului gaussian din imagini.
cv2.Canny(img, 100, 200) – Această funcție reprezintă una dintre funcțiile cheie pentru funcționarea algoritmului care testează dacă un anume loc este liber în parcare. Ca și în cazul celorlalte funcții, primul parametru reprezintă imaginea pe care se fac modificări, iar parametri 2 si 3 reprezintă limitele inferioare și superioare pentru diferența de culoare între pixeli.
cv2.HoughLinesP() – Această funcție are capabilitatea de a detecta liniile dintr-o imagine. Rezultatul acesteia este definit printr-o lista de forma (x1,y1), (x2,y2) unde x1 și y1 reprezintă coordonatele unde începe o linie, iar x2 și y2 reprezintă coordonatele unde se termină această linie. Cu ajutorul acestor coordonate, liniile detectate în imaginea originală pot fi reconstruite pe o altă imagine goală. Pe lângă parametrul clasic legat de imaginea pe care se efectuează prelucrarea, această funcție dispune de doi parametri pentru sensiblitate. Primul dintre aceștia este numit deseori minLineLength și are rolul de a impune lungimea minimă a unei linii pentru ca aceasta să fie luată în considerare la detecție. Această impunere împiedică detectarea detaliilor din imagine ca și linii. Al doilea parametru se numește deseori maxLineGap și impune o distanță maximă între liniile detectate. Acesta impiedică detecția mai multor linii în locul unei linii mai groase.
cv2.HoughCircles() – Această funcție îndeplinește rolul de a detecta cercurile dintr-o imagine. Rezultatul este o listă ce conține coordonatele centrului cercurilor și raza acestora. Cu aceste coordonate și cu funcțiile de desen se pot evidenția cercurile detectate în imagini. De asemenea este prima funcție din această lucrare ce folosește ca parametru o altă funcție a modulului OpenCV, și anume cv2.HOUGH_GRADIENT. Funcția cv2.HOUGH_GRADIENT furnizează informațiile despre gradientul marginilor cercurilor funcției cv2.HoughCircles(). La fel ca și cv2.HoughLinesP(), funcția cv2.HoughCircles() are câțiva parametri de sensibilitate. Cei mai relevanți dintre aceștia sunt:
param2 este un parametru ce definește sensibilitate detectorului propriu zis de cercuri, cu cât mai mic, cu atât mai multe cercuri vor fi detectate, însă dacă acesta are o valoare prea mare nu va fi detectat niciun cerc.
minRadius și maxRadius sunt doi parametri importanți în situațiile când știm aproximativ care este raza cercurilor pe care vrem să le detectăm. Parametrul minRadius împiedică detecția cercurilor cu raza mai mică decât valoarea acestuia, iar maxRadius împiedică detecția cercurilor cu raza mai mare decât valoarea acestui parametru. Practic, acești doi parametri pot fi văzuți ca doua capete de interval în care se încadrează valorile razelor cercurilor ce dorim să fie detectate.
cv2.selectROI(img) – Această funcție oferă flexibilitate selectării unei regiuni de interes cu ajutorul mouseului. Singurul parametru pe care îl primește este imaginea pe care se dorește prelucrarea. Rezultatul funcției este definit prin 4 valori și anume: punctul de coordonate x, punctul de coordonate y, lățimea și înălțimea regiunii date. Această regiune se poate reconstrui ca o nouă imagine folosind datele returnate de funcție.
Funcțiile amintite mai sus au fost printre cele mai importante în realizarea acestei aplicații. Desigur modulul OpenCV conține mult mai multe funcții decât cele amintite și chiar s-au folosit mai multe funcții din acest modul în dezvoltarea acestei aplicații, însă cele amintite mai sus sunt cele care au contat cel mai mult.
Cap 6. Proiectarea aplicației
În fazele inițiale ale acestei aplicații nu știam exact ce va fi, nu știam metodele necesare pentru dezvoltarea algoritmului sau cum funcționează Raspberry Pi sau de ce era în stare. După câteva ore de navigat pe internet au început să apară idei, acestea fiind inspirate din alte proiecte asemănătoare realizate în jurul lumii.
După câteva zile această aplicație începea să-și formeze un schelet, deși nu știam încă ce algoritmi v-a rula, unde vor fi transmise imaginile, sau dacă va funcționa abordarea aleasă.
Figură 17. Scheletul aplicației
După prima impresie despre cum ar trebui să arate aplicația de față am început să învăț să lucrez cu limbajul de programare Python și modulul OpenCV. Acest lucru a fost puțin dificil la început, nefiind familiar cu sintaxa limbajului Python, dar mai ales cu conceptele legate de Computer Vision. Procesul de învățare a început în luna noiembrie 2017 și nu s-a terminat încă deoarece Python nu este un limbaj doar pentru prelucrări de imagine, ci este un limbaj complex în care se pot crea o mulțime de algoritmi și se poate lucra cu multe tipuri de date, de la operații de bază precum calcule, vectori și matrici până la web design, rețelistică și testare software.
În procesul de învățare și înțelegere al conceptelor de Computer Vision m-am concentrat pe ceea ce era necesar pentru dezvoltarea acestei aplicații, însă în tot acest timp am descoperit diverse moduri de utilizare ale acestui concept, chiar și idei de proiecte foarte entuziasmante.
Ulterior am achiziționat un Raspberry Pi Zero W și am început să urmez cursuri pentru utilizarea acestui calculator.
În final, după câteva luni am început să le pun pe toate cap la cap și să optimizez aplicația existentă pentru un rezultat cât mai satisfăcător.
Cap 7. Dezvoltarea aplicației
Dezvoltarea acestei aplicații a constat în mai multe etape care vor fi enumerate în rândurile ce urmează. Prima etapă a dezvoltării a constat în conceperea algoritmului, aceasta fiind urmată de configurarea Raspberry Pi-ului pentru a transmite și a afișa imaginile preluate de cameră pe un IP local.
Cap 7.1 Dezvoltarea algoritmilor
În primă fază am început să dezvolt algoritmul pentru testarea disponibilității unui loc de parcare. Fazele dezvoltării acestui algoritm sunt următoarele:
Încărcarea unei imagini reprezentative:
img= cv2.imread(‘parking.jpg’,1)
Inițierea funcției de selecție a regiunii de interes:
r= cv2.selectROI (img)
Formarea porțiunii din imagine selectată de funcția ROI:
sub_img= [int(r[1]):int(r[1]+r[3]), int(r[0]):int(r[0]+r[2])]
Evidențierea muchiilor din sub_img:
edg= cv2.Canny(sub_img,100,150)
Obținerea numărului de pixeli din edg:
pix=cv2.countNonZero(edg)
Validarea locului ca liber sau ocupat:
if pix>1500:
#desenează un dreptunghi roșu dacă numărul de pixeli este mai mare de 1500
cv2.rectangle(im, (int(r[0]), int(r[1])), (int(r[0] + r[2]), int(r[1] + r[3])), (0, 0, 255), 3)
else:
#desenează un dreptunghi verde dacă numărul de pixeli este mai mic de 1500
cv2.rectangle(im, (int(r[0]), int(r[1])), (int(r[0] + r[2]), int(r[1] + r[3])), (0, 255 , 0), 3)
În final se afișează imaginea imaginea cu dreptunghiurile roșii sau verzi și numărul de dreptunghiuri verzi, acesta reprezentând numărul de locuri libere de parcare.
După finalizarea acestui algoritm și o analiză amănunțită din punct de vedere al utilizatorului final am constatat că procedeul de a selecta fiecare loc în parte este un disconfort ce ar putea fi eliminat. Așadar am început să caut metode de detecție automată a locurilor de parcare.
Prima abordare a acestei probleme a fost prin încercarea de a detecta colțurile fiecărui loc de parcare, stocarea coordonatelor și folosirea acestora pentru a trasa dreptunghiurile verzi sau roșii. Această metodă a fost reprodusă în următoarele linii de cod.
Încărcarea imaginii:
img= cv2.imread(‘parkinglot.jpg’,1)
Conversia imaginii în alb-negru:
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
Evidențieria muchiilor din imagine:
edg= cv2.Canny(sub_img,100,150)
Detecția liniilor din imagine:
lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength=0,maxLineGap=3)
Desenarea liniilor pe o imagine neagră
contours=np.zeros((height, width,3),np.uint8)
for line in lines:
x1,y1,x2,y2 = line[0]
cv2.line(contours,(x1,y1),(x2,y2),255,2)
Detecția colțurilor
corners= cv2.cornerHarris(gray,2,3,0.04)
corners= cv2.dilate(corners, None)
Evidențierea colțurilor în culoarea roșu
img[corners>0.01*corners.max()]= [0, 0, 255]
Deși această metodă părea la început o soluție reală asupra problemei, s-a dovedit a fi greșită. Se poate observa în imaginea de mai sus că detecția colțurilor nu este foarte precisă și returnează rezultate fals-pozitive. Colțurile detectate la capetele îmbinările și capetele liniilor ar fi fost perfecte ca această aplicație să funcționeze, însă colțurile detectate de-a lungul liniilor dau peste cap algoritmul prin returnarea de coordonate greșite, care nu s-ar fi potrivit cu operațiile ce ar fi trebuit aplicate pentru a testa dacă locul este disponibil sau nu.
O altă abordare pentru detecția automată a locurilor de parcare, și totodată a disponibilități acestora o reprezintă detecția unor cercuri plasate între liniile locurilor de parcare. Desigur, este un sacrificiu ce trebuie făcut și anume desenarea de cercuri pe fiecare loc de parcare însă acest sacrificiu aduce un avantaj considerabil față de metoda anterioară. În următoarele rânduri voi explica algoritmul ce detectează cercurile de pe locurile de parcare și afișează numărul de locuri libere.
Încărcarea imaginii și prelucrarea acesteia pentru rezultate optime
img= cv2.imread(‘circles.jpg’,1)
img= cv2.medianBlur(img, 1)
cimg= cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
l=0
Detectarea de cercuri:
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 0.5, 100, param1=50, param2=40, minRadius=20, maxRadius=30)
Încadrarea coordonatelor cercurilor găsite pe o imagine neagră:
circles = np.uint16(np.around(circles))
Reprezentarea cercurilor pe o imaginea inițială și incrementarea variabilei care returnează numărul de locuri libere:
for i in circles[0,:]:
x, y, r= i[0], i[1], i[2]
cv2.circle(cimg, (x, y), r, (0,0,255) ,2)
l+=1
Afișarea rezultatului și a numărului de locuri libere:
cv2.putText(cimg, "locuri libere: {}".format(str(l)),(10,950), font, 2,(0,255,0),3,cv2.LINE_AA)
cv2.imshow('Original',img)
cv2.imshow('Circles',cimg)
Desigur, toți acești algoritmi au fost dezvoltați pentru o imagine. Având în vedere că această aplicație este bazată pe o transmisie în timp real, acești algoritmi se aplică pentru fiecare cadru oferit de camera. Pentru a nu utiliza resurse într-un mod neeficient, am setat numărul de cadre pe secundă transmise la 2, sau un cadru la fiecare 500ms, în locul celui standard de 30 cadre pe secundă.
Cap 7.2. Configurarea Raspberry Pi-ului pentru transmisia live
După instalarea sistemului de operare Raspbian, Raspberry Pi-ul este gata pentru a începe configurarea acestuia. Înainte de toate, acesta trebuie setat să accepte modulul camera. Următoarele comenzi au rolul de a face Raspberry Pi-ul să transmită imaginile capturate de cameră live pe un IP local:
sudo apt-get install motion – Această comandă va instala software-ul necesar transmisiunii live.
sudo nano /etc/motion/motion.conf – Această comandă deschide fișierul de configurare al softwareului unde trebuie schimbați anumiți parametri:
daemon – trebuie setat pe ON
framerate – trebuie setată o valoare cât mai mare (ex: 100)
Stream_port – alegeți port-ul pe care se vor transmite imaginile (8081 e prestabilit)
Stream_qualty – la fel ca la framerate, o valoare cât mai mare (ex: 100)
Stream_localhost – trebuie setat pe OFF
webcontrol_localhost – trebuie setat pe OFF
quality – setat pe 100
width – setat pe 640
height – setat pe 480
post_capture – setat pe 5
sudo nano /etc/default.motion – În fișierul deschis de această comandă trebuie doar setat parametrul „start_motion_daemon” pe „yes”.
sudo service motion start – Comanda pentru pornirea transmisiei live
În browser, la adresa 192.168.1.4:8081 se pot vedea imaginile provenite de la Raspberry Pi. Adresa menționată diferă între modelele de Raspberry Pi și conexiunea la internet.
Cap 8. Testarea aplicației
Pentru testarea aplicației am folosit o platformă asemănătoare unei parcări cu 8 locuri de parcare. Această platformă a fost realizată dintr-o cutie de carton, iar la baza acesteia am așezat una dintre pozele folosite pentru dezvoltarea algoritmilor.
Testarea s-a făcut din punct de vedere al funcționalității, în anumite condiții și pe transmisie în timp real. Desigur, performanțele unor algoritmi au scăzut în momentul în care nu au mai fost aplicați pe o singură imagine, ci pe 2 imagini pe secundă.
Am început prin testarea algoritmului de detecție a cercurilor. După multiple teste concluzia la care am ajuns este că, deși ar fi o soluție promițătoare pentru detecția automată a locurilor de parcare, această soluție nu este deloc stabilă. Indiferent de valorile parametrilor sunt detectate mai multe sau mai puține cercuri decât cele existente.
În poza din stânga s-a ales sensibilitatea detecției cercurilor relativ mică și de asta sunt atât de multe cercuri, însă și în cazul unei sensibilități ridicate, sunt detectate cercuri care nu există.
Pe lângă rezultatele eronate, acest algoritm are și probleme din punctul de vedere al distanței dintre cerc și camera, în sensul că detectează doar cercurile aflate aproape de cameră. O altă problemă ar fi reflexia luminii, spre exemplu dacă lumina bate puternic peste anumite cercuri, acestea nu vor fi detectate.
Testarea algoritmului în care se oferă coordonatele locului de parcare și este testată valabilitatea acestuia presupune verificarea algoritmului în condiții de lumină scăzută și cazuri în care altceva decât o mașină este pe locul punctat de coordonatele date.
După primele teste am constatat că acest algoritm are o rată mai bună de succes față de algoritmul pentru detecția cercurilor.
După ajustarea parametrilor necesari detecției, am obținut următoarul rezultat. În figura precedentă se poate observa că algoritmul nu este atât de sensibil încât să confunde un pieton cu o mașină, prin urmare locurile de parcare traversate de pietoni, nu vor fi văzute ca și ocupate.
În cazul unei lumini puternice, ca în figura precedentă, acest algoritm generează rezultate eronate, dar semnificativ mai puține decât algoritmul de detecție a cercurilor.
În cazul în care lumina nu este suficientă, algoritmul va genera un rezultat eronat în proporție de 100%. Acest lucru se întâmplă din aceleași motive pentru care nici ochiul uman nu ar putea testa valabilitatea unui loc de parcare în timpul nopții și anume lipsa informației vizuale. Desigur, ochiul uman ar putea realiza testarea valabilității unui loc de parcare în figura de mai sus, însă principiul ce se aplică în aceasta nu are nicio legătură cu algoritmul sau reglarea parametrilor, ci cu felul în care sunt procesate imaginile.
În continuare voi încerca să pun în evidență principalele avantaje și dezavantaje ale acestor doi algoritmi.
Tabel 3. Compararea celor doi algoritmi de detecție a locurilor de parcare
Cap 9. Concluzii
În urma realizării acestei lucrări mi-am dat seama că procesarea de imagini are un rol din ce în ce mai important în domeniile în care se aplică.
Tema aleasă este una de interes general iar abordările alese sunt multiple. Desigur, fiecare abordare are avantajele și dezavantajele ei, însă fiecare își îndeplinește scopul.
Consider că cea mai bună metodă de abordare ale acestei probleme este algoritmul de detecție a valabilității unui loc de parcare prezentat în Cap7. Dezvoltarea aplicației. Această metodă, deși presupune selecția manuală a fiecărui loc de parcare, oferă un rezultat precis și corect asupra valabilității locurilor de parcare, față de soluția de a detecta cercuri pe suprafața fiecărui loc de parcare. Motivul principal pentru care acea soluție nu mi se pare realizabilă este deoarece depinde foarte mult de imagine, în sensul că putem regla parametri pentru a realiza soluția pentru o imagine statică, însă în cazul în care avem 30, 25, sau chiar 2 imagini pe secundă, acești parametri ar trebui reglați de fiecare dată, ceea ce nu reprezintă o soluție momentan.
Soluția prezentată în această lucrare, și anume algoritmul de a detecta valabilitatea unui loc de parcare încadrat în niște anume coordonate, are avantajul de a oferi un rezultat concis asupra valabilității unuia sau mai multor locuri de parcare, însă are și dezavantajul de a oferi rezultate eronate în cazul mișcării camerei. Desigur, la fel ca celelalte aplicații bazate pe Computer Vision, nu poate oferi un rezultat pe timp de noapte sau dacă un alt obiect obturează viziunea camerei. Această soluție mi se pare realizabilă deoarece oferă un rezultat bun, iar singurul dezavantaj major poate fi depășit cu reconfigurări periodice.
Pentru utilizarea acestei aplicații, în primul rând trebuie să dispunem de o conexiune la internet, mai apoi să pornim Raspberry Pi-ul pentru a avea imaginile necesare, iar în final să trasăm manual fiecare regiune de interes apoi să lăsăm aplicația să-și facă treaba.
Pe viitor îmi propun să transpun algoritmul potrivit pe o cameră de supraveghere, într-o parcare reală, să îmbunătățesc algoritmul ce determină valabilitatea unui loc de parcare astfel încât să fie necesare doar două click-uri pentru selecția unui loc de parcare și aceste locuri să poată fi reprezentate prin patrulatere neregulate și nu dreptunghiuri. O altă propunere pentru viitor ar fi introducerea de camere capabile de vedere nocturnă pentru a depăși si obstacolul de nefuncționare pe timp de noapte.
Deși acest tip de aplicație nu este cel mai performant când vine vorba despre valabilitatea locurilor de parcare, pot spune că este printre cele mai ieftine și abordabile soluții. Cred aceste lucruri deoarece nu este nevoie de modificări majore în cadrul infrastructurii pentru a funcționa, iar prețul componentelor cu care poate fi realizat este unul aproape inexistent pentru o instituție sau un oraș ce dorește să dispună de o astfel de dotare
Nu în ultimul rând aș vrea să spun că părerea mea este că viitorul tehnologiei va fi bazat pe aceste tehnologii ce intră sub conceptul de Computer Vision, de la domenii precum automotive și robotică până în industria medicală și educațională
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: Ș.l. dr Ing. Andrei TERNAUCIUC Răzvan VÎLCEANU [306629] (ID: 306629)
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.
