Wrocław, 2 lipca 2009

Autorzy: Dawid Płachecki 148941; Piotr Zapłotny 149254

Prowadzący: Dr inż. Witold Paluszyński




System identyfikacji personalnej oparty o rozpoznawanie twarzy



Raport przygotowany na zaliczenie przedmiotu: "Metody i algorytmy sztucznej inteligencji."

Abstrakt

Celem projektu było utworzenie systemu, który potrafiłby rozpoznawać i odróżniać od siebie twarze w czasie rzeczywistym. Aby osiągnąć zamierzony efekt, zastosowana została biblioteka OpenCV wraz z klasyfikatorem Haar. Ponadto użyto kamery internetowej, która przekazywała obraz w rozdzielczości 320x240 pikseli. Program przetwarzający został napisany w języku C++.




Presonal identification system using face recognition



This report has been prepared as a requirement for the course: "Methods and algorithms of artificial intelligence."

Abstract

The purpose of this project was to create system, which can recognize and tell apart faces in real-time. To achieve that effect we used OpenCV library with Haar-classifier. In addition, we used the camera with resolution 320x240. Main program was implemented in C++.





Wstęp

Metod na wykrycie twarzy może być wiele. Jedną z lepszych jest poszukiwanie obiektu, który posiada fragmenty przypominające oczy, nos i usta. Jednak znalezienie twarzy to dopiero początek w przypadku, gdy chcemy mieć możliwość identyfikacji użytkowników na jej podstawie. Pomysł jest taki, by elementy jak oczy, nos i usta sprowadzić do jednego punktu, a następnie badać stosunki odległości między poszczególnymi punktami z nadzieją, że są one charakterystyczne dla danej twarzy.

W efekcie prac projektowych powstał system składający się z kamery i programu, którego działanie umożliwia rozpoznawanie, jak również identyfikację osób na podstawie odebranego obrazu.


Biblioteki i narzędzia

Program został napisany w środowisku Microsoft Visual Studio 2005, w języku C++. Do budowy systemu użyto dodatkowej, zewnętrznej biblioteki OpenCV, posiadającej funkcje usprawniające pracę z obrazem.

Biblioteka OpenCV

OpenCV (czyli Open Source Computer Vision Library) to biblioteka funkcji do obróbki obrazu charakteryzująca się otwartym kodem. Stosowana głównie w zadaniu przetwarzania obrazu w czasie rzeczywistym. Przy tworzeniu programu użyliśmy następujących funkcji bibliotecznych:
1) Obsługa kamery podłączonej do postu USB;
2) Tworzenie okien programu;
3) Wykrywanie (klasyfikacja) obiektów;
4) Rysowanie prostokątów wokół wykrytego obiektu.

Klasyfikator Haar

Jego zadaniem jest analiza i klasyfikacja obrazu. Podczas tworzenia dowolnego klasyfikatora budowane jest drzewo decyzji, składające się z N poziomów, posiadające przynajmniej dwie gałęzie wychodzące z jednego węzła. Z każdym poziomem rośnie szczegółowość cech jakie są analizowane. Na początku są to proste informacje dotyczące kształtu, powierzchni i orientacji obiektu. Wybór odpowiedniej gałęzi jest dokonywany poprzez określenie zmiennych warunkujących stopień przynależności, po czym wybierana jest opcja do której analizowany obraz ma "najbliżej".


Klasyfikacja

Aby program spełniał swoje zadanie musiał poradzić sobie z odnalezieniem twarzy(Rys. 3), a na niej oczu, nosa i ust (Rys. 4). Do wykrycia twarzy użyto klasyfikator dostarczony razem z biblioteką OpenCV. W celu wykrycia oczu, ust i nosa potrzebny był dodatkowy, który został stworzony przez nas. Uczenie klasyfikatora polegało na wczesniejszym przygotowaniu próbek elementów, które mają być wykryte, jak również tak zwanego tła (elementy które mogą się pojawić ale nie mają być zaklasyfikowane). Przykładowo: wzory nosa to pliki graficzne o rozdzielczości 50x50 pikseli, ust - 70x30 a tła 200x200, niezawierające nosa/ust (Rys. 1 i 2). Następnie uruchamiana była aplikacja interpretująca podane wcześniej dane graficzne i tworząca klasyfikator w postaci pliku xml. Średni czas wymagany do utworzenia to około dwóch godzin. Powstałe klasyfikatory zawierają dwudziestopoziomowe drzewa decyzyjne (N=20).


klasyfikator_ust
Rys. 1: Przykłady danych zastosowanych do uczenia klasyfikatora wykrywającego usta ( A-dane "pozytywne"; B-tło )


klasyfikator_nosa
Rys. 2: Przykłady danych zastosowanych do uczenia klasyfikatora wykrywającego nos ( A-dane "pozytywne"; B-tło )


klasyfikacja_twarzy
Rys. 3: Klatka ze znalezioną twarzą


klasyfikacja_elementów
Rys. 4: Klatka z zaklasyfikowanymi elementami twarzy


Tworzenie klasyfikatora

By utworzyć klasyfikator wymagane jest przygotowanie wzorców oraz plików tła. Następnie dane te są przetwarzane przez dwa programy, czego wynikiem jest plik klasyfikatora. Aplikacje o których mowa to createsamples.exe i haartraining.exe. Pierwsza z nich analizuje pakiet wzorców i tworzy wektor cech charakterystycznych. Druga przetwarza ten wektor wraz z plikami tła, tworząc klasyfikator.

createsamples.exe

Przykład utworzenia wektora cech dla elementów wzorcowych:
createsamples.exe -info wzor.txt -vec wzor.vec -num 432 -w 20 -h 20

Parametry:
-info - plik tekstowy zawierający listę nazw obrazów wzorcowych;
-vec - nazwa wektora wynikowego;
-num - liczba plików wzorcowych;
-w - szerokość do jakiej będą skalowane obrazy wzorcowe;
-h - wysokość do jakiej będą skalowane obrazy wzorcowe.

haartraining.exe

Przykład generacji pliku klasyfikatora:
haartraining.exe -vec wzor.vec -bg tlo.txt -w 20 -h 20 -mem 300 -npos 432 -nneg 538

Parametry:
-vec - plik z wektorem utworzonym przez createsamples.exe;
-bg - plik tekstowy zawierający listę nazw obrazów tła;
-w - szerokość do jakiej zostały przeskalowane obrazy wzorcowe;
-h - wysokość do jakiej zostały przeskalowane obrazy wzorcowe;
-mem - limit pamięci przydzielanej programowi w megabajtach;
-npos - liczba plików wzorcowych;
-nneg - liczba plików tła.


Algorytm

Podczas inicjalizacji wymagane jest stworzenie bazy użytkowników, którzy będą przez system rozpoznawani. Uczenie programu przebiega bezinwazyjnie i polega na patrzeniu przez określony czas w obiektyw kamery, do momentu aż zostanie zebrana wystarczjąca ilość informacji na temat danej twarzy. Proces odnajdywania i identyfikacji wygląda następująco. Podczas włączenia programu w trybie rozpoznawania, napływają z kamery klatki na których wyszukiwana jest twarz. Jeśli zostanie znaleziona to uruchamiane są trzy kolejne klasyfikatory, które szukają oczu, nosa i ust. Obliczane są odległości między następującymi elementami (Rys. 5):
1) OkoLewe - OkoPrawe;
2) OkoLewe - CzubekNosa;
3) OkoLewe - LewyKoniecUst;
4) OkoPrawe - PrawyKoniecUst;
5) OkoPrawe - CzubekNosa;
6) CzubekNosa - LewyKoniecUst;
7) CzubekNosa - PrawyKoniecUst;
8) PrawyKoniecUst - LewyKoniecUst.

Następnie rozpoczyna działanie właściwy algorytm identyfikacji. Program, mając do dyspozycji wzorce w bazie, normalizuje i porównuje aktualnie napływające zestawy wartości. Wszelkie odchylenia od odpowiadających odległości bazowych są sumowane. Wynikiem działania algorytmu jest liczba, tym większa im bardziej aktualnie przetwarzana twarz różni się od wzorca. Warunkiem uznania twarzy jako "znanej" jest określenie mała wartość sumy błędów. Próg dopuszczalności (zalecany) wynosi 30, co znaczy, że każda twarz z sumą nieprzekraczającą tej wartości zostanie uznana jako dopasowana do odpowiadającej jej twarzy w bazie. Wysokość progu to subiektywny wynik obserwacji przebiegu testów. Jest jednak możliwość jego zmiany przez użytkownika.


wizualizacja_odległości
Rys. 5: Klatka z wizualizacją odległości między rozpatrywanymi punktami


Schemat programu w pseudokodzie:
menu(); 
dopóki niespełniony warunek wyjścia
{ 
	pobierz obraz z kamery; 
	jesli pobrano
	{ 
		wyszukaj twarz;
		jeśli znaleziono
		{ 
			wytnij samą twarz; 
			skaluj twarz do rozmiaru wysokosci z klasy OpenCV; 
			zapisz do kopii klasy; 
			wyszukaj oczy(kopia); 
			wyszukaj nos(kopia); 
			wyszukaj usta(kopia); 
			jesli znaleziono prawidłowe dopasowanie oczy usta nos
			{
				policz długosci odcinkow; 
				wyswietl twarz z naniesionymi liniami(kopia); 
				tryb1(trening); / tryb2(identyfikacja); 
			} 
		wyswietl obraz z naniesioną ramką w miejscu twarzy; 
		} 
	} 
}

Działanie programu

Do uruchomienia programu niezbędne jest podanie lokalizacji bibliotecznego klasyfikatora twarzy.

Uruchomienie programu wraz z parametrem startowym:
FaceFinder.exe --cascade="C:/Program Files/OpenCV/data/haarcascades/haarcascade_frontalface_alt.xml"

Program posiada dwa tryby działania: uczący i identyfikacji. Oba rozpoczynają od analizy danych z kamery w celu znalezienia twarzy. Następnie wyodrębniany jest fragment ją zawierający i wyszukiwane są składowe, czyli oczy, nos i usta. Po znalezieniu ich dalsze działanie programu uzależnione jest od wybranego wcześniej trybu.

1) W trybie pierwszym użytkownik zostaje zapytany czy dodać do bazy parametry znalezionej twarzy. Wymagane jest również podanie nazwy użytkownika do której to parametry zostaną przypisane. Po podjęciu decyzji program wraca do analizy danych z kamery i sytuacja sie powtarza do czasu zakończenia przez użytkownika trybu uczącego.

2) Drugi działa z bazą w trybie tylko do odczytu. Aktualnie uchwycona twarz jest porównywana ze wzorcami zawartymi w bazie. Wynikiem takiego porównania jest liczba, która określa sumę różnic długości odpowiadających sobie odcinków (przedstawionych na Rys. 5) dla wzorca w bazie i twarzy aktualnie rozpatrywanej. Innymi słowy im mniejsza wartość tym twarz bardziej podobna do bazowej i na odwrót. W zależności od wartości tej sumy i określonego progu dopuszczalności, twarz może zostać przyjęta, jako występująca w bazie lub odrzucona. Uznanie twarzy za "obcą" będzie miało miejsce w przypadku, gdy wartość sumy błędów przewyższy próg dopuszczalności. Rozpoznianie wzorca jest sygnalizowane wyświetleniem nazwy osoby, którą on reprezentuje. Niezależnie od wyniku program zaczyna całą procedurę od nowa aż do momentu zakończenia przez użytkownika trybu identyfikacji.


analiza_obrazu
Rys. 6: Okna programu wyświetlające na bieżąco wyniki analizy obrazu


komunikacja
Rys. 7: Przykładowa komunikacja z programem


trening
Rys. 8: Komunikaty interfejsu w trybie nauki



Testy

Działanie programu sprawdzone zostało dla kilku osób. Na ogół wynik pracy był pozytywny (program odróżniał użytkowników). Efekty pracy nie są jednak w pełni zadowalające. Znaczący wpływ na poprawę jakości dopasowania ma oświetlenie. Poza tym niezwykle uciążliwa okazała się szybkość pracy programu. Nie licząc parametrów kamery, testy przeprowadzono na słabym laptopie z procesorem turion 1.6GHz. Długie odstępy pomiędzy klatkami powodowały trudność z ustawieniem się użytkownika w odpowiednim miejscu. Oprócz tego liczba przeprowadzonych pomiarów była niewielka. Napotkane problemy sprzętowe sprawiły, iż musieliśmy zrezygnować z inteligentnego interfejsu dokonującego testów, gdy nos znajdzie się na środku obrazka, oraz porzucenia idei zastosowania klasyfikatora brwi (pomiar kilku kolejnych linii). Dodatkowo testy zostały przeprowadzone przy współpracy z różnymi filtrami w które wyposażyliśmy program (metoda splotu). Jednakże wyniki były tak mało zadowalające (dodatkowo powyższe trudności), iż koncepcja ta została porzucona, a klasyfikatory stworzone przez nas z zdecydowanie lepiej spełniały swą role na "surowych" obrazkach.


Wnioski

Identyfikacja za pomocą analizy obrazu twarzy okazuje się być dość dobrą metodą w przypadku gdy jej zadaniem nie jest chronienie obiektów o dużej wartości. Na jej korzyść przemawia przede wszystkim wygoda, ponieważ nie wymaga noszenia ze sobą żadnych dodatkowych przedmiotów (typu karta magnetyczna) ani pamiętania haseł. Jej skuteczność można regulować za pomącą modyfikacji wartości progu dopuszczalności. Ustawienie niższego zmniejszy możliwość zaakceptowania twarzy obcej, jednak może też spowodować zwiększenie szans na nieprzyjęcię twarzy osoby z bazy.

Metoda zastosowana w naszym programie nie do końca znalazłaby zastosowanie w systemach ochrony, ma jednak za zadanie obrazować proces zachodzący w przypadku stosowania identyfikacji obrazu twarzy. Zastosowana analiza jest typu "nie obchodzi mnie co było wcześniej" i stworzona została głównie z myślą o celach dydaktycznych. Każda klatka rozpatrywana jest oddzielnie, a na podstawie jednej trudno jest określić z całą pewnością, że znalezione dopasowanie jest poprawne. Jak się okazuje nietrudno to zmienić. Wystarczy, by warunkiem była określona ilość wystąpień "znanej" twarzy w przedziale czasu. Błedy rozpoznania mają taką tendencję, że w przypadku osoby znanej jakaś klatka może sporadycznie zostać uznana za "obcą". Natomiast dla osoby spoza bazy dość rzadko, jednak może trafić się klatka wskazująca na dopasowanie. Gdyby zastosować warunek "20 klatek rozpoznanych na sekundę, przez 5 sekund" w przypadku gdy w ciągu sekundy analizowanych jest 25 obrazów to sposób wydaje się skuteczny. Obcej osobie trudno będzie uzyskać taki wynik, a dla użytkownika z bazy nie powinien być problemem.

Klasyfikator sam w sobie nie jest zbyt precyzyjny, zwłaszcza dla niewielkich plików uczących. W naszym przypadku jego stworzenie było i tak wyzwaniem, gdyż pojedynczy plik buduje się parę godzin. Czasami na jednym obrazku wykrywanych jest więcej obiektów tego samego typu. W przypadku oczu ma to swoje uzasadnienie ale podczas analizy nosa i ust trzeba zdecydowanie unikać tego typu błędów. Z tego względu wprowadziliśmy podział twarzy na przedziały w których dopasowanie może się znaleźć. Np. dopasowanie ust nie jest uwzględniane na czole. Poza tym klasyfikatory pokazują różny obszar. Z testów wynika, że raczej nigdy nie mniejszy niż dopasowanie, za to czasem większy, dlatego spośród wyszukanych wybierany jest ten o najmniejszych współrzędnych. Analiza długości linii dokonywana jest tylko wtedy gdy program wyszuka wszystkie elementy detaliczne, tj. oczy, usta, nos. W procesie uczenia użytkownik może odrzucić wg niego błędne dopasowania. Możliwe i uzasadnione wydaje się stosowanie sieci neuronowej, zwłaszcza w przypadku gdy program ma wykrywać ruchome obiekty w różnych położeniach. Gdy zaś mowa o rozpoznawaniu osoby ustawionej w jednej i tej samej pozycji zdecydowanie szybsze wydają się metody zastosowane aktualnie.

Co do wydajności programu to jest ona jego słabą stroną. Obliczenia w czasie rzeczywistym mocno obciążają procesor. Prawdopodobnie dużą poprawę przyniosłaby optymalizacja kodu. Oprócz tego możnaby ominąć USB, którego to protokół wykorzystuje dodatkowe zasoby. Z tymi usprawnieniami system ten mógłby pewnie działać sprawnie na średniej klasy mikrokontrolerze.

Wspomniane zostało, że system ten nie nadaje się do ochrony dóbr o stosunkowo dużej wartości. Jest tak dlatego, że w prezentowanym tu wydaniu łatwo go oszukać. Wystarczy, że obca osoba pojawi się przed kamerą ze zdjęciem osoby posiadającej dostęp. Głównie dlatego rozpoznawanie twarzy stosowane jest jako system pomocniczy. Jeśli jednak o zastosowaniach mowa to niekoniecznie musi on być weryfikatorem tożsamości w celu uzyskania dostępu. Jednym z pomysłów jest stosowanie systemu w kamerach monitorujących miejsca publicze np. w poszukiwaniu osób ściganych listem gończym. Można też połączyć go z systemem kamer faragmentu budynku w którym powinny przebywać tylko osoby uprawnione. Biorąc pod uwagę stosunkwo niską cenę budowy całego systemu i wyżej wspomniane zalety, wydaje się on być dobrym rozwiązaniem w niektórych zastosowaniach.


Literatura

[1] Strona domowa OpenCV - http://opencv.willowgarage.com/wiki/

[2] Informacje przydatne do samodzielnej budowy klasyfikatorów Haar - http://note.sonots.com/SciSoftware/haartraining.html

[3] Inny projekt traktujący o Systemie Rozpoznawania Twarzy za pomocą klasyfikacji Haar - http://www.cs.put.poznan.pl/kkrawiec/ro/lab/2006-1/ro.pdf

[4] Opis możliwości Systemów Rozpoznawania Twarzy - http://www.polixel.com.pl/doc/OPIS_System_rozpoznawania_twarzy.pdf

[5] Strona firmy zajmującej się Systemami Rozpoznawania Twarzy - http://www.face-recognition.eu/


Valid HTML 4.01 Transitional