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.

Przykładowe zdjęcie


Wyznaczony obszar do dalszej obróbki


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.
  • Transformacja na obraz czarnobiały
Czarnobiale zdjęcie wyznaczonego obszaru do lokalizacji ust
  • Zastosowanie nieliniowego filtru medianowego celem zniwelowania zakłóceń losowych, których poziom intensywności znacznie odbiega od poziomu intensywności punktów sąsiednich.
Zdjęcie po zastosowaniu filtru medianowego
  • Zdjęcie po transformacji Hough'a
Zdjęcie po transformacji Hough'a'
  • Wyznaczenie obszaru zawierającego usta, które jest dość prymitywne, jednak w przypadku podobnych warunków oświetleniowych i dobrze wykonanych zdjęć jest bardzo skuteczne. Odbywa się to w następujący sposób, dysponując obrazem po wszystkich przekształceniach, nakładamy na niego prostokąt o wysokości równej 1/3 wysokości badanego obszaru, szerokości, która jest taka sama jak szerokość badanego zdjęcia. Następnie przesuwamy ten prostokąt w dół badając ilość białych pikseli. Z przeprowadzonych doświadczeń wynika, że jeżeli zdjęcie jest "dobre" (warunki świetlne zbliżone do tych ze zdjęć serii uczącej oraz przechylenie głowy jest nieznaczne) to obszar zawierający usta posiada w sobie znacznie więcej białych elementów od pozostałych miejsc. Przesuwając zatem prostokąt zapamiętujemy największą mieszczącą się w nim ilość białych pikseli i jego położenie, po dokonaniu całkowitej analizy wycinamy ze zdjęcia obszar, gdzie białych pikseli jest najwięcej i traktujemy to jako nasze usta - obraz gotowy do zakodowania.

    Zdarza się jednak, że ze względu na złe oświetlenie, nieostre zdjęcie lub zbyt duże przechylenie głowy, uzyskany efekt końcowy nie będzie odzwierciedlać w rzeczywistości ust, gdyż np. bardziej uwydatniony będzie nos i on zostanie sklasyfikowany jako usta, lub ze względu na nachylenie głowy wyznaczony obszar będzie zawierał tylko ich część, ale o tym powiemy opisując wyniki naszych eksperymentów.
Zdjęcie finałowe, przeznaczone do kodowania


Obraz w takiej postaci jak powyższy poddajemy kodowaniu parametrycznemu, staramy się zauważyć oraz zapisać dla niego najbardziej charakterystyczne cechy, są to:
  • Pole powierzchni (objętość), czyli liczba białych pikseli.
  • Wysokość, czyli różnica współrzędnych X dla punktu położonego najwyżej i najniżej na obrazie.
  • Szerokość, wyznaczana analogicznie do wysokości.
  • Stosunek wysokości do szerokości.
  • Położenie centroidu otrzymanego obrazu, który wyznaczany jest jako średnia ze współrzędnych wszystkich białych pikseli.
  • Maksymalny promień od centroidu, czyli odległość najdalszego białego punktu od wyznaczonego środka.
  • Liczba "pustych" linii w pionie, czyli takich które nie zawierają żadnego białego punktu.
  • Liczba pustych linii w poziomie.
  • Krągłość, wyrażana stosunkiem pola powierzchni do iloczynu liczby Pi i kwadratu maksymalnego promienia.
  • Liczba zmian pikseli, czyli przejść z koloru czarny -> biały i biały -> czarny , na całym obrazie.

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:

Model sieci


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:

lp SSE MSE SSE/o-units
1. 115.3496 0.9943 57.6748
2. 11.8106 0.1018 5.9053
3. 8.2750 0.0713 4.1375
4. 7.8919 0.0680 3.9459
5. 7.5336 0.0649 3.7668
6. 4.0293 0.0347 2.0146
7. 4.0131 0.0346 2.0065
8. 4.0027 0.0345 2.0013


oraz wykres zależności liczby cykli uczących od błędu SSE:

Wykres uczenia od bledow


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

snns2c emocje.net


(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

Menu główne programu>


  • Stwórz plik do nauki sieci
Podajemy ścieżkę z katalogiem, w którym znajdują się zdjęcia służące jako próbki do nauki sieci. Następnie tworzony jest plik .pat wzorców, odpowiednio sformatowany, gotowy do użycia w symulatorze SNNS. Postanowiliśmy, że będziemy uczyć sieć naprzemiennie, raz uśmiech, raz twarz normalna. Naszym zdaniem ma to wpływ na ustalenie wag w sieci neuronowej.
  • Klasyfikuj zdjęcia w katalogu
Do badań stworzyliśmy dwa katalogi - w jednym znajdowały się zdjęcia dwóch zadowolonych osób, w drugim zdjęcia osób, które nie miały już takiego dobrego nastroju. Każdy z nich zawiera 44 obrazy. Wybór tej opcji powoduje utworzenie dwóch plików tekstowych, zawierających wyniki rozpoznawania próbek z każdego katalogu, oraz statystykę.
  • Klasyfikuj pojedyncze zdjęcie
Opcja ta pozwala rozpoznać emocje na pojedynczym zdjęciu ze wskazanego katalogu oraz wyświetlić wartości parametrów obrazu.
  • Camera show
Opcja dodatkowa. Pozwala wykorzystać kamerę internetową. Zasada działania jest identyczna jak w przypadku analizy samego zdjęcia z tą jednak istotną różnicą, że teraz obraz poddawany jest obróbce w czasie rzeczywistym. Niestety, musieliśmy uwzględnić opóźnienia wynikające z zastosowania biblioteki OpenCV.


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.

Dawid_uśmiech


Wydzielone usta
Usta_Dawid



Obraz rozpoznany błędnie. Naszym zdaniem, uśmiech wymuszony, bardziej grymas. Program nie da się oszukać!

Jott_uśmiech


Wydzielone usta
Usta_Jott



Obraz rozpoznany nieprawidłowo. Twarz skierowana pod kątem, niewyraźny zarys ust. Na zdjęciu ust widoczny nos, który przeszkadza.

Jott_uśmiech


Wydzielone usta
Usta_Jott



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.

Jott_normal


Wydzielone usta
Usta_Jott



Obraz rozpoznany błędnie. Zdjęcie nieostre, wyraźny problem z prawidłowym rozpoznaniem ust.

Jott_normal


Wydzielone usta
Usta_Jott



Obraz rozpoznany nieprawidłowo. Twarz skierowana pod kątem, błędne rozpoznanie ust.

Dawid_normal


Wydzielone usta
Usta_Dawid



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.

Kamera
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 Przykłady wykorzystania OpenCV do detekcji twarzy Symulator sieci neuronowej SNNS Parametry kodowania obrazu

Valid HTML 4.01 Transitional