Sprawozdanie_3

13

Click here to load reader

Transcript of Sprawozdanie_3

Page 1: Sprawozdanie_3

Narzędzia sztucznej inteligencji – laboratorium

Dzięgielewski LechKrems Joanna

rok III INF I st., gr. 8wtorek, godz. 11.55

Ćwiczenie 3: Zastosowanie sieci neuronowej z współzawodnictwem (Kohonena) do kompresji obrazów.

Ćwiczenie wykonano w dniach:8.05,15.05,29.05,5.06.2012

Sprawozdanie oddano dnia:12.06.2012

ocena:

1. Cel i zakres ćwiczenia

Celem ćwiczenia było zastosowanie warstwy neuronów z tzw. współzawodnictwem, uczonych metodą Kohonena (która jest metodą uczenia nienadzorowanego) w zadaniu kompresji obrazu. Sieć taka jest w stanie realizować kompresję stratną, polegającą na zmniejszeniu ilości informacji reprezentującej dany obraz przy zachowaniu błędu odwzorowania na określonym poziomie.

Rys.1. Ilustracja zastosowania sieci z współzawodnictwem w zadaniu kompresji obrazu.

1

Page 2: Sprawozdanie_3

2. Wstęp teoretyczny

Sieć Kohonena jest jednym z najbardziej znanych typów sieci neuronowych uczonej w trybie bez nauczyciela. Jest siecią o bardzo prostej strukturze – posiada tylko dwie warstwy, a przepływ informacji w tej sieci jest ściśle jednokierunkowy. Mimo prostej budowy i nieskomplikowanych metod określających sposób jej funkcjonowania, możliwości aplikacyjne tego typu modelu są olbrzymie.

Sieć Kohonena została nazwana przez jego twórcę samoorganizującym odwzorowaniem (Self-Organizing Map - SOM) lub samoorganizującym odwzorowaniem cech (Self-Organizing Feature Map - SOFM) i jest najbardziej popularnym typem sieci określanej mianem samoorganizującej.

W sieci tej mamy do czynienia z uczeniem konkurencyjnym. Oznacza to, że użytkownik ma do dyspozycji jedynie wzorce wejściowe, nie posiada natomiast żadnych wzorców wyjścia. Zadaniem sieci w trakcie procesu uczenia jest wytworzenie takich wzorców. Sieć ma na celu utworzenie takiej struktury, która w najlepszy sposób będzie odwzorowywała zależności w przestrzeni wektorów wejściowych.

Sieć jest zwykle jednokierunkowa, w której każdy neuron jest połączony ze wszystkimi składowymi N-wymiarowego wektora wejściowego X. Wagi połączeń neuronów tworzą wektor wi=[wi1, wi2, ..., wiN]T. Wektor sygnałów wejściowych X jest przed procesem uczenia normalizowany ||X||=1, co można zapisać jako:

Rys.2. Model neuronu stosowanego w sieci Kohonena

2

Page 3: Sprawozdanie_3

Rys.3. Struktura sieci Kohonena

Cechy sieci Kohonena:

sieć Kohonena jest narzędziem redukcji wymiarów – obiekty będące punktami w przestrzeni o dużej liczbie wymiar są rzutowane na warstwę wyjściową sieci Kohonena (tworzona jest tzw. mapa topologiczna)

obiekty znajdujące się blisko siebie w przestrzeni o dużej liczbie wymiarów znajdują się również blisko siebie na mapie topologicznej; obiekty odległe od siebie w przestrzeni o dużej liczbie wymiarów znajdują się również daleko od siebie na mapie topologicznej

neurony warstwy wyjściowej reprezentują skupienia obiektów

skupienia są charakteryzowane przez wagi reprezentujących je neuronów

3. Szczegółowe omówienie etapów ćwiczenia

Czynności wstępne – zapoznano się z działaniem dołączonych do biblioteki Neural Network Toolbox skryptów przykładowych ilustrujących działanie działanie warstwy neuronów z współzawodnictwem (nnd14cl, democ1) oraz zapoznano się z przeznaczeniem i składnią funkcji newc, train, sim.

Przebieg ćwiczenia

Punkty 1 – 2

3

Page 4: Sprawozdanie_3

Pobrano ze strony prowadzącego obrazek oraz otworzono nowe okno edytora m-plików i zapisano w nim poniższy kod:close allclear

Punkt 3Następnie umieszczono wywołanie funkcji imfinfo wyświetlającej

informacje o danym pliku graficznym.

imfinfo('peppers.tif')

Punkt 4Wczytano zawartość pliku graficznego do zmiennej (macierzy) o nazwie

„obraz”.

obraz = imread('peppers.tif');

Punkt 5W następnym kroku wyświetlono wczytany obraz w oknie graficznym.

figure(1)colormap grayimagesc(obraz,[0 255])

Rys.4. Wczytany obraz

Punkt 6Przeanalizowano informacje o obrazie otrzymane przy użyciu funkcji imfinfo

i otrzymano następujące informacje:

Rozdzielczość obrazu – 512x512

4

Page 5: Sprawozdanie_3

Bity wykorzystane na zakodowanie stopnia szarości pojedynczego piksela – 8 Wartość piksela w kolorze czarnym – 255

Rozmiar macierzy to 512x512.

Punkt 7Zdefiniowano zmienne nx i ny reprezentujące rozmiary ramek w pikselach i

przypisanie im żądanych wartości. Następnie przypisano zmiennym X i Y wartości reprezentujące rozmiary obrazu w pikselach oraz zmiennym Nx i Ny wartości reprezentujące ilość ramek w obrazie. Na koniec utworzono tablicę blokową A złożoną z Nx*Ny macierzy reprezentujących poszczególne ramki obrazu.

nx = 4;ny = 4;[X Y] = size(obraz);Nx = X/nx;Ny = Y/ny;A = mat2cell(obraz,repmat(ny,1,Ny),repmat(nx,1,Nx));

Punkt 8Wyświetlono zawartoś zmiennej A i jej wybranego bloku.

disp(A)disp(A{1,1})

Otrzymano:

11 58 61 59 13 91 87 87 14 95 89 83 13 82 96 82

Punkt 9Utworzono macierz wzorców wejściowych P.

P = zeros(nx*ny,Nx*Ny); for i=1:Ny for j=1:Nx P(:,j+(i-1)*Ny) =reshape(A{i,j},nx*ny,1); endend

Punkt 10Utworzono sieć Kohonena (czyli warstwę neuronów “z współzawodnictwem”,

uczonych bez nauczyciela) o odpowiedniej strukturze. Zdefiniowano zmienną N określającą liczbę neuronów w warstwie. Następnie zdefiniowamo zmienną eta określającą współczynnik prędkości uczenia się sieci oraz wywołano funkcję newc z odpowiednimi parametrami.

5

Page 6: Sprawozdanie_3

N=8;eta = 0.1;net=newc(P,N,eta);

Punkt 11Dopisano instrukcje, które po inicjalizacji warstwy wyświetlą rozmiary i

początkowe wartości elementów macierzy współczynników wagowych.

disp('Rozmiary macierzy wag: ')disp(net.IW)disp('Zawartosc macierzy wag: ')disp(net.IW{1})

Punkt 12Ponieważ macierz P ma duże rozmiary, wybrano z niej losowo pewną ilość

kolumn, które pełniły rolę wzorców uczących. W tym celu utworzyliśmy zmienną nf określającą ilość ramek prezentowanych w trakcie uczenia. Wygenerowano losowe liczby, stworzono macierz Pu zawierającą wylosowane kolumny macierzy P.

nf=Nx*Ny/4;r=randperm(Nx*Ny);Fi=r(1:nf);whos Fidisp(Fi)Pu=P(:,Fi);

Otrzymano: Wektor Fi ma rozmiar 1x4096 i zawiera losowe wartości z zakresu od 0 do 16

384 Macierz Pu ma rozmiary: 16x4096 i jest wypełniona kolumnami z macierzy P

wylosowanymi w Fi

Punkt 13Następnie korzystając z funkcji train przeprowadzono uczenie sieci w

oparciu o przygotowaną w poprzednim punkcie macierz Pu.

net.trainParam.epochs = 1;net = train(net,Pu)

disp('Rozmiary macierzy wag: ')disp(net.IW)disp('Zawartosc macierzy wag: ')disp(net.IW{1})

Otrzymano:Rozmiary macierzy wag: [8x16 double]

6

Page 7: Sprawozdanie_3

Funkcji uczącej train przekazano tylko 2 argumenty ze względu na metodę nauki sieci neuronowej. Metoda Kohonena nie wymaga podania wzorców wyjściowych ani błędu docelowego.

Punkt 14Przypisano macierz współczynników wagowych nauczonej warstwy zmiennej

W.

W = net.IW{1}

Punkt 15Przeprowadzono symulację działania sieci podając na jej wejście, w sposób

wsadowy, wszystkie wzorce wejściowe, czyli ramki składające się na obraz zapisane w macierzy P.

a = sim(net,P);

Punkt 16Dokonano konwersji macierzy a do postaci macierzy pełnej.

af = full(a);

Rozmiary macierzy af i a są identyczne, ilość miejsca, jakie zajmują jest natomiast różna. Macierz a:262148 Bytes, af:2097152. Przy wykorzystaniu macierzy rzadkiej uzyskano w tym przypadku 8-krotnie mniejsze zapotrzebowanie na pamięć.

Punkt 17Dokonano konwersji macierzy a do wektora ac. Wektor ten będzie pełnił rolę

„książki kodowej” w oparciu, o którą możliwe będzie odtworzenie uśrednionych wartości pikseli wchodzących w skład poszczególnych ramek, zakodowanych w ich współczynnikach wagowych.

ac = vec2ind(a);

Punkt 18Ponieważ elementy macierzy W są typu double, dokonano konwersji na typ

całkowity. W ten sam sposób przeprowadzono konwersję zmiennej ac.

whos WW=uint8(W);ac=uint8(ac);

Punkt 19Zapisano skompresowany obraz i porównano rozmiary z oryginałem.

Otrzymano następujące rezultaty: oryginał = 264 168 bajtów, po kompresji = 4 272 bajtów.

7

Page 8: Sprawozdanie_3

save obraz.mat W ac Nx Ny nx ny

Punkt 20Obliczono wartość współczynnika kompresji Kn wyrażonego, jako stosunek

liczby bitów oryginalnego obrazu do sumy bitów wymaganych do zapamiętania współczynników wagowych sieci oraz „książki kodowej”.

p = 8; %ilosc bitu przeznaczonych do okreslenia stopnia szarosci pikselak = 8; %ilosc bitu przeznaczonych dla elementu indeksu acm = 8; %ilosc bitu przeznaczonych dla elementu macierzy WKr =(Nx*Ny*nx*ny*p)/(Nx*Ny*k+N*nx*ny*m);

Współczynnik kompresji: Kr = 15.8760

Punkt 21W tym celu odtworzenei skompresowanego obrazu otworzono nowy edytor m-

plików, w nim wczytano z pliku obraz.mat dane potrzebne do odtworzenia obrazka oraz dokonano konwersji zmiennych W i ac do typu rzeczywistego, zachowując ich nazwy.

clearclose allload obraz.mat;W=double(W);ac=double(ac);

Punkt 22Sprawdzono przy pomocy polecenia whos czy istnieją potrzebne dane do

odtworzenia obrazka.

Punkt 23Następnie utworzono pustą tablicę blokową Ad o rozmiarach Nx x Ny, do

której zostaną wpisane poszczególne ramki obrazu podlegającego dekompresji.

Ad = cell(Nx,Ny);

Punkt 24Napisano pętlę zawierającą operację wpisywania odpowiednich wartości

pikseli do odpowiedniej składowej tablicy Ad.

for i=1:Nx for j=1:Ny Ad{i,j} = reshape(W(ac(j+(i-1)*Nx),:),ny,nx); end end

Punkt 25

8

Page 9: Sprawozdanie_3

Po wpisaniu wszystkich odtworzonych ramek to tablicy Ad, przekształcono ją w macierz obraz_d, która reprezentowała cały odtworzony obraz (bez podziału na ramki).

obraz_d = cell2mat(Ad);

Punkt 26Następnie wczytano zawartość pliku z oryginalnym obrazem do zmiennej

obraz.

obraz = imread('peppers.tif');

Punkt 27Wyświetlono obrazy we wspólnym oknie graficznym – oryginał po lewej, obraz

odtworzony po prawej.

figure(1) SUBPLOT(1,2,1), colormap gray;imagesc(obraz,[0 255]); SUBPLOT(1,2,2), colormap gray;imagesc(obraz_d,[0 255]);

Rys.5. Porównanie obrazu oryginalnego z odtworzonym

Można zauważyć „gołym okiem”, że obraz odtworzony jest dużo gorszej jakości niż oryginał, widać widoczne zniekształcone piksele.

Punkt 28W kolejnym kroku obliczono wartość średniokwadratowego błędu kompresji.

[X Y]=size(obraz);

9

Page 10: Sprawozdanie_3

obraz=double(obraz);MSE=1/(X*Y) * sumsqr(obraz-obraz_d);

Otrzymano wynik: MSE = 230.3783

Punkt 29Następnie obliczono wartość współczynnika PSNR – szczytowego stosunku

sygnału do szumu, służącego do określenia poziomu podobieństwa obrazu oryginalnego z obrazem skompresowanym.

PSNR = 10* log10( ( 2^8-1)^2 /MSE);

Otrzymano: PSNR = 24.5064

4. Uwagi i wnioskiCelem ćwiczenia było dokonanie kompresji obrazu z zastosowaniem sieci

neuronowej z współzawodnictwem (Kohonena). Dokonano tego przy pomocy standardowych danych. Efektem był obraz z lekkimi zniekształceniami jednak dający się odczytać.

5. Wykaz literatury wykorzystywanej w sprawozdaniu

[1] Wikipedia.org[2] Skrypty demonstracyjne[3] MATLAB – POMOC

10