PRACA DYPLOMOWA INŻYNIERSKA · Rok akademicki 2012 / 2013 Politechnika Warszawska Wydział...
Transcript of PRACA DYPLOMOWA INŻYNIERSKA · Rok akademicki 2012 / 2013 Politechnika Warszawska Wydział...
Rok akademicki 2012 / 2013
Politechnika Warszawska
Wydział Elektroniki i Technik Informacyjnych
Instytut Informatyki
PRACA DYPLOMOWA INŻYNIERSKA
Dominik Olędzki
Interfejs komputera wykorzystujący kamerę
Opiekun pracy
prof. nzw. dr hab. Przemysław Rokita
Ocena: .....................................................
................................................................
Podpis Przewodniczącego
Komisji Egzaminu Dyplomowego
Specjalność: Inżynieria Systemów Informatycznych
Data urodzenia: 1990.03.19
Data rozpoczęcia studiów: 2009.10.01
Życiorys
Urodziłem się 19. marca 1990 roku w Łosicach gdzie ukończyłem szkołę podstawową i
gimnazjum. W latach 2006 – 2009 uczęszczałem do I Liceum Ogólnokształcącego
im. Bolesława Prusa w Siedlcach. W październiku 2009 roku rozpocząłem studia na Wydziale
Elektroniki i Technik Informacyjnych Politechniki Warszawskiej na kierunku Informatyka.
Od stycznia 2010 roku aktywnie działałem w ramach Koła Naukowego Twórców Gier
„Polygon”.
.......................................................
Podpis studenta
EGZAMIN DYPLOMOWY
Złożył egzamin dyplomowy w dniu .................................................................................. 2013 r
z wynikiem ..................................................................................................................................
Ogólny wynik studiów: ...............................................................................................................
Dodatkowe wnioski i uwagi Komisji: .........................................................................................
......................................................................................................................................................
......................................................................................................................................................
STRESZCZENIE
Celem pracy jest omówienie próby zaprojektowania i wykonania przez autora interfejsu
komputera wykorzystującego kamerę, realizowanego w systemie przetwarzania obrazu
stworzonym na potrzeby pracy dyplomowej. Praca zawiera opis dostępnych produktów i
technologii, przygotowanego systemu oraz trzech zaproponowanych rozwiązań opartych o
wykrywanie położenia i orientacji głowy i części twarzy, wraz z rezultatami i wnioskami.
System bazuje na czujniku ruchu wyposażonym w kamerę RGB oraz sensor głębi.
Słowa kluczowe: czujnik ruchu, interfejs komputera
COMPUTER INTERFACE USING VIDEO CAMERA
The purpose of this paper is to describe my attempt to design and develop human-computer
interface based on camera, implemented in image processing system, created for the thesis.
This paper contains a description of currently available products and technologies, created
processing system and the three proposed solutions based on detection of position and
orientation of human head and face features with results and conclusions. System uses a
motion sensor equipped with RGB video camera and depth sensor.
Keywords: motion sensor, computer interface
Pragnę złożyć serdeczne podziękowania
Panu prof. nzw. dr hab. Przemysławowi Rokicie za
wskazówki i pomoc merytoryczną w przygotowaniu
niniejszej pracy.
1
Spis treści
Spis treści 1
Wprowadzenie 3 1.
Rozwiązania dostępne na rynku 4 2.
Kontrolery gier 4
Systemy inwazyjne 5
Systemy nieinwazyjne 5
Technologia 6 3.
Sprzęt 6
Oprogramowanie 8
System przetwarzania obrazu 10 4.
Wymagania 10
Rozwiązanie 11
Metoda pierwsza 16 5.
Położenie gałek ocznych 16
Orientacja gałek ocznych 18
Wzajemne relacje położenia kamery i monitora 18
Program do generowania danych uczących sieci 19
Program do wyznaczania punktu skupienia wzroku 23
Wnioski z metody pierwszej 24
Metoda druga 26 6.
Metoda trzecia 34 7.
3
Wprowadzenie 1.
Według raportu Gartnera, na świecie jest już ponad miliard
komputerów (1). Spotykamy je na co dzień, w domu, w pracy i w
szkole, ale warto zadać sobie pytanie, co jest powodem tak dużej
popularności urządzeń, które jeszcze 20 lat temu uchodziły za
narzędzia dla naukowców i specjalistów. Moim zdaniem jedną z
głównych przyczyn tego stanu rzeczy, jest dążenie producentów sprzętu
i oprogramowania do ułatwienia obsługi tych urządzeń.
Dzisiaj aby móc korzystać z komputera nie musimy już znać na
pamięć setek komend, powszechne są interfejsy graficzne, a powoli
wkraczają do naszych domów nowoczesne urządzenia takie jak czujniki
ruchu i kamery obserwujące wykonywane przez nas gesty. W mojej
pracy starałem się zaprojektować interfejs komputera nie wymagający
obsługi myszki ani klawiatury, bazujący na kamerze i czujniku ruchu.
Celem mojej pracy było zbadanie dostępnych technologii oraz
zaprojektowanie i implementacja interfejsu komputera
wykorzystującego kamerę. Cel ten można zrealizować na wiele
różnorodnych sposobów, ja chciałem oprzeć swoje rozwiązanie na
technikach śledzenia spojrzenia użytkownika. Rozwiązanie takie
umożliwiłoby korzystanie z komputera osobom o obniżonej sprawności
ruchowej, a moim zdaniem byłoby również wygodnym sposobem
obsługi komputera dla osób o pełnej sprawności.
W pracy tej opisałem trzy metody, które opracowałem: pierwsza
oparta o badanie położenia i orientacji gałek ocznych użytkownika,
druga o badanie położenia i orientacji głowy użytkownika oraz trzecia
oparta na śledzeniu dłoni. Ponadto, do testowania opracowanych
metod stworzyłem uniwersalny i łatwy w użyciu system przetwarzania
obrazu, który również opisałem w tej pracy.
4
Rozwiązania dostępne na rynku 2.
Produkty służące do obsługi komputera za pomocą gestów
rozpoznawanych dzięki obrazowi z kamer i sensorów można
zaklasyfikować do jednej z kategorii:
kontrolery gier,
inne systemy inwazyjne,
inne systemy nieinwazyjne.
Kontrolery gier
Konsole gier wideo przeżywają swój renesans dzięki zastosowaniu
nowoczesnych technologii bazujących na czujnikach ruchu i
kamerach. Trzy najbardziej popularne produkty to Microsoft Kinect,
Sony Playstation Move oraz Nintendo Wii.
Produkt firmy Microsoft charakteryzuje się brakiem
jakiegokolwiek kontrolera, sterowanie oparte jest o czujnik ruchu,
podobny do tego użytego w mojej pracy. Użytkownik wybiera funkcje
na ekranie wskazując je palcem, a ponadto może wykonywać różnego
rodzaju gesty, od prostego „kliknięcia” po figury taneczne w grach.
Playstation Move to zestaw z kamerą i kontrolerami trzymanymi w
dłoni. Kontroler jest w kształcie pałeczki z podświetlaną kulką
zmieniającą barwę w zależności od gracza i przebiegu rozgrywki.
Kamera znajduje kulkę w polu widzenia i określa jej położenie w
przestrzeni trójwymiarowej, a kontroler wyposażony w akcelerometr i
żyroskop, pozwala na ocenę orientacji w przestrzeni i prędkości ruchu.
Firma Nintendo stworzyła rozwiązanie podobne do Playstation
Move, ale kontroler jest kształtem bardziej zbliżony do pilota, a zamiast
kulki zastosowano sensor podczerwieni w kontrolerze, który rejestruje
położenie specjalnej podstawki z diodami LED umieszczanej pod
telewizorem. Ponadto kontroler wyposażono w akcelerometr, a
żyroskop umieszczono w dodatkowej części dołączanej do kontrolera
(Wii MotionPlus).
5
Systemy inwazyjne
Systemy inwazyjne charakteryzują się obecnością urządzeń zwykle
zakładanych na głowę użytkownika: okulary, kaski, kamery na
wysięgniku, często nie pozwalające na swobodne ruchy ciała. Punkt, w
którym skupia się wzrok użytkownika wyznaczany jest na podstawie z
góry założonego położenia głowy i analizy obrazu gałki ocznej
uzyskanego za pomocą bardzo blisko umieszczonej kamery. Jednym z
najbardziej popularnych jest EC8™ System firmy Eye-Com Corporation
Systemy nieinwazyjne
Systemy nieinwazyjne nie wymagają zakładania żadnego
dodatkowego sprzętu. Na przykład EyeTech TM4 firmy EyeTech Digital
Systems składa się z kamery oraz źródła światła podczerwonego, które
po odbiciu umożliwia wykrycie źrenicy oka. Rozwiązanie to daje dużą
dokładność (do około 1°), ale nie pozwala na swobodę ruchów ciała.
Ponadto, cena urządzenia zaczyna się od około 6500 dolarów.
Ciekawe rozwiązanie zaproponowała firma Tobii Technology, która
ma w swojej ofercie urządzenie o bardzo wysokiej dokładności, które do
estymacji kierunku spojrzenia używa metody bazującej na odbiciu
światła podczerwonego od rogówki (ang. Pupil-Center-Corneal Reflection)
(2). Cena modułu śledzenia wzroku wynosi 6900 dolarów.
6
Technologia 3.
Sprzęt
Do zrealizowania celu swojej pracy inżynierskiej potrzebowałem
niestandardowej kamery, dosyć dużego monitora oraz wydajnego
układu graficznego. W tym podrozdziale opisałem te elementy systemu.
Czujnik ruchu
Urządzenie, którego używałem to ASUS Xtion Pro Live. Nie jest to
typowa kamera, powszechnie przyjęto określenie „czujnik ruchu”.
Urządzenie to zawiera kilka sensorów:
1. kamera wideo RGB o rozdzielczości 1280 x 1024 piksele
(około 10 kl/s, przy rozdzielczości 640 x 480 30 kl/s);
2. promiennik podczerwieni;
3. matryca CCD czuła na światło podczerwone o rozdzielczości
1600 x 1200 pikseli;
4. 2 mikrofony zlokalizowane na krańcach urządzenia.
Pełna specyfikacja urządzenia dostępna jest na stronie producenta
(3).
Promiennik podczerwieni oraz matryca czuła na podczerwień
pozwala na wyznaczenie odległości od czujnika dla każdego piksela
obrazu w postaci mapy głębi, co z kolei, po odpowiednim
przekształceniu, pozwala na wyznaczenie pozycji każdego piksela
obrazu w przestrzeni trójwymiarowej. Metoda skanowania przestrzeni,
którą zastosowano w tym urządzeniu nazywana jest „światłem
strukturyzowanym” (ang. structured light), metoda ta dokładniej
opisana jest w pozycji (4) bibliografii.
Ze względu na sposób przetwarzania informacji z matrycy czułej
na podczerwień, rozdzielczość wynikowa mapy głębi wynosi tylko
640 x 480 pikseli.
7
Monitor
Ze względu na niską dokładność urządzenia pomiarowego (mała
rozdzielczość wideo i mapy głębi), ważnym parametrem systemu jest
rozmiar monitora. Szerokość kątowa monitora na siatkówce oka jest
określona następującym wzorem:
Gdzie w – szerokość monitora, L – odległość obserwatora od
monitora. Im większy monitor, tym kąty wychylenia gałki będą większe,
a tym samym, błąd względny mniejszy. Zależność przedstawiono na
rysunku 1. W swojej pracy użyłem monitora o przekątnej 27 cali,
uznając ten rozmiar za wystarczająco duży do dokładnych pomiarów, a
jednocześnie dostępny w akceptowalnej cenie.
RYSUNEK 1
Układ graficzny
Operacje związane z przetwarzaniem obrazów są bardzo
wymagające obliczeniowo, dlatego używa się do nich specjalnych kart
graficznych. Firma NVIDIA Corporation stworzyła technologię CUDA
(ang. Compute Unified Device Architecture) służącą do wykonywania
własnych, niestandardowych programów przy użyciu kart graficznych.
𝛼
𝑤
𝐿
8
Najbardziej wymagające kroki moich algorytmów wykorzystują tę
technologię, dlatego wyposażyłem komputer w kartę graficzną firmy
NVIDIA współpracującą z technologią CUDA.
Oprogramowanie
W swojej pracy użyłem kilku produktów z kategorii
oprogramowania pośredniczącego, w tym: zestaw narzędzi
programistycznych do kamery ASUS Xtion Pro Live, biblioteki
przetwarzania obrazu OpenCV, platformy programistycznej Qt do
budowy interfejsu graficznego.
Oprogramowanie czujnika ruchu
W skład oprogramowania firmy PrimeSense dostarczonego wraz z
czujnikiem ruchu wchodzą:
1. Sterownik urządzenia dla systemów Windows i Linux.
2. Biblioteka OpenNI (Open Natural Interaction),
dostarczająca uniwersalny interfejs programistyczny dla
urządzeń naturalnego interfejsu użytkownika, takich jak
ASUS Xtion i Microsoft Kinect.
3. Oprogramowanie NITE stanowiące warstwę pośrednią
między urządzeniem, a biblioteką OpenNI. Jest to zestaw
algorytmów do wykrywania gestów oraz analizowania
sceny.
Przetwarzanie obrazu
Do implementacji opracowanych rozwiązań posłużyłem się
biblioteką OpenCV autorstwa firm Intel oraz Willow Garage. Wybrałem
tę bibliotekę ze względu na szeroki zakres zastosowania, wysoką
wydajność implementowanych algorytmów, a przede wszystkim ze
względu na silne wsparcie społeczności użytkowników na portalach
internetowych. Ponadto, OpenCV zawiera wiele implementacji
algorytmów korzystających z technologii CUDA oraz bardzo dobrze
współpracuje z używaną przeze mnie platformą programistyczną Qt.
9
Interfejs użytkownika
Do stworzenia interfejsu graficznego opisanych programów użyłem
zestawu bibliotek Qt firmy Qt Development Frameworks. Biblioteki te
umożliwiają łatwe i szybkie stworzenie aplikacji zdarzeniowych z
interfejsem graficznym, a w tym ułatwiają implementację np. widoków
trójwymiarowych z użyciem OpenGL, których używałem do testowania
metody drugiej.
Środowisko programistyczne i inne narzędzia
Jako środowisko programistyczne używałem Microsoft Visual
Studio 2010, w którym napisałem bibliotekę – system przetwarzania
obrazu oraz pięć innych programów, opisałem wszystkie w dalszej
części pracy. Biblioteka oraz pięć programów napisałem w języku C++,
jeden w języku C#. Poza opisanymi wyżej bibliotekami, w trakcie pracy
używałem jeszcze oprogramowania AForge.NET Framework 1 – do
uczenia sieci neuronowej, Accord.NET Framework2 – używałem modułu
Statistics do analizy głównych składowych, ARToolkit 3 – do
wyznaczania relacji kamera-monitor na podstawie markerów.
Poza tym, kod źródłowy projektu umieściłem na repozytorium
Subversion w serwisie Google Code. Jako klienta SVN używałem
oprogramowania TortoiseSVN dla systemu Windows.
1 http://www.aforgenet.com/ 2 http://code.google.com/p/accord/ 3 http://www.hitl.washington.edu/artoolkit/
10
System przetwarzania obrazu 4.
Wymagania
Do zrealizowania celu pracy inżynierskiej potrzebowałem
uniwersalnego narzędzia, które pozwoliłoby na testowanie różnych
podejść, metod przetwarzania i analizy obrazów oraz zapisywanie
wyników. Oprogramowanie, którego szukałem musiało obsługiwać
wiele strumieni danych wejściowych oraz pozwalać na wspólne
przetwarzanie odpowiadających sobie klatek w każdym ze strumieni.
Jednocześnie potrzebowałem oprogramowania, które obsługiwałoby
używany przeze mnie czujnik ruchu. Niestety nie znalazłem
odpowiedniego rozwiązania, co zmusiło mnie do stworzenia własnego,
uniwersalnego systemu przetwarzania obrazu. Projektując system
określiłem następujące wymagania funkcjonalne:
1. System musi obsługiwać czujnik ruchu ASUS Xtion Pro
Live.
2. Musi pozwalać na współbieżne przetwarzanie obrazu z wielu
źródeł, np. obrazu RGB i mapy głębi z czujnika.
3. Musi być łatwo rozszerzalny o nowe metody przetwarzania.
4. Powinien wspomagać wielokrotne używanie raz napisanego
kodu.
5. Powinien izolować poszczególne metody przetwarzania tak
aby ułatwić wymianę poszczególnych etapów i umożliwić
szybkie lokalizowanie błędów.
Ponadto, system powinien spełniać poniższe wymagania
pozafunkcjonalne:
1. System powinien działać na komputerze PC wyposażonym w
system operacyjny Microsoft Windows.
2. Powinien wykorzystywać możliwości procesorów
wielordzeniowych i kart graficznych współpracujących z
technologią CUDA.
11
3. Wydajność systemu powinna pozwalać na przetwarzanie co
najmniej 10 klatek na sekundę dla metod opisanych w
niniejszej pracy.
Rozwiązanie
System, który stworzyłem spełnia prawie wszystkie powyższe
wymagania, aktualnie nie wykorzystuje wielu rdzeni do równoległego
przetwarzania, ponieważ wydajność była satysfakcjonująca i nie było
takiej potrzeby, a ponadto, utrudniłoby to implementację wielu
używanych filtrów. Moje rozwiązanie jest biblioteką statyczną
dołączaną do pozostałych projektów, która dostarcza łatwego i
uniwersalnego interfejsu do implementacji niestandardowych metod
przetwarzania. Umożliwia przetwarzanie danych z wielu źródeł, w tym
nie tylko obrazu, ale również dźwięku czy innych dowolnych danych
liczbowych, które można zapisać w postaci macierzy. Kroki
przetwarzania mogą przyjmować dane z kilku strumieni oraz mogą
generować kilka strumieni nowych danych, mogą być dowolnie
łączone, przeplatane i zapętlane. System składa się z dwóch
kluczowych elementów: grafu przetwarzania oraz zestawu filtrów.
Graf przetwarzania
Graf przetwarzania obrazu jest strukturą, która definiuje
kolejność kroków przetwarzania oraz przepływ danych między nimi.
Odpowiada za wywołanie wszystkich potrzebnych filtrów w
odpowiedniej kolejności i na odpowiednich danych. Filtry po
stworzeniu są dodawane do listy filtrów grafu, który przed
uruchomieniem przetwarzania wyznacza kolejność w jakiej filtry
powinny być wywoływane, aby spełnione zostały określone między nimi
zależności przepływu danych. Graf przetwarzania decyduje również o
wyborze jednej z dwóch metod przetwarzania zawartych w każdym
filtrze: przetwarzanie danych poprawnych, przetwarzanie danych, w
których co najmniej jedna składowa jest niepoprawna.
12
Poza samym procesem przetwarzania, graf filtrów odpowiada
również za stworzenie interfejsu umożliwiającego wyświetlanie wyników
oraz kontrolę parametrów w trakcie przetwarzania. W tym celu tworzy
widżet ekranowy agregujący widżety udostępniane przez filtry.
Architekturę typowej aplikacji wykorzystującej mój system
przetwarzania przedstawia rysunek 2, graf przetwarzania jest zawarty
w aplikacji.
RYSUNEK 2
Filtry
Filtr można utożsamiać z funkcją:
Gdzie:
– liczba wejść filtra;
– liczba wyjść filtra;
- macierze wejściowe określonego o określonej liczbie
wymiarów i w pełni lub częściowo określonych wymiarach – np. obraz
RGB o rozdzielczości 640 x 480 pikseli lub zestaw punktów w
przestrzeni trójwymiarowej zapisanych w postaci wektorów poziomych
tak, że każdy wiersz macierzy określa inny punkt;
- macierze wejściowe określone na tych samych zasadach
co macierze wejściowe;
Aplikacja Graf przetwarzania
Filtr Filtr
13
- dodatkowe wartości logiczne określające czy dane wejściowe w
macierzy są poprawne;
- dodatkowe wartości logiczne określające czy dane wyjściowe
w macierzy są poprawne;
– funkcja przetwarzania danych, dzięki dodatkowym flagom
poprawności danych może w wyjątkowy sposób obsługiwać sytuacje
błędne lub częściowy brak danych.
Filtry można podzielić na trzy kategorie:
1. filtry wejściowe,
2. filtry wyjściowe,
3. filtry przetwarzające.
Filtry wejściowe to takie, które dostarczają danych z określonego
źródła. Charakteryzują się brakiem wejść i (zwykle) jednym wyjściem,
w moim systemie do tej grupy należą filtry takie jak:
RGBInput – pobiera obraz RGB z czujnika ruchu ASUS Xtion
Pro Live;
DepthInput – pobiera mapę głębokości z czujnika ruchu;
IRInput – pobiera obraz z matrycy czułej na podczerwień z
czujnika ruchu;
ConstInput – generuje stałą, wcześniej ustaloną macierz;
FileInput – odczytuje dane z pliku;
StreamInput – generuje ciąg wcześniej ustalonych macierzy;
ParameterInput – generuje wartości parametryzowane za
pomocą suwaków na widżecie wyświetlanym w oknie grafu
przetwarzania.
Filtry wyjściowe to takie, które wyświetlają lub zapisują wyniki
przetwarzania, zwykle mają jedno wejście i nie mają żadnych wyjść. Do
tej grupy należą takie filtry:
ImageOutput – wyświetla obraz we własnym widżecie;
FileOutput – zapisuje obrazy do kolejnych plików w
formacie ddd.png, gdzie ddd zastępuje kolejnymi liczbami;
14
ConsoleOutput – wyświetla wartość w konsoli, przydatne w
przypadku małych macierzy zawierających np. współrzędne
jednego punktu lub macierz transformacji, używane do
testowania;
CSVOutput – zapisuje kolejne macierze wyjściowe w postaci
rozciągniętej do jednego wiersza do pliku w formacie CSV,
obsługuje wiele strumieni wejściowych, ale trzeba pamiętać
ich kolejność i wymiary;
OpenGLOutput – wyświetla trzy rodzaje danych: punkty w
przestrzeni trójwymiarowej, wektory w przestrzeni
trójwymiarowej oraz macierze transformacji, tło widoku
stanowi siatkę na płaszczyźnie XZ przestrzeni
trójwymiarowej, punkty rysowane są jako koła określonym
kolorze i średnicy, wektory jako strzałki, a macierze
transformacji jako trzy wektory jednostkowe równoległe do
osi układu współrzędnych, przekształcone za pomocą
macierzy transformacji, w każdym z widoków widoczne są
trzy półprzezroczyste wektory OX, OY i OZ przydatne jako
punkt odniesienia;
PointOnScreenOutput – wyświetla koło o określonym kolorze
i promieniu na widoku pełnoekranowym w punkcie w
przestrzeni dwuwymiarowej, przekazanym za pomocą
wejścia.
Do filtrów przetwarzających należą takie, które przetwarzają dane
wejściowe, a wyniki tego przetwarzania udostępniają za pośrednictwem
swoich wyjść. W trakcie pisania pracy zaimplementowałem wiele filtrów
tego rodzaju, nie ma potrzeby wypisywania ich, a wiele z nich
opakowuje funkcje OpenCV.
Dane z wejść i wyjść filtrów przekazywane są w postaci macierzy,
obiektu klasy Mat biblioteki OpenCV. Dzięki temu rozwiązaniu filtry
mogą przekazywać między sobą niemal dowolne dane numeryczne,
macierze mają dowolną liczbę wymiarów, dowolne rozmiary oraz
dowolny typ danych. Poza standardowymi połączeniami wyjść i wejść
15
filtrów, w systemie występują również asocjacje między filtrami, które
są wymagane przez niektóre zastosowania np. do wywoływania metod
udostępnianych przez API czujnika ruchu. W swoich zastosowaniach
starałem się konsekwentnie używać kilku typów danych: obrazy 3-
kanałowe RGB, obrazy 1-kanałowe – w skali szarości (liczby całkowite)
i mapa głębi (liczby zmiennoprzecinkowe), punkty i wektory w
przestrzeni dwu- i trójwymiarowej, macierze transformacji. Ponieważ
system udostępnia wspólny dla wszystkich filtrów interfejs, do
opisywania projektowanych grafów przetwarzania zaproponowałem
jednolitą notację w postaci diagramu. Przykładowy diagram
przedstawia rysunek 3.
RYSUNEK 3
Filtr wejściowy
Filtr przetwarzający
Filtr wyjściowy
Filtr wejściowy
Dane 1 Dane 2
Asocjacja
Wynik przetwarzania
16
Metoda pierwsza 5.
Pierwsza próba budowy interfejsu komputera zakładała obsługę
bez użycia myszy. Głównym założeniem było wykrycie punktu na
ekranie monitora, na którym użytkownika skupia wzrok i przesunięcie
tam kursora. Do osiągnięcia tego celu potrzebne były następujące
dane:
1. położenie gałek ocznych względem czujnika;
2. kąty obrotu gałek ocznych w osi pionowej i osi poziomej
prostopadłej do kierunku spojrzenia;
3. położenie kamery względem monitora;
4. wymiary i rozdzielczość monitora.
W dalszej części rozdziału przedstawiłem diagram programów
zbudowanych na bazie opisanego wcześniej systemu przetwarzania,
realizujących metodę pierwszą.
Położenie gałek ocznych
Czujnik ruchu udostępnia mapę głębi widzianej sceny, dzięki tym
danym oraz obrazowi z matrycy RGB możemy określić położenie
punktów sceny w przestrzeni trójwymiarowej w układzie związanym z
czujnikiem ruchu. W tym celu najpierw musimy wyznaczyć położenie
gałek ocznych na obrazie RGB w układzie dwuwymiarowym obrazu.
Dokonywane jest to za pomocą klasyfikatora cech Haaro-podobnych,
którego implementację dostarcza biblioteka OpenCV. Ponieważ
wykrywanie oczu w każdej klatce znacząco obniżyłoby wydajność
rozwiązania, wykrywanie następuje etapowo. Pierwszym krokiem jest
znalezienie twarzy na obrazie przy użyciu klasyfikatora cech Haaro-
podobnych, jeśli nie znaleziono twarzy we wcześniejszej klatce
wyszukiwanie przeprowadzane jest w obrębie całej klatki, w innym
wypadku wyszukiwanie przeprowadzane jest w obszarze, w którym
istnieje wysokie prawdopodobieństwo znalezienia twarzy, jest to obszar
o szerokości i wysokości 25% większej niż prostokąt, w którym ostatnio
17
znaleziono twarz. Jeśli użytkownik nie wykona szczególnie szybkiego
ruchu, skuteczność tego rozwiązania jest bardzo wysoka. Jeśli nie
udało się znaleźć twarzy w obszarze wysokiego prawdopodobieństwa,
wyszukiwanie następuje w obrębie całej klatki.
Wstępne wyszukiwanie twarzy przyspiesza proces detekcji oczu,
ponieważ oczy, jako mniejsze elementy obrazu, są trudniejsze do
znalezienia i wymagają więcej czasu. Po znalezieniu twarzy, można
przeprowadzić detekcję oczu tylko w ograniczonym obszarze obrazu.
Po znalezieniu położenia oczu na obrazie RGB z czujnika ruchu,
należy obliczyć ich położenie w przestrzeni trójwymiarowej względem
czujnika. Przypomnę, że obraz dwuwymiarowy powstaje na matrycy
kamery w sposób, który opisuje rzutowanie perspektywiczne, poniżej
podałem formułę pozwalającą na obliczenie położenia rzutu
perspektywicznego punktu na matrycę kamery w zależności od
położenia punktu w przestrzeni, we współrzędnych jednorodnych.
Wzory te nie uwzględniają transformacji współrzędnych z matrycy
kamery do współrzędnych obrazu w postaci cyfrowej oraz
zniekształcenia obiektywu kamery.
[
]
[
]
[
]
– punkt w przestrzeni trójwymiarowej,
– macierz projekcji,
- rzut punktu P na matrycę kamery,
– ogniskowa kamery.
Jak widać, podczas rzutowania perspektywicznego zatracana jest
informacja o odległości punktu P od kamery. Wartość tę można
odczytać z mapy głębi, którą tworzy czujnik ruchu. W efekcie
współrzędne pierwotnego punktu P możemy policzyć za pomocą wzoru:
18
W ten sposób z obrazu RGB i mapy głębi uzyskaliśmy współrzędne
położenia gałek ocznych w przestrzeni trójwymiarowej o początku
układu współrzędnych związanym z kamerą.
Orientacja gałek ocznych
Samo położenie gałek ocznych nie wystarczy do wyznaczenia
kierunku spojrzenia, do tego celu potrzebujemy jeszcze dwóch kątów
obrotu gałek ocznych. Początkowo założyłem, że kąty te można
wyznaczyć za pomocą odpowiednio nauczonej sieci neuronowej.
Warstwa wejściowa sieci posiadała 400 neuronów (20x20 pikseli),
warstwa wyjściowa 2 wartości w przedziale ⟨ ⟩, a warstwa ukryta 50
neuronów. Próba wynosiła 3000 obrazów dla 100 różnych punktów na
ekranie, 90% próby przeznaczyłem na zbiór uczący, a 10% na zbiór
testowy. Neurony w sieci aktywowane były bipolarną funkcją
sigmoidalną i uczone za pomocą algorytmu wstecznej propagacji błędu
(5) przez 10000 epok lub do momentu uzyskania średniego błędu
kwadratowego mniejszego niż 0,2 (wszystkie dane znormalizowano do
przedziału ⟨ ⟩ ). Niestety tak zaprojektowana sieć neuronowa nie
wykazała zadowalającej zdolności uczenia się. W trakcie uczenia średni
błąd kwadratowy zmalał od wartości początkowej 0,92 do wartości 0,02
(dla 10000 epok) oraz wartości 0,19 (dla drugiego warunku), ale w
żadnym z opisanych wypadków sieć nie uzyskała pożądanej własności
uogólniania wzorca, przez co praktyczne zastosowanie rozwiązania nie
daje satysfakcjonujących rezultatów.
Wzajemne relacje położenia kamery i monitora
Aby rzutować wektor spojrzenia na płaszczyznę monitora, musimy
znać jego położenie i orientację w zależności od kamery, ponieważ do
tej pory wszystkie operacje wykonywaliśmy w układzie współrzędnych
związanym z kamerą. W tym celu należy dokonać niezbędnych
pomiarów i skonstruować macierz transformacji, którą mnoży się z
19
każdym punktem obliczonym we współrzędnych kamery. Ciekawym
rozwiązaniem, które można wprowadzić do tego kroku w przyszłości
wydaje się być biblioteka ARToolkit udostępniająca narzędzia dla
twórców aplikacji związanych z ideą rozszerzonej rzeczywistości.
Kamerę i monitor należałoby oznaczyć odpowiednimi markerami, a
następnie wykonać kilka zdjęć pod różnymi kątami obejmujących oba
urządzenia i dokonać wyznaczenia macierzy transformacji między nimi
przy użyciu biblioteki ARToolkit. Niestety pierwsze próby tego typu
podejścia nie dawały oczekiwanych rezultatów, więc pozostawiam ten
temat jako potencjalny punkt rozwoju pracy w przyszłości.
Program do generowania danych uczących sieci
Sposób w jaki chciałem uzyskać kąty odchylenia gałek ocznych,
opisany w podrozdziale „Orientacja gałek ocznych” wymaga zebrania
zestawu uczącego i testowego. Do tego celu przygotowałem pierwszy
program. Tak jak pisałem w rozdziale 4., wszystkie programy bazujące
na moim systemie przetwarzania obrazu można przedstawić w formie
diagramu filtrów. Rysunek 4. przedstawia diagram dla pierwszego
programu. Diagram uwzględnia tylko jedno oko, aby zachować
czytelność, ponieważ obraz drugiego oka jest przetwarzany analogicznie
i nie ma potrzeby dublowania diagramu. W tabeli 1. przedstawiłem opis
filtrów występujących na diagramie.
Program po uruchomieniu generuje zestaw losowych punktów,
których współrzędne mieszczą się w zakresie rozdzielczości monitora, a
następnie zaczyna wyświetlać je na pełnoekranowym widżecie.
Użytkownik powinien zachowywać się naturalnie i śledzić oczami
pojawiający się punkt. W tym czasie czujnik ruchu rejestruje obraz
RGB i mapę głębi, a program oblicza o jaki kąt użytkownik powinien
odchylić każde z oczu, aby punkt skupienia wzroku trafiał w cel na
ekranie. Wszystkie dane liczbowe zapisywane są do arkusza CSV (jeden
wiersz na klatkę), a wszystkie obrazy oczu są wycinane i zapisywane do
plików PNG o nazwie zawierającej numer klatki. Tak zebrane dane
można poddać analizie.
20
TABELA 1
Nazwa filtra Opis działania
RGBInput Pobiera obraz z kamery RGB zamontowanej w
czujniku ruchu.
DepthInput Pobiera mapę głębi z czujnika ruchu.
FaceDetection Wykrywa twarz, oczy, nos i usta na obrazie.
Crop Kadruje podany obraz do podanego prostokąta.
CenterOfRect Filtr bazujący na klasie CustomFilter, oblicza
środek prostokąta.
Position3D Na podstawie współrzędnych na obrazie 2D i
mapie głębi oblicza położenie punktu w przestrzeni
trójwymiarowej.
Transform3D Wykonuje przekształcenie podanych na wejście
punktów za pomocą wcześniej ustalonej macierzy
transformacji. W tym programie użyte w celu
zmiany układu współrzędnych ze związanego z
kamerą na związany z monitorem.
StreamData Przekazuje wcześniej wygenerowane dane. W tym
programie są to losowe punkty na ekranie, które
wzrokiem śledzi użytkownik.
FindAngles Znajduje pożądane kąty odchylenia gałki ocznej
tak, aby rzut wektora od gałki ocznej odchylony o
te kąty trafiał w punkt przekazany na drugie
wejście filtra.
CSVOutput Zapisuje dane do pliku w formacie CSV.
SaveToFile Zapisuje obrazy do plików w formacie PNG.
PointOnScreen Wyświetla punkt na ekranie o środku podanym na
wejście. Podczas zbierania danych użytkownik
powinien śledzić wzrokiem ten punkt.
21
RYSUNEK 4
RGBInput
FaceDetection
CenterOfRect
Position3D
DepthInput
StreamData FindAngles
CSVOutput
Crop
SaveToFile
PointOnScreen
Transform3D
obraz RGB mapa głębi
prostokąt oka
punkt na ekranie
22
Opisany program został zawarty na dołączonej płycie DVD, w
katalogu o nazwie Metoda 1. Instrukcja kompilacji również znalazła się
na płycie, w katalogu Media. Po uruchomieniu programu użytkownik
zobaczy poniższy ekran.
RYSUNEK 5
Czarny punkt wskazuje miejsce, w którym należy skupić wzrok.
Punkt zmienia położenie co sekundę, a użytkownik powinien go śledzić
wzorkiem. Po każdej klatce w katalogu Output/eyes/ zapisywane są
obrazy oczu w rozmiarach w jakich zostały wykryte, a w katalogu
Output/eyes50/ obrazy o rozmiarze 50 x 50 pikseli o środku w tym
samym punkcie co oryginalne. Ponadto zapisywany jest arkusz
kalkulacyjny w pliku Output/output.csv, w którym pierwsze dwie
kolumny odnoszą się do lewego oka, a drugie dwie do prawego oka.
Pierwsza kolumna dla oka oznacza oczekiwany kąt odchylenia gałki
ocznej w poziomie, a druga w pionie, obie wartości podane są w
radianach. Ostatnie dwie kolumny arkusza to położenie punktu na
wyświetlaczu, ponieważ punkty generowane są losowo. Tak pozyskane
dane można wykorzystać do uczenia sieci neuronowej za pomocą
programu NetsTest, który znajduje się na płycie w katalogu Uczenie
sieci. Proces można obejrzeć na nagraniach:
23
metoda_1_zbieranie_probek.mp4 oraz
metoda_1_zbieranie_probek_ekran.wmv.
Program do wyznaczania punktu skupienia wzroku
Program do wyliczania punktu, na który spogląda użytkownik jest
bardzo podobny do programu do zbierania danych uczących. Dane
poddawane są analogicznym przekształceniom, a główna różnica
wynika z faktu konieczności wyliczenia innej niewiadomej – wcześniej
wyliczaliśmy kąty na podstawie danego punktu docelowego, teraz kąty
musimy estymować za pomocą sieci neuronowej, a wyliczać punkt
docelowy. Jeśli punkt wyliczony dla prawego oka jest inny niż ten
wyliczony dla lewego (prawie zawsze tak jest), punkty są uśredniane.
Rysunek 6. przedstawia diagram działania programu. W programie
pojawiły się nowe filtry, opisałem je w tabeli 2.
TABELA 2
Nazwa filtra Opis działania
NeuroNetwork Implementacja tego filtra nie powstała, ponieważ
tymczasowo zrezygnowałem z rozwijania tej metody
ze względu na niezadowalające wyniki uczenia sieci
neuronowej. Koncepcyjnie, filtr ten powinien
obliczać wartości kątów odchylenia gałki ocznej na
podstawie wyciętego obrazka. Wagi neuronów w
sieci byłyby ładowane na początku działania
programu.
Projection Ten filtr wykonuje rzutowanie punktu podanego na
wejście wzdłuż wektora o odchyleniu podanym za
pomocą dwóch kątów (drugie wejście) względem osi
OZ, na płaszczyznę monitora, czyli płaszczyznę XY.
24
RYSUNEK 6
Wnioski z metody pierwszej
RGBInput DepthInput
FaceDetection
CenterOfRect
Crop
Position3D
NeuroNetwork
Transform3D
PointOnScreen
Projection
obraz mapa głębi
prostokąt oka
kąty odchylenia
punkt 2D
25
Najsłabszym punktem metody pierwszej okazała się sieć
neuronowa. Prawdopodobnie zbiór uczący sieci neuronowej był zbyt
mało różnorodny, ponieważ dla każdego punktu na ekranie
generowano aż 30 obrazów, co z 3000 próbek dawało 100 rzeczywiście
różnorodnych punktów. Sieć uzyskała pewną zdolność rozpoznawania
wartości odchylenia kąta dla punktów we zbioru uczącego, ale nie
zyskała cechy uogólniania wzorca przez co wyniki na innym zbiorze
testowym nie były satysfakcjonujące.
Myślę, że dalsza praca nad tą metodą musiałaby uwzględnić
przebudowanie i przetestowanie innych rodzajów sieci neuronowej oraz
próbę selekcji informacji z obrazów w celu zmniejszenia liczby
wymiarów wektora wejściowego.
26
Metoda druga 6.
Po nieudanej próbie wyznaczenia punktu, w którym skupia się
wzrok użytkownika, uprościłem założenia projektu. Druga metoda
zakłada, że użytkownik steruje kursorem za pomocą ruchów całą
głową. Program miał wyznaczać rzut czubka nosa wzdłuż wektora
skierowanego zgodnie z orientacją głowy, na płaszczyznę monitora,
czyli sterowanie kursorem miało odbywać się poprzez wskazywanie
położenia nosem.
Po uruchomieniu programy zakładamy, że głowa użytkownika
znajduje się mniej więcej naprzeciwko środka monitora i jest
skierowana w jego kierunku, w tym stanie wektor, po którym będziemy
rzutować ma współrzędne w układzie związanym z monitorem,
gdzie oś Z wskazuje głębokość i rośnie wraz z oddalaniem od monitora.
Ta metoda bazuje na obliczaniu transformacji, której poddane
zostały punkty charakterystyczne wykryte w obszarze głowy w okresie
czasu między poszczególnymi klatkami obrazu. Algorytm składa się z
pięciu ogólnych kroków, które opisałem w kolejnych podrozdziałach.
1. Wykrycie punktów charakterystycznych w obszarze twarzy.
2. Połączenie punktów w pary, z punktami odpowiadającymi z
poprzedniej klatki.
3. Znalezienie przekształcenia między punktami z kolejnych
klatek.
4. Nałożenie przekształcenia na wektor wzdłuż którego
rzutujemy.
5. Rzutowanie czubka nosa wzdłuż wektora na monitor.
Wykrycie punktów charakterystycznych
Tak jak w poprzednim przypadku, w celu skrócenia czasu
przetwarzania klatki, pierwszą operacją przeprowadzaną na obrazie
jest wykrycie twarzy. Tutaj również posłużyłem się znaną metodą
klasyfikatora cech Haaro-podobnych. Metoda ta działa bardzo szybko,
ponieważ nie zależy nam na znalezieniu dokładnego położenia i
27
rozmiaru twarzy, a tylko przybliżony obszar zainteresowania, co można
uzyskać dostosowując parametry wyszukiwania, a ponadto biblioteka
OpenCV dostarcza implementację klasyfikatora dla kart graficznych
wspierających technologię CUDA.
Po znalezieniu twarzy na obrazie, na podstawie prostokąta
tworzona jest maska bitowa, która później podawana jest jako
parametr do operacji znajdowania punktów charakterystycznych.
Aktualnie jednym z najlepszych algorytmów znajdowania cech
charakterystycznych w obrazie jest SURF (ang. Speeded Up Robust
Features) (6). Algorytm ten po raz pierwszy został zaprezentowany w
2006 roku przez Herberta Baya z Eidgenössische Technische
Hochschule Zürich. Opiera się on o sumy dwuwymiarowych falek
Haara, co pozwala na wydajne użycie sumacyjnych postaci obrazu
(ang. integral image, summed area table) (7). Ja użyłem implementacji z
biblioteki OpenCV w postaci klasy SurfFeatureDetector.
Ze względu na system przetwarzania, który przesyła między
filtrami macierze, cechy wykrytych punktów takie jak o położenie,
rozmiar czy orientacja muszą być zapisane do postaci wektora liczb
zmiennoprzecinkowych. Po zapisaniu wszystkich punktów w postaci
macierzy, są one przekazywane do bufora zapamiętującego dane na
jedną klatkę oraz do filtra znajdującego przekształcenie między
punktami z poszczególnych klatek.
Połączenie punktów
Odpowiadające sobie punkty charakterystyczne obrazu z
aktualnej i poprzedniej klatki muszą zostać połączone w pary. W tym
celu wykorzystuję metodę najbliższych sąsiadów, która została
zaimplementowana w OpenCV przy użyciu biblioteki FLANN (ang. Fast
Library for Nearest Neighbors).
Wyznaczanie przekształcenia (8)
Wyznaczenie przekształcenia między dwoma zestawami punktów
w przestrzeni trójwymiarowej należy do skomplikowanych problemów
28
optymalizacyjnych, szczególnie w przypadku gdy błędy pomiaru są
znaczne lub zbiór danych zawiera punkty fałszywe.
Pierwszym etapem wyznaczania przekształcenia między dwoma
zbiorami danych A i B zawierającymi po N odpowiadających sobie
punktów P jest obliczenie centroidów:
[ ]
∑
∑
Obliczanie centroidów ma na celu wyłuskanie z danych samego
przesunięcia, pozostawiając rotację bez zmian. Przesuwamy punkty z
obu zbiorów tak, aby centroidy znalazły się w środku układu
współrzędnych po czym możemy przystąpić do wyznaczania macierzy
rotacji. Jest wiele sposobów na znalezienie optymalnej macierzy rotacji
tak, aby odległości odpowiadających sobie punktów były jak
najmniejsze. Jednym z nich jest skorzystanie z metody rozkładu
macierzy według wartości osobliwych (SVD, ang. Singular Value
Decomposition). Metoda ta jest szeroko dostępna w różnych
bibliotekach programistycznych, również w OpenCV, którego używamy.
Każdą macierz rzeczywistą można przedstawić w postaci
rozkładu według wartości osobliwych.
Twierdzenie:
Dla każdej macierzy rzędu o wymiarach istnieją takie macierze
ortogonalne i ( i oraz taka macierz pseudodiagonalna , że:
gdzie macierz ma postać:
[
]
oznacza macierz diagonalną r-tego stopnia, gdzie:
oraz:
29
Przy czym liczby to niezerowe wartości osobliwe macierzy .
W celu znalezienia macierzy rotacji tworzymy akumulator, macierz
rozmiaru , sumując iloczyny wycentrowanych, odpowiadających
sobie punktów ze zbiorów i . Następnie dokonujemy rozkładu i
obliczamy macierz obrotu według wzorów:
∑
[ ]
Musimy jeszcze obsłużyć jedną wyjątkową sytuację. Gdy
wyznacznik macierzy jest mniejszy od 0, należy zmienić znak liczb w
trzeciej kolumnie macierzy.
Aby znaleźć wynikową macierz transformacji należy złożyć
wszystkie przekształcenia.
[
]
[
]
[
]
Nałożenie przekształcenia i rzutowanie punktu
Do przekształcania wektora orientacji głowy użyjemy filtra
Multiply, który na swoje wejścia przyjmuje dwie macierze, a na
wyjściu daje wynik mnożenia tych macierzy. Należy jeszcze wziąć pod
uwagę różnice w położeniu kamery względem monitora, co uzyskamy
za pomocą filtra Transform3D z odpowiednio ustawioną macierzą
30
transformacji. Transformacji tej należy poddać punkt czubka nosa jak i
wyznaczony wektor orientacji głowy.
Diagram programu
Poniżej, na rysunku 7. przedstawiłem diagram programu dla
systemu przetwarzania obrazu. Nowym elementem na tym diagramie
jest filtr cykliczny zrealizowany za pomocą dwóch filtrów: BufferInput i
BufferOutput. Takie rozwiązanie wymuszone jest przez założenie
projektowe grafu przetwarzania, że dla jednej klatki każdy filtr może
zostać wywołany tylko raz.
TABELA 3
Nazwa filtra Opis działania
FindFeatures Ten filtr znajduje punkty charakterystyczne na
obrazie za pomocą algorytmu SURF. Na wyjścia
wystawia macierz punktów 2D oraz macierz
odpowiadających im punktów
charakterystycznych.
Buffer Przechowuje dane przez jedną klatkę po czym
wystawia je na wyjście.
BufferOutput
BufferInput
Te dwa filtry współpracują ze sobą, aby możliwe
było stworzenie zależności cyklicznych. Na swoje
wyjścia BufferOutput wystawia macierze, które
podano na wejścia BufferInput.
Multiply Na wyjściu wynik mnożenia dwóch macierzy z
wejść.
VectorProjection Rzutowanie punktu wzdłuż wektora na
płaszczyznę monitora XY.
31
RYSUNEK 7
RGBInput
DepthInput
FaceDetection
FindFeatures
Buffer
Position3D
FindTransform
Multiply
BufferInput
BufferOutput
CenterOfRect
Position3D
Transform3D VectorProjection
PointOnScreen
obraz
prostokąt nosa
prostokąt twarzy
punkty 2D
punkty charakterystyczne
macierz transformacji
32
Opisany program znajduje się na dołączonej płycie w katalogu
Metoda 2. Konfiguracja i uruchomienie przebiega analogicznie do
pierwszego programu opisanego w poprzednim rozdziale. Po
uruchomieniu użytkownik zobaczy ekran podobny do tego poniżej.
RYSUNEK 8
Po prawej stronie okna znajduje się widok z kamery z nałożoną
ramką wykrytej twarzy. Po lewej zaś, widok trójwymiarowy z
półprzezroczystym oraz nieprzezroczystym oznaczeniem osi. Jest to
widok, który wizualnie reprezentuje obliczoną macierz transformacji.
Osie półprzezroczyste to oryginalne osie układu X, Y i Z, natomiast osie
nieprzezroczyste reprezentują początek układu po przekształceniu za
pomocą obliczonej transformacji. Jak widać z działania programu,
transformacja ta zachowuje się dosyć chaotycznie, a przy próbie
szybszego ruchu całkowicie znika z ekranu. Jeśli osie nie są widoczne,
należy użyć klawiszy W, S, A oraz D do przemieszczania kamery oraz
klawiszy strzałek do obracania kamery.
Wnioski z metody drugiej
Metoda druga nie zawiera algorytmów heurystycznych ani uczenia
maszynowego, które mogłoby spowodować niedeterministyczne
działanie rozwiązania. W tym przypadku największym problemem są
duże błędy pomiaru i potencjalnie błędne parowanie punktów
charakterystycznych z kolejnych klatek obrazu, które powodują
chaotyczne przemieszczanie się wyznaczonego punktu na ekranie.
33
Kolejnym źródłem błędów są punkty charakterystyczne, które zmieściły
się w obszarze oznaczonym jako twarz, ale znajdują się np. na tle.
Rozwiązaniem tego typu problemów mogą być statystyczne metody
klasyfikacji punktów jako obserwacje odstające, np. RANSAC (ang.
RANdom SAmple Consensus). Ponadto, trudno jest poprawnie obsłużyć
sytuację, w której twarz użytkownika wychodzi poza obszar
widoczności kamery, a następnie znowu się pojawia. Resetowanie
wektora orientacji głowy w tej sytuacji może spowodować
rozkalibrowanie i stale wskazywać przesunięty punkt na ekranie.
Najlepszym sposobem obsługi takiego zdarzenia wydaje się być
ponowne kalibrowanie.
34
Metoda trzecia 7.
Trzeci projekt interfejsu komputera, który przygotowałem
wyróżnia się z dwóch pozostałych, ponieważ do obsługi komputera
wykorzystuje dłonie, a poza tym, jest próbą wykorzystania pakietu
narzędzi programistycznych dostarczonych przez producenta razem z
czujnikiem ruchu.
Opis
Co prawda, narzędzia dla programistów dostarczone z kamerą
mają bardzo wygodny interfejs programistyczny, ale w celu zachowania
spójności pracy, ten projekt również zrobiłem na bazie własnego
systemu przetwarzania obrazu. Wymagało to napisania nowego filtra,
który opakowuje funkcje bibliotek producenta. Filtr HandDetector
posiada jedno wyjście i jest to macierz punktów w przestrzeni
trójwymiarowej określających pozycję dłoni na scenie. Kolejność
punktów jest zachowywana między klatkami.
Implementacja filtru HandDetector polega na zdefiniowaniu i
zarejestrowaniu funkcji obsługi odpowiednich zdarzeń w API kamery.
Śledzenie dłoni rozpoczyna się po wykryciu gestu machania, ukrycie
dłoni na chwilę spowoduje przerwanie śledzenia. I tak, filtr
implementuje procedury obsługi następujących zdarzeń:
1. Wykrycie gestu machania – powoduje rozpoczęcie śledzenia.
2. Wykrycie nowej dłoni – powoduje dodanie deskryptora do
tablicy dłoni.
3. Aktualizacja położenia dłoni – powoduje zaktualizowanie
deskryptora w tablicy.
4. Zniknięcie dłoni – powoduje usunięcie deskryptora z tablicy.
Oczywiście, funkcja Process filtra bada stan tablicy deskryptorów
i ustala na wyjściu położenie śledzonych dłoni w przestrzeni
trójwymiarowej.
Na podstawie tego filtra zrobiłem program demonstracyjny
pozwalający na odbijanie piłki rękami, znajduje się na płycie z
35
materiałami. Najpierw należy pomachać do urządzenia, aby program
zaczął śledzić dłoń (za pierwszym razem może się nie udać). Gdy dłoń
zostanie wykryta, z góry spada piłka, którą można odbijać. Oczywiście,
jeśli w tym czasie pomachamy drugą dłonią, ona również zostanie
wykryta.
Diagram tego projektu jest bardzo prosty i nie ma potrzeby
przedstawiania go tutaj. Natomiast jako ciekawostkę, pozwolę sobie
wspomnieć, że prosta gra została zaimplementowana w postaci filtra
przetwarzania obrazu. Filtr Game przyjmuje na wejściu obraz RGB,
którego używa jako tło oraz macierz z punktami na obrazie, w których
znajdują się wykryte dłonie. Sam filtr Game nie tworzy żadnego widżetu,
do wyświetlania używa innego, standardowego filtra – ImageOutput.
Poniżej przedstawiam zrzut ekranu z aplikacji demonstrującej
metodę trzecią. Program ten znajduje się na płycie, w katalogu Metoda
3. Sposób uruchomienia jest analogiczny do dwóch poprzednich
programów. W katalogu Media znajduje się nagranie wideo
prezentujące działanie programu.
RYSUNEK 9
36
Wnioski z metody trzeciej
W tym wypadku nie było problemów z dokładnością działania, do
tego zastosowania oferowana dokładność jest wystarczająca, choć
czasami widoczne są „przeskoki” punktów, w których wykryto dłonie.
Do tej metody zastosowałem zestaw narzędzi dostarczonych przez
producenta kamery, nie ma zastrzeżeń co do ich działania, ale nie
dostarczają one wystarczającej dokładności pomiarów do zrealizowania
dwóch poprzednich metod, którymi się zajmowałem.
37
Plany rozwoju 8.
W przyszłości chciałbym rozwinąć system przetwarzania do
postaci narzędzia dostępnego dla osób nie potrafiących programować,
ponieważ w tym momencie system jest biblioteką statyczną, a nie
znalazłem narzędzia, które pozwoliłoby mi na przetestowanie kilku
metod bez potrzeby pisania kodu. W tym celu chciałbym stworzyć
graficzny edytor diagramów przepływu danych i możliwość zapisywania
ich do plików. Ponadto, system wymaga stworzenia wielu filtrów, które
pomimo tego, że są podstawowe i często używane, nie zostały
zaimplementowane, ponieważ nie były potrzebne do moich projektów.
Kluczowym zagadnieniem jest zapewnienie kompatybilności z innymi
kamerami dostępnymi na rynku, a przede wszystkim ze standardowym
interfejsem obsługi kamery internetowej. Bardzo pożądana jest również
opcja nagrywania i odtwarzania plików audio-video na przykład do
testowania rozwiązań.
Najsłabszym ogniwem pierwszego rozwiązania jest sieć
neuronowa, dlatego w przyszłości chciałbym ją lepiej zaprojektować
oraz zdobyć więcej próbek, co pozwoliłoby na nauczenie sieci
wyznaczania kierunku wzroku użytkownika.
Co do drugiego rozwiązania, problem stanowią fałszywe punkty
charakterystyczne oraz zbyt mała dokładność wyznaczania
przekształceń. Dlatego też chciałbym zaimplementować jeden z
algorytmów statystycznych służący do eliminowania obserwacji
odstających od modelu, np. RANSAC. Myślę, że ten krok znacząco
poprawi dokładność obliczeń.
Problemem, który dotyka obu powyższych rozwiązań jest trudność
w ręcznym określeniu dokładnych relacji przestrzennych kamera-
monitor. Chciałbym opracować możliwie łatwą i dokładną metodę na
wyznaczanie tych relacji (macierzy transformacji z jednego układu
współrzędnych do drugiego). Możliwe, że udałoby się to osiągnąć dzięki
samemu czujnikowi głębi, który mógłby w jakiś sposób identyfikować
38
monitor, a następnie analizować zmiany zachodzące na scenie podczas
przenoszenia urządzenia w inne miejsce.
39
Podsumowanie 9.
Nie udało mi się zrealizować pierwotnie postawionego celu, ale
opracowałem trzy metody, których dokładność nie jest zadowalająca,
ale po poznaniu ich mocnych i słabych stron stwierdzam, że są one
dobrą bazą do rozwoju i dalszych badań w tym temacie, na przykład w
ramach pracowni dyplomowej magisterskiej.
Ponadto zapoznałem się z możliwościami urządzenia, którym
dysponowałem podczas tworzenia pracy oraz z oprogramowaniem
dostarczonym z czujnikiem ruchu i na tej podstawie przygotowałem
program demonstracyjny korzystający z tego oprogramowania, będący
implementacją pewnego interfejsu komputera dla prostej gry
zręcznościowej bazującą na wykrywaniu dłoni.
Bardzo pomocnym i wygodnym narzędziem okazał się stworzony
przeze mnie w ramach tej pracy system przetwarzania obrazu, który
również warto rozwijać podczas dalszych badań tematu.
40
Bibliografia 10.
1. Gartner, Inc. Gartner, Inc. Gartner. [Online] 23 6 2008.
http://www.gartner.com/newsroom/id/703807.
2. Tobii Technology. An introduction to eye tracking and Tobii Eye
Trackers. 27 1 2010.
3. ASUSTeK Computer Inc. ASUS Xtion Pro Live. [Online]
http://pl.asus.com/Multimedia/Motion_Sensor/Xtion_PRO_LIVE/#sp
ecifications.
4. Szeliski Richard. Computer Vision: Algorithms and
Applications. brak miejsca : Springer, 2010.
5. Tadeusiewicz Ryszard. Sieci neuronowe. Warszawa :
Akademicka Oficyna Wydaw. RM, 1993.
6. Khvedchenia Ievgen. Comparison of the OpenCV's feature
detection algorithms. Computer Vision Talks. [Online] 11 1 2011.
http://computer-vision-talks.com/2011/01/comparison-of-the-
opencvs-feature-detection-algorithms-2/.
7. SURF: Speeded Up Robust Features. Bay Herbert, Tuytelaars
Tinne i Van Gool Luc. Graz, Austria : Springer Berlin Heidelberg,
2006.
8. Ho Nghia. Finding optimal rotation and translation between
corresponding 3D points. Nghia Ho. [Online] 09 2011.
http://nghiaho.com/?page_id=671.
41
Dodatek A. Zawartość płyty DVD .
Poniżej przedstawiam hierarchię katalogów i plików utworzoną na
dołączonej płycie DVD.
Media
o konfiguracja_projektow.wmv – wideo prezentujące
ustawienia projektu.
o metoda_1_uczenie_sieci.jpg – zrzut ekranu z
programu do uczenia sieci na podstawie próbek.
o metoda_1_zbieranie_probek.mp4 – nagranie procesu
tworzenia próbek do metody pierwszej.
o metoda_1_zbieranie_probek_ekran.wmv –
przechwycenie obrazu monitora z procesu tworzenia
próbek do metody pierwszej.
o metoda_2.wmv – prezentacja programu opartego na
metodzie drugiej.
o metoda_3.wmv – prezentacja programu opartego na
metodzie trzeciej.
Metoda 1
o Projekt MS Visual Studio 2010 z programem 1
Metoda 2
o Projekt MS Visual Studio 2010 z programem 2
Metoda 3
o Projekt MS Visual Studio 2010 z programem 3
Potrzebne biblioteki
o Accord.NET Framework-2.7.1.exe – biblioteka do
przetwarzania obrazu, obliczeń statystycznych,
uczenia maszynowego, wykorzystana w programie
NetsTest do uczenia sieci neuronowej.
o cudatoolkit_4.2.9_win_32.msi – narzędzia firmy
NVidia do tworzenia programów używających
technologii CUDA, instalacja opcjonalna.
42
o OpenCV-2.4.3.exe – biblioteka do przetwarzania
obrazu, baza dla mojego systemu przetwarzania.
o qt-win-opensource-4.8.4-vs2010.exe – platforma
programistyczna dla programów o interfejsie
graficznym, bardzo bogaty zestaw bibliotek.
System przetwarzania
o Projekt MS Visual Studio 2010 z systemem
przetwarzania, tworzy bibliotekę statyczną, którą
podłączamy w poprzednich programach.
Uczenie sieci
o Projekt MS Visual Studio 2010 w języku C# z
programem do uczenia sieci neuronowej na podstawie
próbek i danych z programu „Metoda 1”.
Praca dyplomowa.pdf – tekst pracy dyplomowej.