Wrocław, dn. 30.05.2007r. | ||||||||||||||||||||||||||||||||||||
Rozpoznawanie emocji na podstawie zdjęć ust Smile or not Smile - SornS Metody i algorytmy sztucznej inteligencji dr inż. Witold Paluszyński Politechnika Wrocławska, Wydział Elektroniki, ARR IV Dawid Szakiel Sławomir Tajnert Dawid Szakiel, nr indeksu: 133167; Sławomir Tajnert, nr indeksu: 133174; Grupa projektowa: Środa, godz. 9:15 |
||||||||||||||||||||||||||||||||||||
1. Prezentacja problemu "Twarz to jedyny system, który obrazuje nam konkretne emocje, jakich doznaje człowiek" twierdzi Paul Ekman, psycholog, jeden z najwybitniejszych badaczy emocji. Z twarzy można odczytać najróżniejsze doznania jakie przeżywa człowiek. Rozpoznanie tego, co druga osoba czuje, nie wydaje się specjalnie skomplikowane, wystarczy nam jedno spojrzenie. A jak ma to zrobić komputer? Czyż nie fascynującym wydaje się stworzenie takiego systemu, który w sekundę rozpoznałby w jakim nastroju znajduje się właściciel komputera czy domownik? Naszym zdaniem to wizja bardzo ciekawa i uważamy, że nie trzeba będzie zbyt długo czekać na podobne rozwiązania. My także postanowiliśmy podjąć się próby weryfikacji emocji malujących się na twarzy człowieka. Naszym zdaniem dużo można dowiedzieć się analizując same usta. Radość, smutek, rozpacz, wszystko to jesteśmy w stanie odczytać. Oczywiście, do tego dochodzi wiele innych czynników, jak np. oczy czy czoło, które także są źródłem wielu przydatnych informacji o nastroju człowieka. My skupiliśmy się jednak na ustach. Postanowiliśmy, że wykonamy zdjęcia różnych osób (dwóch, trzech) i z tych ujęć będziemy wycinać same usta, a następnie starać się rozpoznawać czy usta przedstawiają uśmiech, czy też nie. |
||||||||||||||||||||||||||||||||||||
2. Zaproponowana metoda rozwiązania W założeniach przyjęliśmy, że będziemy rozpatrywać problem nieco uproszczony, początkowo chcieliśmy poddawać analizie i obróbce odpowiednio przygotowane zdjęcia samych ust. Stwierdziliśmy jednak, że wbrew pozorom byłoby to mało efektywne, z każdego zdjęcia twarzy musielibyśmy "wycinać" usta, i tak otrzymany materiał poddawać dalszym działaniom. Pojawił się zatem problem analizy całego zdjęcia i wydobycia z niego potrzebnych informacji o nastroju osoby przedstawionej na fotografii. Do zlokalizowania twarzy wykorzystaliśmy klasyfikator Haar'a, który jest dostępny razem z biblioteką do przetwarzania obrazów OpenCV. Następnie doświadczalnie zawęziliśmy obszar poszukiwań ust do fragmentu zdjęcia, zależnego od wielkości obszaru uznanego przez klasyfikator za twarz. ![]() ![]() Tak uzyskany obraz poddajemy przekształceniom morfologicznym, by uwydatnić charakterystyczne cechy uśmiechu oraz miny neutralnej, ostatecznie kodujemy wynik transformacji w postaci 10 parametrów, które podajemy jako wartości uczące dla sieci neuronowej SNNS, na ich podstawie będzie się również odbywała weryfikacja zdjęć na nauczonym klasyfikatorze. |
||||||||||||||||||||||||||||||||||||
3. Analiza (obróbka) zdjęć Dysponując przygotowanym obszarem poszukiwań, przystępujemy do szeregu przekształceń, które mają na celu umożliwienie zlokalizowania ust. Początkowo próbowaliśmy znaleźć je na obrazie kolorowym, dokonując analizy kolorów poszczególnych pikseli zapisanych w formacie RGB. Jak się okazało nie jest to wcale takie proste, nawet na zdjęciach wykonanych w podobnych warunkach, tym samym sprzętem, różnice w wartościach składowych kolorów są dość znaczne i nie pozwalają na wyznaczenie ust w taki sposób. Poniżej prezentujemy jaką drogę przebywa zdjęcie by ostateczny obraz mógł być użyty do uczenia lub testowania klasyfikatora.
![]()
![]()
![]()
![]() Obraz w takiej postaci jak powyższy poddajemy kodowaniu parametrycznemu, staramy się zauważyć oraz zapisać dla niego najbardziej charakterystyczne cechy, są to:
Mając wyznaczone parametry finałowego obrazu mogliśmy przystąpić do uczenia sieci neuronowej SNNS a następnie do wykonywania eksperymentów. |
||||||||||||||||||||||||||||||||||||
4. Sieci neuronowe Mając przygotowany zestaw danych wejściowych, charakterystycznych parametrów dla 116 próbek uczących możemy przystąpić do nauki sieci neuronowej. W naszym projekcie wykorzystamy aplikację SNNS (Stuttgart Neural Network Simulator), bardzo dobrego i polecanego symulatora sieci neuronowych, gdzie w prosty sposób możemy utworzyć i nauczyć sieć korzystając z jednego z wielu dostępnych tam algorytmów uczących. Przystąpiliśmy zatem do tworzenia sieci, która odpowiadałaby naszym wymaganiom. Mamy 10 parametrów wejściowych i 2 wyjściowe, zatem sieć będzie posiadała odpowiednio 10 neuronów w warstwie wejściowej i 2 w warstwie wyjściowej. Pozostał odpowiedni dobór liczby neuronów w wartswie ukrytej (warstwy ukryte przetwarzają sygnały w ten sposób, że wypracowują pewne dane pośrednie, stanowiące potem podstawę dla procesu wyznaczania ostatecznego rozwiązania), nie może ich być za mało, ani za dużo, ponieważ sieć nie będzie się efektywnie uczyć, bądź w ogóle nie będzie się w stanie nauczyć. Sprawdzaliśmy działanie sieci dla 10 i 3 neuronów w wartswie ukrytej, lecz błąd uzyskany podczas nauki był zdecydowanie za duży. W oparciu o przeprowadzone badania postanowiliśmy wybrać 5 neuronów w warstwie ukrytej. Zatem model sieci wygląda następująco: ![]() Warstwa wyjściowa to neurony 16 (uśmiech) i 17 (mina normalna). Teraz możemy przystąpić do nauki sieci. Spośród wielu algorytmów uczących empirycznie wybraliśmy algorytm std_backpropagation, zwany także online backpropagation, ponieważ aktualizuje on wagi po każdym uczeniu. Jest to jedna z najpopularniejszych metod uczenia i zarazem bardzo skuteczna. Poniżej prezentujemy przykładowe przebiegi uczenia sieci wraz z błędami:
oraz wykres zależności liczby cykli uczących od błędu SSE: ![]() W pierwszej fazie badań uczyliśmy sieć tylko dla jednej osoby. Uzyskaliśmy wtedy wynik błędu SSE zbliżony do zera. Dla dwóch osób wartość błędu zatrzymała się na poziomie 4. Warto zaznaczyć, że są to osoby o innych rysach twarzy, zdjęcia robione są różnymi aparatami, w innym pomieszczeniu, zatem parametry powinny się trochę różnić. Wynika stąd, że z każdą dodaną osobą do badań rośnie wartość błędu. Naszym zdaniem uzyskanie błędu SSE dla dwóch osób na poziomie 4 jest wartością zadowalającą, ale nie bardzo dobrą. Symulator SNNS daje możliwość sprawdzenia działania nauczonej sieci, ale my chcieliśmy wykorzystać ją w programie. Oczywiście jest to rozwiązanie dużo sprawniejsze, ponieważ nie musimy zapisywać odpowiedzi sieci dla każdego badanego zdjęcia. Tutaj z pomocą przyszła nam aplikacja dostarczana wraz z SNNS, snns2c, gdzie po wykonaniu polecenia (emocje.net to zapisana, nauczona wcześniej przez nas sieć) tworzy ona dwa pliki: emocje.h i emocje.c, które teraz wystarczy dodać do naszej aplikacji i wywoływać dla każdego zdjęcia funkcję z nauczoną siecią neuronową. Jako parametry funkcji podajemy tablicę z wartościami wskaźników dla każdego badanego obrazu, oraz tablicę wynikową, gdzie znajdują się wartości odpowiedzi sieci. |
||||||||||||||||||||||||||||||||||||
5. Opis działania programu Program napisaliśmy w środowisku Microsoft Visual Studio 2005 w wersji legalnej dostępnej na stronie MSDNA. Główne okno programu wygląda następująco ![]()
|
||||||||||||||||||||||||||||||||||||
6. Wyniki przeprowadzonych badań Przypomnijmy: mamy sieć neuronową nauczoną na 116 zdjęciach dwóch osób. Została ona zaimportowana do naszego programu. Poza tym w dwóch osobnych katalogach posiadamy po 44 zdjęcia wyrażające zadowolenie i nic nie wyrażające (tzw. mina normalna). Do sprawdzenia działania naszego systemu wykorzystamy pkt. 2 z menu programu, opisanego wyżej. Uśmiech Dokonaliśmy weryfikacji 44 zdjęć znajdujących się w katalogu. Fragment pliku z uzyskanymi wynikami: Zdjecie 22: usmiech 0.999948 5.17192e-005 Rozpoznano usmiech *********************** Zdjecie 23: usmiech 1.86872e-006 0.999998 Rozpoznano normal *********************** Zdjecie 24: usmiech 1 1.98903e-007 Rozpoznano usmiech Przedstawione parametry to wartości odpowiedzi sieci neuronowej. Pierwszy parametr określa rozpoznaną emocję jako uśmiech, drugi to mina normalna. Nasz program błędnie rozpoznał 7 zdjęć, co daje 84.1% poprawnych wyników. Obraz poprawnie rozpoznany, twarz zwrócona na wprost, szczęśliwy człowiek. ![]() Wydzielone usta ![]() Obraz rozpoznany błędnie. Naszym zdaniem, uśmiech wymuszony, bardziej grymas. Program nie da się oszukać! ![]() Wydzielone usta ![]() Obraz rozpoznany nieprawidłowo. Twarz skierowana pod kątem, niewyraźny zarys ust. Na zdjęciu ust widoczny nos, który przeszkadza. ![]() Wydzielone usta ![]() Mina normalna Analogicznie jak w powżyszym przypadku badamy wszystkie zdjęcia w katalogu. Tym razem program niepoprawnie rozpoznał 9 spośród 44 zdjęć, co daje 79.55% skuteczność działania. Obraz prawidłowo zaklasyfikowany. ![]() Wydzielone usta ![]() Obraz rozpoznany błędnie. Zdjęcie nieostre, wyraźny problem z prawidłowym rozpoznaniem ust. ![]() Wydzielone usta ![]() Obraz rozpoznany nieprawidłowo. Twarz skierowana pod kątem, błędne rozpoznanie ust. ![]() Wydzielone usta ![]() |
||||||||||||||||||||||||||||||||||||
7. Wnioski Praca nad tym zagadnieniem była dla nas bardzo fascynująca, wielkie było nasze zdumienie kiedy okazało się, że nauczona na podstawie próbek sieć rzeczywiście rozpoznaje poprawnie uśmiech i minę normalną. Radość jest tym większa, ponieważ było to nasze pierwsze spotkanie z tego rodzaju klasyfikatorem. Na dodatek udało nam się zrealizować o wiele więcej niż na początku założyliśmy. Stworzyliśmy całą procedurę wydobywania ust ze zdjęcia przedstawiającego twarz, dodatkowo zaimplementowaliśmy nauczoną sieć w naszej aplikacji, co pozwala na jej użycie w trybie czasu rzeczywistego, np. do rozpoznawania miny osoby postawionej przed kamerą internetową. Same zdjęcia i opis zadania mogą być mało interesujące, dlatego postanowiliśmy zaprezentować krótki filmik, który obrazuje działanie naszej sieci umieszczonej w programie. ![]() Filmik - SornS Obraz został zarejestrowany programem Hyper Cam 2 w wersji shareware (stąd napisy w lewym górnym rogu), a następnie dodane zostały napisy legalną wersją programu Windows Movie Maker. Jak widać w przedstawionych wynikach, sieć nie zawsze poprawnie ropoznaje grymas twarzy, o wiele bardziej poprawiłaby się sytuacja, jeśli usta wyznaczane byłyby na obrazie kolorowym, ominięty zostałby wtedy problem błędnego ich lokalizowania. Nie jesteśmy do końca przekonani czy dałoby się usprawnić działanie programu w przypadku twarzy nachylonej pod dużym kątem, wymagałoby to zmiany klasyfikatora twarzy, który nie zawsze sobie radzi z jej znalezieniem w przypadku przekrzywienia. Warto byłoby poprawić sam interfejs do komunikacji z kamerą, my wykorzystaliśmy gotwy dostarczony z biblioteką OpenCV, ale jest on dość stary, co widoczne jest w małej ilości klatek na sekundę w prezentowanym filmie, do badań jednak wystarcza. Do celów pokazowych możnaby zastosować prymitywną filtrację wyników, na załączonym video jest moment kiedy osoba obraca twarz, i w pewnym momencie sieć identyfikuje obraz jako uśmiech (którego w rzeczywistości nie ma). Gdyby zmieniać kolor obszaru zawierającego usta w chwili gdy trzy kolejne klatki przedstawiają tę samą minę rozponaną przez klasyfikator, dałoby się ograniczyć tego typu błąd. Reasumując, wyniki na poziomie ok. 80% poprawnie rozpoznanych zdjęć wydają nam się bardzo dobre. |
||||||||||||||||||||||||||||||||||||
8. Źródła Biblioteka OpenCV
|
||||||||||||||||||||||||||||||||||||