Algorytm rozpoznawania: Konwertujemy obraz do skali szarości. 1

Transkrypt

Algorytm rozpoznawania: Konwertujemy obraz do skali szarości. 1
Algorytm rozpoznawania:
Konwertujemy obraz do skali szarości.
1.
2.
3.
4.
5.
Wybieramy z obrazu część 20 na 20 pikseli
Wykonujemy wyrównanie histogramu dla wybranej części
Podajemy przetworzone dane do dwóch sieci neuronowych
Jeśli oba wyniki sieci przekraczają wybrany próg, to uznajemy, że w tym miejscu jest twarz
Jeśli sprawdzimy już wszystkie części 20 na 20 pikseli, to zmniejszamy obraz i zaczynamy
od początku na zmniejszonym obrazie, jeśli oczywiście jest sens zmniejszać jeszcze
(tworzymy tzw. piramidę obrazów).
Nauczanie sieci:
Nauczamy dwie sieci neuronowe, żeby zmniejszyć ilość niepoprawnie znalezionych twarzy tam,
gdzie ich nie ma. Najczęściej twarze źle rozpoznane są w miejscu, które podaje tylko jedna sieć, a
dobre rozpoznania są wspólne dla obu sieci (oczywiście samemu do tego nie doszliśmy, tak jest w
literaturze).
1. Przygotowujemy 100 obrazów 20 na 20 pikseli z wizerunkiem twarzy, każdy obraz
konwertujemy do skali szarości i wykonujemy wyrównanie histogramu
2. Wybieramy losowo 100 wycinków 20 na 20 pikseli obrazów, na których nie ma twarzy;
każdy obraz konwertujemy do skali szarości i wykonujemy wyrównanie histogramu
3. Uczymy sieć dla naszych przygotowanych wyżej przykładów uczących
4. Sprawdzamy na wylosowanych wycinkach obrazów, na których nie ma twarzy czy sieć
poprawnie rozpoznaje brak twarzy. Jeśli nie, to dodajemy takie przykłady do nowych
przykładów uczących bez twarzy
5. Jeśli były przykłady błędnie rozpoznanych twarzy, to uczymy sieć dla nowego zestawu
uczącego przygotowanego z błędnie rozpoznanych miejsc i wracamy do punktu 4. (czyli
znów wybieramy losowo wycinki i sprawdzamy czy sieć nie daje niepoprawnych
odpowiedzi)
Sieć neuronowa:
Użyta sieć neuronowa to jednokierunkowa, wielowarstwowa sztuczna sieć neuronowa. Składa się z
3 warstw: wejściowej (której liczebność określona jest rozmiarem wektora wejściowego, w tym
przypadku jest to 400 perceptronów (20 * 20 = 400)), ukryta (rozmiar dobrany eksperymentalnie i
ustalony na 100 perceptronów) oraz wyjściowa (w tej warstwie jest tylko jeden perceptron, jego
wyjście bliskie 1 oznaczać ma, że wykryto twarz, a bliskie 0, że w danych wejściowych nie ma
twarzy).
Każdy perceptron w warstwie jest połączony z każdym wyjściem perceptronu z poprzedniej
warstwy.
Wyjście perceptronu to suma wyjść perceptronów z poprzednich warstw przemnożonych przez
wagi (neuron ma tyle wag, ile jest neuronów warstwie poprzedniej) podanych na funkcję aktywacji.
1
W tym przypadku jest to nieliniowa funkcja sigma:
.
1e− x
Nauczanie takiej sieci przebiega poprzez wykonanie algorytmu wstecznej propagacji błędów. Jest to
nauczanie pod nadzorem (albo inaczej 'z nauczycielem'), dlatego, że podajemy do algorytmu dane
wejściowe i oczekiwane wyjście, a sieć uczy się odpowiednio dla tych danych podawać
odpowiednie wyniki. Nazwa algorytmu wzięła się od kolejności liczenia błędu. Najpierw obliczamy
go dla warstwy wyjściowej (bo wiemy jaki wynik dała sieć, a jaki oczekiwaliśmy), a następnie
obliczamy jakie były błędy poprzednich warstw. Cały algorytm opiera się o regułę delty. Więcej
można poczytać w sieci, np. wykłady prof. W. Ducha:
http://www.is.umk.pl/~duch/Wyklady/NN_plan.html (wykład o wielowarstwowych sieciach
neuronowych: http://www.is.umk.pl/~duch/Wyklady/NN-CI/CI-8.ppt).
Pytania:
Pytania z jakimi możesz się spotkać:
- ile jest neuronów (perceptronów) w poszczególnych warstwach?
Warstwa wejściowa: 400 (bo 20*20), warstwa ukryta: 100, warstwa wyjściowa: 1
- jaki jest próg, po którym przyjmujemy, że sieć rozpoznała twarz?
Został wybrany próg 0.9, czyli jeśli sieć poda wynik powyżej 0.9, to przyjmuję, że rozpoznała twarz
- jaki jest próg/kryterium po którym przerywana jest nauka sieci?
Sieć jest nauczana, aż średni błąd epoki nie będzie mniejszy niż 0.01, gdzie epoka, to jedno
nauczanie sieci dla całego zestawu uczącego
- jak zostały przygotowane twarze do uczenia?
Twarze zostały wycięte ze zdjęć znalezionych w internecie i przeskalowane do rozmiaru 20*20