PROGRAMOWANIE SIECIOWE |
---|
Prowadzący: Dr Marek Bazan |
Data: 17.05.2012 |
ZADANIE KLASYFIKACJI OBRAZÓW ROZPOZNAWANIE TWARZY
1. Wstęp teoretyczny.
Klasyfikacja jest jedną z najbardziej typowych form przetwarzania neuronowego. Jeżeli zbiór sygnałów wejściowych można podzielid na kilka klas, (nb. muszą istnied takie cechy (atrybuty), które pozwolą na dokonanie takiego jednoznacznego podziału), to w odpowiedzi na sygnał wejściowy klasyfikator powinien podad informację o klasie, do której ten sygnał należy.
Sieć MLP (Multilayer Perceptron neural network) składa się z "n" warstw ukrytych oraz jednej warstwy wyjściowej. Do badao stworzono sied dwuwarstwową. Warstwa ukryta jest pobudzana funkcją tangensa hiperbolicznego będącego sigmoidalną funkcją bipolarną, warstwa wyjściowa pobudzana funkcją sigmoidalną.
Zadanie polega na klasyfikacji obrazów, rozpoznawaniu twarzy. Zadanie wykonano na zdjęciach zapisanych w formacie jpg. W celu przetwarzania takich obrazów należy je przetransformować na obrazy binarne poleceniem "im2bw". Obrazy poddano redukcji rozdzielczości do rozmiaru 50x56, ze względu na dużą złożoność obliczeniową algorytmu krosswalidacji.
Walidacja krzyżowa działa następująco. Dzielimy zbiór danych na "k" możliwie równych części. Dla k'tej częsci jako zbiór treningowy przyjmujemy wszystkie elementy zbioru obrazów oprócz k'tego obrazu. Zbiorem testowym jest k'ta część zbioru obrazów. Dla każdego takiego zestawu liczymy błąd predykcji RSE(M;Z(k)) i dla wszystkich "k" części uśredniamy wynik. Generujemy "L" sieci o różnej strukturze i wybieramy tę, dla której błąd CV wynosi minimum.
SKRYPT
for i=1:1:5
p=num2str(i);
%osoba 1
eval(['os1' p '= (im2bw(imread([''D:/neuronowe 5/faces/male/9332898/9332898.' p asda'.jpg''])));']);
eval(['os2' p '= (im2bw(imread([''D:/neuronowe 5/faces/male/bplyce/bplyce.' p aaaa'.jpg''])));']);
eval(['os3' p '= (im2bw(imread([''D:/neuronowe 5/faces/male/cchris/cchris.' p aaaa'.jpg''])));']);
eval(['os4' p '= (im2bw(imread([''D:/neuronowe 5/faces/female/phughe/phughe.' p aaaa'.jpg''])));']);
eval(['os5' p '= (im2bw(imread([''D:/neuronowe 5/faces/female/asamma/asamma.' p aaaa'.jpg''])));']);
end
%zamiana macierzy na wektor
%osoba1
os11=os11(:); os12=os12(:); os13=os13(:); os14=os14(:); os15=os15(:);
%osoba2
os21=os21(:); os22=os22(:); os23=os23(:); os24=os24(:); os25=os25(:);
%osoba3
os31=os31(:); os32=os32(:); os33=os33(:); os34=os34(:); os35=os35(:);
%osoba4
os41=os41(:); os42=os42(:); os43=os43(:); os44=os44(:); os45=os45(:);
%osoba5
os51=os51(:); os52=os52(:); os53=os53(:); os54=os54(:); os55=os55(:);
%wektor klasyfikujacy, odpowiedzi sieci
out=[os11 os11 os11 os11 os11 os21 os21 os21 os21 os21 os31 os31 os31 os31 os31 os41 os41 os41 os41 os41 os52 os52 os52 os52 os52];
%wektor obrazow
osoby=[os11 os12 os13 os14 os15 os21 os22 os23 os24 os25 os31 os32 os33 os34 os35 os41 os42 os43 os44 os45 os51 os52 os53 os54 os55];
%metoda krosswalidacji wyznaczamy ilosc neuronow do warstwy ukrytej
CV=99999;
RSM=0;
suma=0;
for neurony=100:100:2800
neurony
net=mlp(2800,neurony,2800,'logistic');
for i=1:1:25
temp_osoby=osoby;
temp_out=out;
temp_osoby(:,i)=[]; %usuwamy i'ty element z macierzy danych
temp_out(:,i)=[];
[net,error]=mlptrain(net,temp_osoby',temp_out',10); %wszystkie elementy ze a zbioru "osoba1" bez i'tego
[Y Z]=mlpfwd(net,osoby(:,i)');
%policzyc bledy predykcji
suma=(osoby(:,i)'-Y).^2;
suma=suma/2800;
RSM=RSM+suma;
suma=0; %suma bledow predykcji
end
temp=(1/25)*RSM;
RSM = 0;
if temp<CV
CV=temp;
hidden_neurons=neurony; %i zapamietujemy dla ilu neuronow w warstwie ukrytej aa CV bylo minimalne
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
hidden_neurons=1400; %wybrana za pomoca walidacji krzyzowej, o najmniejszym bledzie a predykcji
net=mlp(2800,hidden_neurons,2800,'logistic');
[net,error]=mlptrain(net,osoby',out',10);
for ktory_obraz=1:1:25
szum=osoby;
for ile_pikseli=1:1:50
for ile=1:1:ile_pikseli
i=randi([1 2800]);
if szum(i,ktory_obraz)==0
wartosc=1;
else
wartosc=0;
end
szum(i,ktory_obraz)=wartosc;
end
[Y Z]=mlpfwd(net,szum(:,ktory_obraz)');
%porownanie wyniku ze wzorcem
licznik=0;
k=0;
for i=1:1:50
for j=1:1:56
k=k+1;
wynik(i,j)=Y(k);
wzor(i,j)=out(k,ktory_obraz);
if ((wynik(i,j)<=0.49) && (wzor(i,j)==0)||((wynik(i,j)>0.49)&&(wzor(i,j)==1)))
licznik=licznik+1;
end
end
end
bladMLP(1,ile_pikseli+ktory_obraz*50-50)=100-licznik;
end
end
2. Badania - sprawdzenie wpływu stopnia zaszumienia obrazu na wejściu sieci na jego aarozpoznawalność przez sieć.
Za pomocą algorytmu walidacji krzyżowej wyznaczono najlepiej pasującą ilość neuronów w warstwie ukrytej, tak aby błąd predykcji był najmniejszy. Wyznaczona wartość wynosi 1400 neuronów warstwie ukrytej sieć MLP. Sieć była trenowana 25 obrazami przedstawiających twarze pięciu różnych osób (po 5 obrazów dla każdej z osób). W zbiorze obrazów dla każdej osoby znajdował się wzorzec oraz obrazy z różnymi zakłóceniami, naniesiona ziarnistość różnego stopnia, rozmazanie obrazu itp.
Twarz osoby 1 |
---|
![]() |
![]() |
![]() |
Dane trenujące sieć |
![]() |
Twarz osoby 2 |
---|
![]() |
![]() |
![]() |
Dane trenujące sieć |
![]() |
Twarz osoby 3 |
---|
![]() |
![]() |
![]() |
Dane trenujące sieć |
![]() |
Twarz osoby 4 |
---|
![]() |
![]() |
![]() |
Dane trenujące sieć |
![]() |
Twarz osoby 5 |
---|
![]() |
![]() |
![]() |
Dane trenujące sieć |
![]() |
4. Wnioski.
Sieć nauczono obrazów twarzy pięciu różnych osób. Dla każdej z osób użyto czterech obrazów z różnymi efektami zaszumiającymi oraz jednego obrazu bez szumów. Dodatkowo, każdy obrazek przedstawia inną mimikę twarzy co dodatkowo urozmaica dane wejściowe.
Podając na wejście sieci twarze różnych ludzi, w różnym stopniu zaszumionych. Szumy te były dodatkowymi szumami nałożonymi na obrazy wejściowe już zaszumione. We wszystkich przypadkach, niezależnie od stopnia zaszumienia, twarze rozpoznane zostały poprawnie. Dla trzech twarzy odnotowano brak szumów na wyjściu sieci przy dodatkowym zaszumieniu nawet 40 pikseli. Dużo zależy od samych obrazów. Znaczny wpływ ma kontrast między twarzą a tłem oraz ilość miejsc, gdzie sąsiednie piksele są różnej wartości.
Ponieważ wszelkie działania na obrazach, a więc dużych macierzach, są związane z bardzo dużą złożonością obliczeniową - dlatego stosuje się metody akceleracyjne dla algorytmu. Zastosowanym tutaj algorytmem jest krosswalidacja pozwalająca wyznaczyć minimalną ilość potrzebnych neuronów w warstwie ukrytej sieci perceptronowej tak, aby błąd predykcji był najmniejszy. Zabieg ten przyspiesza działanie całego algorytmu klasyfikacji, ponieważ im mniej neuronów jest wykorzystywana przez sieć, tym mniej obliczeń trzeba wykonać. Wadą tej metody jest jednak konieczność kosztownych czasowo i pamięciowo obliczeń potrzebnych do wyznaczenia tejże ilości neuronów w warstwie ukrytej.
5. Bibliografia
- "Principal component analysis" I.T. Jolliffe
- "Neural networks for pattern recognition" Ch. Bishop