The report for "Artificial Intelligence '10" course

Gender Classification on Face Images

Adam Grycner
University of Wrocław
9 June 2010

Problem description

In this project I have tried to create tool for gender classification by face photos. The task is split in two subproblems. First - find characteristic points of face using OpenCV. Second - build classifier using collected informations. In my project I have used three types of classifier


Raport z projektu zaliczeniowego, Sztuczna Inteligencja '10

Rozpoznawanie płci na podstawie zdjęcia twarzy

Adam Grycner
Uniwersytet Wrocławski
9 czerwca 2010

Opis problemu

Problem, który jest rozwiązywany przez implementację projektu dotyczy rozpoznawania płci na podstawie zdjęcia twarzy.
Mając dane zdjęcie (w formacie *.jpg) chcemy stwierdzić, czy osoba zaprezentowana na tej fotografii jest kobietą, czy mężczyzną.
Zadanie rozpoznawanie płci na podstawie zdjęcia twarzy składa się z dwóch części. Pierwszą jest wykrycie charakterystycznych punktów twarzy (w moim projekcie - oczy, nos, usta). Drugą częścią jest zastosowanie metod uczenia na wydzielonym zbiorze danych.
W moim projekcie zastosowałem następujące metody uczenia:

Opis zastosowanej metody rozwiązania problemu

Część pierwsza: rozpoznawanie charakterystycznych punktów twarzy

W celu rozpoznawania charakterystycznych punktów twarzy wykorzystałem "Open Sourcową" bibliotekę do obróbki zdjęć - OpenCV. Dodatkowo potrzebne były też wyuczone klasyfikatory Haar'a dostępne m.in. na stronie http://alereimondo.no-ip.org/OpenCV/34 .
Wykorzystałem wyuczone klasyfikatory znajdujące prostokąty obejmujące:

Niestety klasyfikatory Haar'a nie zawsze zwracały dokładny wynik. Często zwracały wiele sprzecznych wyników albo nie zwracały w ogóle wyniku. Aby poradzić sobie z tym problemem zastosowałem kilka heurystyk:

Następnie wszystkie punkty przeskalowałem tak, że prostokąt obejmujący twarz miał wymiary 100x100. Na sam koniec dane o znalezionych punktach zapisywałem do bazy w pliku csv.


Przykład:

Zdjęcia przed oznaczeniem:

Zdjęcia o oznaczeniu:

Część druga: zastosowanie metod uczenia

Po znalezieniu charakterystycznych punktów twarzy oraz zapisaniu ich do bazy dzieliłem bazę na dane uczące i testowe (w stosunku 3:1). Następnie wykorzystałem metody uczenia na danych uczących, aby zaklasyfikować dane testowe.

Naiwny klasyfikator Bayesa

Pierwszą metodą klasyfikacji danych, którą zastosowałem był Naiwny Klasyfikator Bayesa. Metoda ta polega na wykorzystaniu wzoru Bayesa do zaklasyfikowania danych, Wzór Bayesa:

P(C| F_1, F_2, F_3, ..., F_n) = P(C) * P(F_1, F_2, F_3, ..., F_n | C) / P(F_1, F_2, F_3, ..., F_n)

gdzie

F_i - wartości współrzędnych charakterystycznych punktów twarzy
C - klasa (kobieta/mężczyzna)

W naiwny sposób zakładamy, że zdarzenia są niezależne, zatem:

P(F_1, F_2, F_3, ..., F_n | C) = P(F_1 | C) * P(F_2 | C) * ... * P(F_n | C)

Na sam koniec, aby zaklasyfikować nieznaną twarz, korzystamy ze wzoru:

classify(f_1, f_2, ..., f_N) = argmaxC P(C) * ∏ {i=1..N} P(F_i | C)

Wartość P(C) , to procent danych w bazie uczącej należących do klasy C, a P(F_i | C) - procent danych zaklasyfikowanych jako C mających odpowiednią wartość F_i.
Jako, że w przypadku prezentowanego zadania klasyfikacji zdjęcia twarzy, cechy charakterystyczne nie są wartościami nominalnymi ( mają wartości rzeczywiste) należy wprowadzić do algorytmu jeszcze jedne usprawnienie. P(F_i | C) liczymy w następujący sposób - dzielimy wartości atrybutu F_i z bazy uczącej na równe przedziały. Definiujemy funkcję, która każdą wartość F_i przyporządkowuje odpowiedniemu przedziałowi. P(F_i | C) jest to liczba elementów klasy C, których atrybut F_i należy do tego samego przedziału, co atrybut F_i danych do zaklasyfikowania.

K-Nearest Neighbours

W tym przypadku zadanie klasyfikacji opiera się o wyszukanie k rekordów z bazy, które mają najmniejszą wartość odległości względem danych do zaklasyfikowania. Klasa , do której zaklasyfikujemy dane, to klasa , do której zaklasyfikowana jest większość "sąsiadów".
Funkcja odległości w moim projekcie została zdefiniowana następująco:

odległość(x,y) = ∑ {i=1...N} współ_i * | x[i] - y[i] | , gdzie
współ_i = 1/(F_i_max - F_i_min) , a
x[i], y[i] - wartość atrybutu F_i danych x i y

Programowanie genetyczne

Ostatnią metodą klasyfikacji, którą zastosowałem w projekcie, było programowanie genetyczne, czyli algorytmy ewolucyjne na drzewach. Przebieg algorytmu był podobny, jak w algorytmie SGA. Inaczej zostały tylko zdefiniowane operatory mutacji, krzyżowania oraz inaczej został zdefiniowany osobnik.

Osobnik

Osobnikiem było drzewo decyzje. W węzłach pośrednich były zadawane pytania : czy x[i] <= v (czy wartość atrybutu F_i jest mniejsza równa od v).
W węzłach terminalnych była trzymana informacja o klasie, do które powinny być zaklasyfikowane dane (kobieta/mężczyzna).

Krzyżowanie

Krzyżowanie dwóch osobników (dwóch drzew):

Mutacja

Mutacja na drzewach przybierała kilka postaci:

Implementacja

Do implementacji projektu wykorzystałem język programowania Python oraz system operacyjny Ubuntu Linux. Dodatkowo, tak jak wcześniej wspomniałem, do detekcji charakterystycznych cech twarzy i obróbki obrazu wykorzystałem bibliotekę OpenCV dostosowaną do Pythona .

Wykorzystane dane

W projekcie wykorzystałem 428 zdjęć (217 zdjęć panów i 211 zdjęć pań) znalezionych w wyszukiwarce grafik Google'a (po wpisaniu haseł: passport, arrest, ID, hairstyle).
Przy wykrywaniu charakterystycznych punktów twarzy wykorzystałem klasyfikatory Haar'a dostępne na stronie http://alereimondo.no-ip.org/OpenCV/34 .

Przykład użycia

python main.py -f
Szuka punktów charakterystycznych dla wszystkich zdjęć w katalogu './Faces/faces' i zapisuje te informacje w './DataBase/baza.csv'

python main.py -d 0.75
Dzieli plik './DataBase/baza.csv' na dwa pliki './DataBase/learn.csv' i './DataBase/class.csv'. Rekord z pliku 'baza.csv' trafia do pliku 'learn.csv' (baza wykorzystana do uczenia) z prawdopodobieństwem 75%. Reszta rekordów trafia do bazy 'class.csv' (baza wykorzystana do testów).

python main.py -a 'NBC,200' -c 'test,_'
Klasyfikowane są dane z pliku 'class.csv' przy użyciu Naiwnego Klasyfikatora Bayesa z podziałem na 200 grup. NBC wykorzystuje dane z pliku 'learn.csv'.
Przykładowy wynik:
(Poprawne, wszystkie) Współczynniki poprawności
(67, 125) 0.536

python main.py -a 'NN,5' -c 'test,_'
Przykładowy wynik:
(Poprawne, wszystkie) Współczynniki poprawności
(87, 125) 0.696

python main.py -a 'EVO,The Best' -c 'test,_'
Przykładowy wynik:
(Poprawne, wszystkie) Współczynniki poprawności
(107, 125) 0.856

python main.py -a 'EVO,The Best' -c 'clas,55.jpg'
Klasyfikuje zdjęcie twarzy z pliku '55.jpg'
Przykładowy wynik:
Szukanie charakterystycznych punktów
Klasyfikacja
male

Testy

Testy przeprowadzono w następujący sposób - dzielono bazę na dane uczące i testowe według współczynnika podziału. Do zbioru uczącego trafiało losowe t% danych, a do danych testowych (100-t)% . Następnie sprawdzano procent poprawnych odpowiedzi udzielonych przez odpowiednią metodę na zbiorze testowym z wykorzystaniem do nauki danych uczących. Oto otrzymane wyniki

Procent podziałuNBC 10NBC 50NN 5NN 21EVO 1EVO 2EVO 3
25% 0.7080.5060.7200.6300.8630.813 0.658
50% 0.7260.5850.7260.7220.8630.799 0.722
75% 0.7040.6120.7240.7440.8670.846 0.744
EVO1 - najlepszy znaleziony klasyfikator

EVO2 - drugi najlepszy znaleziony klasyfikator

EVO3 - klasyfikator uczony na podanym zbiorze uczącym przez krótki okres czasu

Przeprowadziłem jeszcze jeden test. Spośród 428 zdjęć wyselekcjonowałem 100 (50 mężczyzn, 50 kobiet), które zostały najprecyzyjniej oznaczone (charakterystyczne punkty twarzy zostały dokładnie oznaczone). Następnie wykorzystałem Naiwny Klasyfikator Bayesa do klasyfikacji. Współczynniki przy NBC podzieliłem przez cztery. Oto wyniki:

Procent podziałuNBC 3NBC 13
25% 0.750.63
50% 0.850.72
75% 0.880.71

Wnioski

Względnie niski współczynnik poprawności przetestowanych metod może wynikać ze słabej dokładności klasyfikatorów Haar'a przy rozpoznawaniu charakterystycznych punktów twarzy. Wyselekcjonowanie 100 najprecyzyjniej oznaczonych zdjęć zdaje się potwierdzać tą tezę . Niestety nie udało mi się znaleźć innego darmowego, skutecznego, łatwo dostępnego narzędzia do znajdowania charakterystycznych punktów twarzy. Inne (komercyjne lub mniej precyzyjne) narzędzia to np. VeriLook, FaceCropper, faceAPI, Betaface.
Niski współczynnik poprawności może też wynikać z trudności zadania. Pomimo wyselekcjonowania 100 zdjęć, klasyfikator Bayesa nie przekroczył skuteczności 90%.

Literatura i materiały

  1. Zbigniew Michalewicz, Algorytmy genetyczne + struktury danych = programy ewolucyjne
  2. notatki dra Lipińskiego do wykładu "Algorytmy ewolucyjne"
  3. Chengjun Liu, Harry Wechsle Evolutionary Pursuit and Its Application to Face Recognition
  4. Wyuczone klasyfikatory Haar'a
  5. OpenCV dla języka Python

Valid HTML 4.01 Transitional