Metode de pseudocolorare [310243]
Universitatea “Politehnica” [anonimizat] (CTI – INF)
Conducător(i) științific(i) Absolvent: [anonimizat]. Corneliu FLOREA Radu ZAHARIA
2017
ANEXA 1
[DECLARATIE DE ONESTITATE ACADEMICA]
Cuprins [Placeholder]
Lista acronimelor
Introducere
Capitolul 1 : Spatiul de culori RGB
Transformarea din spatiul RGB in tonuri de gri
Transformarea inversa
Capitolul 2 : Retele neuronale
Descriere generala
Perceptronul multistrat
Capitolul 3 : Posibilitati de abordare
Recunoasterea obiectelor
Recunoasterea scenei
Imagini pre etichetate
Capitolul 4 : Solutia propusa
Capitolul 5 : Implementarea in Python
Capitolul 6 : Rezultate si Concluzii
[LISTA FIGURILOR SI A TABELELOR]
Lista acronimelor
RGB = Red Green Blue (Rosu Verde Albastru)
RN = Retea Neuronala
CMY = Cyan Magenta Yellow ([anonimizat] a imaginilor)
CIE = Commission Internationale de l'Éclairage
ReLU = Rectified Linear Unit
SVR = Support Vector Regression ( Regresie cu vectori suport)
ANN = Artificial Neural Network ( Retea neuronala artificiala)
CNN = Convolutional Neural Network ( Retea neuronala convolutionala )
SLIC = Simple Linear Iterative Clustering ( Algoritm de clustering folosit pentru gruparea pixelilor unei imagini )
k-NN = k-Nearest Neighbours ( Algoritm de clasificare ce se bazeaza pe distantele dintr-e [anonimizat] k vectori etichetati )
Introducere
[PUNE NISTE POZE AICI ?]
Scopul acestei lucrari de licenta este implementarea unei aplicatii cu scopul colorizarii imaginilor in tonuri de gri. [anonimizat] o [anonimizat] a o prelucra si de a genera pe baza ei, o imagine colorata care sa aproximeze imaginea reala. [anonimizat].
Istoria colorizarii incepe de cand a [anonimizat] “daguerreotype”, [anonimizat], oamenii isi doreau posibilitatea de a [anonimizat]. Pana la aparitia tehnicilor digitale de prelucrarea a imaginilor, s-a practicat astfel colorarea manuala a [anonimizat], [anonimizat] [1].
In ziua de azi dispunem de unelte digitale pentru a [anonimizat] “Photoshop”, totusi, si aceasta metoda este tot una manuala. [anonimizat]-l, [anonimizat]-[anonimizat], astfel in zilele noastre exista metode de colorizare automata a imaginilor.
In general imaginile in tonuri de gri pot stocate ca imagini indexate. [anonimizat]. [anonimizat], [anonimizat], raze-X si altele. Informatia scalara stocata astfel intr-o matrice reprezinta in general o intensitate sau o [anonimizat]at o culoare. Noi putem folosi orice harta de valoare pentru a oferi o interpretare vizuala a datelor, spre exemplu daca vorbim de un gradient de temperatura, putem folosi tonuri albastre pentru temperaturi joase, si galben-rosu pentru temperaturi ridicate. Daca vorbim de imagini fotografice, pe de alta parte, atunci valorile scalare din imagine in general vor reprezenta intensitatea luminoasa a acelor puncte din spatiul captat [2].
Tehnica de colorizare digitala a imaginilor in tonuri de gri presupune schimbarea hartii de culoare. In varianta cea mai simpla se poate aplica pur si simplu o transformare pixel la pixel a hartii de culoare. Aceasta varianta are difciente astfel incat rezultate mai bune sepot obtin o cu transformare adaptiva ce tine cont si de vecinatati. Regulile dupa care se introduc informatie din vecinatate pot fi manuale sau extrase automat pe baza unei invatari automate cu sisteme inteligente.
Solutia propusa in aceasta lucrare este implementarea unei aplicatii de colorizare automata a imaginilor folosind o retea neuronala perceptron multistrat, implementata in python.
In vederea obtinerii a mai multor puncte de comparatie am antrenat in paralel doua versiuni ale aplicatiei, una folosind functii de activare sigmoide si alta folosind functii de activare ReLU. In total s-au adunat cateva sute de ore de antrenare. Din pacate, o parte din aceste ore au fost pierdute datorita unor restartari fortate provocate de actualizarile sistemului de operare. Am fost nevoit sa dezvolt si o solutie aplicabila imaginilor mari, datorita unor limitari tehnice ce au facut antrenarea si procesarea de imagini de rezolutie inalta prin reteaua neuronala imposibila cu resursele disponibile. Rezultatele obtinute au fost de calitate variabila, de la bune, la slabe, performante bune obtinandu-se pe imagini de tip “padure”, “urban” si “animale”, iar cele slabe pe “flori” si “oameni”.
Capitolul 1 : Spatiul de culori RGB
Pentru a putea aborda problema trecerii dintr-un spatiu de culoare unidimensional intr-unul color, anume RGB, acesta fiind standard in fotografia color, trebuie sa incepem in sens invers.
In primul rand, este necesar sa intelegem faptul ca notiunea de culoare tine de perceptia subiectiva umana. Fizic vorbind, lumina nu are propietatea culoare , insa sistemul vizual uman (format din ochi si cortexul vizual ) asocieaza o perceptie de culoare pentru diferite lungimi de unda. Spectrul luminii vizibile este caracterizat de lungimi de unda in intervalul 380 – 780 nm, fiind marginit de lumina ultravioleta si cea infrarosie [3].
Partea ochiului care se ocupa de captarea semnalului luminos si transformarea lui in impulsuri nervoase este retina. Aceasta are doua tipuri de celule fotoreceptoare, bastonase si conuri. Acestea sunt in numar de arpoximativ 7 milioane de conuri, si intre 75 si 150 de milioane de bastonase [3]. Celulele cu bastonas sunt folosite pentru perceptia intensitatii luminoase (nu percep informatie de culoare), in timp ce cele cu con sunt responsabile cu perceptia culorilor.
In principal celulele cu con sunt impartite in 3 categorii, sensibile la culorile de rosu, verde si albastru. Acest fapt a combinat cu teoria tri-cromaticitatii a lui Grassman a dus la aparitia conceptulu ide spatii de culoare, cum ar fi spatiul RGB. Spre exemplu culoarea alba este perceputa atunci cand cele trei tipuri de conuri sunt stimulate la aceasi intensitate maxima [3].
In principal exista doua modele de combinare a culorilor, modelul aditiv, folosit in ecrane electronice si proiectoare de lumina, si modelul substractiv, folosit in pictura si imprimare color.Atunci cand se doreste imprimarea unei imagini digitale stocate intr-un format aditiv, este necesara conversia intr-un model substractiv,cum ar fi CMY, acest lucru se face automat [4].
Spatiul de culoare RGB a fost standardizat de CIE in 1930, experimentul tristimulus a avut ca rezultat lungimile de unda pentru cele 3 culori primare, 700 nm pentru rosu, 546 nm pentru verde si 435 nm pentru albastru[3]. Modelul poate fi reprezentat in coordonate carteziene in furma unui cub. Axele reprezentand cantitatea de rosu, verde respectiv albastru. In origine se afla negru, iar in coltul opus alb. In cele 3 colturi unde cate doua culori au valoarea maxima avem culorile galben, magenta si cian.[4]
Imaginile ce folosesc scpatul de culoare RGB au cate trei componente pentru fiecare pixel. Atunci cand privim o imagine RGB pe un ecran, diferitele intensitati de rosu, verde si albastru sunt combinate in sistemul vizual uman si rezulta perceptia diverselor culori [4]. Este important de mentionat faptul ca spatiul de culori RGB definit de standardul CIE nu poate reprezenta toata gama de culori ce pot fi percepute in realitate de ochiul uman. Daca privim potcoava de culori si triunghiul corespunzator spatiul RGB (Fig 1.1) , putem observa ca exista o parte signifianta a acesteia, care nu este incadrata in triunghiul RGB [3]. Se poate observa cu ochiul liber ca in afara triunghiului, percepem culori uniforme, acest lucur fiind o consecinta a ecranelor pe care se vizualizeaza imaginea.
Fig 1.1 Potcoava de culoare si triunghiul RGB. [17]
Legatura dintre RGB si tonuri de gri
Cand s-a pus problema construirii sistemelor TV color, o problema importanta a fost asigurarea compatibilitatii intre semnalul TV color, si cel alb negru. Astfel s-a ajuns la concluzia ca semnalul TV color trebuie sa continta informatie despre luminanta, bazata pe cantitatea de culoare prezenta in imaginine.
CIE a efectuat experimente despre perceptia umana asupra luminantei privind culorile. Mai exact s-a dorit aflarea legaturii dintre diferitele culorii, si perceptia intensitatii luminoase subiective umane. Acest lucru a dus la aparitia functiei de luminanta ce descrie sensitivitatea sistemului visual uman la diferite culori. Curba de luminanta arata ca ochiul uman percepe culoarea verde ca fiind cea mai luminoasa, urmata de rosu, si in final albastru ca fiind cea mai inchisa. Pe baza acestui experiment s-a determinat ecuatia ce transforma intensitatile culorilor primare RGB in intensitate luminoasa, notata de obicei cu Y folosita in standardul NTSC[3].
Fig 1.1.1 Curba de perceptie a luminozitatii [18]
[3]
Aceasta ecuatie transforma informatia de culoare in intensitate luminoasa tinand cont de contributia fiecarei culori in perceptia intensitatii luminoase a sistemului vizual uman.
[Mai multa informatie + referinte aici ???]
1.2 Transformarea inversa
Pornind de la presupunerea ca imaginile in tonuri de gri capturate de aparatele foto alb-negru contin doar informatia de luminanta si faptul ca ecuatia 1.1.1 aproximeaza bine corespondenta dintre culoare si preceptia luminii, putem trage concluzia ca daca dorim sa coloram aceste imagini, este necesar sa aflam necunoscutele R, G si B care rezulta in valoarea intensitatii luminoase aferente fiecare pixel. Practic pentru partea initiala de antrenare a aplicatiei acestui proiect, vom porni de la imagini color, pe care le vom transforma in imagini in nivele de gri, folosind aceasta ecuatie, pentru a asigura ca avem un model controlat si cunoscut. Aceasta presupunere ar putea sa rezulte in erori in momentul in care vom dori aplicarea procedeului pe fotografii reale, ale caror nivele de gri sa nu provina intocmai din aceasta ecuatie, insa pornim cu speranta ca rezultatul final va fi o aproximare destul de apropiata a realitatii.
Rezolvarea acestei ecuatii insa prezinta o mare problema, doarece avem o singura ecuatie cu 3 necunoscute, un sistem nedeterminat. Practic putem gasi mai multe combinatii ale necunoscutelor R,G si B care sa rezulte in acelasi Y, deci atunci cand am dori sa facem transformarea inversa, nu avem nici o cale de a ne asigura ca rezultatul obtinut provine din valorile initiale reale. De asemenea luand o imagine color de test artificiala, genrata in paint, si transformata apoi cu ecuatia in tonuri de gri, observam ca anumite culori diferite ajung sa aiba luminanta aproape egala, ceea ce creeaza o problema atunci cand dorim sa o recoloram, deoarece daca folosim doar informatia dintr-un singur pixel, suntem constransi de faptul ca acelasi pixel gri poate corespunde unui singur pixel rgb, si rezultatul final va fi eronat. Mai exact, culorile care sunt apropiate ca nivel de luminanta vor tinde la a fi colorate similar, desi in realitate ele sunt foarte diferite.
Fig 1.2.1 Rezultatele unei retele neuronale perceptron multistrat folosind doar informatia unui pixel
Dupa cum am spus mai sus si din rezultatul expreimentului anterior este clar ca informatia oferita de un singur pixel unidimensional nu este suficienta. Deci avem nevoie de mai multa informatie decat ceea oferita de un singur pixel, un punct de inceput ar putea fi sa ne uitam la informatia oferita de pixeii vecini, deoarece in imaginile nautrale exista o corelatie intre pixelii vecinii
Capitolul 2 : Retele neuronale artificiale
In 1989 George Cybenko a demonstrat ca o retea neuronala poate fi un aproximator de functii universal. Mai precis, daca are destui neuroni in stratul ascuns, in numar finit, o retea neuronala de tip feedforward cu functie de activare sigmoidala poate aproxima destul de bine orice functie ce are ca suport un hiper cub unitate [5]. Limitarea domeniului la un hipercub unitate nu este o problema, deoarece orice spatiu de probleme poate fi redefinit ca ocupand un spatiu unitate prin impartire. Deci, presupunand ca exista o functie care poate face legatura intre o vecinatate de pixeli in nivele de gri si un pixel RGB, o retea neuronala dimensionata adecvat poate aproxima aceasta functie.
2.1 Descriere generala
Retelele neuronale artificiale sunt inspirate din neuronii biologici. O retea neuronala artificiala este formata din noduri reprezentate de neuroni artificiali. Acesti neuroni artificiali au asociata o functie, care insumeaza intrarile nodului, si ofera acest rezultat ca iesire pentru a fi folosit de catre alte noduri. Taria sinapselor este simulata prin ponderile asociate fiecarei laturi ale grafului. Aceste ponderi sunt ajustate in urma unui proces de antrenare in care se foloseste un model de referinta al iesirii dorite pentru anumite intrari [6].
Retelele neuronale initiale erau limitate la rezolvarea problemelor liniar separabile, fiind formate practic dintr-un singur perceptron. In 1974, Werbos a extins conceptul de retea neuronala cu un singur strat la o retea cu mai multe straturi, ceea ce a permis rezolvarea de probleme ce nu erau liniar separabile [6].
De la inceputul dezvoltarii retelelor neuronale artificiale, au fost inventate mai multe modele de neuron artificial, fiecare cu punctele sale tari si slabe.
[Expand here Adaline, MLP, Hopfield, SOM?]
2.2 Perceptronul multistrat
In general, retelele neuronale au scopul de a aproxima functii, bazandu-se pe combinatii liniare a unor functii de baza neliniare. Daca consideram un modelul unui singur neuron artificial, de aici inainte numit perceptron, iesirea lui poate fi exprimata astfel:
Unde: y – iesirea perceptronului
x – vectorul de intrare al perceptronului
w – vectorul de ponderi al perceptronului
f – functia de activare a perceptronului
ϕ – functia de baza neliniara
Fig 2.2.1 Perceptronul simplu
Fig 2.2.2 Perceptronul multistrat cu un singur strat ascuns
Se dorește ca aceste funcții de bază să fie și ele ajustabile, deci să fie exprimată ca o combinare liniară de intrări. Astfel, pentru fiecare perceptron se calculează combinările liniare ale variabilelor de intrare
Unde wji este ponderea care leagă elementul i al vectorului x de intrarea perceptronului j, iar wj0 este ponderea de deplasare, iar aj se numeste activarea perceptronului. Aceste activari sunt transformate mai departe de o functie h(), care reprezinta functia de baza a stratului a scuns, in general de tip sigmoida sau tangenta hiperbolica, pentru a obtine in final iesirile stratului ascuns, pentru a fi folosite mai departe ca intrari in stratul de iesire[7].
Iesirea apoi se calculeaza folosind functia de activare, cum ar fi functia sigmoida astefel yk = σ(ak) unde
In final iesirea neuronilor din stratul de iesire vor avea forma:
Antrenarea rețelei neuronale are ca scop ajustarea ponderilor w astfel incat iesirea retelei neuronale sa fie cat mai apropiată de iesirea functiei pe care dorim s-o aproximam. O masura buna este eroarea patratica. Astfel avand un set de N vectori de intrare xn , respectiv un vector de vectori tinta tn, scopul este minimizarea functiei eroare
Putem privii eroarea ca o suprafata n-dimensionala (unde n reprezinta numarul de ponderi) ce are ca suport spatiul vectorilor de ponderi[8]. Astfel, putem aplica metode de optimizare bazate pe gradient. Pentru a gasi punctul de minim, ne intereseaza sa ajungem cu vectorul w intr-un punct critic, adica acolo unde gradientul ∇E = 0 . Punctele unde gradientul este 0 pot fi puncte de minim sau maxim local. Unul din aceste puncte ar putea fi chiar minimul global, din pacate este in general imposibil de spus daca acesta este cazul. Totusi pentru anumite aplicatii este suficient sa gasim un punct minim local.
Gasirea unei solutii analitice a ecuatiei ∇E = 0 este o sarcina practic imposibila in momentul in care complexitatea problemei este suficient de mare. Solutia este aplicarea metodelor numerice[7]. O tehnica generala este inceperea intr-un punct w0, si apoi deplasarea succesiva in directia de scadere a gradientului cu un pas Δw . Dimensionarea pasului este in sinea ei o problema ce necesita discutie. Pe scurt, daca pasul este prea mare, putem sa ratam punctele de minim, si chiar sa oscilam in jurul lor, iar in cazul in care este prea mic, timpul de convergenta va fi foarte mare, pasul devenind extrem de mic pe masura ce ne apropiem de un punct in care ∇E = 0
Metoda cea mai intuitiva este deci cea descrisa mai sus, in care ponderile se ajusteaza cu un pas mic, in directia de scadere a gradientului
unde exponentul din paranteza indica generatia setului de ponderi si reprezinta rata de antrenare, care are efectul de a dimensiona pasul de cautare, deci afecteaza rata de convergenta si precizia. Eroarea fiind definita in functie de un set de date de antrenare, aceasta metoda necesita procesarea tuturor datelor de intrare pentru evaluarea erorii. Aceste metode care testeaza tot setul de date la fiecare iteratie se numesc metode batch (set) . Aceasta are dezavantajul de a avea o complexitate de calcul foarte mare, si astfel s-au dezvoltat metode mult mai eficiente si rapide pentru optimizarea in batch. Exista si metode de optimizare on-line in care optimizarea setului de ponderi se face pentru fiecare set de vectori intrare-iesire[7].
Este necesara o metoda eficienta pentru evaluarea gradientului functiei de eroare E(w). Aceasta metoda este cunoscuta sum numele de error backpropagation. Pornind de la un model simplu, liniar in care iesirea yk se exprima
si rescrierea ecuatiei 2.5 ca o suma de erori partiale
Pentru aplicarea unui algoritm de optimizare de gradient, avem nevoie sa calculam gradientul erorii fata de setul de ponder w. Gradientul functiei eroaree 2.8 in functie de o pondere wji are forma[7]:
Ectuatia 2.9 exprima gradientul ca produs al erorii dintre iesirea neuronului si iesirea dorita, si vectorul de intrare aplicat neuronului. Mai departe, tinem cont de faptul ca intr-o retea neuronala artificiala, fiecare nod calculeaza o activare ca suma ponderata a intrarilor sale
unde aj este activarea nodului curent, wji este ponderea conexiuni dintre nodul j si nodul i, iar zi este activarea nodului i adica h(aj) [7].
Pentru calculul erorii En trebuiesc calculate toate activarile nodurilor din retea, obtinute in urma aplicarii vectorului de intrare Xn . Eroare En depinde de ponderea wji prin suma intrarilor aj in nodul j , astfel ecuatia 2.9 se poate rescrie [7]:
Din ecuatia 2.10 se observa ca si daca se noteaza rezulta in final:
Deci derivata se obtine din immultirea valorii δ de la nodul de iesirea cu valoarea de iesire z a nodului de intrare[7]. In cadrul unei retele neuronale artificiale, ne intereseaza valorile lui δ pentru stratul de iesire si straturile intermediare. Pentru un neuron din stratul de iesire, δ este pur si simplu diferenta dintre iesirea neuronului si iesirea dorita, iar pentru straturile ascunse, se porneste de la notatia lui δ
Tinand cont de ecuatia 2.10 rezulta
de aici venind si numele de backpropagation, eroarea calculandu-se ca suma ponderata din erorile calculate in nodurile din straturile urmatoare, facandu-se deci o propagare inversa a erorii, de la stratul de iesire, spre straturile ascunse, si in final catre stratul de intrare, lucru ce permite ajustarea ponderilor pe parcurs.
Se poate purta si o discutie despre functiile de activare. In cursul acestei lucrari de licenta am lucrat cu doua functii de activare: functia sigmoida si ReLU (Rectified Linear Unit).
Functia sigmoida este cea descrisa de formula (2.4) Aceasta functie este caracterizata de faptul ca valorile sale de iesire se vor afla mereu in intervalul [0,1] , tinzand spre 0 cand x tinde la – infinit si la 1 cand x tinde la infinit, si are valoarea 0.5 cand x = 0.
Fig 2.2.3 – Graficul functiei de activare sigmoida
Functia de activare sigmoida a fost folosita foarte mult la inceput, crezandu-se ca aceasta aproximeaza foarte bine comportamentul real al unui neuron, adica este 0 cand sinapsele acestuia nu genereaza semnale, si 1 cand acestea genereaza impulsuri la frecventa maxima. Astazi este folosita mai rar deoarece are anumite dezavantaje. Cel mai mare dintre acestea este faptul ca acestea au tendinta de a satura activarea neuronilor, adica sa ajunga la 0 sau 1, si in consecinta, gradientul sa devina aproape 0 in aceste regiuni. Daca ne gandim la antrenarea prin optimizarea de gradient, rezulta ca daca suntem intr-una din aceste zone, gradientul va fi aproape 0, si astfel, pasul de deplasare pe gradient ( efectiv rata de antrenare ) va deveni foarte mic, ceea ce inseamna ca dupa un numar de interatii, in momentul in care anumiti neuronii incep sa se satureze, antrenarea va incetinii drastic [10]. Un alt dezavantaj al acetei functii de activare este faptul ca din punct de vedere computational, este o functie constisituare, necesitand calcule de exponentiere si impartire.
Totusi, faptul ca iesirea se afla mereu in intervalul [0,1] poate constitui un avantaj, deoarece putem face anumite presupuneri simplificatoare atunci cand stim ca iesirea nu va iesi din acest inverval . Spre exemplu atunci cand dorim sa convertim iesirea neuronului in intervalul [0,255] pentru intensitatii ale canalelor de pixeli, este suficienta inmultirea. Acest lucru nu mai este valabil la ReLU, dupa cum am sesizat in momentul in care am inceput sa experimentez si cu aceasta functie de activare.
Functia de activare ReLU, care vine de la Rectified Linear Unit, este o functie de activare liniara, care are urmatoarea forma:
Fig 2.2.4 Graficul functiei de activare ReLU
Krizhevsky et al. au aratat ca aceasta functie accelereaza rata de convergenta a optimizarii de gradient stohastice de 6 ori. Presupunerea fiind ca acest lucru de datoreaza faptului ca aceasta nu se satureaza [10]. Un alt avantaj este faptul ca este mult mai ieftina din punct de vedere computatioal.
Aceasta functie de activare are totusi un mare dezavantaj, anume, datorita faptului ca iesirea devine 0 pentru orice valoare mai mica de 0, daca gradientul estimat intr-un astfel de neuron este foarte mare, acest lucru poate duce sa actualizarea ponderilor in asa fel incat acesta sa nu se mai activeze niciodata, astfel, fiind scos efectiv din retea, Acest este afectat si de rata de antrenare, deci poate fi evitate daca rata de antrenare nu este foarte mare [10].
O problema care am descoperit-o in timpul testarii retelei neuronale ce folosea aceste functii de activare, este faptul ca, functia ReLU ne fiind marginita superior, premisa ca iesirea retelei poate fi usor convertita in intervalul [0, 255] folosind doar operatia de inmultire nu se mai aplica, aceasta putand depasi intervalul, si, dat fiind tipul de date de intregi fara semn, apare efectul de overflow, pe anumite canale, intorcandu-le in valori apropiate de 0, in timp ce canalul albastru are tendinta sa nu se rastoarne, si ramane dominant. Acest efect se observa mai ales in zonele puternic luminate. Solutia evitarii acestei probleme este bineinteles marginirea superioara facuta manual la final, insa este greu de prezis ce alte efecte ascunse mai pot aparea datorita acestui fapt.
Fig 2.2.5 Efectele faptului ca ReLU nu este marginit superior
Capitolul 3 : Posibilitati de abordare
Exista o multitudine de abordari dezvoltate dealungul timpului, in scopul colorizarii imaginilor in niveluri de gri.
3.1 Transfer de culoare
O solutie simpla de colorare a imaginilor in nivele de gri este folosirea unei imagini colorare, cu un continut similar, din care prin metode automate sa luam informatia de culoare continuta de aceasta, si s-o transferam imaginii in nivele de gri. O astfel de solutie este propusa de Tomihisa Welsh,Michael Ashikhmin si Klaus Mueller in lucrarea intitulata “Transferring Color to Greyscale Images” publicata in 2002.
Solutia propusa de ei presupune convertirea imaginilor in spatiul de culori lαβ . Apoi din aceste imagini se esantioneaza aleator un numar de pixeli, urmand in cele din urma parcurgerea imaginii in nivele de gri linie cu linie, iar pentru fiecare pixel din imaigniea in nivele de gri se selecteaza din pixelii esantionati mai devreme, acel pixel care este cel mai potrivit folosind statistici de vecinatate, ca apoi in final, pixelului curent din imaginea in nivele de gri sa i se transfere valorile de crominanta (canalele α si β), aceasta fiind metoda globala. Ei au mai propus si o solutie bazata pe ferestre, in care transferul se face intre imaginea sursa (color) si ferestre din imaginea ce se doreste a fi colorata, pentru ca mai apoi zonele colorate din noua imagine sa fie folosite ca sursa pentru transferul de culoare in restul imaginii, folosind o metoda bazata pe sinteza texturilor? [9]
Spatiul de culori lαβ a fost ales deoarece acesta minimizeaza corelatia intre cele 3 axe de coordonate ale spatiului de culoare. Canalul l corespunde luminantei, iar canalele α si β contin informatii de corminanta, corespunzand aproximativ canalelor galben-albastru si rosu-verde, in ideea ca variatiile unui canal nu vor afecta cu mult celelalte canale. Acest spatiu de culoare lea permis autorilor sa transfere informatiile de culoare de la o imagine la alta fara aparitia artefactelor. Pentru transferul culorilor, ei se bazeaza pe gasirea pixelilor corespunzatori intre imagini bazandu-se pe informatia de luminanta, de aceea ei mai fac si o deplasare a histogramei de luminanta pentru a aduce cele doua imagini la aproximativ aceleasi nivele de luminanta, facand gasirea pixelilor ce se potrivesc, mai usoara [9].
Autorii s-au bazat pe faptul ca variatiile principale dintr-o imagine sunt cauzate de diferenta in luminozitate, si avand in vedere faptul ca de interes era doar informatia de culoare, au stabilit ca un numar de 200 de esantioare aleatoare sunt suficiente pentru a oferi o baza buna de comparatie pentru gasirea pixelilor potriviti, acest fapt a redus timpul de calcul. Pentru acestia se calculeaza statisticile de vecinatate ce constau in dispersia valorilor de luminanta intr-o vecintate de 5×5 pixeli, dau au constatat ca pentru imagini mai complicate aceasta vecinatate necesita marire[9]
Acestia au observat ca metoda globala functioneaza bine pe imagini in care elementele similare au aceeasi luminanta, insa este problematica atunci cand nu se mai aplica aceasta presupunere simplificatoare. Din acest motiv au dezvoltat o solutie bazata pe ferestre corespunzatoare, in care transferul se face dupa metoda descrisa mai sus, dar doar intre ferestrele corespunzatoare, ceea ce minimizeaza riscul de a gasi pixeli cu aceasi luminanta care sa reprezinte culori diferite. Apoi, folosind metode bazate pe algoritmi de sinteza a texturilor, se propaga mai departe culorile din ferestrele in care s-au transferat culorile in restul imaginii[9].
Fig 3.1.1 Algoritmul descris de Welsh et al. aplicat pe o
imagine ce contine un peisaj dintr-o padure [9]
Metoda descrisa mai sus are performante bune, deoarece tine cont sa minimizeze sursele de eroare ce pot provoca erori in colorare, insa problema cu aceasta metoda este faptul ca necesita interactiune umana pentru stabilirea sursei de culoare si zonelor de interes. De interes ar fi metode care sa necesite mai putina interactiune umana.
3.2 Predictia automata a culorilor
Din moment ce dorim sa minimizam interactiunea umana in procesul de colorizare a imaginilor, ne intereseaza acele metode in care calcultatoarele for face cea mai mare parte a muncii pentru noi, astfel ajungem la necesitatea folosirii metodelor de recunoastere a formelor si inteligenta artificiala. In principiu, avem nevoie de un sistem inteligent, pe care sa-l antrenam sa invete corespondenta dintre pixelii imaginilor in nivele de gri, si pixelii imaginilor color.
Aceasta problema a fost deja studiata in profunzime dealungul timpului, si s-au gasit multe abordari diferinte, dar in principiu aceste solutii se pot impartii in doua mari categorii: solutii bazate pe regresie cu vectori suport (SVR) si solutii bazate pe retele neuronale convolutionale adanci (Deep CNN).
In lucrarea “Machine Learning based Efficient Image colorization”, autorii Manoj Nagarajan, Arjun Gurumurthy si Ashok Marannan descriu o metoda de colorizare a imaginilor pornind de la un set de antrenare, folosind algoritmi de tip SVR si k-means. Pentru a asigura o eficienta sporita, acestia pronesc de la un set mic de antrenare, si in loc sa antreneze pentru pixeli individuali, se folosesc de grupari de pixeli denumiti “superpixeli”, apoi aplica si tehnici de postprocesare pentru a complementa locurile unde algoritmul nu s-a descurcat suficient de bine[11].
Precum si in metoda propusa de Welsh, acestia lucreaza in spatiul de culori lαβ. Autorii au decis ca abordarea colorizarii fiecarui pixel in parte ar fi prea intensa din punct de vedere computational, si ca ar fi mai eficienta o colorizare bazata pe grupari de pixeli, care sunt generate prin algoritmul SLIC. Apoi aceste grupari de pixeli sunt transformate in vectori de antrenare format din transformata fourier rapida bi-dimensionala a unei ferestre centrate pe superpixelul de transformat. Pentru vectorii “tinta”, prin care sistemul invata sa prezica culorile s-au folosit mai multe surse de informatii: media si varianta luminantei, informatii legate de centroidul segmentului, histograma superpixelului, histograma locala si modulul gradientului ( informatie de contur) [11].
Dorind predictia canalelor de crominanta α si β, autorii au antrenat doi clasificatori, unul pentru fiecare canal, apoi aceasta informatie este combinata la final. Procesul de colorizare insa, nu este unul direct. In acest proces, se tine cont de nivelul de incredere al predictiei, iar in cazul in care aceasta este buna, este aplicata, iar in caz ca nu, zona prezisa nu este colorata, si in schimb, se aplica o metoda similara cu cea bazata pe ferestre a lui Welsh, in care zonele colorate in care exista un nivel ridicat de incredere, sunt folosite ca surse de transfer de culoare pentru zonele ramase necolorate[11]
Acestia au concluzionat ca algoritmul k-NN are performante mai bune decat SVR, insa nici acesta nu este perfect.
Fig 3.2.1 Rezultatele obtinute de autorii cu metoda descrisa mai sus
O alta tehnica de colorizare a imaginilor se bazeaza pe retele neuronale convolutionale. Acestea fiind considerate un standard in ceea ce priveste rezolvarea problemelor de clasificare in domeniul imaginilor[12]. Jeff Hwang si You Zhou au luat in considerare acest lucru, si au tras concluzia ca aceste proprietati ale retelelor neuronale convolutionale sunt potrivite si pentru abordarea problemei de colorizare a imaginilor[12].
Acestia au atras atentia la faptul ca, datorita caracteristicii continue a culorilor intr-o imagine, predictia culorilor s-ar putea sa nu fie cea mai adecvata metoda pentru colorizare, data fiind tendinta retelelor sa medieze iesirea in cazul pixelilor care pentru acelasi nivel de gri au culori diferite, rezultand in imagini desaturate. Astfel, au propus ca aceasta problema ar putea fi mai degraba considerata ca fiind o problema de clasificare[12].
Pentru antrenare, acestia a folosit imagini RGB de reozlutie 224 x 244, pe care apoi le-au transformat in spatiul CIELUV, urmand sa foloseasca canalul L de luminanta ca intrare si canalele U si V ca tinte pentru antrenare. Acestia au integrat o retea de tip deep learning denumita VGG16, care este o retea pre-antrenata care a demonstrat performante majore in domeniul recunoasterii imaginilor[12].
Acestia au testat in paralel doua tipuri de retele, una de regresie (predictiva) si una bazata pe clasficare, iar ipoteza lor a fost confirmata, imaginile scoase de modelul predictiv aveau o calitate scazute, fiind desaturate, in timp ce modelul bazat pe clasificare scotea imagini foarte viu folorate[12]. Acest rezultat prezinta interes si pentru aplicatia mea, deoarece am decis folosirea unui model predictiv, ceea ce ar putea genera aceleasi neajunsuri descrise mai sus.
Fig 3.2.2 Comparatie intre rezultatul modelului bazat pe regresie si cel bazat pe clasificare
Capitolul 4 : Solutia propusa
Am sa prefatez acest capitol prin a mentiona faptul ca solutia propusa in aceasta lucrare a fost planuita si gandita inaintea studierii solutiilor precedente. Astfel, prin comparatia, aceasta va fi una mai bruta, lipsita de optimizarile si considerentele prezente in metodele descrise anterior. Totusi, experimentele preliminare au dat deja rezultate acceptabile.
Am decis abordarea acestei probleme prin folosirea unei retele neuronale de tip MLP, cu doua straturi ascunse. Motivatia alegerii acestei retele are la baza rezultatele lui George Cybenko descrisa la inceputul capitolului 2, anume faptul ca o retea neuronala cu suficienti neuroni in straturile ascunse poate fi un aproximator universal, deci, poate aproxima aceea functie de transformare din spatiul culorilor in nivele de gri in spatiul culorilor RGB. Desigur o functie directa, 1 la 1 intre pixeli cu nivele de gri si pixeli color nu exista, datorita faptului ca relatia de transformare folosita pentru conversia imaginilor RGB in nivele de gri nu este biunivoca. Dar, plecand de la presupunerea expusa la sfarsitul primului capitol, ca exista o legatura intre vecinatatile unui pixel si culoare sa, putem cauta si gasi o astfel de functie. La un nivel abstract, putem considera ca vom antrena reteaua sa recunoasca corespondenta dintre textura din jurul unui pixel, si culoarea corespunzatoare.
Ca functii de activare ale neuronilor, se vor folosi doua variante. Una in care se foloseste functia sigmoida, si una in care se foloseste functia ReLU, urmand o comparatie a rezultatelor.
In principiu se va lucra pe vecinatati de dimensiuni variabile, impare, pentru a asigura faptul ca acestea pot fi centrate pe un singur pixel. Dimensiunea vecinatatilor va fi optimizata in urma a mai multor iteratii de antrenare / testare, pentru a vedea care ofera rezultate performante, dar in acelasi timp, sa asigure o eficienta din punctul de vedere al memoriei si cantitatea de calcule necesare.
Avand in vedere faptul ca se va lucra pe vecinatati, un alt factor ce trebuie decis tine de modul de abordare al marginilor imaginilor. Aici exista doua posibilitati:
Avand vecinatati NxN impare, putem ignora N/2 pixeli fata de marginile imaginii atunci cand pargurgem imaginea pentru generarea vectorilor de intrare.
Putem borda imaginea cu N/2 pixeli, pentru a permite vecinatatilor sa fie centrate si pe pixelii situati in marginea imaginii, fara a exista probleme de incercare in accesarea unor zone din memorie nedisponibile
Desi mai simpla si directa, am decis sa nu folosesc varianta a, deoarece asta ar insemna pe de o parte ca rezultatele colorizarii vor avea zone lipsa, si pe de alta parte, pierdere de informatie cu care am putea antrena reteaua, desi, avand in vedere ca in general pozele sunt centrate pe subiectul de interes, ar fi rar ca informatii iportante sa se afle in marginea acestora. Totusi, daca dimensiunea vecinatatii devine destul de mare, mai ales raportata la dimensiunea imaginii, asta ar putea duce la pierdezi semnificative de informatie ( ex: vecinatati 10×10 intr-o imagine 100×100, ar duce la pierderea a 10% din informatia prezenta in aceea imagine ).
Astfel, am ales optinea b, de a borda imaginea pentru a permite accesul la toata informatia prezenta in ea. Desigur, si aici trebuie purtata o discutie despre modul de abordare al acestei bordari. Metoda cea mai simpla ar fi bordarea cu negru sau alb a imaginii, insa aceasta abordare ar creea probleme prin faptul ca vecinatatile corespunzatoare pixelilor marginali ar include informatii false si gresite, si practic reteaua ar invata aceste modele care nu sunt de interes si nu contin informatie utila. O alta metoda posibila ar fi pur si simplu repetarea imaginii precum un model pe faianta, astfel, informatia din bordura imaginii ar fi tot din imaginea originala, insa aceasta abordare are dezavanajul de a creea discontinuitati, si am banuit ca nici aceste discontinuitati nu sunt de dorit in a fi expuse retelei catre antrenare. In final, am decis ca o bordare potrivita ar fi oglindirea marginilor fata de laturi si pe diagonala fata de colturi. Aceasta metoda este putin mai costisitoare si netriviala de implementat, insa convera avantajul in faptul ca nu mai eixsta discontinuitati, iar informatia care este oglindita in acele zone are un caracter local, adica o vecinatate centrata pe un pixel marginal, va include in mare parte doar pixeli din zona acelui pixeli, fie ei dublati, spre deosebire de posibilitatea anterioara, in care jumatate de pixelii prezenti in vecinatate ar fi luati din zone indepartate ale imaginii.
Setul de antrenare va consta din imagini de dimensiuni relativ reduse, din considerente ale memoriei disponibile si a timplui de antrenare. Aceste imaginii au fost impartite in cinci categorii:
Un set de imagini cu flori
Un set de imagini contindand peisaje din padure
Un set de imagini cu oameni
Un set de imagini cu animale de companie
Un set de imagini cu peisaje urbane
Categorisirea imaginilor a fost facuta subiectiv, orientata descrierea verbala a continutului lor, lucru ce va fi relevant si va impacta performantele aplicatiei atunci cand vom tine cont de etichetarea lor in timpul antrenarii si testarii, subiect ce va fi dezvoltat mai tarziu. Mentionez faptul ca daca aceasta clasificare ar fi fost facuta intr-un mod diferit, spre exemplu, tinand cont de coerenta culorilor prezente in imagine, acest lucru cu siguranta ar fi ajutat reteaua in invatarea imaginilor, intamplator, categoriile ce constau in imagini florale si paduri sunt caracterizate din faptul ca sunt dominate de aceleasi nuante, ceea ce probabil va asigura performantele cele mai bune pe acele doua seturi.
Pentru antrenare se vor incarca imaginile din setul de antrenare, care sunt imagini RGB, apoi, folosind formula 1.1.1, se vor genera imaginile corespunzatoare in nivele de gri. Apoi, pentru fiecare pixel din imaginile de antrenare, se vor genera vectorii de trasaturi. Vectorii de intrare vor avea urmatoarea structura:
N x N valori reprezentand intenstitatea nivelelor de gri din vecintatate, normate in intervalul [0,1]
Un vector format din 5 valori, toate 0, mai putin valoarea din vector al carui index corespunde cu eticheta imaginii din care provine vecinatatea
Vectorii de iesire vor fi formati din valori in intervalul [0,1] reprezentand intensitatile pentru canalele R, G si B ale pixelului din centrul vecinatatii curente, urmand ca in final acestea sa fie transformate in valori intregi in intervalul [0, 255] pentru reprezentarea imaginilor rezultate.
Odata ce setul de vectorii de antrenare a fost generat, urmeaza procesul de antrenare, care se va face folosind metoda de antrenare clasica prin optimizare de gradient prin backpropagation. Functia obiectiv fiind eroarea patratica medie.
Dupa finalizarea antrenarii, vectorii de antrenare sunt trecutii prin retea pentru a vedea rezultatele finale, si a masura cat de bine a invatat reteaua neuronala. Avand imaginile de la iesire, si imaginile originale RGB, se pot calcula erorile patratice medii si raportul semnal zgomot, care vor fi folosite pentru o analiza obiectiva a rezultatelor. -Ideea folosirii acestor parametri apartine domnului profesor coordonator Conf. Dr. Ing. Corneliu FLOREA.
Pentru testare se urmeaza aceeasi pasi, mai putin antrenarea retelei.
Capitolul 4.1 : Surse aditionale de informatie
Asa cum am stabilit in punctul anterior, ne folosim de informatia disponibila in jurul pixelilor pentru a ajuta la discriminarea lor, si la invatarea culorii potrivite, totusi, pot exista scenarii in care informatia prezenta in vecinatate nu este suficienta. Este usor sa ne imaginam un astfel de scenariu. Daca consideram o imagine cu iarba, si una cu un animal, in anumite conditii, vecinatatile din jurul unui pixel corespunzator unui fir de iarba, si cele din jurul unui fir din blana acestui animal pot fi extrem de similare, astfel incat reteaua nu va putea sa le diferentieze, si va fi nevoita sa medieze aceste doua contradictii, si astfel in loc sa avem iarba verde si blana maro, ambele vor fi colorate cu o culoare care reprezinta media acestora doua.
Este clar deci, faptul ca exista situatii, in care vecinatatea nu ofera informatie suficienta, bineinteles, acest lucru ar putea fi mitigat prin alegerea unei dimensiuni foarte mare pentru vecintatate, si sa facem o retea neuronala cu foarte multi neuroni in stratul ascuns, pe care sa o antrenam timp indelungat, si poate v-a invata sa le diferentieze astfel, insa acest lucru este foarte costisitor si ca timp si ca putere de calcul, deci, ar putea fi de interes daca am mai putea extrage si folosi si alte informatii pentru a ne ajuta.
4.1.1 Recunoasterea automata a obiectelor din imagine
Cea mai performanta soltie ar fi, daca am putea oferii retelei neuronale informatii despre titpul de obiect din care face parte vecinatatea curenta. Astfel reteaua ar putea diferentia clar intre texturile intalnite in imaginie stiind diferenta dintre planta, animal, om, etc. Acest lucru ar avea si avantajul de a micsora cantitatea de informatie necesara in vecinatate, si prevad conditii in care, daca segmentarea imaginii se face cu o granularitate destul de fina, ar fi suficienta informatia dintr-un singur pixel.
Deci prezinta interes metodele automate de recunoastere si etichetare a elementelor prezente intr-o imagine.
Metoda descrisa in capitolul 3.2 pare sa contina elementele unei astfel de abordari, tinand cont de faptul ca metoda a fost descrisa ca fiind una de clasificare, mai degraba, decat una de predictie. Diferenta fiind ca in algoritmul lor, nu se eticheteaza superpixelii cu tipul de obiect, ci pur si simplu cu clasa de superpixeli a caror culoare a fost invatata in procesul de antrenare.
O posibila abordare a acestei probleme ar fi bazata tot pe un proces de machine learning in care am antrena un clasificator separat sa se ocupe de etichetarea obiectelor din imagini. Pasii unei astfel de metode ar fi urmatorii:
Construirea si antrenarea unui clasificator capabil sa recunoasca o gama larga de texturi pentru etichetare
Aplicarea unei metode performante de segmentare a imaginii de intrare pentru a separa regiunile in zone apartinand aceluiasi obiect (ex. JSEG)
Pentru fiecare segment individual se cauta o zona rectangulara de arie cat mai mare care sa fie etichetata de clasificatorul mentionat mai sus
Propagarea etichetei pe tot segmentul
Folosirea acestei informatii la antrenarea si testarea retelei neuronale de colorizare
O metoda performanta de etichetare a elementelor dintr-o imagine este propusa de Julian McAuley et al. Ei propun o metda de etichetare a regiunilor unei imagini prin invatare structurata, aceasta etichetare fiind ierarhica, adica regiunile din imagine sunt etichetate pe mai multe niveluri, incepand de la toata imaginea, care apoi este impartita in regiuni egale, care sunt si ele etichetate la randul lor, si apoi impartite in continuare intr-un mod recursiv[13].
Acestia pornesc de la ideea ca anumite categorii dintr-o imagine pot fi identificate direct doar pe baza propietatilor globale ale imaginii, in timp ce altele depinde de informatie locala. O solutie posibila a acestei probleme fiind posibilitatea de a construi clasificatori de ordin I, bazati pe informatie locala, extrasa la scale diferite in imaginea de clasificat, insa este foarte grea antrenarea acestor clasificatori pentru a respecta constrangeri de netezire (adica sa asigure faptul ca regiunile apropiate sunt etichetate in categorii similare, trecerea nefind brusca). Astfel, se propune o metoda bazata pe o structura arborescenta, ce poate satisface constrangerile de netezire, bazandu-se pe informatii extrase la scari diferite[13].
Metoda se bazeaza pe o reprezentare sub forma de graf unidirectional, in care un nod este conectat de alte noduri doar daca se suprapun pe aceeasi regiune, mai simplu spus, fiecare not este conectat direct la cele patru noduri corespunzatoare subdiviziunii sale, formand astfel un arbore cuaternar. Nu exista legaturi intre nodurile vecine, dar in autorii se asteapta ca lagaturile dintre parinti si copii sa fie suficiente pentru a asigura satisfacerea constrangerilor de netezire[13].
Clasificarile se fac intr-un mod ierarhic, anume fiecare nod de nivel superior are atribuita o clasa mai generala, in timp ce nodurile inferioare, de nivel mai adanc, devin mai specifice, astfel, etichete de tip “oaie” si “cal” pot apartine unui nod cu eticheta “camp” in timp ce etichete de tip “scaun”, “masa” sa se regaseasca sub un nod etichetat de “scena de interior”, iar o eticheta de tip “fundal” este considerata valida ca fiind membra a oricarei categorii superioare. Aceste constrangeri sunt indeplinite prin asignarea unui cost infinit functiei obiectiv, in cazul in care rezultatul unei clasificari nu apartine setului de etichete corespunzatoare nodului parinte[13].
Clasificatorii folositi de acestia ofera ca rezultat un vector in care toate pozitiile sunt 0 iar pozitia corespunzatoare clasei castigoatoare contine probabilitatea ca o regiune x sa apartina clasei y. Acestia testeaza doua modalitati de generalizare a clasifiarii, un model in care exista un vector separat pentru fiecare nivel de adancime a nodurilor, si se specifica nivell curent, sau un alt model, in care exista un singur vector format din concatenarea rezultatelor a mai multor clasificatori pentru fiecare nivel, continand un numar de probabilitati egal cu numarul de nivele, iar restul valorilor fiind zero . O alta parte a functiei obiectiv tine de respectarea ierarhiei, descrisa mai sus, si faptul ca nodurile asociate aceleasi clase pe nivele diferite sa aiba aceeasi probabilitate asociata[13].
Functia eroare indica cat de “gresita” este o eticheta assignata de catre clasificator, fara de eticheta corecta. Autorii folosesc o functie de eroare bazata pe cea Hamming, care este 0 pentru clasificare corecta, si inversul numarului de clase daca clasificarea a fost eronat. Acesta apoi scaleaza acest rezultat pentru a asigura ca fiecare regiune are aceasi contributie la eroare, mai exact o regiune de adancime mai mica va genera o eroare de 4 ori mai mare decat o regiune din nivelul urmator[13].
In final acestia foloesc o metoda de invatare structurata, pe care insa nu o detaliaza, dar se bazeaza pe masini cu vector suport [14]. Acestia au antrenat pe baza de date VOC2008 pentru antrenare si VOC2007 pentru testare[13]. Rezultatele obtinute au fost destul de bune pentru clasificatorii care au fost antrenati, rezultatele acestora respectand constrangerile de ierarhie, spre deosebire de alte modele care in nivelele cu adancime mare dadeau rezultate sporadice si inconsistente cu continutul de ansamblu al imaginii.
Fig 4.1.1.1 Rezultatele etichetarii pe regiuni obtinute cu metoda descrisa anterior [13]
4.1.2 Clasificarea imaginilor
Din moment ce recunoasterea obiectelor este o problema foarte complexa cu o multitudine de abordari mai mult sau mai putin performante, ce necesita multa putere de calcul si timp de antrenare, ar putea fi practica si o abordare de clasificare la un nivel mai inalt. Daca nu putem sa-i spunem retelei tipul exact al obiectului din care provine vecinatatea, poate este suficient sa specificam doar tipul general al imaginii din care provine aceasta, si ar putea sa confere destula informatie pentru a spori abilitatea de colorizare a a retelei.
Cand vine vorba de intelegerea unei scene, aceasta abilitate este la randul ei una ce necesita o capacitate de intelegere si prelucrare a informatiei ce se poate gasi doar in oameni, aceasta abilitate bazandu-se pe modul in care este organizat creierul primatelor, complexitate ce a inspirat aparitia retelelor neuronale convolutionale (CNN) [19]. Dintr-o cautare rapida a termenilor “scene recognition” se poate observa cu ochiul liber ca aceste CNN-uri au devenit un standard in ceea ce priveste recunoasterea de continut vizual.
Problema de recunoastere a scenelor poate fi abordata in doua modalitati diferite, fie prin recunoasterea obiectelor individuale din scena si apoi formarea unei etichete semantice bazate pe acest continut, fie prin antrenarea retelelor sa recunoasca scene in mod direct, la nivelul global al imaginii, fara a pune importanta pe obiectele individuale din scena[20].
Bolei Zhou et al. au investigat performantele unei astfel de retea neuronala in cazul in care se dispune de o baza de date de imagini foarte mare, mai mare decat orice baza de date folosita in precedent si au concluzionat ca performantele atinse sunt mai bune decat alte retele antrenate pe baze de date mai mici[19]. Deci se poate concluziona ca o retea neuronala convolutionala cu multe straturi, antrenata pe o baza de date suficient de mare poate rezolva aceasta problema. Astfel de retele neuronale antrenate, cu performante bune sunt disponibile pe site-ul “MIT Places” [21] si sunt bazate pe un framework pentru retele de tip deep compatibila cu Python[22], ceea ce ar permite teoretic integrarea unei astfel de solutii in aplicatia ce urmeaza a fi dezvoltata
4.1.3 Imagini pre etichetate
Desi am ales sa nu implementez o metoda de recunoastere a scenelor din considerente de timp, dificultate si faptul ca este o problema de sine statatoare care ar iesi din subiectul acestei lucrari de licenta, informatia privind categoria imaginilor va fi asociata manual pentru fiecare set de imagini de cele cinci categorii mentionate la inceputul capitolului 4. Se va facecomparatie intre performantele metodei atunci cand imaginile sunt etichetate fata de cazul in care nu se tine cont de aceste etichete.
Pornind de la o baza de date de imagini clasificate dintr-un numar relativ mic de categorii, folosind o etichetare grosiera a continutului, putem folosi informatia oferita de categorii pentru a da indicii retelei neuronale despre continutul cu care avem de aface, pentru a mari sansele ca reteaua sa faca predictii corecte.
Spre exemplu, antrenand reteaua neuronala pe o clasa de imagini etichetata ca fiind “padure”, ne asteptam ca reteaua sa aiba tendinta de a colora imaginea catre nuante verzi. Desigur, daca eticheta este eronata, rezultatele vor fi si ele eronate, introducand o imagine cu un oras, etichetata ca padure, vom avea ca rezultate cladiri verzi.
In aceste conditii reteaua neuronala va avea o structura destul de simpla, ea trebund sa tina cont doar de vecinatatea pixelului curent si eticheta imaginii. Spre exemplu, daca avem de aface cu o vecintatate patratica NxN si C categorii distincte de imagini codate “one-hot” am avea nevoie de o retea formata din NxN + C neuroni de intrare, 3 neuroni de iesire si un numar variabil de neuroni in straturile ascunse ale retelei. Desigur forma si dimensiunea vecinatatii va trebui sa fie aleasa optimal in urma a mai multor iteratii de testare si antrenare pentru a vedea ce valori duc la precizia cea mai buna.
Aceasta metoda are avantajul de a avea nevoie de o singura retea neuronala de dimensiuni fixe, care nu depinde de dimensiunea imaginilor sau a obiectelor din imagine.
Capitolul 5 : Implementarea in Python
Am ales Python ca limbaj pentru implementarea aplicatiei deoarece acesta permite dezvoltarea rapida de aplicatii datorita bibliotecilor de care dispune si datorita nivelului inalt al limbajului care se ocupa in fundal de detaliile de care ar trebui sa se ocupe programatorul daca ar lucra intr-un limbaj de nivel mai jos precum C. De asemenea mai exista si avantajul ca acesta nu necesita licenta spre deosebire de MATLAB.
Distributia Anaconda are avantajul de a veni impreuna cu bibliotecile comune pentru calcule matematice si uz academic. Pentru retele neuronale am folosit biblioteca “nimblenet” care permite creearea, antrenarea si folosirea retelelor de tip perceptron multistrat si contine o paleta larga de functii de activare si algoritmi de antrenare.
Desigur, simplitatea procesului de dezvoltare a aplicatiei are costuri ce constau in viteza de executie mai slaba (Python fiind un limbaj interpretat) si probleme de optimizare. Aceste doua fapte au limitat aplicatia in ceea ce priveste volumul de date ce poate fi procesat intr-un timp util. Astfel, din considerente de timp si memorie limitata, dimensiunea si cantitatea imaginilor ce pot fi procesate concomitent intr-un set de antrenare este limitata. Deoarece numarul de imagini creste cantitatea de informatie intr-un mod liniar, in timp ce dimensiunea o face intr-un mod exponential, am ales sa limitez imaginile procesate de aplicatii la a avea ce mai mica dimensiune de fix 100 de pixeli, iar cealalta dimensiune sa-si pastreze proportia.
Totusi, imaginile de rezolutie mica nu sunt foarte placute privirii si observarea de detalii este aproape imposibila in astfel de imagini, si deci, ar fi utila o metoda de a putea folosi reteaua neuronala antrenata pe imagini mici, pe imagini mari. Acest subiect va fi elaborat mai jos.
Aplicatia incepe prin incarcarea pozelor mici din setul de antrenare sau de test, in functie de modul selectat. Pozele mici sunt identificate de faptul ca in denumirea lor contine subfixul “sm” de la “small” ceea ce denota faptul ca acestea sunt de dimensiuni mici. Acest lucru este indeplinit cu ajutorul functiei “walk” a bibliotecii “os” ce permite interactiunea intre Python si sistemul de operare. Aceasta functie intoarce o lista du toate directoarele, subdirectoarele si fisierele gasite in mod recursiv intr-o cale specificata ca argument. Acestea pot fi apoi parcurse si in ele se poate cauta subfixul “sm” in denumirile fisierelor, astfel acestea pot fi adaugate in lista de fisiere ce trebuiesc incarcate.
Fig 5.1 Schema de functionare a aplicatiei
cls = 0
paths = []
origfn = []
walk = os.walk(path)
for root, dirs, files in walk:
print root
for file in files:
print file
if 'sm' in file:
paths += [(root + '/' + file, cls)]
cat = root.split('/')
origfn += [cat[-1] + "/" + file]
cls += 1
Calea si “eticheta” fiecarui fisier formeaza un tuplu care apoi este adaugat in lista, urmand apoi ca fiecare element din aceasta lista sa fie incarcat cu functia “imread” din biblioteca “mahotas”.
Urmeaza apoi partea de preprocesare a imaginilor pentru a transforma informatiile continute de imagini in date potrivite pentru reteaua neuronala. Pentru fiecare imagine din set se aloca matricile ce urmeaza sa stocheze varianta lor bordata si pentru rezultatele predictiei. Dupa aceasta alocare are loc bordarea propiu zisa
for i in range(0, IMG_H):
for j in range(0, IMG_W):
target[VEC_RANGE + i][VEC_RANGE + j] = img[i][j]
#bordare colturi
for i in range(0, VEC_RANGE):
for j in range(0, VEC_RANGE):
target[i][j] = img[VEC_RANGE – i][VEC_RANGE – j]
target[i][IMG_W + VEC_RANGE + j] = img[VEC_RANGE – i][IMG_W – j – 1]
target[VEC_RANGE + IMG_H + i][VEC_RANGE + IMG_W + j] = img[IMG_H – 1 – i][IMG_W – 1 – j]
target[VEC_RANGE + IMG_H + i][j] = img[IMG_H – 1 – i][VEC_RANGE – j]
#bordare sus-jos
for i in range(0, VEC_RANGE):
for j in range(0, IMG_W):
target[i][VEC_RANGE+j] = img[VEC_RANGE – i][j]
target[VEC_RANGE + IMG_H + i][VEC_RANGE + j] = img[IMG_H – 1 – i][j]
#bordare laterala
for i in range(0,IMG_H):
for j in range(0,VEC_RANGE):
target[i+VEC_RANGE][VEC_RANGE+IMG_W+j] = img[i][IMG_W-j-1]
target[VEC_RANGE + i][j] = img[i][VEC_RANGE – j]
Imaginea bordata obtinuta este apoi transformata in imagine cu nivele de gri printr-o transformare exprimata eficient prin inmultirea de matrici implementata folosind biblioteca “numpy” care este dedicata manipularilor de matrici.
def rgb2gray(rgb):
return np.dot(rgb[…,:3], [0.299, 0.587, 0.114]) [15]
Pasul urmator este formarea vectorilor de intrare din vecinatati. Dimensiunea vecinatatilor este definita la inceputul programului, impreuna cu alti parametri constanti ai retelei neuronale, precum dimensiunea straturilor ascunse si numarul de iteratii de antrenare. Pentru fiecare pixel din imagine se formeaza un vector de valori corespunzator cu numarul de pixeli ai unei vecinatati ( acum fiind clar de ce imaginile de rezolutie inalta si folosirea vecinatatilor de dimensiuni mari duce la un consum foarte mare de memorie ). Datorita modului de implementare a bibliotecii “nimblenet”, datele de intrare trebuiesc cuplate explicit cu datele de iesire prin entitati denumite instante. Odata ce vecinatatea a fost vectorizata, la finalul vectorului de intrare se alipseste si vectorul de etichetare, descris in capitolul patru. In final, informatia de iesire este formata din tripetul de valori RGB corespunzatori pixelului curent.
In urma procesului de prelucrare urmeaza setarea retelei neuronale. Se incepe cu definirea numarul de neuroni de intrare, care este patratul dimensiunii laterale a unei vecinatati, plus dimensiunea vectorului de etichetare, care este 5 in cazul de fata. Apoi se definesc straturile ascunde si cel de iesire printr-o lista de tupleti, formati din dimensiunea acestora si tipul functiei de activare.
settings = {
"n_inputs" : VEC_SIZE * VEC_SIZE + 5,
"layers" : [(HIDDEN_LAYER1, ReLU_function), (HIDDEN_LAYER2, ReLU_function), (3, ReLU_function)]
}
In functie daca se doreste antrenarea retelei sau pur si simplu testarea ei, urmeaza fie procesul de antrenare al retelei prin backpropagation sau incarcarea retelei dintr-un fisier deja existent. Ponderile rezultate in urma procesului de antrenare pot fi salvate pentru mai tarziu, insa trebuie mentionat ca acestea sunt independente de setarile retelei, mai exact, ele nu sunt specificate explicit in fisiere, ci trebuiesc sa corespunda, altfel incarcarea de ponderi va esua datorita necorespondentei dintr-e numarul de neuroni din setari si cei ai retelei salvate.
if loadnet == True:
network = NeuralNet.load_network_from_file("%s.pkl" % "filename")
else:
…
backpropagation(network, training_set, test_set, cost_function, save_trained_network=True, print_rate = 2,
max_iterations=MAX_ITERATIONS)
network.save_network_to_file("%s.pkl" % "filename")
In final, dupa ce reteaua a fost incarcata din fisier sau s-a terminat procesul de antrenare, urmeaza procesul de predictie a iesirilor. Rezultatul predictiei este un vector de dimensiuni mari in care toti pixelii imaginilor de iesire sunt situati secvential, astfel este necesar un process de parcurgere al acestui vector pentru formarea imaginilor de iesire dorite, acest proces se bazeaza pe calculul unei deplasari in vector bazat pe suma produsului dimensiunilor imaginilor folosite ca set de intrare ( dimensiunile ar trebui sa fie identice ). Odata ce rezultatele au fost aduse intr-o forma corespunzatoare imaginilor, acestea sunt afisate, apoi pe baza informatiilor de cale stocate ca tupluri in procesul de incarcare al imaginilor se genereaza caii pentru salvarea rezultatelor. Directorul radacina al acestor rezultate este denumit in functie de setarile retelei neuronale, pentru a permite o navigare usoara a acestora, numele fiind format din dimensiunea vecinatatii, numarul de neuroni in straturile ascunse si numarul de iteratii de antrenare, informatii ce vor fi utile in momentul in care se va dori calculul performantelor. De asemenea, pentru a evita suprascrierea rezultatelor mai vechi al aceleasi retele fisierele mai sunt ierarhizate in directoare formate din data si timpul finalizarii procesului.
settings = str(VEC_SIZE) + "_" + str(HIDDEN_LAYER1) + "_" + str(HIDDEN_LAYER2) + "_" + str(MAX_ITERATIONS) + "\\"
now = datetime.datetime.utcnow().strftime("%y-%m-%d_%H-%M")
savepath = "D:\\LICENTA\\Aplicatie\\images\\results\\" + settings + now + "\\"
dir = savepath
if not os.path.exists(savepath):
os.makedirs(savepath)
for k in range(0,len(prediction)):
IMG_H = len(prediction[k])
IMG_W = len(prediction[k][0])
if k == 0:
offset = 0
else:
offset += len(prediction[k-1])*len(prediction[k-1][0])
for i in range(0, IMG_H):
for j in range(0, IMG_W):
predcol = result[offset + i * IMG_W + j]
prediction[k][i][j] = [np.uint8(min(predcol[0] * 255, 255)), np.uint8(min(predcol[1] * 255, 255)), np.uint8(min(predcol[2] * 255, 255))]
Capitolul 5.2 Abordarea imaginilor de dimensiuni mari
Desigur, o implementare directa folosind aceeasi aplicatie este posibila, deoarece reteaua neuronala functioneaza pe vecinatati, deci dimensiunea imaginii este irelevanta. Dar, imaginea fiind de dimensiune mai mare si rezolutie mai mare, se poate intampla ca acelasi obiect sa fie reprezentat pe o arie de pixeli ce poate fi de dimensiuni variabile, deci, antrenand reteaua neuronala pe imagini ce au fost redimensionate, dimensiunile obiectelor, respectiv vecinatatile ce sunt invatate de retea, nu vor corespunde, deci rezultatele pot fi eronate. In afara de aceasta problema, imaginile mari ocupa foarte mult spatiu in memorie cand sunt reprezentate ca seturi de date pentru reteaua neuronala, ceea ce limiteaza numarul de imagini ce pot fi colorate intr-o singura rulare a aplicatiei, si necesita un timp de calcul inconvenient, mai mult de un minut pentru o singura imagine.
Fig 5.2 Comparatie intr-e culorile prezise pe imaginea mica comparativ cu cea mare
O alta solutie posibila, ce nu are dezavantajele mentionate mai sus, a fost inspirata de conceptul transferului de culoare din articolul publicat de Welsh et al. Astfel, am considerat elaborarea unei aplicatii secundare, care sa contina niste pasi aditionali de prelucrare pentru cazul imaginilor de dimensiuni mari care se pot rezuma la convertirea imaginilor in spatiul de culori YUV si transferul prin esantionare a componentelor UV
Pasii pentru prelucrarea imaginilor mari sunt urmatorii:
Se incarca imaginea mare, notata cu subfixul “big”
Se incarca analogul de dimensiuni redusa a acesteia, notata cu subfixul “sm”
Imaginea de dimensiuni reduse este prelucrata de reteaua neuronala pentru a obtine o versiune pseudocolorata
Imaginea originala mare, si imaginea colorata mica sunt convertite in spatiul de culoare YUV
Se calculeaza raportul de esantionare pe orizontala si verticala ca raport intre dimensiunile imaginilor mari, respectiv mici
Folosind acest raport, fiecarui pixel din imaginea de rezolutie mare i se transfera valorile U si V ale pixelui corespunzator din imaginea de dimensiuni mici
Fig 5.2 Imagine mare obtinuta prin transfer de culoare
Capitolul 5.3 Calculul parametrilor de performanta
Asa cum am mentionat in capitolul 4, pentru o apreciere obiectiva a rezultatelor, este necesara o metoda de a masura performanta in colorizare a aplicatiei, anume calculul erorii patratice medii si raportul semnal zgomot. Din pacate calculul acestora nu a fost implementat de la inceputul procesului de antrenare, astfel a fost necesara implementarea separata a acestor calcule, bazate pe imaginile salvate ca rezultat la finalul proceselor de testare si antrenare, deoarece ar fi foarte costisitoare ca timp reluarea acestor procese.
Capitolul 6 : Rezultate si Concluzii
Fig 6.1 Rezultate obtinute dupa 2000 de iteratii de antrenare cu functii de activare sigmoide
Din punct de vedere subiectiv si prin apreciere vizuala, rezultatele cele mai bune s-au obtinut pe imaginile din categoriile “urban”, “paduri” si “animale de companie”, in timp ce rezultate slabe au fost obtinute pe categoriile “oameni” si “flori”. In aceste rezultate intervin desigur mai multi factori. Principala cauza a lipsei de performanta pe seturile “oameni” si “flori” este variatia mare a culorilor prezente in setul de antrenare. Setul de antrenare a continut flori diverse acoperind o gama larga de culori, si practic, daca doua astfel de culori diferite se intampla sa corespunda aceluiasi nivel de luminozitate si tip de vecinatate (ex petala), atunci discriminarea devine grea spre imposibila cu informatiile valabile. O situatie similara este prezenta si in setul de imagini cu eticheta “oameni” , pielea oamenilor tinzand sa aiba nuante si nivele de luminozitate diferita, plus informatie inutila de fundal care complica situatia in plus. O solutie posibila a acestor probleme ar fi micsorarea variatiilor din setul de antrenare al acestor categorii, plus un timp de antrenare mult mai mare.
Performanta pe imaginile etichetate cu “padure” este usor explicata din faptul ca verde este culoarea dominanta in acest tip de scene, lucru pe care reteaua l-a invatat prea bine, ceea ce creeaza mici probleme in zonele care nu ar trebui sa fie verzi, precum scoarta copacilor si zonele de pamant. Acest lucru poate fi o consecinta a faptului ca procesul de antrenare are ca scop micsorarea erorii patratice, si aparent se genereaza o eroare totala mai mica prin colorarea intregii imagini cu verde decat daca ar pune nuante de maro acolo unde nu este cazul. Alte locuri unde nu se descurca foarte bine sunt acelea in care apar elemente neintalnite in setul de antrenare pe aceea eticheta, precum un caine, sau un lac.
[Imagine demonstrativa aici? Maybe]
Performanta pe setul de “animale” este si ea explicata prin faptul ca tinderea retelei de a colora blana in nuante de maro nu este gresita, iar faptul ca majoritatea se afla pe fundal verde, de iarba, din nou, ajuta. Exista totusi situatii de confuzie in care anumite zone din blana animalelor sunt colorate verzi datorita similaritatii texturii din vecinatatile de blana si a firelor de iarba.
Cand vine vorba de imagini din setul “urban”, reteaua a invatat faptul ca zonele uniforme si deschise la culoare sunt cer, si deci, albastre, iar in rest, culorile desaturate aplicate cladirilor sunt o aproximare destul de buna a realitatii, desigur, saturatia bogata a unora din imagini se pierde.
Bibliografie
[1] Cara Johnson, Hand – Coloring of Nineteenth Century Photographs, https://www.ischool.utexas.edu/~cochinea/pdfs/c-johnston-04-hand-coloring.pdf – 06.03.2017
[2] Constantin Vertan, Prelucrarea si analiza imaginilor, 1999
[3] RGB din cartea de pe master TAID.
[4] Rafael C. Gonzalez, Richard E. Woods, Digital Image Processing – Second Edition, Prentice Hall, 2002
[5] George Cybenko, Approximation by Superpositions of a Sigmoidal Function, Mathematics of Control, Signals and Systems 1989
[6] Judith E. Dayhoff, James M. DeLeo, Artificial Neural Networks – Opening the Black Box, 1999
https://www.researchgate.net/profile/James_Deleo/publication/227868123_Artificial_neural_networks/links/544073a10cf2fd72f99dd9b0.pdf – 07.05.2017
[7] Christopher M. Bishop, Pattern Recognition and Machine Learning, Springer, 2016
[8] Dustin Stansbury, A Gentle Introduction to Artificial Neural Networks
https://theclevermachine.wordpress.com/2014/09/11/a-gentle-introduction-to-artificial-neural-networks/ 09.05.2017
[9] Tomihisa Welsh, Michael Ashikhmin, Klaus Mueller “Transferring Color to Greyscale Images”, 2002
[10] CS231n Convolutional Neural Networks for Visual Recognition , Standford University, 2017http://cs231n.github.io/neural-networks-1/#actfun 15.05.2017
[11] Manoj Nagarajan et al., Machine Learning based Efficient Image colorization,
http://pages.cs.wisc.edu/~marannan/Project_Report_CS534.pdf 17.05.2017
[12] Jeff Hwang, You Zhou, Image Colorization with Deep Convolutional Neural Networks
http://cs231n.stanford.edu/reports/2016/pdfs/219_Report.pdf 17.05.2017
[13] Julian McAuley et al. “Hierarchical Image-Region Labeling via Structured Learning”
https://cseweb.ucsd.edu/~jmcauley/pdfs/bmvc09.pdf 20.05.2017
[14] Ioannis Tsochantaridis et al. “Support Vector Machine Learning for Interdependent and Structured Output Spaces” http://www.machinelearning.org/proceedings/icml2004/papers/76.pdf 20.05.2017
[15] https://stackoverflow.com/questions/12201577/how-can-i-convert-an-rgb-image-into-grayscale-in-python
[16] Todd Veldhuizen, Measures of image quality, CVOnline, http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/VELDHUIZEN/node18.html 25.05.2017
[17] Sursa: https://en.wikipedia.org/wiki/File:CIE1931xy_CIERGB.svg (imagine din domeniu public)
[18] Sursa: https://en.wikipedia.org/wiki/File:CIE_1931_Luminosity.png (imagine din domeniul public)
[19] Bolei Zhou et al. “Learning Deep Features for Scene Recognition using Places Database”
https://papers.nips.cc/paper/5349-learning-deep-features-for-scene-recognition-using-places-database.pdf 03.06.2017
[20] Bavin Ondieki, “Convolutional Neural Networks for Scene Recognition”, Standford
http://cs231n.stanford.edu/reports/2015/pdfs/ondieki_final_paper.pdf
[21] http://places.csail.mit.edu/index.html
[22] http://caffe.berkeleyvision.org/installation.html
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: Metode de pseudocolorare [310243] (ID: 310243)
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.
