Metody i algorytmy sztucznej inteligencji
Projekt*
Rozpoznawanie emocji na zdjęciach twarzy
Autor: Marcin Namysł
Prowadzący: dr inż Witold Paluszyński.
Data wykonania: 15.06.2007 r.
* Projekt wykonany w ramach zajęć z przedmiotu Metody i algorytmy sztucznej inteligencji
prowadzonych na Politechnice Wrocławskiej, na wydziale Elektroniki, na kierunku Automatyka i Robotyka
(specjalność ARR).
1. Opis zadania
Niewątpliwie jest to bardzo ciekawe i przydatne zagadnienie, którego rozwój jest ze wszech miar konieczny i
uzasadniony. Ciągły postęp cywilizacji pociąga za sobą między innymi rozwój robotyki. Wizja świata, w którym
człowiekowi w wielu czynnościach i obowiązkach będą pomagały roboty wydaje się być nie aż tak odległa. Robot,
który miałby być towarzyszem człowieka, musiałby z pewnością umieć rozpoznawać jego stan emocjonalny. Mógłby
wtedy dla przykładu lepiej rozpoznać czy jego działania odnoszą oczekiwany przez człowieka skutek, czy też nie
i w ten sposób je korygować. W tym celu konieczne jest opracowanie różnorodnych technik odczytywania stanów
emocjonalnych człowieka przez robota. Oczywiście zagadnienie może znaleźć zastosowanie w komputerach, które
mogłyby uzyskać umiejętność odczytywania emocji użytkownika, tworzenie dzięki temu inteligentnego
oprogramowania dostosowującego się do jego nastroju lub we wszelakich innych urządzeniach nie tylko domowego
użytku.
Podjąłem się na projekcie skonstruowania rozwiązania w pewnym sensie uproszczonego zagadnienia rozpoznawania emocji.
Ograniczyłem się do rozpoznawania z wyrazu twarzy osoby tego, czy się ona uśmiecha, czy też nie.
2. Realizacja zadania
Analizę przeprowadzono na podstawie zdjęć dwóch osób. Została im zrobiona seria zdjęć, na których osoby te
wyrażały dwojakiego typu emocje - radość (widoczna na twarzy jako uśmiech) oraz neutralny stan emocjonalny
("kamienna twarz", zamyślenie itp.).
2.1 Przetwarzanie i obróbka zdjęć
Pierwszym etapem była obróbka zdjęć. Do tego celu wykorzystano bibliotekę OpenCV
przeznaczoną do przetwarzania obrazów. Poniżej przedstawiono kolejne etapy przetwarzania i obróbki zdjęć
- Lokalizacja twarzy na zdjęciu
Podstawowym problemem zdawała się być lokalizacja obszaru twarzy na zdjęciu. Z pomocą
przyszła zastosowana biblioteka. Ludzka twarz opisana jest za pomocą punktów charakterystycznych,
odwzorowujących ułożenie ust, oczu, brwi i linii włosów. Do lokalizacji twarzy wykorzystano tzw.
filtry kaskadowe Haara, które zostały zaimplementowane właśnie w
OpenCV.
- Lokalizacja ust na obrazie twarzy
Mając zlokalizowaną twarz, należało w następnej kolejności wyodrębnić z niej obszar, na którym znajdują
się usta. Obszar ten wyznaczono eksperymentalnie zawężając otrzymany w poprzednim etapie obszar twarzy do
interesującego nas regionu obejmującego usta.
- Normalizacja obszaru ust
Mając wyodrębniony obszar, w obrębie którego znajdują się usta, należało ten obszar poddać pewnej normalizacji.
W tym celu skorzystano z gotowych mechanizmów dostępnych w OpenCV.
Wstępnie zastosowano filtrację przy wykorzystaniu filtru medianowego, który
bardzo skutecznie zwalcza wszelkie lokalne szumy nie powodując ich rozmywania na większym obszarze.
Następnie otrzymany obszar ust poddano pewnym transformacjom, mającym na celu uwypuklenie punktów
związanych z samymi ustami. Do tego celu wykorzystano algorytm Canny służący
do wykrywania krawędzi, oraz pionową i poziomą maskę Sobela również
pozwalającą na wyodrębnienie z obrazu składników odpowiedzialnych za szybkie zmiany jasności (konturów, krawędzi).
Obraz twarzy
Wyodrębnione i obrobione usta
- Parametryzacja ust
Otrzymane sylwetki ust należało w pewien sposób opisać za pomocą parametrów dlań charakterystycznych.
W tym celu znowuż wykorzystano mechanizmy oferowane przez bibliotekę OpenCV.
Wykorzystano momenty niezależne od położenia i skali - tzw. momenty centralne
znormalizowane. Przekazują one informację o kształcie sylwetki, jednak są zależne od
jej orientacji.
Momenty zwykłe (rzędu p + q)
Momenty centralne (niezależne od położenia)
Momenty centralne znormalizowane
gdzie:
- rozmiary obrazu (szerokość i wysokość),
- współrzędne punktu na obrazie,
- współrzędne środka sylwetki,
- funkcja charakterystyczna sylwetki U.
Do parametryzacji wybrano momenty centralne znormalizowane przedstawione w poniższej tabeli. Zostały
wybrane właśnie te momenty, gdyż dla właśnie takiej ich kombinacji uzyskano dobre wyniki na późniejszym
etapie klasyfikacji.
Nr parametru | p | q |
1 | 0 | 0 |
2 | 0 | 1 |
3 | 1 | 0 |
4 | 1 | 1 |
5 | 1 | 2 |
6 | 2 | 1 |
2.2 Klasyfikacja przy użyciu sieci neuronowej
Kolejny etap pracy związany był z sieciami neuronowymi. Tutaj wykorzystano gotową aplikację, mianowicie
SNNS. Jest to dobry, rozbudowany i co ważne darmowy symulator sieci
neuronowych. Początek pracy z sieciami neuronowymi polegał na uczeniu sieci. Zastosowano sieć jednokierunkową
(feed forward). Jako funkcje uczącą wybrano Std_Backpropagation. Próbowano również funkcji
Quickprop, jednak lepsze rezultaty uzyskano dla funkcji Std_Backpropagation.
Mając do dyspozycji 131 próbek uczących przystąpiono do uczenia sieci. W poprzednim
podrozdziale przedstawiono obróbkę zdjęć oraz ich parametryzację. Każde zdjęcie sparametryzowano 6
wartościami, które tutaj są używane jako wagi dla neuronów warstwy wejściowej. Warstwa wyjściowa sieci
zawiera 2 neurony wyjściowe (oznaczające odpowiednio uśmiech i brak emocji). Aby dobrać ilość
neuronów w warstwie ukrytej, dokonano szeregu eksperymentów z uczeniem sieci dla różnej liczby tych neuronów.
Dobre wyniki uzyskano dla ich liczby równej 10 i na taką liczbę neuronów ostatecznie się zdecydowano.

Rysunek: Schemat zastosowanej sieci neuronowej
Podczas eksperymentów z uczeniem sieci dla jednej osoby uzyskiwane błędy (SSE)
były praktycznie zerowe. Podczas uczenia sieci dla dwóch osób, udało się zejść do wartości błędu równej w
przybliżeniu 4. Biorąc pod uwagę takie czynniki jak różnice w oświetleniu w jakim były robione obie
serie zdjęć, różnice w rysach twarzy (kobieta, mężczyzna), itp. można uznać ten wynik za dobry.
2.3 Opis działania programu
Poniższy rysunek przedstawia krótki opis działania programu (w zależności od wybranej opcji)
- Tworzenie pliku ze wzorcem (s) -
dzięki tej opcji można stworzyć plik do nauki sieci. Jest on
w odpowiedni sposób tworzony, także można go od ręki wykorzystać do nauki sieci w SNNS.
Obróbka pojedynczego zdjęcia (z) -
dokonuje obróbki podanego zdjęcia (patrz punkt 2.1),
oraz wyświetla wyznaczone dla niego parametry.
Rozpoznawanie pojedynczego zdjęcia (k) -
opcja pozwalająca na rozpoznanie emocji na podanym zdjęciu. Dzięki
opcji umożliwiającej przerobienie nauczonej sieci neuronowej na strukturę w języku C możliwe jest rozpoznawanie emocji
ze zdjęć nie wymagające uruchamiania programu SNNS. Możliwość tą
wykorzystano w stworzonym programie. Powyższy rysunek przedstawia właśnie przykład zastosowania tej opcji.
Należy podać typ osoby (m - mężczyzna, k - kobieta, a - bez znaczenia). Podanie typu osoby jest
związane z tym, że należało nieco inaczej dobrać pewien parametr dla funkcji wykrywającej krawędzie (w OpenCV) ze
względu na różnice oświetlenia na zdjęciach obu osób. Po podaniu ścieżki do zdjęcia i jego nazwy bez rozszerzenia
(domyślnie dodawane jest do tej nazwy rozszerzenie .jpg) oraz informacji, czy dana osoba na podanym zdjęciu
się uśmiecha, czy też nie, zostanie wyświetlona odpowiedź sieci - wypracowane przez sieć wagi dwóch neuronów
wyjściowych, wynik rozpoznawania oraz poprawność rozpoznawania (informacja czy sieć zwróciła poprawną odpowiedź - jest
to określane na podstawie podanej wcześniej informacji, czy dana osoba się uśmiecha porównanej z
odpowiedzią zwróconą przez sieć).
Rozpoznawanie zdjęć w katalogu (a) -
Opcja podobna do tej przedstawionej powyżej, z tą różnica że
rozpoznawane są zdjęcia znajdujące się w podanym katalogu. Należy podać do którego zdjęcia w katalogu
chcemy rozpoznać emocje, oraz numer ostatniego zdjęcia z uśmiechem (zdjęcia w katalogu powinny być
pogrupowane w następujący sposób - na początku zdjęcia z uśmiechem, potem bez emocji).
Wyjście (x) -
Opuszczenie aplikacji.
3. Otrzymane wyniki
Uzyska skuteczność rozpoznawania emocji to w przybliżeniu 80%.
Nauczona sieć była testowana na podstawie serii zdjęć obu osób (w ilości równej 50). Poniżej
Przedstawiono rysunek przedstawiający otrzymane wyniki.
W dalszej części pokrótce zostaną omówione wybrane poprawne i niepoprawne wyniki jakie udało się uzyskać.
3.1 Przykład poprawnego rozpoznawania emocji przez sieć
Zostaną tutaj przedstawione dwa wybrane przykłady poprawnego rozpoznania stanu emocjonalnego przez sieć neuronową
wśród próbek testowych. Jak widać osoby zachowały powagę, na obrobionych zdjęciach ust również nie widać
grama uśmiechu - sieć nie miała w tym przypadku problemów z rozpoznaniem emocji.
3.2 Przykład błędnego rozpoznawania emocji przez sieć
Zostaną tutaj przedstawione dwa przykłady błędnego rozpoznania stanu emocjonalnego przez nauczoną sieć
neuronową wśród próbek testowych. Jak widać na zdjęciu pierwszym od lewej - kobieta, ktorej robiono zdjęcia,
była wyraźnie zmęczona ciągłym do nich pozowaniem i już nawet zabrakło jej sił, aby się wyraźniej uśmiechnąć
(co również obrazuje zdjęcie obrobionych ust). Człowiek na zdjęciu po prawej już najwyraźniej myślał o
momencie, w którym będzie oddawał ten projekt - radość była, jednak nieco ukryta. Zdjęcia ust również nie
są przekonywujące, prezentują mało wyraźny uśmiech. Zatem sieć neuronowa rzeczywiście mogła mieć duże
problemy z poprawną klasyfikacją tych danych - stąd prawdopodobnie wynika błędne rozpoznanie stanu emocjonalnego dla tych próbek testowych.
4. Wnioski
Można powiedzieć, że udało się rozwiązać postawione w projekcie zadanie. Udało się odpowiednio obrobić zdjęcia,
odpowiednio sparametryzować usta, oraz co najważniejsze przeprowadzić poprawne eksperymenty z siecią
neuronową. Osiągnięcie skuteczności rozpoznawania dla próbek testowych równej 80% wydaje się być
dobrym wynikiem. Prawdopodobnie można by go jeszcze poprawić stosując bardziej wyszukane sposoby obróbki
zdjęć, w jeszcze lepszy sposób uwypuklające usta na zdjęciu, jeszcze lepiej eliminujące z obrabianego zdjęcia
takie elementy jak np. nos, który na niektórych obrobionych zdjęciach ust jest w pewnym stopniu widoczny i
może czasem psuć wyniki. Rozbudowa i udoskonalanie takiego systemu wymagałyby również podjęcia próby
podobnego rozpoznawania emocji dodatkowo na podstawie innych elementów z twarzy (brwi, czoło itd.).
Uważam, że zastosowana metoda rozwiązania jest dobra i warto przy rozwiązywaniu podobnego problemu pójść
podobną drogą. Biblioteka OpenCV bardzo dobrze nadaje się do przeprowadzenia
etapu obróbki zdjęć, a symulator sieci neuronowych SNNS jest bardzo dobrym
narzędziem ułatwiającym znacząco pracę z sieciami neuronowymi, posiadającym bardzo wiele możliwości, których
mimo iż bardzo intensywnie korzystałem z tego symulatora, nie udało mi się w całości poznać.
Źródła danych
Poniżej zaprezentowano zestawienie wykorzystanych przy tworzeniu projektu materiałów źródłowych.
Klasyfikator Haara (lokalizacja twarzy na zdjęciu)
Biblioteka OpenCV
Algorytm Canny (wykrywanie krawędzi)
Analiza obrazów w systemie wizyjnym
Symulator sieci neuronowych SNNS (Stuttgart Neural Network Simulator)
Również korzystano z dokumentacji do OpenCV dostępnej po zainstalowaniu tej biblioteki.