Sieci neuronowe - projekt Maciej Barański, Kamil Dadel 15 stycznia 2015 Streszczenie W ramach projektu został zrealizowany algorytm kompresji stratnej bazujący na działaniu samoorganizującej się sieci Kohonena. Algorytm został zaimplementowany w środowisku Matlab oraz porównany z działaniem algorytmu Vector Quantization. Spis treści 1 Wstęp teoretyczny 2 1.1 Wektoryzacja.................................................. 3 1.2 Transformata cosinusowana.......................................... 3 1.3 Filtr dolnoprzepustowy............................................. 3 1.4 Kwantyzacja.................................................. 3 1.4.1 Kwantyzacja wektorowa........................................ 3 1.4.2 Samoorganizują się sieć neuronowa.................................. 3 1.5 Kodowanie................................................... 4 2 Eksperymenty 5 2.1 Pierwszy eksperyment - Lena......................................... 5 2.2 Drugi eksperyment - kwiat........................................... 5 2.3 Porównanie działania dwóch metod...................................... 6 3 Wnioski 8 4 Instrukcja 9 4.1 Nauka sieci................................................... 9 4.2 Kompresja obrazu............................................... 9 4.3 Uwagi...................................................... 9 1
1 Wstęp teoretyczny Kompresja obrazów jest ważną dziedziną przetwarzania obrazów. W informatyce jest wszechobecna - każda grafika komputerowa zawiera w sobie pewien poziom kompresji, który pozwala pogodzić ilość potrzebnej przestrzeni (bądź potrzebnego transferu) oraz jakość obrazu. Rysunek 1: Schemat kompresji obrazów Na schemacie 1 przedstawiono jeden ze schematów kompresji obrazów. Oryginalny obraz zostaje zamieniony na postać macierzową. Następnie dokonywana jest transformata cosinusowa ze względu na pożądane cechy (łatwo zniwelować wysokie częstotliwości, które nie są widoczne dla ludzkiego oka w obrazie). Następnie wysokie częstotliwości są niwelowane filtrem dolnoprzepustowym. Następnie dokonywana jest kwantyzacja, która pozwala na przybliżenie wartości za pomocą słów zdefiniowanych w słowniku. Dzięki temu otrzymywane są indeksy (które zajmują mniej pamięci niż odpowiadające im wartości). Następnie indeksy te są odpowiednio kodowane w celu zmniejszenia potrzebnej pamięci. Tak przygotowany obraz jest skompresowany. Należy zaznaczyć, że strata informacji następuje w filtrze oraz w kwantyzacji. Odtwarzanie obrazu polega na wstępnym zdekodowaniu indeksów, odtworzenie wartości częstotliwości oraz przeprowadzenie odwrotnej transformaty cosinusowej. Rysunek 2: Schemat kompresji obrazów z samoorganizującą się siecią w projekcie zostanie porównanie działanie schematu 1 oraz 2. Jedyna różnica w działaniu polega na sposobie kwantyzacji: w pierwszym jest stosowana kwantyzacja wektorowa, zaś w drugim kwantyzacja za pomocą samoorganizującej się sieci neuronowej. 2
1.1 Wektoryzacja Istnieje wiele różnych przestrzeni barw: RGB,CMYK oraz HSV. W projekcie założono stosowanie tylko odcieni szarości. Dzięki temu obraz jest zamieniany na postać macierzową. 1.2 Transformata cosinusowana Dyskretna transformata kosinusowa (DCT z ang. discrete cosine transform) jest stosowana w kompresji danych ze względu na to, że większość jej współczynników jest bliska 0. Dzięki temu po kwantyzacji będą się zerować, co pozwoli na ich zapis za pomocą mniejszej ilości bitów przy niedużej stracie jakości. Transformata ta jest stosowana w kompresji JPEG oraz MPEG. 1.3 Filtr dolnoprzepustowy Po transformacie cosinusowej istotne, niskie częstotliwości znajdują się w lewym, górnym rogu, zaś wysokie częstotliwości w prawym, dolnym rogu. Będą one eliminowane, ponieważ nie są istotne z punktu widzenia jakości obrazu. 1.4 Kwantyzacja Kwantyzacja będzie polegać na zamianie wartości na te, które są zdefiniowane w słowniku. Liczba wartości w słowników jest zazwyczaj dużo mniejsza niż liczba możliwych wartości. Ponadto dzięki zdefiniowaniu słownika po kwantyzacji nie są istotne już same wartości, lecz indeksy tych wartości w słowniku. 1.4.1 Kwantyzacja wektorowa Kwantyzacja wektorowa będzie polegać na zamianie przestrzeni wektorowej R k na przestrzeń wektorową Y = {y i : i = 1,..., N}. Każdy wektor y i jest nazywany słowem w zbiorze Y nazywanym słownikiem. Ponadto każdemu słowu w słowniku jest zdefiniowany region przynależności (z ang. Voronoi region) zdefiniowany następująco: V i = {x V k : x y i x y j, j i} (1) Kwantyzacja wektorowa bazuje na pojęciu odległości - zazwyczaj definiowanej jako norma euklidesowa. Region przynależności do danego słowa to wszystkie wektory, które są najbliższe (w sensie zdefiniowanej normy) danemu słowu. Jak działa enkoder? Dekoder kwantyzacji dla wektora wejściowego oblicza wszystkie odległości tego wektora do wszystkich słów w słowniku. Następnie zwraca indeks tego słówa, dla którego obliczona odległość jest najmniejsza. Jak działa dekorer? słowniku. Mając dany słownik oraz indeks wystarczy odnaleźć wartość słowa, który ma dany indeks w Jaki jest algorytm powstawania słownika? 1. Ustalić rozmiar słownika N. 2. Wybrać losowo N słów - będzie to słownik początkowy. 3. Ustalić regiony przynależności - dla wszystkich wektorów wejściowych ustalić do którego słowa w słowniku należą na podstawie ustalonej miary 4. Ustalić nowe słowa w słowniku za pomocą wzoru y i = 1 m m j=1 x ij, gdzie m jest ilością wektorów należących do słowa, a i jest kolejnym wymiarem wektora. 1.4.2 Samoorganizują się sieć neuronowa Samoorganizująca się sieć neuronowa jest nazywana także siecią Kohonena. Uczy się bez nadzoru (z ang. unsupervised learning). Wyjściem sieci jest zdyskretyzowana reprezentacja przestrzeni wejściowej zwana mapą. Sieć Kohonena zachowuje właściwości przestrzeni wejściowej. Nauka sieci polega ciągłym przetwarzaniu za pomocą sieci wektorów wejściowych. Każdy wektor jest porównywany z wszystkimi neuronami (za pomocą normy) i wybierany jest zwycięzca, który ma największą normę. Współczynik wagi zwycięskiego neuronu zostaje zmieniony. Istnieje możliwość wprowadzenia sąsiedztwa, które zmienia również neurony sąsiadujące ze zwycięskim. 3
Rysunek 3: Topologia samoorganizującej się sieci neuronowej Sieć w naszym wypadku działa bardzo podobnie do kwantyzacji wektorowej, w związku z tym zastosowano ją do schematu kompresji danych. 1.5 Kodowanie W projekcie zostało zaimplementowane kodowanie różnicowe oraz kodowanie Huffmana. Kodowanie różnicowe Mając dany ciąg danych d 1,..., d N kodowanie różnicowe poleca na zamianie ciągu na nowy ˆd 1,..., ˆd N, w którym pierwszy element ˆd 1 pozostaje taki sam, zaś każdy następny jest zdefiniowany następująco: Dekodowanie polega na odwrotnej transformacji zdefiniowanej następująco: Kodowanie Huffmana 1. Określ prawdopodobieństwo każdego symbolu ˆd i = d i d i 1 (2) d i = d i 1 + ˆd i (3) 2. Stwórz listę drzew binarnych, które na początku posiada tylko korzeń składający się z pary: symbol i prawdopodobieństwo. 3. Dopóki na liście nie zostanie tylko jedno drzewo należy: (a) usunąć dwa drzewa o najmniejszym prawdopodobieństwie w korzeniu (b) wstawić nowe drzewo, którego korzeń jest sumą prawdopodobieństw usuniętych drzew, zaś one same stają się lewym i prawym poddrzewem. Powstałe drzewo nazywamy drzewem Huffmana. 4
2 Eksperymenty W ramach projektu zostały przeprowadzone dwa eksperymenty mające na celu porównanie działania kwantyzacji wektorowej oraz sieci samoorganizującej się. 2.1 Pierwszy eksperyment - Lena Pierwszy eksperyment polegał na wytrenowaniu sieci neuronowej oraz na stworzeniu słownika do kwantyzacji wektorowej przy pomocy znanego obrazu Lena. Rysunek 4: Lena - obraz wejściowy Poniżej przedstawiono wynik działania kwantyzacji wektorowej oraz sieci Kohonena. Rysunek 5: Wynik działania kwantyzacji wektorowej Rysunek 6: Wynik działania samoorganizującej się sieci Nie istnieje jednoznaczna miara pozwalająca na określenie jakości kompresji. W obu przypadkach ustawiono ten sam stopień kompresji - 1.3. Wobec tego decydujące znaczenie ma, który z tych obrazów wynikowych bardziej przypomina obraz wejściowy dla ludzkiego oka. W tym przypadku widać, że nieznacznie lepszy wynik dała sieć neuronowa. 2.2 Drugi eksperyment - kwiat Drugi eksperyment polegał na kompresji obrazu przedstawionego poniżej: 5
Rysunek 7: Kwiat - obraz wejściowy Jednak w tym wypadku kwantyzacja została przeprowadzona na słowniku i na sieci wytrenowanej za pomocą obrazu Lena. Rysunek 8: Wynik działania kwantyzacji wektorowej Rysunek 9: Wynik działania samoorganizującej się sieci Jak widać obie metody uzyskały gorszą jakość. Oceniając subiektywnie sieć Kohonena również w tym przypadku uzyskała lepszy wynik. 2.3 Porównanie działania dwóch metod W tej części rozdziału przedstawiono obiektywne porównania działania samoorganizującej się sieci (SOM) oraz kwantyzacji wektorowej (VQ). Na początek przedstawiono czas wykonywania się wspólnych etapów kompresji dla obu metod. Tablica 1: Czas działania etapów wspólnych dla obu metod Czas [s] Lena SOM Kwiat SOM DCT 0.0041478 0.00328266 Filtr dolnoprzepustowy 0.000151817 0.000190733 Kodowanie roznicowe 0.0100969 0.00300768 Kodowanie Hoffmana 1.46109 1.54723 Dekodowanie Hoffmana 10.8187 13.4189 Dekodowanie roznicowe 0.00688478 0.00371844 Odwrotne DCT 0.00416662 0.00373725 6
W następnych dwóch tabelkach przedstawiono czasy wykonywania się etapów kodowania oraz nauki. Tablica 2: Porównanie czasów kodowania Lena SOM Kwiat SOM Lena VQ Kwiat VQ Czas kodowania [s] 702.778 852.515 0.435521 0.594474 Tablica 3: Porównanie czasu powstawania słownika oraz trenowania sieci neuronowej SOM VQ Czas powstawania slownika [s] 702.778 0.435521 W ostatniej tabelce przedstawiono parametry będące przybliżeniem jakości obrazu, która jest zauważalna dla ludzkiego oka. Pierwszy parametr MSE jest zwyczajnym błędem średniokwadratowym dwóch obrazów (A - obrazem po kompresji, B - obrazem referencyjnym): MSE = M N i=1 j=1 (A(i, j) B(i, j)) 2 (4) Drugi parametr PSNR (z ang. peak signal-to-noise) jest stosunkiem sygnału do szumu. Im większy parametr tym lepsza jakość obrazu. PSNR = 10 log 255 MSE (5) Tablica 4: Porównanie parametrów obrazów wynikowych Lena SOM Kwiat SOM Lena VQ Kwiat VQ PSNR [db] 71.9786 25.7237 60.401 25.8442 MSE 48.6507 4964.96 154.846 4905.45 7
3 Wnioski Podczas innych eksperymentów z algorytmami zauważono, że działają one tylko dla niezbyt skompresowanych obrazów. Wielokrotna kompresja obrazów sprawia, że tracone są istotne częstotliwości i nie jest możliwa rekonstrukcja obrazu. Kodowanie Huffmana można zastąpić kodowaniem UVLC, które ze względu na to, że jest zmiennej długości i dostosowywuje się do rozkładu danych wejściowych będzie lepiej przystosowane do zastosowanych algorytmów. W algorytmach zastosowaną prostą kompresję bez podziału obrazów na okna. Modyfikacja algorytmu uwzględniająca podział obrazu na okna pozwoli na istotne zwiększenie efektywności kompresji. Sieć Kohonena można z powodzeniem stosować zamiast kwantyzacji wektorowej. Pozwala ona na osiągnięcie lepszych wyników. Niestety działanie sieci jest o wiele dłuższe od działania algorytmu kwantyzacji wektorowej. 8
4 Instrukcja 4.1 Nauka sieci 1. Dokonaj wektoryzacji obrazu lena.jpg 2. Przeprowadź dyskretną transformatę cosinusową 3. Stwórz i naucz sieć Kohonena dla niskich częstotliwości 4. Zbadaj czas uczenia się sieci 5. Zdefiniuj nowy słownik Huffmana 4.2 Kompresja obrazu 1. Dokonaj wektoryzacji obrazu lena.jpg 2. Przeprowadź dyskretną transformatę cosinusową 3. Użyj filtru dolnoprzepustowego 4. Wykorzystaj sieć Kohonena nauczonej na obrazie lena.jpg 5. Przeprowadź kodowanie różnicowe i kodowanie Huffmana 6. Zbadaj czasy wykonywania się poszczególnych etapów 7. Wyznacz parametr MSE dla obrazów wynikowych i referencyjnych 8. Zbadaj rezultaty przeprowadzanych operacji 4.3 Uwagi Przydatne funkcje: 1. rgb2gray 2. dct2 3. selforgmap 4. train 5. huffmandict 6. diff_coding 7. huffmanenco Zaleca się użycie interfejsu graficznego do tworzenia i trenowania sieci neuronowej, który jest uruchamiany za pomocą polecenia nnstart. Umożliwia on wygenerowanie skryptu, który zawiera instrukcje pozwalające na powtórzenie działania interfejsu. 4.4 Zadanie dodatkowe Działanie kompresji można ulepszyć poprzez podział obrazu na okna i kodowanie całych okien DCT zamiast poszczególnych wartości. Ponadto istnieje możliwość zamiany kodowania Huffmana na efektywniejszy (na przykład UVLC). 9