Krzysztof Dondajewski
Jarosław Puszczyński
Celem projektu było stworzenie aplikacji, która zdolna by była śledzić ruch ludzkiej głowy i zgodnie z tymi ruchami sterować na przykład myszką komputerową.
Projekt
realizowany był w środowisku java z wykorzystaniem bibliotek: Java Media
Framework, Java Advanced Imaging oraz biblioteki genetycznej ECJ z
wykorzystaniem Genetic Programming. Projekt składał się z dwóch części –
uczącej i testującej. W części uczącej algorytm starał się stworzyć drzewo
genetyczne, które w jak najlepszy sposób znajdowałoby pozycję nosa – względem
którego miały być wykonywane ruchy. W części testującej sprawdzane były
stworzone drzewa na nowych plikach z nagranymi ruchami twarzy.
a)
część
ucząca
Materiałem
uczącym były filmy z nagranymi ruchami twarzy oraz pliki z zapisanymi
rzeczywistymi pozycjami nosa w każdej klatce. Każdy osobnik był drzewem
składającym się liści, którymi były wejścia maski zdefiniowanej jako pewna liczba
sąsiadów danego piksela oraz węzłów będących funkcjami (m.in. min, max, +, -,
*, /, threshold, exp). Każdy z osobników było ocenianym na podstawie piksela
wybranego (przez drzewo algorytmu genetycznego) jako pozycja nosa i jego
odległości euklidesowej od rzeczywistej pozycji nosa. Dokładnie była to
funkcja:
fitness = exp
(-1*beta*d(poz. rzecz, poz. osobnika))
b)
część
testująca
W części testującej dla najlepszego osobnika z populacji testowane było jego zachowanie na nowym zbiorze bądź na tym samym zbiorze. Wynik można było obserwować na obrazkach, w których były zaznaczone pozycje nosa dla jednego bądź wielu osobników powstałych w wyniku działania programu uczącego z innymi parametrami populacji bądź na innym zbiorze uczącym.
Działanie aplikacji zostało przeprowadzone na
dwóch wcześniej przygotowanych sekwencjach avi (po ok. 20 i 600 klatek). Dla
pierwszej z nich uczono się na każdej klatce (bądź co 2, 3) na drugiej
sekwencji co 25 bądź 50 klatek. Parametry algorytmu genetycznego - rozmiar
populacji i liczba generacji zostały ustalone odpowiednio na 10 osobników oraz
20 generacji.
Przykładowe drzewa wygenerowane przez
algorytm genetyczny wyglądają następująco (litery oznaczają odpowiednie
„sensory” maski piksela):
(exp (/ e (/ c (exp (* (/ c d) (- a b))))))
(thres1 (- a d)
(+ e d))
Uzyskane wyniki były obiecujące, w początkowej fazie obliczona pozycja nosa podążała za rzeczywistą pozycją nosa. Jednak wraz z czasem pozycje nosa zaczęły „się rozjeżdżać". Przyczyną tego jest zapewne mała liczba populacji i generacji algorytmu genetycznego. Należałoby zwiększyć obydwa te parametry, wiąże się to jednak z dłuższym nakładem czasowym na stworzenie ostatecznego drzewa. Poza tym program posiada jeszcze wiele parametrów, których zmiana może mieć wpływ na działanie algorytmu i które należałby przebadać. Są to na przykład: maska piksela (rozmiar, wybrane piksele), szerokość i wysokość obszarów którym szukamy nowej pozycji nosa, rozmiar zbioru uczącego, współczynnik frameskiprate (na co której klatce się uczymy).