RECUNOAȘTERE DE OBIECTE CU AJUTORUL CAMEREI WEB FOLOSIND REȚELE NEURONALE CONVOLUȚIONALE [304573]
RECUNOAȘTERE DE OBIECTE CU AJUTORUL CAMEREI WEB FOLOSIND REȚELE NEURONALE CONVOLUȚIONALE
PROIECT DE DIPLOMĂ
Author: Darius ARIEȘAN
Coordonator științific: As. univ .dr. ing. Dan GOȚA
Autor: Darius ARIEȘAN
Recunoaștere de obiecte cu ajutorul camerei web folosind rețele neuronale convoluționale
Enunțul temei: Identificarea și recunoașterea cu succes a obiectelor cu ajutorul rețelelor neuronale convoluționale prin itermediul camerei web.
Conținutul proiectului: (enumerarea părților componente) [anonimizat], [anonimizat], Titlul capitolului 1, Titlul capitolului 2,… Titlul capitolului n, Bibliografie, Anexe.
Locul documentației: [anonimizat]: ing. Prenume Nume (dacă este cazul)
Data emiterii temei: 1 Noiembrie 2018
Data predării:
[anonimizat]/BI seria XB nr. 435495, CNP [anonimizat],
autorul lucrării: [anonimizat] a [anonimizat] , [anonimizat], sesiunea Iulie 2019 a anului universitar 2018-2019, [anonimizat], [anonimizat], și în bibliografie.
Declar, [anonimizat] a convențiilor internaționale privind drepturile de autor.
Declar, [anonimizat] a mai fost prezentată în fața unei alte comisii de examen de licență.
In cazul constatării ulterioare a [anonimizat], respectiv, anularea examenului de licență.
Data Prenume NUME
Darius ARIEȘAN
(semnătura)
SINTEZA
proiectului de diplomă cu titlul:
Recunoaștere obiectelor cu ajutorul camerei web folosind rețele neuronale convoluționale
Autor: Darius ARIEȘAN
Conducător științific:Prof.dr.ing. Dan GOȚA
1. Cerințele temei: [anonimizat]-un dosar.
2. Soluții alese: Pentru implementarea acestui sistem s-au folosit librării specializate în machine learning cum ar fi OpenCv și Keras cu TensorFlow cu ajutorul cărora s-au colectat și procesat date și cu ajutorul cărora s-a creat o rețea neuronală convolțională.
3. Rezultate obținute: [anonimizat] o rată de clasificarea a obiectelor mare.
4. Testări și verificări: Pentru testarea peformanțelor s-a [anonimizat], pentru a [anonimizat] 20% din setul de date de intrare.
5. Contribuții personale: [anonimizat].
6. Surse de documentare: [anonimizat]-uri de specialitate sau articole stințiifice în direcția temei alese.
Semnătura autorului
Semnătura conducătorului științific
Introducere
Apariția și dezvoltarea inteligenței artificiale
Încă de când oamenii au venit prima oara cu idea cumputerelor, au visat ca acestea să se dezvolte în mod continuu și să dispună de propria lor inteligență. Am putea spune că cea mai interesantă ramură a inteligenței artificiale este învățarea mecanică(machine learning). Permițând calculatoarelor să învețe să resolve probleme pe cont propriu, învățarea mașinilor a făcut o serie de descoperiri care odată părea aproape imposibilă. Aceasta este motivul pentru care computerele vă pot înțelege vocea, să recunoască un obiect sau fața unui prieten și să vă conducă mașina.
Mulți oameni au contribuit ca aceste lucruri să fie astăzi posibile, dar unul dintre ei s-a remarcat în fața celorlalți, Geoff Hinton, numit și nașul inteligenței artificiale moderne. Geoff s-a gandit că pentru a putea înțelege un dispozitiv cu adevărat complicat, ca un creier, ar trebui să construiești unul. Inpirația lui a venit în cele din urmă de la Frank Rosenblatt, care era un tip ce la finalul anului 1950 a dezvoltat ceea ce el a numit Perceptron, și a fost o rețea neuronală, un sistem de calcul care reușea să imite creierul uman până la un anumit punct. Problema acestei rețele neuronale era ca avea un singur strat de neuroni, ceea ce o facea destul de limitată. Timp de zece ani nimeni nu a vrut să mai cerceteze această arie de care majoritatea erau convinși că nu va funcționa, exceptandu-l pe Hinton.
Geoff Hinton a căutat finanțare pentru visul lui pe la centrele de cercetare din întreaga lume. În cele din urmă a reușit să gasească această finanțare în Canada, la Universitatea din Toronto. Acolo, el și colaboratorii săi au reușit să dezvolte o rețea neuronală cu mai multe straturi, o rețea neuronală profundă care a început să funcționeze din ce în ce mai bine, dezvoltând și câteva tehnologi noi cum ar fi: mașina cu auto-conducere la finalul anilor ’80 și un sistem care ar putea recunoaște cifrele scrise de mână la finalul anilor ’90. Dar din nou ideea inteligenței artificiale a atins un plafon. Tehnologia nu a reușit să functioneze suficient de bine încât să prezinte interesul finanțatorilor pe mai departe din cauza insuficienței datelor și a puterii de calcul.
În anul 2006 lumea s-a prabușit la ideile lui Hilton. Computerele erau mult mai rapide. Procesoarele super-rapide și cantitățile masive de date produse pe internet a dat algoritmilor lui Hilton un impuls magic. Computerele puteau identifica tot ce se afla într-o imagine sau chiar să recunoască vorbirea. Investițiile în ceea ce privește inteligenta artificială au început să crească de la an la an și din ce în ce mai mulți oameni erau interesați de acest domeniu. Au început să apară și universitați care erau specializate pe inteligență artificială și tot ce înseamnă ea.
Interacțiunea dintre om-mașină a început să fie și ea de asemenea tot mai puternică prin crearea de roboți care sunt capabili să imite într-o tot mai mare parte comportamentul uman. Cu toate acestea orice robot este limitat și fiecare poate fi specializat doar pe un singur domeniu, ceea ce îl face mult inferior rasei umane. Totuși, dezvoltarea tehnologiei încă continuă și se încearcă învățarea unui computer de a fi capabil să se dezvolte și să își mărească aria domeniilor de cunoaștere singur, asemenea unui copil care crește. Cu aceste gânduri de dezvoltare infinită vin și anumite temeri din partea oamenilor cum ar fi: Dacă la un un moment dat acești așa-ziși roboți vor prelua controlul asupra lor în totalitate și nu vor mai asculta de cerințele oamenilor și își vor fixa propriile scopuri?
Așadar, inteligența artificială este un pas mare în lumea tehnologiei și nu numai, care după cum am putut observa a avut nevoie de mai bine de cincizeci de ani pentru a înflori cu adevărat și dovedindu-se benefică în facilitarea activitaților oamenilor. Deși la ora actuală este una dintre cele mai căutate tehnologi și crește foarte repede în ceea ce privește răspândirea acesteia în cât mai multe domenii, trececerea de la un nivel la altul al inteligenței artificiale se face destul de greoi, iar pană la marele vis al oamenilor de știință de a face roboții asemenea oamenilor va mai trece ceva timp.
Figura 1.1 Urmările dezvoltării inteligenței artificiale asupra omului
Context general
Viața digitală sporește capacitațile umane și distruge vechile activitați umane. Sistemele bazate pe coduri se extind pe zi ce trece oferind oportunitați nemaiîtalnite anterior. Astăzi, inteligența artificială a dus dispozitivele de imagistică la un alt nivel oferindu-le caracteristici îmbunătățite și tot odata largirea ariei de folosire a acestora. Prelucrarea automată a conținutului imaginii este utilă pentru o mare varietate de sarcini legate de imagine. Pentru sistemele informatice procesarea unei imagi înseamnă trecerea informațiilor la nivel de pixeli și înțelegerea umană a acelorași imagini. Computerele încearcă de acum să pună capăt acestei barieri.
Lucrarea de diplomă își propune să poată identifica cu success obiectele antrenate. Aceast proces se numește detectare de obiecte și este una dintre problemele de bază ale viziunii pe computer. Dupa cum vom demonstra, rețelele neuronale convoluționale sunt în prezent soluția de ultimă oră pentru detectarea obiectelor.
Algoritmii de învățare sunt folosiți pe scară largă în aplicații de vizune pe calculator. Învățarea mecanică a apărut ca un instrument util pentru modelarea problemelor care altfel sunt dificil de formulat exact. Programele clasice de calculator sunt programate în mod explicit de un individ pentru a efectua o sarcină. Cu învățarea mecanică, o parte din contribuția umană este înlocuită de un algoritm de învățare.
Odata cu creșterea puterii de calcul, învățarea mecanică a devenit din ce în ce mai practică de-a lungul anilor, cerând un timp tot mai redus pentru scanarea tuturor datelor necesare procesului de învățare. În lucrare, algoritmul este capabil să prezică obiectul înfățisat dupa ce prin procesul de învățare a reușit să antreneze toate imaginile. Deși datele de antrenament pe care le-am introdus nu pot include toate posibilitațile instanțelor de intrare, algoritmul de învățare trebuie să fie capabil să generalizeze pentru a gestiona situațiile neprevăzute.
Acest sistem inteligent de recunoaștere a obiectelor pe care noi l-am implementat la nivelul unei simple camere web poate fi implementat pe o gamă foarte larga de dispozitive aducând de asemenea diverse beneficii. Un exemplu ar fi obiectele care sunt detectate și afisate pe un monitor în momentul în care aceastea trec pe banda de verificare din cadrul aeroporturilor.
Am ales această lucrarare deoarece inteligența artificială este cea mai dezvoltată tehnologie cu care se poate lucra la ora actuală și cu care se pot dezvolta aplicații ce reușesc să imite într-un mod spectaculos anilitățile umane. Mi-am dorit să am și eu un prim contact cu această tehnologie inovativă despre care se vorbește atât de mult la nivelul întregii lumi.
Lucrarea pe care eu am ales-o mă ajută să intru în această lume în care computerele reușesc să învețe pe cont propriu. Deși pasionat de tehnologie dintotdeauna, nu am reușit niciodata să cercetez mai în detaliu această ramură. Am dorit să înțeleg cum poate un calculator să fie capabil de recunoașterea anumitor obiecte în mod automat și într-un timp insesizabil doar punându-le în fața camerei.
Obiective
Fiind motivat de succesul recent al rețelelor neuronale și a tot ce înseamnă inteligența artificială în ziua de astăzi, lucrarea își propune o mică parte a tot ceea ce este capabilă să facă această noua tehnologie. Astfel, prezintă toți pașii necesari pentru a înzestra camera web cu abilitatea de a recunoaște diferite obiecte, de la simpla pornire a camerei unui calculator cu ajutorul codului până la antrenarea unui model cu date și recunoșterea obiectelor propriu-zisă.
Pentru a îndeplini acest obiectiv a fost nevoie să parcurg urmatorii pași:
Descărcarea unui editor de cod și familiarizarea cu limbajul de programare Python.
Instalarea framework-urilor și librăriilor compatibile cu limbajul Python necesare pentru lucrul cu vederea computerizată în timp real, procesarea imaginilor și crearea straturilor unei rețele neuronale.
Pornirea camerei prin intermediul codului, reglarea culorilor și a dimensiunilor pentru a fi bine aranjat în spațiul oferit de monitor și cu o claritate cat mai bună.
Captarea imaginilor cu obiectele pe care dorim să le recunoaștem și salvarea lor în fișiere pe categorii.
Parcurgere fișierelor pe categorii și procesarea imaginilor din fiecare fișier.
Crearea modelului și introducerea straturilor necesare rețelei neuronale.
Testarea și validarea modelului creat cu ajutorul unui nou set de date.
Studiu Bibliografic
Stadiu actual
Prelucrarea de imagini este un domeniu care își pastrează dinamismul în ciuda trecerii anilor. Dezvoltările tehnologice au facilitat accesul unui număr tot mai mare de oameni la această ramură facinantă a imagisticii computerizate.
Figura 2.1 Conținutul imagisticii computerizate.
În prezent tehnicile de recunoaștere de imagini folosesc rezultate și metode matematice precum recnuoașterea formelor, inteligența artificială, psiho-fizica, știința calculatoarelor, eletronica și multe alte discipline științifice. Pentru a simplifica sarcina înțelegerii viziunii computerizate, putem distinge în lanțul algoritmic doua nivele: procesarea de nivel scăzut a imaginii și înțelegerea de nivel înalt a imaginii.
Procesarea de nivel înalt se bazeaza pe cunoaștere, utilizând algoritmi ce duc la într-un final la scopul propus. Metodele de inteligență artificială sunt folosite în cele mai multe cazuri. Viziunea computerizată de nivel înalt încearcă să imite cunoașterea umană și capacitatea de a lua decizii potrivit informației conținute în imagine.
Viziunea computerizată și deci procesul de recunoaștere, sunt strâns legate de cunoaștere a conținutului imaginii. O imagine poate fi descrisă printr-un model formal, care nu se va schimba. Procesarea de nivel înalt extrage în mod continuu noi informații din imagini, reînnoieste și clarifică cunoașterea odată cu creșterea setului de date primit.
Cei mai multi algoritmi de procesare a imaginilor au fost propuși înca din anii ’70. Cercetarea recentă încearcă să găsească metode mai eficiente și să realizeze aplicarea acestora pe mașini parelele care să ușureze cantitatea mare de operații necesare prelucrarii.
Una dintre problemele destul de complicate și încă nerezolvate în zilele noastre este specificarea automată a etapelor de pre-procesare necesare rezolvării unei anumite sarcini. Omul este cel care trebuie să aleagă de obicei succesiunea operatiilor, iar atingerea scopului propus depinde mult de intuiția și experiența anterioară a acestuia.
Interesul pentru detecția și analiza mișcării a crescut odată cu dezvoltarea unor noi metodologii de analiză precum și a creșterii capacitaților de procesare a calculatoarelor. La intrarea unui sistem de analiză a mișcării se regăsește de obicei o secvență de imagini, ceea ce duce la creșterea considerabilă a volumului de date prelucrate. Analiza mișcării este de cele mai multe ori implementată în sistemele de analiză în timp real, cum a fi orientarea unui robot autonom. O altă probemă tratată de domeniul analizei mișcării este aceea de a obține informații legate de obiectele prezente în imagini, incluzând atât obiectele aflate în mișscare cât și cele statice.
Diferite puncte de vedere asupra temei
Pentru a face o introducere în tema pe care lucrarea o propune am studiat cu atenție un articol recomandat de Thales Sehn Kӧrting, Doctor în teledetecție de la Institutul Național de cercetare spațială din Brazilia. Titlul articolului este “Everything you wanted to know about Deep Learning for Computer Vision but were afraid to ask” elaborat de Moacir A. Ponti, Leonardo S. F. Ribeiro și Tiago S. Nazare de la Universitatea Sao Paulo, Brazilia.
Aria viziunii computerizat a fost revoluționată datorită tehnicilor deep learning și următoarelor doua motive: disponibilitatea seturilor de date, etichetate, ce conțin milioane de imagini și performanța puterii de calcul care a crescut în ultimii ani.
Metodele machine learning încearcă să descopere modele (reguli, parametri etc.) folosind date de intrare și algoritmi de ghidare ale acestor date pentru a învăța din ele. În învățarea supravegheată, avem exemple de rezultate așteptate, în timp ce învățarea nesupravegheată face presupuneri în vederea construirii modelului. Cu toate aceastea, pentru a obține succesul, este foarte importante să avem o bună reprezentare a datelor de intrare.
Învățarea profundă implică adesea învățarea reprezentărilor ierarhice folosind o serie de straturi care operează prin procesarea unei intrări generând o serie de reprezentări care sunt apoi date ca intrări în stratul următor. Dispunând de spații cu o dimensionalitate destul de mare, astfel de metode pot capta domeniul de aplicare a relațiilor găsite în date originale, astfel încât să găsească reprezentarea corectă a sarcinii.
Rețelele neuronale convoluționale (CNN sau ConvNets) sunt probabil cel mai bine cunoscute modele deep learning utilizate pentru rezolvarea sarcinilior de computer vision, în special pentru clasificarea imaginilior. Blocurile de bază ale CNN-urilor sunt bocurile convoluționale, operatorii de grupare (pooling operators), funcțiile de activare și straturile complet conectate care sunt în esență similare cu straturile ascunse ale unei rețele perceptron cu mai multe straturi (MLP).
Putem scrie această rețea ca o compoziție de secvențe de funcții, care au ca intrare un vector , un set de parametrii și un vector de ieșire :
ƒ(x) = … (
este imaginea de intrare, iar funcția de convoluție adică cea mai caracteristică funcție într-o rețea neuronală convoluțională.
Stratul convolutional este compus dintr-un set de filtre, fiecare fiind aplicat întregului vector de intrare. Fiecare filtru nu este decât o matrice pătratică de ponderi sau valori. Fiecare valoare este un parametru a modelului ce trebuie învățat . Fiecare filtru va produce ceea ce se numește o transformare afină a intrării. De asemenea se produce o combinație liniară a tuturor valorilor pixelilor într-un cadru de finit de dimensiunea filtrului. Fiecare regiune pe care procesele de filtrare au produs-o se numește câmp receptiv local: o valoare de ieșire (pixel) este o combinație a pixelilor de intrare în acest câmp receptiv local.
Figura 2.2 Procesul de convoluție al unei imagini cu ajutorul filtrelor
Un alt bloc de bază în CNN sunt funcțiile de activare. Aceastea nu sunt nimic altceva decât niște funcții care modelează o intrare pentru a obține o ieșire diferită. Se mai numesc și funcții de transfer. Aceastea sunt folosite în rețelele neuronale pentru a determina ieșirea unei funcții ca fiind da sau nu.
Funcția cea mai utilizată în CNN-uri este ReLU (Rectified Linear Function) care apare după stratul convoluțional sau după stratul complet conectat . Această funcție anulează toate valorile negative și este lineară pentru oricare dintre valorile pozitive. Aceasta este legată oarecum de constrângerea non-negativă adesea folosită pentru regularizarea metodelor de procesare a imaginilor bazate pe proiecții subspațiale .
Figura 2.3 Funcția ReLU
Fiecare neuron convoluțional produce un vector nou care trece prin funcția de activare și care se numește harta caracteristicilor (feature map). Aceaste hărți sunt cladite, formând un tensor ce formează intrarea pentru următorul strat. Fiecare proceasează independent întregul tensor și emite o singură hartă a caracteristicilor.
Figura 2.4 Doua straturi convoluționale care produc harți ale caracteristicilor. Funcția încercuită de după fiecare filtru este funcția de activare
De obicei plasați după straturile convoluționale, operatorii de grupare (pooling operators) sunt folosiți pentru a reduce reprezentarea unei intrări, prin reducearea dimensiunilor și permițând totodată să se facă presupuneri despre caracteristicile conținute din subregiunea obținută. Cel mai frecvent utilizat este operatorul maxpooling. Acest operator are doua roluri principale: primul, de a reduce dimensiunea datelor, deoarece adâncimea tensorului crește adesea și de aceea este convenabil să reducem primele două dimensiuni. Al doilea, de a reducea dimensiunea imaginii dacă este posibil.
Figura 2.5 Aplicarea operatorului de grupare MaxPooling
Dupa straturile convoluționale, de obicei avem incluse straturile complet conectate. Spre deosebire de un strat convoluțional, pentru care fiecare filtru produce o matrice de valori, stratul complet conectat produce din întreg vectorul de intrare o singură valoare, un scalar. Pentru ca acest lucru să fie posibil, e nevoie ca dimensiunile ultimului strat să fie modelate. De exemplu dacă ultimul strat are dimensiunile 2 x 2 x 5 rezultă vectorul 1 x ( 2 x 2 x 5) care este egal cu 1 x 20.
Figura 2.6 Tranziția dintre un strat convoluțional și unul comple conectat. Vectorul x conține toate valorile celor 5 hărți de caracterizatre.
În cele din urmă, după straturile complet conectate avem din nou o funcție de activare. De data aceasta cea mai folosită este Softmax, care schimbă valorile obținute de la ultimul strat complet conectat în probabilitați care însumează 1 (reprezentând probabilitatea de 100%).
Figura 2.7 Transformarea valorilor obținute în urma trecereii prin straturile complet conectate în valoari procentuale prin funcția Softmax.
Așadar, prin parcurgerea acestui articol, elaborat de cei 3 cercetători de la Univeristatea Sao Paulo am reușit să facem o scurtă introducere în rețelele neuronale convoluționale. După abordarea a încă câtorva articole referitoare la tema noastră actuală o să intrăm și mai adânc în acest proces de prelucrare a imaginilor și o să explicăm termenii care au rămas neabordați.
În articolul “A Review of Visual Tracking with Deep Learning” a cărui autori sunt: Xiaoyu Feng, Wei Mei și Dashuai Hu din anul 2016 s-a studiat despre urmărirea vizuală, ca fiind o importantă ramură de studiu a învățării profunde. Acest sistem de viziune computerizată a fost utilizat pe scară largă în domeniul militar, medical, dar și în alte domenii. În ultimii ani, învățarea profundă în viziunea computerizată oferă o urmărire vizuală cu performanțe mai rudicate. Documentul celor trei cercetători chinezi prezintă în primul rând conceptul și stadiul cercetării de urmărire vizuală și de învățare profundă, apoi se concentrează asupra aplicațiilor reprezentative ale învățării profunde în urmărirea vizuală și în cele din urmă rezumă direcțiile viitoare de dezvoltare.
Învățarea profundă este cea mai reușită direcție ce cercetare în domeniul învățării computerizate. De la propunerea în 2006 , a făcut progrese revoluționare în multe aspecte ale procesării informaților, cum ar fi voce, text, imagine, video și așa mai departe.
În viziunea autorilor metodele de urmărire vizuală pot fi împărțite în doua categorii conform modelului de observare: metoda generativă și metoda discriminatorie . Metoda generativă folosește modelul generativ pentru a descrie caracteristicile aparente și minimizează eroare de reconstricție pentru a căuta obiectul. Metoda discriminatorie poate fi folosită pentru a distinge obiectul de fundal.
Rețelele neuroanale convoluționale au devenit modelul profund de bază în viziunea computerizată, la fel și în ceea ce privește umărirea vizuală datorită superiorității de recunoaștere a imaginii. Pornind de la SO-DLT (Structured Output – Deep Learning Tracker), au apărut un număr mare de algoritmi de urmărire bazați pe rețetele neuronale convoluționale (CNN), iar doi reprezentanți ai acestora sunt rețeaua neuronală convoluționară de urmărire completă (FCNT) și rețeaua neuronală multi-domeniu (MD Net) .
FCNT în calitate de reprezentat al CNN utilizat în urmărire, FCNT analizează și profită de hărțile caracteristice ale modelului VGG (Visual Gometry Group) cu succes, care este bine pre-antrenat ImageNet (bază de date de imagini, în care fiecare nod al ierarhiei este reprezentat de sute de mii de imagini).
MD Net este diferit de ideea FCNT, deoarcere folosește taote secvențele unui videoclip pentru a pre-antrena și adopta sarcina de urmărire.
Figura 2.8 VGG (Visual Graphic Group)
În cele din urmă autorii acestui articol au ajuns la concluzia că învățarea profundă este o metodă puternică de învățare cumputerizată. Deși progresul său în urmarirea vizuală este mai mic decât în recunoaștere video și detectarea obiectului video, cercetătorii încearcă diferite moduri de a progresa mai mult și în direcția urmăririi vizuale. Pentru cercetarea învățării profunde în urmarirea vizuală, există multe alte direcții care merită explorate. Una dintre aceastea ar putea fi aplicarea altor modele de rețele neconvenționale, dar care au obținut rezultate bune: DBN (Deep Belief Nets) (CNN fără strat de intrare) și RNN (Recurrent neural networks) (CNN care pot folosi starea lor internă pentru a procesa secvențe de intrări) .
În articolul “Deep Learning with Theano, Torch, Caffe, Tensorflow, and Deeplearning4J: Which One is the Best in Speed and Accuaracy?” scris de Vassili Kovalev, Alexandre Kalinovsky și sergey Kovalev în anul 2016 se dezbate o problemă comparativă între cele mai folosite biblioteci pentru învățarea profundă. Comparația se face între Theano (cu Keras API), Torch, Caffe, Tensorflow și Deeplearning4J.
Pentru testarea celor cinci tehnologii s-a folosit o bază de date MNIST (Mixed National Institute of Standards and Technology) care conține un set de cifre scrise de mână . Este o bază de date vastă, care este este utilizată în mod obișnuit pentru formarea diferitelor abordări de clasificare a imaginilor.
Figura 2.9 Exemplu de bază de date MNIST.
Subiectele principale ale acestui studiu comparativ au fost viteza de convergență a rețelelor neuronale profunde în stadiul de pregatire, precizia de clasificare a rețelelor antrenate în etapa de predicție dar și cantitatea de cod necesară pentru algoritmul de testare masurat în linii de cod.
În final luând în considerare toate rezultate testelor prinvind viteza, precizia clasificării și numărul liniilor de cod, clasamentul făcut în urma acestor caracteristici este dupa cum urmează: Theano (cu Keras API), Tensorflow, Caffe, Torch, Deeplearnin4J. Cu toate acestea este greu de oferit o comparație obiectivă pe deplin datorită diferențelor inevitabile dintre cadre. De exemplu, la testarea liniilor de cod necesare codului sursă, trebuie ținut cont de faptul că interfețele acestor biblioteci folosesc diferite limbaje de programare (Python, Java) ale căror linii de cod nu sunt echivalente.
În articolul “Convolutional-Recursive Deep Learning for 3D Object Classification” creat de către Richard Socher, Brody Huval, Bharath Bhat, Cristopher D. Manning și Andrew Y. Ng de la departamentul de Computer Science de la Universitatea Standford se dezbate o problemă inovativă legată combinarea a doua tipuri de rețele neuronale: rețele neuronale convoluționale (CNN) și rețele neuronale recursive (RNN) pentru îmbunătățirea procesului de recunoaștere a unui obiect 3D.
Lucrarea introduce primul model de învățare profundă convoluțional-recursiv pentru recunoașterea obiectelor. În comparație cu alte metode de învățare , ei susțin că abordarea lor este rapidă, nu are nevoie de canale suplimentare de intrare și obține rezultate de ultimă generație în ceea ce privește detectarea obiectelor.
Figura 2.10 Modelul creat de cercetătorii de la Universitatea Standford
Figura 2.10: un singur strat CNN extrage caracteristicile de nivel scăzut ale imaginilor și adâncimea. Ambele reprezentări sunt date ca intrări pentru un set de RNN cu ponderi aleatorii, apoi cartografiază caracteristicile într-un spațiu dimensional inferior. Concatenarea tuturor vectorilor care rezultă formează vectorul final caracteristic pentru un clasificator softmax.
Așadar, cercetătorii din Standford prin cercetarea făcută au reușit să introducă un model nou, bazat pe o combinație de rețele neuronale convoluționale și recursive. Spre deosebire de modelele RNN anterioare, ei au reparat structura arboreșcentă, care permite combinarea mai multor vectori, utilizarea mai multor ponderi și păstrarea parametrilor inițializați aleatoriu.
A existat un mare interes în recunoașterea obiectelor și înțelegerea scenei utilizând RGB-D (Red Green Blue – Depth). Silberman și Fergus au publicat un set de date 3D pentru înțelegerea completă a șcenei . Koppula și colaboratorii săi au oferit recent un nou set de date pentru segmentarea scenei . Abordarea cea mai obișnuită astăzi pentru recunoașterea obiectelor este folosirea caractersiticilor concepute pe histograme de orientare, cum ar fi SIFT sau SURF .
Figura 2.11 Procesul prin care o imagine ajunge sub formă de histogramă
O altă soliție asupra acestei probleme constă în utilizare unor metode de învățare a caracteristicilor nesupravegheate care au făcut mari îmbunătățiri în recunoaștere obiectelor. Deși există multe metode profunde de învățare pentru a învăța trăsături din imaginile RGB, câteva arhitecturi de învățare profundă au fost încă investigate pentru imaginile 3D. Blum și colaboratorii au introdus descriptorii convoluționali pentru datele RGB-D. Ei folosesc punctele de interes SURF și învață caracteristici folosind mijloace similare . Munca lor este asemătoare cu a celor de la Standford, prin faptul că trăsăturile se învață într-un mod nesupravegheat. Farabet și colaboratorii introduc, de asemenea, un model pentru segmentarea scenei care se bazează pe rețele neuronale convoluționale pe mai multe niveluri.
Arhitectura
Sistemul pe care lucrarea își propune să-l implementeze este unul de recunoaștere a obiectelor. Mai jos putem observa arhitectura generală a sistemului cu pașii parcurși până să se ajungă la rezultatul final.
Figura 3.1 Arhitectura sistemului
După cum am spus și anterior sistemul este unul de recunoaștere. Pentru a se ajunge în faza finală și sistemul să recunoască corect obiectele acesta trebuie antrenat. Antrenarea se face cu ajutorul algoritmilor specializați în deep learning aplicați pe setul de date. Setul nostru de date poate fi încărcat prin doua metode.
Prima metodă presupune pornirea camerei web din cod folosind funcții specializate în vederea computerizată în timp real și captarea imaginii prin apăsarea unei taste.
A doua metodă este încărcarea brută a dosarelor ce compun setul de date cu imagini descărcate sau obținute prin alte mijloace.
Odată creat setul de date cu care dorim să lucrăm urmează o serie de procese pentru transformarea setului aferent în date cu care cumputerul este obișnuit să lucreze, adică transformarea imaginilor în formă numerică.
După aducerea datelor la forma necesară, am creat modelul pentru antrenarea datelor. Acest model este definit de un număr de straturi care servesc la filtrarea, simplificare și modelarea imaginilor. Ieșirea din acest model sau rețea constă într-un vector de probabilități ce încadrează conținutul imaginii într-una din clasele cu imagini create la început.
Implementare și testare
Tehnologii folosite
Machine Learning
Machine Learning (învățarea mecanică) este după cum a spus Arthur Samuel, unul dintre pionierii mașinilor de învățare, un domeniu care oferă calculatorului abilitatea de a învăța fără a fi programat în mod explicit. Programele care utilizează machine learning nu sunt programe introduse explicit în computer, cum ar fi o declarație if sau o buclă for. Programele se ajustează, într-un sens, ca răspuns la datele la care sunt expuse, asemenea unui copil care se naște și nu știe nimic, dar învață și incepe să înțealeagă lumea datorită experiențelor la care a fost expus.
În 1962 Samuel a învățat un program de calculator să joace dame. Scopul lui era să-l învețe să joace dame mai bine decat el însuși, ceea ce, evident, nu era ceva ce ar fi putut programa explicit. În cele din urma acest program a reușit să bată campinul mondial la dame. Acest lucru s-a întamplat și la jocul de șah sau go.
Partea de învățare din machine learning înseamnă că algorimtii încearcă să optimizeze pentru a minimiza erorile și să maximizeze probabilitatea ca predicțiile să fie adevarate. Acest sistem are o fucție de eroare și o funcție obiectiv.
Un program de învățare se întreabă mai întai care este funcția obiectivă, iar apoi încearcă să minimizeze eroarea. O modalitate este de a-și face presupuneri cu privire la natura intrărilor. Diferitele ieșiri sunt produsul intrărilor și al algoritmului. De obicei, presupunerile inițiale sunt destul de greșite, acest lucru paote fi măsurat prin cotrastul cu adevărul, iar apoi folosindu-se aceste erori. se modifică ponderile. Asta e ceea ce fac rețelele neuronale. Ele continuă să măsoare eroarea și să își modifice parametrii pana când nu poate obține o eroare mai mică.
Figura 4.1 Procesul parcurs de un program cu Machine Learning
OpenCV
OpenCV sau Open Computer Vision este o biblotecă de funcții informatice specializată gratuită. Biblioteca poate fi rulată pe orice sistem de operare și a fost scrisă în limbajele C și C++. Este în permanență dezvoltare pentru o multitudine de limbaje de programare cum ar fi: Python, Matlab etc.
OpenCV a fost creat pentru o performață computațională redusă cu un accent prioritar pentru aplicațiile în timp real. Această bibliotecă poate profita de procesoarele multicore, ceea aduce un avantaj substațial datorită vitezei de calcul .
Un obiectiv pe care OpenCV l-a urmărit a fost de a oferi o platform software de vedere artificială (machine vision) cu ajutorul căruia se pot crea aplicații sofisticate într-un mod relativ ușor și un timp scurt. Biblioteca OpenCV înglobează peste 500 de funcții speciale fiecărei zone ale vederii artificiale incluzând: inspecția vizuală a produselor în fabrici, imagistică medicală, securitate, interfața cu utilizatorul, calibrarea camerei, vederea stereo și robotica.
Dacă dorim să facem o traducere vederii computerizate, putem spune că este procesul de transformare a datelor dintr-o cameră foto sau video într-o nouă reprezentare. Efectuarea acestor transformări ne ajută să obținem rezultatele dorite oferind computerului date mult mai accesibile acestuia. Datele de intrare pot include diverse informații cum ar fi distanța pana la obiectul încadrat sau cum că aparatul foto este instalat într-un anumit punct. O altă caracteristică a vederii computerizate este mișcarea camerei într-o secvență de imagini sau transformări de imagini doar în tonuri alb-negru.
Sistemele de viziune sunt încă destul de naive. Un procesor primește o matrice de numere de la camera foto și în general nu există recunoaștere încorporată a modelului, control automat al focalizării sau a diafragmei.
Figura 4.2 Codificarea unei imagini.
Oricare dintre valorile date de această grilă au câte o componentă de zgomot și astfel nu putem spune ca ne oferă foarte multe informații. Cu toate aceastea este maximul de informații ce se poate obține de la un sistem machine vision. Mai departe, din această rețea ar urma se obține o rețea de cifre. Figura 4.2 prezintă modul de codificare a unei imagini.
Problema se complică și mai mult și devine aproape imposibil de rezolvat, având în vedere imaginea 2D a unei lumi 3D și având în vedere ca nu există o madalitate unică de a reconstrui un semnal 3D.
Aceeași imagine 2D ar putea reprezenta oricare dintre combinațiile infinite de scene 3D, chiar daca datele ar fi perfecte. Mai mult, datele sunt corupte de zgomot și distorsiuni dupa cum am precizat mai sus. Aceste influențe apar din cauza variațiilor de vreme, iluminare, reflexii, mișcări, imperfecțiunile în obiectiv și reglarea mecanică, timpul de integrare a senzorului sau zgomotul electric din senzor.
Figura 4.3 Perspectiva unei imagini din diferite unghiuri.
O altă problemă cu care se confruntă vederea computerizată este zgomotul din imagine. De obicei, această problemă se ameliorează prin utilizarea metodelor statice. Este imposibil să se detecteze marginea unei imagini doar prin compararea unui punct cu vecinii săi imediați. Dar la o scară mai largă, uitandu-ne la statisticile unei regiuni locale, detectarea acestor muchii devine mult mai ușoară. O margine ar trebui să apară ca un șir de astfel de comparații de pixeli vecini peste o regiune locală, fiecare în concordanță cu vecinii săi. Compensarea zgomotelor ar putea fi posibilă și prin analiza statică a imaginii.
În unele cazuri, prin utilizarea funcționalităților de nivel înalt pe care le găsim în biblioteca OpenCV putem să rezolvăm probleme complexe ale vederii computerizate. Componentele care ne sunt puse la dispoziție de către bibliotecă, permit crearea unei soluții complete pentru orice problemă întâmpinată.
OpenCV este structurat astfel:
Figura 4.4 Componente OpenCV
Componentele OpenCV sunt:
Procesarea de bază a imaginii și algoritmii de vedere artificială la nivel superior.
Biblioteca machine learning (MLL) care include clasificatoare statice și instrumente de grupare a datelor.
HighGUI conține rutine de intrare/ieșire (I/O) și funcții pentru stocare și încărcarea imaginilor și a videourilor.
CXCore conține structurile de date, algoritmii necesari, funcțiile de desenare și suportul XML.
În figura 4.4 nu este ilustrată componenta CvAux, care conține recunoașterea cipului încorporat (HMM – Hidden Markov Model) și algoritmii experimentali .
TensorFlow
Aspecte generale
TesorFlow este un framework open source dezvoltat de cercetătorii Google compatibil cu limbajul de programare Python și care operează cu învățarea mecanică și învățarea profundă. Ca alte platforme similare, este proiectat pentru a simplifica procese de dezvoltare și executare a aplicațiilor de analiză avansată pentru oameni de știință, staticieni și pentru cei care lucrează cu modele predictive.
Software-ul TensorFlow se ocupă cu seturi de date care sunt stocate ca noduri computaționale în formă grafică. Marginile care conectează nodurile într-un grafic pot reprezenta vectori multidimensionali sau matrici, creând ceea ce se numesc tensori. Deoarece programele TensorFlow utilizează o arhitectură a fluxului de date care funcționeaza cu rezultate intermediare generalizate ale calculelor, ele sunt deschise în special aplicațiilor de procesare paralelă la scară largă, rețelele neuronale fiind un exemplu.
Framework-ul include atât seturi de API-uri de nivel înalt cât și seturi de nivel scăzut. Google recomandă utilizarea celor de nivel înalt, atunci cand este posibil, pentru a simplifica programarea aplicațiilor. Cu toate acestea, cunoașterea modului de utilizare a API-urilor de nivel inferior, numit TensorFlow Core, poate fi utilă în experimentarea și depanarea aplicațiilor.
Aplicațiile TensorFlow pot rula fie pe unitați centrale de procesare (CPU) convenționale, fie pe unitați de procesare grafică (GPU) cu o performanță ridicată, fie pe unitați de procesare a tensorilor (TPU) ale Google, care sunt dispozitive personalizate concepute special pentru a aceelera activitatea TensorFlow.
TensorFlow este inspirat de framework-ul DistBelief, pe care comapnia Google l-a folosit intern pentru a efectua aplicații de învățare nesupravegheate și aplicații bazate pe învățare profundă bazate pe rețele neuronale foarte mari. Tensorflow diferă de DistBelief, care este closed source, prin faptul că a fost conceput să lucreze separat de infrastructura proprie de calcul.
Google a lansat TensorFlow ca o tehnologie open source în 2015. De atunci, framework-ul a câștigat o varietate de adepți dincolo de Google.
În cea mai mare parte, aplicațiile TensorFlow sunt folosite în întreprinderi care lucrează cu inteligența artificială la scară largă în domeniul învățarii mașinilor și învățării profunde. Google a folosit de asemenea framework-ul pentru aplicații care includ generarea automată a răspunsului la e-mail, clasificarea imaginilor și recunoașterea optică a caracterelor, precum și o aplicație de descoperire a drogurilor pe care compania a lucrat-o cu cercetătorii de la Universitatea Stanford. Alte comapnii importante la nivel mondial utilizatoare de TensorFlow sunt: Coca-Cola, eBay, Intel, Qualcomm, Twitter, Uber, Snapchat etc. Învățarea profundă bazată pe TensorFlow a fost parte a experimentelor și testelor care au implicat una dintre cele mai mari inovații din zilele noastre, autoturismele autonome .
Execuția și antrenarea cu TensorFlow
După cum am precizat mai sus TensorFlow este o bibliotecă care lucrează cu seturi de date sub formă de noduri și muchii care poartă și numele de tensori. Acești tensori pot avea diferite grade dupa cum putem observa în figura 4.5.
Figura 4.5 Tensori de diferite grade
După cum indică și numele, TensroFlow este o bibliotecă pentru definirea și executarea calculelor care implică tensori. Un tensor este o generalizare a unui vector sau a unei matrici cu un potențial foarte ridicat în ceea ce privește dimensiunile. Fiecare element al unui tensor are același tip de dată, iar tipul de dată este întotdeauna cunoscut. Forma sau numărul de dimensiuni și diumensiunea fiecărei dimensiuni ar putea fi doar parțial cunoscută.
O operație ia m ≥ 0 tensori ca intrare și produce n ≥ 0 tensori de ieșire. O operație are un anumit tip, cum ar fi tipul constantă. Acest tip de operație nu are nici un tensor de intrare și are o singură ieșire.
În continuare putem observa cum arată un astfel de graf format din noduri și muchii și un scurt proces prin care TensorFlow reușește să ajungă la un rezultat, ghidat de un set de operații.
Figura 4.6 Simularea unui grafic format din noduri și muchii
Așadar figura 4.6 ilustrează graficul de calcul al unui flux de date pornind de la nodurile din stanga (a, b, c) conectate la nodurile ce conțin operații (x, +) și în cele din urmă la nodul final (-), care reprezintă și rezultatul. Conceptul cheie al acestor tipuri de grafice ar fi dependeța directă sau indirectă. TensorFlow gestionează această dependeță folosind conceptul matematic clasic al unui grafic cu noduri și muchii, gestionând lista de conexiuni a fiecărui nod către un alt nod direct dependent. De exemplu, putem vedea că nodul de multiplicare (x) este direct dependent de nodurile a și b. Adoptarea acestui model clasic de grafic permite TensorFlow să ruleze o execuție leneșă super eficientă doar a acelei părți a graficului care este necesară pentru a executa o anumită operație în grafic .
Pentru a evidenția și mai clar drumul pe care datele odată procesate îl parcurg prin multitudinea de straturi ale unei rețetele neuronale ghidate de de algoritmii TensorFlow o să vorbim despre cum se comportă această bibliotecă la nivel de imagini.
Sistemul de recunoaștere a imaginilor TensorFlow de la Google este unul dintre cele mai precise și mai ușor de implementat sisteme la ora actuală în această direcție. Recunoașterea imaginilor este un proces care implică antrenarea mașinilor pentru a identifica ce conține o imagine. Pentru a fi mai precis, clasifică conținutul prezentat într-o imagine dată anterior. De aceea sistemul nu poate să recunoască orice imagine, decât acele tipuri de imagini care i-au fost date în timpul antrenamentului. Dacă sistemul are de recunoscut o imagine care nu intră în nici o categorie din cele antrenate, răspunsul va continua să se regăsească într-una din aceste tipuri antrenate doar ca scorul de încredere va fi destul de scăzut.
Clasificarea imaginilor implică selectarea clasei cu cea mai mare probabilitate. Atunci când sistemul antrenat are o imagine, rezultatul este un set de valori de probabilitate, unul pentru fiecare clasă. Clasa cu cea mai mare probabilitate este cea mai de încredere. Rețelele neuronale reprezintă o conexiune de unități de calcul care au capacitatea de a învăța dintr-un set de date care le sunt furnizate. Odata cu adăugarea mai multor straturi în aceste rețele neuronale, obținem rețele neuronale profunde care au un grad ridicat de detecție.
Figura 4.7 Simularea unei rețele neuronale profunde pentru detectarea unei imagini
TensorFlow utilizează un grafic de fluxuri de date pentru a reprezenta toate calculele posibile într-o anumită aplicație. API-ul pentru executarea unui grafic permite utilizatorului să specifice declarativ subgraful care ar trebui executat. Acesta selectează zero sau mai multe muchii pentru a alimenta tensorii de intrare în fluxul de date și una sau mai multe muchii pentru a prelua tensorii de ieșire din fluxul de date. Fiecare invocare a API-ului se numește un pas.
Figura 4.8 Fluxul de date pentru o conductă de antrenare Tensorflow
Îm figura 4.8 avem o aplicație tipică de instruire, cu multiple subgrafe care se execută simultan și interacționează prin variabile comune și cozi. Antrenarea de bază a subgrafului depinde de setul de parametri ai modelului și de loturile de intrare dintr-o coadă. Multitudinea de pași ai subgrafului de instruire și diferitele loturi de intrare actualizează modelul. Pentru a umple coada de intrare preprocesarea este concurentă. Execuția parțială și execuția concurentă sunt două caracteristici ce oferă flexibilitate bibliotecii TensorFlow.
Arhiectura stratificată TensorFlow arată astfel:
Figura 4.9 Arhitectura TensorFlow
Timpul de execuție al bibliotecii TensorFlow este o librărie cross-platform. Figura 4.9 ilistrează un C API care separă codul în diferite limbaje de timpul de execuție de bază. Biblioteca centrală TensorFlow este implementată în C++ pentru portabilitate și performanță, ceea ce face să funcționeze pe mai multe sisteme de operare, inclusiv Linux, Mac OS, Windows, Andorid și iOS.
Masterul distribuit traduce cererile de la utilizator care se află în execuție într-un set de sarcini.
Executorul de flux de date, preia fiecare sarcină de la masterul distribuit, gestionează cererile și programează executarea aceastora. Aceasta trimite la dispozitivele locale sarcinile și execută cererile primite în paralel atunci când este posibil, de exemplu prin utilizarea unui procesoare cu mai multe nuclee.
Keras
Aspecte generale
Keras este un API (Application Programming Interface – Interfață de Programare a Aplicației) pentru rețele neuronale de nivel înalt, scris în Python care este capabil să ruleze cu TensorFlow și alte biblioteci specializate pe machine learning. Scopul principal pentru care a fost conceput acest API este facilitarea rapidă a experimentării. „Capacitatea de a trece de la o idee la rezultat cu cea mai mică întârziere posibilă este cheia unei buni cercetări.”
Keras sprijină rețelele convoluționale și rețelele recurente sau combinațiile celor doua și rulează perfect pe CPU(unitatea centrala de procesare) sau pe GPU (unitatea grafică de procesare). De asemenea permite prototiparea simplă și rapidă ceea ce îi conferă librariei trei calități importante: ușurința în utilizare, modularitate și extensibilitate.
Keras este un API conceput pentru ființe uname, nu pentru mașini. Aceasta pune experiența utilizatorului pe primul plan și urmarește cele mai bune practici pentru reducerea încărcării cognitive. Oferă API-uri coerente și simple, minimizează numărul de acțiuni ale utilizatorului necesare pentru utilizarea obișnuită și furnizează un raspuns clar la erorile întâmpinate de utilizator.
Un model este înțeles ca o secvență sau un grafic al modulelor independente, complec configurabile, care pot fi conectate împreună cu cat mai puține restricții posibil. În special, straturile neuronale, costul funcțiilor, optimizatorii, schemele de inițializare, funcțiile de activare și schemele de regularizare sunt taote module independente pe care le puteți combina pentru a crea noi modele.
Modulele noi sunt ușor de adăugat (ca noi clase și funcții), iar modulele existente oferă exemple ample. Pentru a putea crea cu ușurință module noi, permite o expresivitate totală, făcând Keras să fie potrivit pentru o cercetare avansată. Nu există fișiere de configurare separate ale modulelor. Modulele sunt descrise în codul Python, care este compact, ușor de depanat și permite ușurința extensibilității. Structura principală de date a bibliotecii Keras este un model, o modalitate de a organiza straturile .
Rețele neuronale artificiale cu Keras
Înainte de a intra mai adânc în ceea ce înseamnă Keras și cum lucrează el o să vorbim un pic despre rețele neuronale. Rețelele neuronale și-au găsit inspirația în biologie, unde termenul de rețea neuronală poate fi folosit pentru neuroni. Creierul uman este un exemplu al unei astfel de rețele neuronale, care este compusă dintr-un număr de neuroni. După cum știm cu toții, creierul uman este capabil să realizeze calcule destul de complexe, și de aici provine inspirația pentru rețele neuronale artificiale. Această rețea este o unealtă cu adevărat puternică pentru modelare.
Rețeaua neuronală cea mai simplă este „Perceptronul”, care în cea mai simplă formă este compusă dintr-un singur neuron. La fel ca neuronii biologici, care au dendriți și axoni, un singur neuron artificial este o structură arboreșcentă simplă, care are noduri de intrare și un singur nod de ieșire, care este conectat la fiecare nod de intrare. Însfigura 4.10 avem o comparație vizuală a celor două:
Figura 4.10 Neuronul biologic și rețeaua neuronală artificială
După cum se paote observa în figura de mai sus neuronul artificial are sașe componente. De la stânga spre dreapta aceastea sunt:
Nodurile de intrare. Fiecărui nod de intrare îi este asociată o valoare numerică, care poate fi orice număr real, negativ sau pozitiv, număr întreg sau cu zecimale.
Conexiuni. În mod similar, fiecare conexiune care iese de la nodul de intrare are o pondere asociată cu aceastea, care dupa cum am spus paote să fie orice număr real.
Apoi, toate nodurile de intrare și toate ponderile conexiunilor sunt reunite. Ele sunt folosite ca intrări pentru o sumă ponderată:
Output = ƒ sau Output = ƒ(+).
Aceste rezultate vor fi o intrare pentru o funcție de transfer sau de activare. În cazul cel mai simplu, această funcție de trasnfer ar fi o funcție identitate, f(x) = x sau y = x. În acest caz, x este suma ponderată a nodurilor de intrare și a conexiunilor. Cu toate aceastea, la fel ca un neuorn biologic se declanșează numai atunci când un anumit prag este depășit. Neuronul artificial se va declanșa numai atunci când suma intrărilor depășește un prag, să zicem de exemplu zero. Cea mai intuitivă modalitate prin care se poate gândi este crearea unui sistem astfel:
f(x) = 0, dacă x < 0
f(x) = 0.5, dacă x = 0
f(x) = 1, dacă x > 0
Desigur, vă puteți imagina deja că ieșirea nu va fi o linie continuă, va fi o funcție discontinuă. Deoarece acest lucru poate cauza probleme în proceasarea matematică, este adesea folosită o variantă continuă, funcția sigmoidă. Un exemplu de funcție sigmoidă este funcția logistică. Cu ajutorul acestei funcții vom obține un rezultat mult mai omogen. Această funcție are urmatoarea formulă și urmatorul grafic:
S(x) = =
Figura 4.11 Funcția logistică
Ca rezultat, avem nodul de ieșire, care este asociat cu funcția și suma ponderată a nodurilor de intrare.
În cele din urmă, perceptronul poate fi un parametru suplimentar, numit părtinire, ceea ce paote fi considerat ca fiind ponderea asociată cu un nod de intrare suplimentar setat permanent la unu. Valoarea părtinirii este critică deoarece vă permite să mutați funcția de activare în stanga sau în dreapta, ceea ce poate determina succesul învățarii.
De reținut că o consecință a acestui model este că perceptronii funcționează numai cu date numerice. Aceasta înseamnă că toate datele nominale trebuie convertite într-un format numeric.
Acum că știți că perceptronii lucrează cu praguri, pasul spre folosirea lor în scopuri de clasificare nu este atât de departe. Perceptronul poate fi de acord cu faptul că orice ieșire cu un rezultat numeric deasupra unui anumit prag indică faptul că o instanță aparține unei clase, în timp ce o ieșire sub prag ar putea duce la intrarea într-un membru al celorlalte clase. Linia dreaptă unde ieșirea este egală cu pragul semnifică faptul că aceasta este granița dintre cele două clase.
Dacă pană acum am discutat despre ceea ce înseamnă un perceptron și cum lucrează el, în continuare o să expunem problema perceptronilor cu mai multe straturi.
Perceptronii cu mai multe straturi sau rețelele de perceptroni sunt cunoscute și sub numele de rețele neuronale feed-forward. Aceastea sunt rețele mai complexe decât perceptronul, deoarece conțin mai mulți neuroni care sunt organizați în straturi. Aceste straturi sunt de obicei în număr de doua sau trei, dar teoretic, pot avea număr nelimitat de straturi.
Straturile acționează foarte asemănător cu neuronii biologici drespre care am discutat mai anterior, ieșirile unui strat servesc drept intrări pentru următorul strat. O rețea neuronală conține un strat de intrare, straturi ascunse și un strat de ieșire. Perceptronii cu mai mult straturi sunt deseori complet conectați. Asta înseamnă că există o conexiune de la fiecare perceptron dintr-un anumit strat la fiecare perceptron din următorul strat chiar dacă conexiunea nu este necesară întotdeauna. În timp ce perceptronul poate reprezenta doar separări liniare între clase, perceptronul cu mai multe straturi depășeste această limită și poate să reprezinte limite de decizie mai complexe.
Figura 4.12 Reprezentarea unei rețele neuronale cu un strat de intrare, straturi ascunse și un strat de ieșire
Python
Python este unul dintre cele mai simple limbaje de programare dar și unul dintre cele mai puternice. Este un limbaj care lasă utilizatorul să se concentreze mai mult pe soluția problemei decât pe sintaxă și structura limbajului în care se programează.
Creatorul acestui limbaj de programare este Guido van Rossum. El a dat numele limbajului dupa emisiunea sa preferată de pe canalul BBC „Monty Python’s Flying Circus”. Guido van Rossum s-a născut și a crescut în Olanda unde a absolvit masteratul în matematică și știința calculatoarelor la Universitatea din Amsterdam.
Python este un limbaj simplu și minimalist. Citirea unui bun program Python seamănă aproape cu citirea în limba engleza. Această natură pseudo-cod a lui Python este una dintre punctele forte ale acestuia.
Limbajul Python intră în categoria limbajelor open source. Cu alte cuvinte, poți să distribui gratuit copi ale acestui software, să citiți codul sursă, să efectuați modificări și să folosiți bucăți din aceasta în noile programe. Este de asemenea un limbaj de nivel înalt, ceea ce înseamnă că nu trebuie să vă deranjați niciodata cu detalii de nivel scăzut, cum ar fi utilizarea memoriei de programul creat.
O altă caracteristică este că suportă programarea orientată spre procedură și programarea orientată spre obiect. În limbajele orientate spre procedură, programul este construit în jurul unor proceduri sau funcții care nu sunt decât piese de program reutilizabile. În programarea orientată spre obiect, programul este orientat în jurul obiectelor care combină date și funcționalitați. Limbajul are o modalitate foarte puternică, dar simplistă de a face programare orientată spre obiect, mai ales atunci când este comparat cu limbaje mari precum C++ sau Java. De asemenea, Python poate fi încoporat în programele C/C++ pentru a oferi capabilități de scriptare pentru utilizator.
Implementare
Mediul de lucru
Pentru implementarea programului s-a folosit editorul de text Sublime Text și limbajul de programare Python.
Sublime Text este un editor de texte sofisticat creat pentru a ușura munca dezvoltatorilor cu o multitudine de caracteristici ce vin în sprijinul acestora. Este un sistem cross-platform disponibil pentru sistemele de operare Windows, Mac, sau Linux. O licență este suficientă pentru a putea folosi Sublime Text pe oricare sistem de operare.
Am ales să lucrez cu acest editor de text deoarece dispune de o performanță ridicată și un sistem de evidențiere a sintaxelor aparte și creează un aspect foarte prietenos pentru utilizator. Sublime Text are un API pentru Python foarte puternic care permite sporirea funcționalităților. De asemenea, este foarte ușor de a transmite editorului tipul de programare pe care îl vom folosi din meniul Tools. În figura 4.13 avem o ilustrație a interfeței acestui editor, iar mai jos o să povestim un pic de limbajul de programare Python.
Figura 4.13 Interfața editorului de text Sublime Text
În ceea ce privește limbajul de programare l-am ales deoarece este unul dintre cele mai puternice în crearea sistemelor cu inteligență artificială și machine learning. După spusele și statisticile create de Jean Francois Puget, de la departamentul de machine learning a IBM, am putea chiar să-l clasăm pe primul loc în această direcție de dezvoltare. Unele dintre trăsăturile care fac Python-ul să fie atât de puternic sunt: ecosistemul foarte larg de librării specifice pentru AI și ML, simplitatea în scriere, flexibilitatea, independența platformei utlizate, multitudinea de instrumente de vizualizare și comunitatea de sprijin foarte largă.
Figura 4.14 Graficul lui Francois Puget care atestă că Python este limbajul major pentru AI și ML
Până a trece la scriere propriu-zisă a codului a fost nevoie să mai a adăugăm câteva noi biblioteci la librăria standard Python. Acest lucru s-a făcut din linia de comandă cu ajutorul managerului standard de pachete din Python, pip. Aceasta iți perite să instalezi și să administrezi pachete adiționale care nu fac parte din librărie. Python este considerat un limbaj care are incluse baterii. Asta înseamnă că biblioteca standard a limbajului include un set extins de pachete și module pentru a ajuta dezvoltatorii cu aplicațiile lor. Această caracteristică a lui Python face ca acest manager să fie de o importanță aparte, ori de cate ori dorim să includem noi “baterii”.
După ce am verificat ca versiunea pip este compatibilă cu versiunea Python am început să instalăm bibliotecile adiționale de care avem nevoie pentru a dezovolta programul nostru. Prima dintre aceastea a fost OpenCV. Pentru aceasta s-a folosit comanda pip install.
Figura 4.15 Instalare OpenCV din linia de comanda cu ajutoroul managerului pip
Colectarea datelor
După cum am spus și în capitolul anterior, OpenCV este o librărie care se ocupă cu vederea computerizată în timp real, creată pentru eficiența computațională a aplicațiilor. Având o aplicație care lucrază pe baza camerei web a computerului, această librărie este una de bază pentru noi.
După importarea acesteia am creat o referință la camera web standard a computerului. Acest creat un obiect VideoCapture. Argumentul obiectului reprezintă indexul camerei la facem referință, în cazul nostru indexul 0.
Figura 4.16 Crearea referinței la camera cu care lucrăm
Pentru a porni camera din cod cu ajutorul funcțiilor puse la dispoziție de biblioteca OpenCV avem nevoie mai întâi de o buclă while pentru a menține camera deschisă cât timp dorim noi. La fiecare rulare a buclei facem o citire a cadrului cu ajutorul funcției “read” pe care o și afișăm cu ajutorul funcției “imshow”. Frecvența cadrelor afișate am setat-o la o milisecundă cu ajutorul funcției “waitKey” pentru o vedere destul de fluentă a ceea ce se întamplă în fața camerei. Un alt detaliu la care am lucrat în această buclă while este crearea efectul de reflecție în oglindă cu ajutorul funcției “flip”, pentru o mai bună experiență a utilizatorului.
Pentru o mai bună precizie a recunoașterii obiectelor am desenat cu ajutorul funcției “rectangle” un dreptunghi în fereastra camerei. În cazul în care dorim să creem noi imagini pentru antrenarea modelului tot ce trebuie să facem este să introducem obiectul în aceast chenar dreptunghiular și să apăsăm tasta corespunzătoarea dosarului în care dorim să o introducem. De exemplu tasta 1 pentru introducerea imaginii în dosarul cu imagini numărul 1, tasta 2 pentru introducerea imaginii în dosarul cu imagini cu numărul 2 și asa mai departe.
În cele din urmă pentru a fi siguri ca nu o să avem probleme cu ajutorul funcției “release” și al funcției “destroyAllWindows” eliberăm resursele ocupate de camera la care am făcut referință și dezalocăm orice resurse asociate acesteia.
Figura 4.17 Bucla de menținere a camerei și toate funcțiile explicate anterior.
După cum am spus în capitolul anterior procesorul vede imaginile sub forma unor matrici de numere și oricare dintre valorile din matrice au o componentă de zgomot. Aceasta este maximul pe care îl putem obține cu un sistem de viziune computerizata. În figura 4.18 putem vedea un exemplu oferit de propria noastra camera web.
Figura 4.18 Codificarea imaginii.
Pentru imaginile care sunt făcute cu camera, cu ajutorul unor bucle “for” le reparcurgem pentru a le decupa, și a păstra doar regiunea de interes (roi). Să fim siguri că toate imaginile sunt la aceleași dimensiuni cu ajutorul funcției “resize” modificăm lățimea și înălțimea fiecărei poze înainte de a fi introduse în dosar. Totodată convertim imaginile din spațiul de culori BGR în RGB (red-green-blue), deoarece OpenCV a ales să lucreze cu acest spațiu de culori, cu ajutorul funcției “cvtColor”.
Figura 4.19 Bucla for cu toate funcțiile explicate anterior
Revenim un pic la bibliotecile de care avem nevoie, deoarece de acum încolo nu o să mai apelăm doar la funcțiile puse la dispoziție de OpenCV. O să numim fiecare librărie adăugată, le facem o scurtă descriere și de ce am ales să lucrăm cu acestea. Apoi o să revenim din nou la implementarea programului.
Pentru lucrul cu fișiere și pentru a specifica corect căile unde sunt localizate aceastea în computer am importat bibliotecile “os” (operating system) și “glob”.
Modulul os prevede funcții pentru interacționarea cu sistemul de operare și este inclus în librăria standard Python. Modulul oferă un mod accesibil de utilizare a funcționalităților dependente de sistemul de operare. De asemenea include multe funcții pentru interacțiunea cu sistemul de fișiere .
Modulul glob găsește toate numele căilor care se potrivesc unui model specific, în conformitate cu regulile utilizate de shell-ul Unix, deși rezultate sunt returnate în ordine arbitrară .
Un al modul de care avem nevoie este NumPy. Aceasta ca OpenCV-ul nu este inclus în librăria standart Python, așa că l-am introdus cu ajotorul managerului pip prin comanda “pip install NumPy” în linia de comandă. NumPy (Numerical Python) este o librărie open-source pentru calcule științifice. Librăria permite lucrul cu matrici în cel mai natural mod. Acesta conține o listă lungă de funcții matematice, incluzând câteva pentru algebră lineară, transformări Fourier sau generări de numere. LAPACK(Linear Algebra PACKage) este una dintre librăriile importante pentru algebră lineară pe care modulul o folosește. NumPy este un proiect foarte activ cu o mulțime de contribuitori .
Ultimele doua biblioteci de care avem nevoie și poate cele mai importante, având cea mai mare contribuție în program sunt “Keras” și “TensorFlow”. Aceastea doua lucrează împreună, Keras fiind un înveliș pentru TensorFlow care este folosit ca backend.
Deși am ales să lucrez cu aceste framework-uri în continuare, aș fi putut să continui și cu OpenCV. În continuare am să fac o descriere pentru a vedea ce anume le diferențiază și de ce am făcut această alegere.
OpenCV este o librărie specializată pe algoritmi de viziune computerizată. Inițial a avut o varietate de algoritmi ca SIFT sau SURF și abordări pentru metode de machine learning și pentru activități vizuale cum ar fi recunoaștere sau detecții de obiecte utilizând tehnica de cascadare Haar sau detectori HOG (histogram or orientet gradients). Ca avansare în deep learning, OpenCV 3.1 introduce modulul DNN (Deep Neural Networks) în bibliotecă pentru rețelele profunde, folosind câteva cadre populare de deep learning, cum ar fi Caffe .
TensorFlow este un framework pentru machine learning. Deși este mai mult specializat pe probleme foarte generale în acest domeniu cum ar fi: clasificări, clustering (gruparea obiectelor pe grupe astfel încât obiectele din același grup să aibă o asemănare într-un anumit sens), regresii, TensorFlow face și recunoașteri de obiecte.
Keras este un API de pentru rețele neuornale de nivel înalt, scris în Python capabil să ruleze cu TensorFlow, Theano sau CNTK (Microsoft Congnitive ToolKit). Acesta permite prototiparea ușoară și rapidă (prin simplitate, modularitate și extensibilitate).
Diferența cheie este că TensorFlow + Keras este un framework și OpenCV este o librărie. O librărie efectuază operațiuni specifice bine definite conținând un set de obiecte și funcții. Un framework este o colecție de librării care poate fi ca un schelet pentru aplicație care face legăturile între anumite părți ale acesteia.
O diferență pe care am obesrvat-o în timpul dezvoltării între cele doua este faptul că OpenCV lucrează cu spațiul de culori BGR, care mereu va trebui convertit la spațtiul de culori RGB pentru a vedea o imagine în culorile ei naturale. TernsorFlow lucrează direct cu spațiul de culori RGB.
TensorFlow fiind un framework pentru machine learning este mai bine adaptat pentru sarcinile de deep learning. Cele mai multe dintre modelele de deep learning open-source sunt scrise în TensorFlow iar OpenCV a făcut destul de recent DNN-urile și nu este încă suficient de popular și cu o foarte largă comunitate în spate care să le fi experimentat.
Așadar, în urma acestor argumentelor aduse mai sus, am ales TensorFlow + Keras în ciuda a OpenCV din următoarele motive:simplitatea în lucrul cu acest framework, comunitatea vastă din spate și optimizărilor mai bine efectuate, fiind specializat doar pe ramura de machine learning.
Închizând această paranteză cu bibliotecile de care avem nevoie, revenim la implementarea propriu-zisă a codului. Având toate imaginile cu care dorim să antrenăm modelul nostru salvate în dosare pe categorii în continuare am creat o funcție numită “incarcarcare_imagini” cu ajutorul căreia procesăm toate imaginile. Prin această procesare înțelegem redimensionarea acestora și transformarea tuturor imaginilor în matrici, pe care o să le concatenăm într-un singur vector.
Cu ajutorul funcției “os.path.join” creem o cale formată dintr-o concatenare de termeni dați de noi pentru a ajunge la dosarul țintă, iar cu funcția “glob” care primește ca parametru calea ce am creat-o anterior, în mod recursiv, avem acces la toate dosarele cu imagini. Apoi, într-o buclă “for” parcurgem taote imaginile din dosare și le reducem dimensiunile pentru o procesare mai rapidă și le transformăm sub formă de matrici cu ajutorul librariei “preprocessing” din cadrul Keras.
Figura 4.20 Funcția de procesare a imaginilor
Acum că avem vectorul cu date pregătit pentru funcția de montare a modelului, mai creem matricea cu valori binare corespunzătoare etichetelor fiecărui set de date. Mai întâi avem nevoie de funcția “concatenate” din librăria NumPy, iar apoi de funcția “to_categorical” din librăria “keras.utils”.
Figura 4.21 Funcțiile de concatenare și convertirea vectorului în
matrice cu valori binare
Crearea rețelei neuronale convoluționale
Rețeaua noastră neuronală convoluțională este alcătuită din:
Două straturi convoluționale
Doua straturi de pooling (grupare)
Patru straturi de dropout
Un strat de flatten (aplatizare)
Trei straturi dense (compacte)
Stratul convoluțional este unitatea de bază al acestor tipuri de rețele neuronale. Cu ajutorul procedeelor de prelucrarea a imaginilor, un strat convolutional realizează o serie de operații de filtrare liniară pe matricea rezultată din imaginea de intrare sau imaginea rezultată din stratul precedent, denumit și hartă de trăsaturi. Fiecare matrice are un nucleu de adâncime, în cazul unei imagini de intrare RGB, aceasta este trei. Toate straturile convoluționale au o funcție de activare, în cazul nostru, ReLU (Reactified Linear Unit). Procesul de filtrare și cum acționează funcția ReLU este ilustrat în capitolul 2 în figurile 2.2, 2.3, 2.4.
Stratul pooling înlocuiește valoarea unei zone din harta de trăsături cu statistica acelei zone. Noi am folosit ca funcție de grupare MaxPooling. Aceasta înlocuiește o zonă bine definită cu maximul acelei zone, rezultând o hartă de trăsături mai mică, dar care păstrează cea ma relevantă statistică. Acest strat ajută la reducerea dimensiunilor și creșterea vitezei de procesare. Acțiunea funcției MaxPooling o putem vedea în figura 2.6.
Stratul dropout este foarte eficient în evitarea fenomenului de overfitting la rețele neuronale. Acest strat presupune că o parte din ponderile unui strat să fie ignorate, simulând mai multe rețele cu mai puține caracteristici.
Figura 4.22 O rețea neuronal înainte și după utilizarea funcției DropOut cu o rată de 50%.
Stratul flatten este necesar pentru a putea utiliza straturile complet conectate după unele convoluționale. Aceasta transformă tensorul rezultat din straturile convoluționale într-un vector 2D
Figura 4.23 Procesul de aplatizare (flattening)
Stratul dense este stratul obișnuit dintr-o rețea MLP (Multi Layer Perceptron), descrisă în capitolul 3.1.4.2, cu noduri la care sunt legate ponderi (weight) și compensații (bias).
Ponderile sau parametrii reprezintă puterea conexiunii dintre doua noduri. Dacă ponderea de la nodul 1 la nodul 2 are o magnitudine mai mare, asta înseamnă că nodul 1 are o influență peste cea a nodului 2. Un parametru scade valoarea de intrare într-un nod. Schimbarea unei intrări într-un nod cu o magnitudine apropiată de 0, înseamnă că nu se va schimba ieșirea din acel nod. O pondere negativă înseamnă că această intrare va scădea valoarea ieșirii. Așadar, un astfel de parametru determină cât de mult intrarea într-un nod va influența ieșirea aceastuia. Valorile acestor magnitudini sunt luate arbitrar la început și se modifică pe parcursul rulării programului.
O părtinire sau o compensație (bias), este o intrare suplimentară pentru neuroni și este întotdeauna 1 și are propria pondere a conexiunii. Acest lucru asigură că, chiar dacă nu toate intrările depășesc o anumită valoare pentru a interveni funcția de activare, va fi o activare în neuron.
Figura 4.24 Operația dintr-un neuron.
w – weight; b – bias; a-intrare; – iesire; g – funcție de activare;
z – valoarea din nod
La fel ca și straturile convoluționale, straturile dens conectate sau complet conectate au nevoie de o funcție de activare. Pentru primele am folosit funcția ReLU iar pentru cel de-al treilea funcția Softmax care este ilustrată în figura 2.7 din capitolul 2. Tot în acest capitol găsim mai multe detalii despre cum acționează aceastea.
Mai jos avem o imagine pentru a ne face o idee cam cum ar arăta rețeaua noastră convoluțională:
Figura 4.25 Rețea neuronală convoluțională cu straturile descrise anterior
Pentru a construi rețeaua neuronala convolutională (CNN) trebuie să îi definim arhitectura, care este dată de numărul straturilor convoluționale (pentru fiecare strat, numărul de filtre și dimensiunile filtrului). În mod normal, într-o secvență de straturi convoluționale și straturi complet conectate apar și straturile de grupare (pentru fiecare strat, definim dimenisiunile ferestrei) și straturile de dropout (pentru fiecare strat, definim rata de ignorare). După aceastea apare stratul de aplatizare (flatten). Apoi avem straturile complet conectate (pentru fiecare strat, definim numărul de neuroni).
Modelul standard oferit de Keras este “Sequential”. Aceasta este foarte simplu, format la început dintr-un singur strat, dar care se extinde liniar automat în funcție de straturile pe care le adăugam rețelei.
Arhitectura și numărul de straturi conținute de rețeaua noastră neuronală este descrisă în tabelul următor:
Tabel 4.1 Arhitectura rețelei neuronale
Înainte de a antrena modelul, mai întâi trebuie compilat. Compilarea se face cu ajutorul funcției “compile”. Această funcție are nevoie trei parametri: un instrument de calculare a pierderilor, un instrument de optimizare și o metodă de măsurare.
Figura 4.26 Funcția de creare a modelului
Acum că funcția de creare a modelului a fost definită nu ne rămâne decât să-l montăm. Pentru a antrena modelul mai avem nevoie de datele obținute din prelucrarea imaginilor (sub formă matriceală), etichetele acestora (sub forma unei matrici cu valori binar) și perioada (epoch). Perioada reprezintă de câte ori dorim să se parcugă setul nostru de date sau de câte ori dorim să fie antrenat setul nostru de date. Având toate aceastea nu ne rămâne decât să trecem la antrenarea modelului propriu-zis, cu ajutorul funcției “fit”.
Figura 4.27 Funcția de antrenare/montare a modelului
Augmentarea datelor
Una dintre cele mai bune modalități de crește performanța unui model deep learning este de a adăuga un set de date cât mai mare pentru antrenament. Înafară de colectarea datelor unice din diferite surse, avem posibilitatea să dezvoltăm setul de date deja existent. În această direcție există o multitudine de metode. Acest proces de a roti, a modifica lumini sau tonuri de culoare, de a mări sau micșora, de a crea diverse distorsiuni sau chiar de a adăuga zgomot unei imagini se numește augmentarea imaginii respective.
O altă întrebuințare a augmentării datelor, înafară de cea a sporirii setului de date și de a spori capacitatea modelului de a generaliza și eticheta corect imaginile este evitarea overfitting-ului. Despre overfitting și evitarea lui am discutat și în capitotlul anterior, prin folosirea stratului de DropOut, dar oare ce înseamnă acest termen.
Overfitting-ul este o eroare a modelului ce apare în momentul în care antrenarea pe setul de date este mult prea precisă. Nu mereu ce este perfect este și bun. Această supra-antrenare și modificare a parametrilor rețelei în așa fel încât sistemul să fie cât ma exact în recunoașterea obiectelor antrenate face ca modelul să nu mai fie capabil să recunoască imagini similare în care se află același obiect, dar cu mici diferețe.
Cum există posibilitatea ca modelul să fie supra-antrenat, există posibilitatea să fie și prea putin antrenat, astfel apare termenul de underfitting. Underfitting-ul are loc când setul de date dispune de prea puține de date și modelul nu este destul de complex pentru a capta cu precizie relațiile dintre caracteristicile setului de date și variabila țintă.
Mai jos avem evoluția în timp a unui model, care să ilustreze comportamenul termenilor explicați anterior:
Figura 4.28 Reprezentarea unui model underfitted, unul corect antrenat și unul overfitted.
Așadar, o a doua metodă pe care am folosit-o pentru evitarea overfitting-ului este augmentarea datelor. Pentru realizarea acestui proces am creat două aplicații care fac asta după cerințele pe care noi le impunem și a nu fi nevoie să facem asta manual.
Prima aplicație creată este pentru modificări care vizează unghiul de rotație, deplasarea, tăierea, marirea, luminozitatea și reflecția imaginii. Acest lucru s-a făcut cu ajutorul funcției “ImageDataGenerator” din librăria “keras.preprocessing.image”.
Figura 4.29 Funcția de augmentare a imaginilor.
O a doua aplicație create este pentru adăugare de zgomot imaginilor. Ca și zgomot am ales efectul de “salt and papper” (sare și piper), care transformă imaginea într-una care pare presărată cu aceste doua condimente în proporțiile alese de noi.
În urma folosirii celor doua aplicații de augmentare a imaginilor am obținut un set de date care arată în felul următor:
Figura 4.30 Secvență din setul de date al unei clase, dupa augmentare.
Testare
La fel ca antrenarea modelului, testarea se poate realiza în doua moduri.
Prima variantă de testare este folosind camera web. Pentru repornirea camerei este nevoie să folosim același set de funcții folosite anterior oferite de biblioteca OpenCV. Creem din nou o referință, redimensionăm fereastra, convertim spațiul de culori, desenăm chenarul dreptunghiular și, în plus, adăugăm numărul de texte echivalent numarului de clase, pentru a vedea cum decurge predicția. O altă funcție necesară este “predict” care generează predicția afișata în dreptul fiecărei clase, în formă procentuală.
Figura 4.31 Testare cuțit folosind camera web.
Figura 4.32 Testare cuțit folsind camera web.
Figura 4.33 Testare cuțit folosind camera web.
Figura 4.34 Testare pistol folosint camera web.
Figura 4.35 Testare pistol folosind camera web.
Figura 4.36 Testare pistol folosind camera web.
Figura 4.37 Testare grenadă folosind camera web.
Figura 4.38 Testare grenadă folosind camera web.
Figura 4.39 Testare grenadă folosind camera web.
A doua variantă de testare este prin parcurgerea propriu-zisă a unui set de imagini.
Figura 4.40 Testarea pe un set de imagini.
Înafara celor doua testări finale, pe parcursul programului am mai folosit și mici secvențe de cod sau simple afișări pentru testarea corectitudinii rulării. Câteva exemple ar fi: afișarea dimensiunilor imaginilor din dosare, numărul imaginilor din dosare, afișarea unei anumite imagini din dosar (cu ajutorul librăriei matplotlib) sau afișarea sumară a întregului model, pentru a verifica că toate straturile sau creat în mod corect și respectă datele introduse de noi.
Figura 4.41 Sumarul rețelei noastre convoluționale.
Numărul parametrilor reprezintă totalul obținut dintre suma ponderilor și compensațiilor întregii rețele neuronale și se calculează dupa umătoare formulă:
[DIMENSIUNI NUCLEU(ex. 3×3) * ADÂNCIMEA NUCLEULUI(ex. 3)+1] *
* NUMĂR_NUCLEE(ex. 16) = NUMAR_PARAMETRII (ex. 448)
Concluzii
Rezultate obținute
Pentru a observa performanțele aplicației am ales să trei clase de obiecte: pistoale, cuțite, grenăzi. În urma testării seturilor de date format din aceste trei clase cu, ajutorul aplicației, am obținut următoarele rezultate.
Tabel 5.1 Rezultate obținute
După cum se observă în tabelul de mai sus am am executat trei teste succesive, a unui set de date format din 150, 660, respectiv 1242 de eșantioane, împărțite în mod egal, exceptând ultimul test.
Primul test s-a realizat într-un timp foarte scurt, zece secunde, dar nu a reușit performanțe foarte bune decât în cazul clasei cu cuțite.
Al doilea test a avut un timp de procesare ceva mai ridicat, aproximativ cinci minute și jumătate. Performanța a crescut doar în cazul pistoalelor, ceea ce nu este foarte îmbucurător.
Al treilea test a durat aproximativ 10 minute. În ciuda dublării timpului neceras procesării am obținut rezultate mult mai bune pentru toate cele trei clase, chiar apropiate de un raport perfect de sută la sută în cazul clasei cu pistoale.
Așadar, putem concluziona că odata cu creșterea setului de date antrenate cresc și perfomanțele în identificare a aplicației, deși nu întotdeauna. Sporirea setului de date aduce la randul său și un timp de procesare ridicat.
Direcții de dezvoltare
Lucrarea a fost concepută cu scop de învățare și introducere în domeniul inteligenței artificiale, fiind una dintre ultimele tehnologii apărute și în cadrul căreia s-au realizat performanțe uimitoare.
Una dintre ramurile cele mai importante ale inteligenței artificiale este ramura de machine learning, cu care am interacționat și noi.
Pentru a face o demonstrație a ceea ce este capabilă această tehnologie, am ales implementarea unui sistem pe computer care este capabil să recunoască obiecte cu ajutorul camerei web sau obiecte din diferite dosare.
Ca modele de recunoaștere am ales câteva obiecte periculoase cum ar fi un cuțit, un pistol, sau o grenadă. Obiecte care nu ar fi permis să fie deținute de către un pasager al unui avion.
Așadar, o viitoare direcție de dezvoltare ar fi îmbunătățirea sistemului în așa fel încât să simuleze computerul dintr-un aeroport cu scopul de a detecta obiectele nepermise dintr-un bagaj și anunțarea acestora. Pentru acesta ar fi nevoie de sporirea tipurilor de obiecte nepermise și îmbunătățirea rețelei pentru o mai bună precizie.
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: RECUNOAȘTERE DE OBIECTE CU AJUTORUL CAMEREI WEB FOLOSIND REȚELE NEURONALE CONVOLUȚIONALE [304573] (ID: 304573)
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.
