Praca dyplomowa v2 - repo.pw.edu.pl
Transcript of Praca dyplomowa v2 - repo.pw.edu.pl
Rok akademicki 2013/2014 Politechnika Warszawska
Wydział Elektroniki i Technik Informacyjnych Instytut Informatyki
PRACA DYPLOMOWA INŻYNIERSKA
Jakub Dawid Barejka
Rozpoznawanie obiektów 3D
Opiekun pracy: dr inż. Piotr Garbat
Ocena: .....................................................
................................................................
Podpis Przewodniczącego Komisji Egzaminu Dyplomowego
Kierunek: Informatyka
Specjalność: Inżynieria Systemów Informatycznych
Data urodzenia: 1991.09.24
Data rozpoczęcia studiów: 2010.10.01
Życiorys
Urodziłem się 24 września 1991 roku w Kwidzynie. W 2007 roku przeprowadziłem się
do Gdyni, gdzie dostałem się do III Liceum Ogólnokształcącego
im. Marynarki Wojennej RP – klasa o profilu matematyczno – fizyczno -
informatycznym. W 2010 roku zdałem egzamin maturalny, a następnie rozpocząłem
studia na Wydziale Elektroniki i Technik Informacyjnych Politechniki Warszawskiej.
Kształcę się na specjalności Inżynieria Systemów Informatycznych.
..............................................
Podpis studenta EGZAMIN DYPLOMOWY
Złożył egzamin dyplomowy w dniu ........................................................................ 20__ r
z wynikiem .........................................................................................................................
Ogólny wynik studiów: ......................................................................................................
Dodatkowe wnioski i uwagi Komisji: ...............................................................................
............................................................................................................................................
............................................................................................................................................
STRESZCZENIE
W pracy dokonano analizy problemu segmentacji chmur punktów – w pełni
automatycznej detekcji płaszczyzn. Rozpoznawanie przeprowadzono w oparciu o dane,
pochodzące z kamer strukturalnych, w szczególności z czujnika Kinect. Dokonano przy
tym przeglądu i oceny wybranych algorytmów pod kątem otrzymywanych wyników
oraz szybkości działania. Dużą uwagę zwrócono na algorytm RANSAC, który
umożliwia iteracyjną detekcję płaszczyzn w zbiorze cechującym się znacznym
poziomem szumu pomiarowego i ilością punktów odstających. W celu optymalizacji
procesu detekcji zaproponowano kilka metod poprawy, w tym podział chmury
na podzbiory reprezentujące połączone ze sobą elementy, a także wykorzystanie
normalnych do powierzchni, liczonych dla danego podzbioru punktów.
Słowa kluczowe: chmura punktów, Kinect, segmentacja, RANSAC, wykrywanie
obiektów.
3D Object Recognition
SUMMARY
This thesis describes matter of point clouds segmentation – fully automatic processing
of detecting planes. The paper presents results on object recognition which is conducted
by the Kinect 3D camera. Classification of object detection algorithms is shown.
Proposed algorithms are based on RANSAC estimator, which is an iterative method
to estimate parameters of a mathematical model and was designed to cope with a large
proportion of outliers in the input data. Some modifications for this algorithm,
like using Euclidean clusters extraction and estimating surface normals, are introduced.
These methods show significant improvements in accuracy and speed over original
RANSAC estimator.
Keywords: point cloud, Kinect, segmentation, RANSAC, object detection.
Spis treści
1 Wprowadzenie .................................................................................................................. 6
1.1 Cel pracy oraz jej układ ............................................................................................... 8
2 Pozyskiwanie danych ...................................................................................................... 9
2.1 Format PCD ................................................................................................................ 9
2.2 Pozyskanie chmury punktów ...................................................................................... 11
3 Wykrywanie obiektów ................................................................................................. 14
3.1 Etap przetwarzania wstępnego .................................................................................. 14
3.2 Strategie rozpoznawania obiektów ............................................................................ 15
3.2.1 Strategie optymalne ............................................................................................... 15
3.2.2 Strategie heurystyczne ........................................................................................... 16
3.3 Estymator RANSAC – wykrywanie płaszczyzn .......................................................... 18
3.3.1 RANSAC ............................................................................................................... 18
3.3.2 PROSAC ............................................................................................................... 21
3.3.3 MSAC.................................................................................................................... 22
4 Implementacja ............................................................................................................... 24
4.1 Narzędzia ................................................................................................................... 24
4.2 Program ..................................................................................................................... 25
5 Testy ................................................................................................................................. 28
5.1 Weryfikacja słuszności próbkowania chmury ............................................................ 28
5.2 Porównanie estymatorów .......................................................................................... 32
5.2.1 Jedno pudełko ........................................................................................................ 32
5.2.2 Dwa pudełka .......................................................................................................... 35
5.2.3 Trzy pudełka .......................................................................................................... 36
5.2.4 Większa liczba pudełek ......................................................................................... 38
5.3 Problem drugiego planu ............................................................................................ 42
5.4 Wnioski ...................................................................................................................... 45
6 Próba poprawy wyników ............................................................................................ 46
6.1 Szukanie płaszczyzn prostopadłych ........................................................................... 46
6.2 Podział chmury na podzbiory .................................................................................... 47
6.2.1 Drzewo kd ............................................................................................................. 48
6.3 „Lokalne” normalne .................................................................................................. 49
7 Porównanie zmodyfikowanych metod ..................................................................... 51
7.1 Większa liczba pudełek .............................................................................................. 51
7.2 Problem drugiego planu ............................................................................................ 57
8 Podsumowanie ............................................................................................................... 65
8.1 Wnioski ...................................................................................................................... 65
8.2 Możliwości rozwoju pracy ......................................................................................... 66
Bibliografia ............................................................................................................................. 68
6
1 Wprowadzenie
Rekonstrukcja trójwymiarowych obiektów odgrywa w ostatnich latach coraz większą
rolę. Rozwój technologii, a także wprowadzenie na rynek zupełnie nowych kategorii
urządzeń, takich jak inteligentne telefony czy tablety, otworzył nowe horyzonty badań,
zawłaszcza w temacie modelowania obiektów na podstawie nieuporządkowanej chmury
punktów.
Co więcej, ostatnio modnym tematem stało się hasło rzeczywistość rozszerzona, która
to jest systemem łączącym świat rzeczywisty ze światem generowanym komputerowo.
Zazwyczaj wykorzystywany jest obraz z kamery, na który nakłada się generowaną
w czasie rzeczywistym grafikę 3D. Przykładowo, użytkownik może za pomocą
półprzeźroczystych okularów obserwować życie toczące się na ulicach miasta,
jak również elementy wytworzone przez komputer nałożone na rzeczywisty świat.
Wykrywaniem obiektów oraz wykorzystaniem rzeczywistości rozszerzonej
zainteresowane są już w tej chwili wielkie firmy: zarówno technologiczne (Google
ze swoimi szumnie zapowiadanymi okularami), jak i branżowe (choćby IKEA
z ostatnio wydaną aplikacją prezentującą katalog produktów z wykorzystaniem właśnie
rzeczywistości rozszerzonej). Nietrudno jednak wyobrazić sobie kolejne obszary
zastosowań tego zagadnienia. Przykładowo, możliwość wykrycia wszystkich ścian
i podłóg w lokalu, a następnie zaprezentowania klientowi mieszkania po potencjalnym
remoncie, byłaby dużą wartością dodaną dla firm wykończeniowych. Należy więc
spodziewać się utrzymania tego trendu, a także jeszcze większego znaczenia tematyki
wykrywania obiektów w życiu codziennym.
Co się zaś tyczy samej detekcji obiektów, to istotnym jej etapem jest segmentacja,
mająca na celu wyodrębnienie fragmentów o tym samym znaczeniu semantycznym.
Wiele prac poruszało już tematykę segmentacji, jednak zwykle odnosiła się ona do
7
obrazów 2D. Natomiast otaczający nas świat nie jest dwuwymiarowy, więc
przetwarzanie dwuwymiarowych obrazów zawsze będzie w pewnych okolicznościach
prowadziło do niepoprawnych wniosków, bądź będzie co najmniej niewystarczające.
Oto dowód: jedna z najczęściej używanych metod 2D, mianowicie algorytm SIFT
(Scale Invariant Feature Transform) znajduje stabilne cechy lokalne (punkty
charakterystyczne) poprzez stworzenie piramidy obrazów o coraz mniejszej
rozdzielczości. Obrazy tworzące piramidę są obrazami różnicowymi, tzn. uzyskiwane
są w wyniku odjęcia dwóch obrazów powstałych przez zastosowanie na obrazie
początkowym filtrów Gaussa o różnych parametrach. Cechami lokalnymi są
odnalezione w obrazach piramidy ekstrema, spełniające następujące warunki:
• jasność punktów musi przekraczać zadaną wartość,
• punkty nie mogą leżeć wzdłuż linii prostej.
Dla tak wyznaczonych punktów oblicza się wektor cech, będący rodzajem histogramu
gradientów liczonych w ich otoczeniu. Takie cechy są w dużej mierze niewrażliwe na
natężenie oświetlenia (ze względu na użycie gradientów), obrót (kierunek gradientów
zapisuje się względem kierunku gradientu punktu charakterystycznego) i skalę (dzięki
stosowaniu piramidy DOG – Difference of Gaussian).
Uzyskane w ten sposób wektory cech stanowią pewien opis obrazu. Porównując opisy
dwóch obrazów można znaleźć wspólne cechy (punkty charakterystyczne) obrazu
wzorcowego z obrazem przeszukiwanym (Pawlik, Mikrut, 2006 [1]).
Rys. 1.1 Przedstawienie niepoprawnego wykrycia obiektu. Obraz pochodzi z [2]
8
Jednak jak pokazano na Rys. 1.1, ten mechanizm często bywa zawodny. Wykryte
punkty charakterystyczne z lewego obrazu zostały połączone z punktami
charakterystycznymi obrazu drugiego, choć nie powinny. Lewy obraz to butelka,
podczas gdy prawy obraz to tylko kubek z nadrukiem tejże butelki. Niestety, detektory
dwuwymiarowe nie są w stanie wykryć tej różnicy, co dowodzi słuszności postawionej
tezy. Z tego właśnie powodu niniejsza praca będzie dotyczyła problemu wykrywania
obiektów w przestrzeni trójwymiarowej.
1.1 Cel pracy oraz jej układ
W świecie rzeczywistym znaczna część obiektów jest w istocie pewną kombinacją
wielu płaszczyzn. W związku z tym w niniejszej pracy przeprowadzam analizę
problemu segmentacji chmur punktów – w pełni automatycznej detekcji płaszczyzn.
Dokonuję przy tym przeglądu i oceny wybranych algorytmów pod kątem
otrzymywanych wyników oraz szybkości działania. Prezentuję także pomysły mające
na celu optymalizację działania tych algorytmów. Celem pracy jest zaproponowanie
rozwiązania, które jest w stanie rozpoznawać obiekty (będące kombinacją wielu
płaszczyzn), z różnej odległości, z różnych punktów widzenia oraz o różnym stopniu
skomplikowania, w możliwie najkrótszym czasie.
W dalszej części pracy (rozdział drugi) omawiam sposoby pozyskiwania danych
wejściowych dla problemu rozpoznawania obiektów. W rozdziale trzecim prezentuję
algorytmy wykorzystywane przy wykrywaniu płaszczyzn. Rozdział czwarty
poświęcony został omówieniu implementacji i architektury powstałego programu,
w tym narzędzi użytych w trakcie powstawania pracy. Rozdział piąty to prezentacja
otrzymanych wyników. Z kolei rozdział szósty zawiera pomysły, mające na celu
poprawę rozwiązania. Pomysły te są następnie weryfikowane w rozdziale siódmym.
Ostatni rozdział to końcowe wnioski oraz proponowane kierunki rozwoju.
9
2 Pozyskiwanie danych
W celu przeprowadzenia rozpoznawania obiektów potrzebujemy dostarczyć zbiór
danych, z którym będziemy pracować. W niniejszej pracy przeprowadzam
rozpoznawanie obiektów w oparciu o tzw. chmurę punktów (ang. point cloud).
Chmura punktów to struktura zawierająca zbiór punktów w odniesieniu do danego
układu współrzędnych. W moim przypadku będzie to trójwymiarowy układ
współrzędnych, więc punkty będą musiały mieć określone współrzędne X, Y, Z. Oprócz
tego chmura może zawierać także inne informacje, takie jak:
• ilość punktów,
• szerokość/wysokość chmury,
• barwę punktów,
• położenie względem urządzenia rejestrującego.
2.1 Format PCD
Przechowywane chmury punktów zapisywane są w formacie PCD [3]. Przykładowy
plik wygląda następująco:
# .PCD v.7 - Point Cloud Data file format VERSION .7 FIELDS x y z r g b SIZE 4 4 4 4 TYPE F F F F COUNT 1 1 1 1 WIDTH 213 HEIGHT 1 VIEWPOINT 0 0 0 1 0 0 0 POINTS 213 DATA ascii
10
0.93773 0.33763 0 59 59 59 0.90805 0.35641 0 57 57 57 0.81915 0.32 0 59 59 59 (…) 0.944 0.29474 0 57 57 57 0.98111 0.24247 0 56 56 56 0.93655 0.26143 0 56 56 56 0.74459 0.32192 0 59 59 59 0.69927 0.32278 0 59 59 59 0.8102 0.29315 0 57 57 57
Gdzie poszczególne pola oznaczają:
• VERSION – wersja formatu PCD.
• FIELDS – określa nazwę każdego pola, które może mieć punkt. Przykłady:
o FIELDS x y z # tylko dane o położeniu
o FIELDS x y z r g b # dane o położeniu, a także kolor
• SIZE – specyfikuje rozmiar każdego wymiaru (w bajtach).
• TYPE – określa typ każdego wymiaru. Możliwe wartości:
o I - reprezentuje typy ze znakiem (signed): int8 (char), int16 (short) oraz
int32 (int).
o U - reprezentuje typy bez znaku (unsigned): uint8 (unsigned char),
uint16 (unsigned short), uint32 (unsigned int).
o F – float.
• COUNT – określa ilość elementów w każdym wymiarze (pola reprezentujące
położenie x, y, z będą miały wymiar 1, ale np. histogramy miałyby więcej).
• WIDTH - szerokość chmury określona jako liczba punktów w wierszu.
• HEIGHT – wysokość chmury określona jako liczba punktów w kolumnie.
• VIEWPOINT – określa położenie względem urządzenia rejestrującego.
Zapisana jest jako wektor translacji (tx ty tz) + kwaternion (qw qx qy qz).
Domyślną wartością jest: VIEWPOINT 0 0 0 1 0 0 0.
11
• POINTS – całkowita liczba punktów w chmurze (tak naprawdę nadmiarowe).
• DATA – właściwe dane nt. chmury punktów. Mogą być w ASCII lub zapisane
binarnie.
2.2 Pozyskanie chmury punktów
Chmury punktów mogą być tworzone m.in. z wykorzystaniem:
• kamer strukturalnych (RGB-D),
• stereo kamer,
• skanerów 3D,
• kamer wykorzystujących metodę czasu powrotu wiązki (ToF).
W mojej pracy wykorzystałem czujnik ruchu dla konsoli Xbox 360, mianowicie
urządzenie Kinect, które to jest przykładem prostej kamery
strukturalnej.
Rys. 2.1 Czujnik Kinect. Obraz pochodzi z [4]
Wydanie Kinect’a w 2010 r. zrewolucjonizowało świat widzenia komputerowego
i znacząco przyspieszyło jego rozwój. Oto bowiem wreszcie można było nabyć kamerę
RGB-D za stosunkowo niewielkie pieniądze. Korzystając z Kinect’a mamy możliwość
pozyskiwania informacji o scenie od razu w trzech wymiarach.
Jak to jest zrealizowane? Otóż urządzenie posiada dwie kamery. Pierwsza z kamer to
standardowa kamera wizyjna RGB, o rozdzielczości 640x480, wykorzystywana do
12
przetwarzania obrazu wizyjnego (m.in. rozpoznawanie twarzy) oraz nanoszenia
kolorów i tekstur na obiekty wirtualne. Działa podobnie jak kamera internetowa, a więc
przesyła serie obrazów do komputera z prędkością 30 klatek na sekundę. Z kolei druga
kamera jest częścią podsystemu sensora, zwracającego informację o głębokości.
Podsystem ten działa na zasadzie pomiaru odległości za pomocą światła strukturalnego.
Promiennik podczerwieni wyświetla przed kamerą chmurę punktów, których położenia
rejestrowane są przez kamerę z filtrem podczerwonym. Uzyskana rozdzielczość
informacji o głębi z kamery to 300x200 i dalej jest programowo interpolowana do
rozdzielczości kamery wizyjnej (640x480).
Zakres działania czujnika odległości to w teorii 0,4-6,5 m. Praktyka pokazuje, że jest to
nieco mniej, ale dla naszych zastosowań wciąż wystarczająco dużo. Z kolei
zastosowanie metody światła strukturalnego pozwala na bezbłędne działanie sensora
tylko w pomieszczeniach – odczyt jest wrażliwy na zbytnie nasłonecznienie. To także
należy mieć na uwadze. Generalnie jednak do naszych zastosowań Kinect nadaje się
doskonale.
W Tab. 1 oraz na Rys. 2.2 zaprezentowano budowę i architekturę urządzenia.
Rys. 2.2 Budowa sensora Kinect. Obraz pochodzi z [5]
13
1. Zestaw mikrofonów Zawiera 4 mikrofony, które wykorzystywane są przez funkcje
rozpoznawania mowy. Mikrofony te posiadają funkcję filtruj ącą zakłócenia.
2. Emiter podczerwieni Emituje wiązkę promieni podczerwonych, które odbijając się od powierzchni zniekształcają się i następnie są odczytywane przez
kamerę głębokości.
3. Kamera głębokości Analizuje zniekształconą przez obiekt wiązkę promieni
podczerwonych, tworząc model 3D pomieszczenia i obiektów znajdujących się w nim.
4. Automatyczny kontroler nachylenia
Dostosowuje położenie sensora w sposób automatyczny w zależności od rozmiarów śledzonych obiektów.
5. Kabel połączeniowy Nie jest to zwykły kabel z gniazdem USB. Z tego względu do
połączenia sensora Kinect z komputerem potrzebny jest dodatkowy zasilacz z kablem USB.
6. Kolorowa kamera RGB
Działa podobnie jak kamera internetowa, przesyła serie obrazów do komputera z prędkością 30 klatek na sekundę.
Tab. 1 Opis architektury Kinect. Tabela pochodzi z [5]
Na następnych stronach przechodzę do istoty problemu, a więc samego zadania
wykrywania obiektów i problemów z tym związanych.
14
3 Wykrywanie obiektów
W rozdziale omówiony został cały proces prowadzący do wykrycia obiektu.
Na początku prezentuję sposób na ograniczenie liczebności zbioru danych
wejściowych, następnie przedstawiam strategie rozpoznawania obiektów, a w ostatniej
części omawiam najciekawsze metody, które służą do realizacji tego celu. Jak zostało
wspomniane we wstępie, znaczna część obiektów codziennego użytku to pewne
kombinacje płaszczyzn, dlatego większość treści odnosi się do wykrywania właśnie
nich.
3.1 Etap przetwarzania wstępnego
Zanim przejdę do omówienia samego wykrywania płaszczyzn, należy zmierzyć się
z pierwszym napotkanym problemem. Otóż trójwymiarowa chmura punktów,
którą otrzymujemy z urządzenia Kinect zawiera ponad 300 000 punktów. Nie jest to co
prawda liczba tak duża, jaką można by uzyskać korzystając z nowoczesnych
skanerów 3D, jednak pomimo tego faktu, musimy zacząć od zmniejszenia ilości
punktów. Należy bowiem wziąć pod uwagę następujący aspekt: po całej takiej chmurze
punktów będziemy iterować wiele razy. Co więcej, rzeczywiste chmury punktów
pozyskiwane poprzez urządzenia stereowizyjne są nieco zaszumione i Kinect nie jest tu
wyjątkiem.
W celu rozwiązania tego problemu, tj. zmniejszenia ilości punktów, a więc
przyspieszenia obliczeń, a także poprawy jakości wykrywanych płaszczyzn, zastosuję
próbkowanie uzyskanej chmury punktów przy użyciu siatki wokseli. Innymi słowy,
podzielę chmurę punktów na siatkę złożoną z wokseli. W moim przypadku przyjąłem
rozmiar woksela jako 1 cm x 1 cm x 1 cm. Po owym podziale, wszystkie punkty
znajdujące się w ramach danego pojedynczego woksela zastępuję jednym punktem,
15
będącym środkiem ciężkości dla punktów znajdujących się w tym obszarze (czyli
wyznaczam centroid). Takie podejście jest nieco wolniejsze aniżeli przybliżanie
poprzez zwykły środek woksela, ale za to obarczone mniejszym błędem. Należy przy
tym także zauważyć, że wspomniany przeze mnie rozmiar woksela jest jedynie sugestią,
rozwiązaniem, które w moim przypadku dało najlepsze wyniki. Stosując mniejszy
rozmiar woksela uzyskalibyśmy obiekty lepszej jakości, jednak kosztem zwiększenia
czasu wykonywanych obliczeń.
3.2 Strategie rozpoznawania obiektów
Samo rozpoznawanie obiektu to zadanie polegające na znalezieniu znanego obiektu
w obrazie bądź scenie. To zadanie, choć łatwe dla człowieka, dla systemów wizyjnych
wciąż stanowi wyzwanie, wymaga bowiem dokonania:
• detekcji – wykrycia w obrazie zbioru segmentów,
• klasyfikacji – określenia najlepszego dopasowania zbioru segmentów
ze zbiorem elementów reprezentacji modelu obiektu,
• lokalizacji – określenia położenia wykrytego obiektu w przestrzeni
trójwymiarowej lub na płaszczyźnie. Dla obiektu sztywnego o znanych
rozmiarach występuje od 3 do 6 stopni swobody: dla trójwymiarowego obiektu
wymaga to wyliczenia 6 parametrów (3 translacji i 3 kątów obrotu), natomiast
dla obiektu płaskiego – 3 parametrów (2 translacji i 1 kąta).
Problem wykrywania obiektu 3D ze względu na metody przeszukiwania zbioru modeli
oraz segmentów danych możemy podzielić na strategie optymalne oraz strategie
heurystyczne (Kasprzak, 2009 [6]).
3.2.1 Strategie optymalne
Wyróżnić tu możemy przede wszystkim dwa podejścia:
1. Systematyczne przeszukiwanie – wyznaczenie wszystkich możliwych instancji
dla wszystkich możliwych obiektów modelu i aktualnego zbioru segmentów,
następnie ocena jakości tych instancji i wybór najlepszej z nich.
16
2. Klasyfikator Bayesa dla instancji obiektów
Wyznaczamy rozkłady a priori:
• instancji obiektów p(Mk(Rk, tk)),
• zbioru segmentów pod warunkiem instancji obiektów p(A|Mk(Rk, tk)).
Klasyfikacja Bayesa oznacza poszukiwanie maksimum prawdopodobieństwa
a posteriori instancji obiektu:
(Mk, Rk, tk) = argmax(Mk, Rk, tk) p(Mk(Rk, tk)|A),
gdzie
p(Mk(Rk, tk)|A) ~ p(A|Mk(Rk, tk)) p(Mk(Rk, tk)).
W obu przypadkach strategia optymalna sprawia trudności w realizacji.
W systematycznym przeszukiwaniu problemem jest liczba możliwych instancji, która
w praktyce może być bardzo duża, czego konsekwencją jest duża złożoność
obliczeniowa. Z kolei w klasyfikatorze Bayesa wymiar zmiennej losowej jest bardzo
wysoki, a w związku z tym proces uczenia klasyfikatora jest bardzo skomplikowany.
3.2.2 Strategie heurystyczne
Z powodów wymienionych wyżej, w praktyce częściej stosuje się strategie
heurystyczne, które prowadzą do znalezienia „wystarczająco dobrych” rozwiązań
w akceptowalnym czasie. Wyróżniamy trzy główne sposoby:
1. Strategia „dopasowanie sterowane danymi”
Dla metod tego typu ogólny schemat wygląda następująco:
Dla każdego segmentu znalezionego w zbiorze danych wykonuj:
• wybierz segment (np. długa linia),
• znajdź model o podobnych segmentach,
• zwiększ ocenę modeli, które zawierają wybrany segment.
Przyjmij, że instancje istnieją wówczas, gdy ich modele oceniono powyżej
pewnego progu.
17
2. Strategia „dopasowanie sterowane modelem”
Tę strategię można z kolei sprowadzić do następującego schematu:
Dla każdego modelu wykonuj:
• wybierz model i spróbuj go odnaleźć w scenie (np. szukając części
modelu w obrazie),
• określ wartość podobieństwa modelu i obrazu.
Przyjmij, że instancje istnieją wówczas, gdy ich ocena leży powyżej pewnego
progu.
3. Połączenie obu podanych strategii prowadzi do algorytmu generacji
i weryfikacji hipotez .
Algorytm składa się z dwóch etapów:
Etap „generacji hipotez”
• Określ jedną lub więcej początkowych hipotez, wynikających
z dopasowania niewielu części modelu do niewielu segmentów danych.
• Dla każdej instancji oszacuj wartość wektora parametrów lokalizacji
modelu oraz nieznanej lokalizacji.
Etap „weryfikacji hipotez”
Dla każdej hipotezy:
• Generuj pełną listę dopasowani segmentów
• Jeśli liczba dopasowań jest wystarczająco duża, przyjmij, że w obrazie
istnieje instancja obiektu o tych dopasowaniach. Oszacuj ostateczną
wartość wektora parametrów lokalizacji, a następnie usuń z listy
segmentów segmenty dopasowane teraz.
Powyższe kroki są powtarzane dopóki istnieje wystarczająca liczba segmentów.
Praktyka pokazuje, że algorytm generacji i weryfikacji hipotez sprawdza się najlepiej,
a najpopularniejszą jego realizacją, stosowaną m. in. do odnajdywania macierzy
18
fundamentalnej dla odpowiadających sobie obrazów, jest algorytm RANSAC, któremu
zostały poświęcone następne strony.
3.3 Estymator RANSAC – wykrywanie płaszczyzn
Na następnych stronach prezentuję nieco różniące się między sobą podejścia do
zagadnienia wykrywania płaszczyzn w chmurze punktów. Zadaniem jest nie tylko
wykrycie punktów należących do płaszczyzny, ale również obliczenie modelu
pasującego do tych punktów.
3.3.1 RANSAC
Algorytm RANSAC jest iteracyjną metodą stosowaną w celu estymacji parametrów
poszukiwanego modelu matematycznego obiektu w zbiorze danych zawierającym
znaczną ilość punktów nienależących do modelowanej powierzchni. Fakt ten czyni
estymator RANSAC szczególnie interesującym dla celów przetwarzania chmur
punktów obarczonych szumem i błędnymi pomiarami. Praktyka pokazuje, że RANSAC
jest w stanie poradzić sobie w sytuacji, gdy liczba błędnych punktów przekracza nawet
połowę obserwacji (Zuliani, 2012 [7]). Jak zostało wspomniane wcześniej, działanie
algorytmu obejmuje zasadniczo dwie fazy: inicjalizację i test, obydwie powtarzane
iteracyjnie.
Etap inicjalizacji polega na wyborze w sposób losowy minimalnego zbioru punktów,
który będzie wystarczający do jednoznacznego wyznaczenia parametrów
estymowanego modelu geometrycznego. W przestrzeni trójwymiarowej płaszczyzna
jest definiowana przez cztery parametry, z czego trzy są niezależne. Parametry
hipotetycznego modelu M(ϴ) wyznaczane są zatem w oparciu o trzy elementy losowej
próbki. Następnie pozostałe punkty ze zbioru porównywane są z tak utworzonym
modelem. W tej fazie niezbędne jest przyjęcie pewnego progu δ (ang. threshold)
określającego zakres, w którym uznajemy punkt (p) za pasujący do modelu. Wszystkie
punkty spełniające zadane kryterium (ang. inliers) dodawane są do zbioru CS
(ang. Consensus Set) (1), a cały etap określany jest mianem testu (Poręba, Goulette,
2012 [8]).
19
�� = { � ∈ �: �(�, �(�)) ≤ �} Równanie 1
Różnica między punktem a modelem obliczana jest zgodnie z równaniem (2):
�(�, �(�)) ≝ min ����(�, �∗) = ��(�� − ��∗)!"�#$
Równanie 2
gdzie pi* oznacza rzut ortogonalny punktu p na model M(ϴ).
Dobór odpowiedniej wartości tolerancji odgrywa ważną rolę na poziomie stabilności
algorytmu RANSAC i wpływa na jakość wyodrębnionych płaszczyzn. Jako
że skanowane obiekty nie są utworzone z idealnych powierzchni, a chmura punktów
nie jest pozbawiona szumu pomiarowego, wpasowanie modelu odbywa się
z zachowaniem pewnej elastyczności. Najczęściej tolerancja definiowana jest jako
maksymalna odległość weryfikowanego punktu od teoretycznego modelu.
Proces inicjalizacji i testu powtarzany jest iteracyjnie dla nowo wylosowanej próbki
zbiorów minimalnych, a liczba powtórzeń (Iter) wyznaczana jest zgodnie na podstawie
równania (3). W przypadku gdy liczba punktów w nowym zbiorze CS jest większa od
poprzedniego, zastępuje on dotychczasowy zbiór.
(1 − &) = (1 − '())*+, = -�. = log (1 − &)log (1 − '()
Równanie 3
W pracy zastosowano algorytm RANSAC, którego kolejne etapy możemy przedstawić
jako:
1. Wybierz w sposób losowy trzy punkty spośród punktów zawartych w chmurze.
Jeśli wybrane punkty nie definiują w sposób jednoznaczny płaszczyzny (tzn.
są współliniowe), wybierz inne trzy punkty.
2. Oblicz równanie płaszczyzny pasującej do wybranych punktów, tzn. wyznacz
współczynniki a, b, c, d występujące w równaniu ax + by + cd + d = 0.
20
3. Policz liczbę punktów pasujących do znalezionego modelu. Punkt jest uznawany
za pasujący (ang. inlier), jeśli jego odległość od płaszczyzny nie przekracza
określonej wcześniej wartości tolerancji δ.
4. Powtórz kroki 1.-3. dopóki maksymalna liczba iteracji nie zostanie osiągnięta
i zwróć model z największą liczbą pasujących punktów.
W ten sposób wykryta zostanie pierwsza płaszczyzna. W celu wykrycia kolejnych,
należy usunąć z danych wejściowych punkty, które zostały już dopasowane, a następnie
powtórzyć algorytm. Procedurę tę należy powtarzać dopóki liczba punktów
znajdujących się w chmurze pozwala na sensowne przeszukiwanie (ja przyjąłem tę
minimalną liczbę jako 30% wartości początkowej).
Zaletą algorytmu jest jego prostota oraz stosunkowo duża odporność na błędne punkty
(ang. outliers) – nawet przy dużej ilości szumów, RANSAC jest w stanie poprawnie
znaleźć szukany model. Wadą natomiast jest fakt, że czasami może wymagać zbyt
wielu iteracji. Należy także odnotować, że RANSAC może ponieść porażkę
w przypadku ekstremalnie małej liczby poprawnych punktów.
Rys. 3.1 Prosty przykład działania estymatora RANSAC na przestrzeni 2D. Po lewej stronie znajduje się
zbiór danych wejściowych, natomiast po prawej stronie zaznaczono punkty pasujące do zadanego
modelu oraz dopasowany model. Obraz pochodzi z [9]
Powstało też kilka odmian RANSAC’a, którym poświęcę następne strony.
21
3.3.2 PROSAC
PROSAC (ang. PROgressive SAmple Consensus) to najpopularniejsza modyfikacja
estymatora RANSAC. Struktura algorytmu jest podobna do RANSAC’a: tu również
mamy etap generacji hipotezy oraz jej weryfikację. Jednak wybór punktów trafiających
do etapu testu odbywa się w nieco inny sposób.
W RANSAC’u punkty wybierane były w sposób losowy spośród całego zbioru
punktów. Istniało zatem założenie, że wszystkie punkty są jednakowo dobre.
Tu natomiast zakładamy, że punkty nie są równe i staramy się je w jakiś sposób
wartościować. Typowo funkcją oceniającą jakość punktu może być korelacja
intensywności wokół interesujących punktów bądź też odległość Mahalanobisa liczona
dla ustalonych deskryptorów (Chum, Matas, 2005 [10]).
Następnie, cały zbiór punktów wejściowych jest dzielony na podzbiory, przy czym
podzbiory te sortowane są malejąco względem oszacowanej wcześniej jakości. Jakość
podzbioru równa jest jakości najgorszego punktu wchodzącego w skład tego zbioru.
Należy nadmienić, że moc podzbiorów jest rosnąca, więc w pesymistycznym przypadku
PROSAC może upodobnić się do RANSAC’a.
Punkty trafiające do etapu testu wybierane są w sposób losowy, ale nie z całego zbioru
punktów jak w RANSACu, lecz z najlepszego aktualnie podzbioru. Zakładamy więc,
że uporządkowanie zdefiniowane poprzez funkcję jakości jest nie gorsze niż
uporządkowanie losowe. W związku z tym punkty, które mają większą szansę zostać
uznane za pasujące (ang. inlier), są testowane wcześniej.
W istocie, PROSAC bierze pod uwagę te same próbki co RANSAC, jednak w innej
kolejności. Dzięki temu ma szansę zakończyć swoje działanie wcześniej. Podobnie jak
RANSAC, algorytm kończy swoje działanie kiedy prawdopodobieństwo znalezienia
lepszego rozwiązania spadnie poniżej określonej wartości (typowo 5%).
22
3.3.3 MSAC
Jednym z problemów RANSAC’a jest fakt, że jeśli wartość progowa T (ang. threshold)
zostanie ustalona jako zbyt duża, uzyskane wyniki będą bardzo słabe. Wynika to
z faktu, że RANSAC próbuje minimalizować funkcję kosztu zdefiniowaną jako:
� = � 2(�!)�
Równanie 4
gdzie 2() jest następującą funkcją:
2(!) = 3 0, ! < 6!789��:9�, ! ≥ 6!. Równanie 5
Innymi słowy, punkty uznane za pasujące (ang. inliers) nie kosztują nic, z kolei punkty
uznane za niepasujące (ang. outliers) kosztują zawsze pewną stałą wartość. Przy
wysokiej wartości progowej (T2), w skrajnym przypadku, wszystkie rozwiązania mogą
mieć taką samą funkcję kosztu i w związku z tym wszystkie mogą zostać uznane
za pasujące.
Estymator MSAC z kolei korzysta z innej funkcji kosztu, będącej prostym
M-estymatorem (stąd nazwa M-Estimator SAmple Consensus). Mianowicie, zamiast
funkcji kosztu C korzysta z funkcji
�! = � 2!(�!)�
Równanie 6
gdzie
2!(!) = 3!, ! < 6!6!, ! ≥ 6!. Równanie 7
23
Jak widać, punkty niepasujące ciągle wnoszą do funkcji kosztu pewną stałą wartość,
jednak przy punktach pasujących oceniane jest nie tylko czy pasują, ale również jak
dobrze pasują. Innymi słowy, RANSAC traktował wszystkie punkty uznane za pasujące
jednakowo, tu z kolei możemy je różnicować pod względem jakości, co może być
przydatne w przypadku opisanym wyżej (Tor, Zisserman, 2000, [11]).
Istnieją jeszcze inne modyfikacje RANSAC’a, m. in. MLESAC (Maximum LikeLihood
Estimation SAmple Consensus), RMSAC (Randomized MSAC) i RRANSAC
(Randomized RANSAC), ale ze względu na małą efektywność i kiepską wydajność
czasową (ujawnioną w testach) nie poświęcam im tu miejsca.
W następnym rozdziale prezentuję implementację oraz narzędzia wykorzystane przy
tworzeniu programu powstałego do testowania w/w algorytmów.
24
4 Implementacja
W celu przeprowadzenia testów weryfikujących działanie wyżej opisanych algorytmów,
a także skuteczności metod mających na celu poprawić ich wyniki, została
zaimplementowana aplikacja pełniąca rolę środowiska testowego.
4.1 Narzędzia
W swojej aplikacji wykorzystałem następujące narzędzia i biblioteki:
• PCL (Point Cloud Library) - biblioteka służąca przetwarzaniu trójwymiarowych
chmur punktów. Jest to na tyle duży produkt, że w istocie składa się z kilkunastu
mniejszych bibliotek. Jedna z nich, sample consensus, zawiera implementację
algorytmu RANSAC, a także jego odmian, z czego skorzystałem w trakcie
moich badań.
• Boost - dobrze znana biblioteka C++, dostarczająca implementację wielu
struktur danych i algorytmów. Korzysta z niej PCL (m.in. z shared pointers),
więc jej użycie było konieczne.
• Qt – stworzenie graficznego interfejsu użytkownika.
• Eclipse – zintegrowane środowisko programistyczne (IDE) wraz z wtyczką
CDT, umożliwiającą tworzenie programów w języku C++.
• CMake - narzędzie do automatycznego zarządzania procesem kompilacji
programu, korzystające z prostego języka skryptowego.
• Git - rozproszony system kontroli wersji.
25
4.2 Program
Algorytm w wersji podstawowej można zapisać w następujący sposób:
1. Ustaw parametry wejściowe: estymator, wartość progową oraz maksymalną
liczbę iteracji.
2. Wczytaj wejściową chmurę punktów.
3. Jeśli próbkowanie chmury jest włączone, to zastosuj je na wprowadzonej
chmurze punktów. W przeciwnym razie od razu idź do pkt. 4.
4. Jeśli w chmurze jest wymagana minimalna liczba punktów, to uruchom wybrany
estymator (sparametryzowany podanymi wcześniej wartościami). W przeciwnym
razie idź do pkt. 7.
5. Zapisz odnalezioną płaszczyznę na wyjście.
6. Usuń z chmury punkty wchodzące w skład wykrytej płaszczyzny. Idź do pkt. 4.
7. Wyświetl wykryte płaszczyzny.
8. Zakończ program.
Schemat blokowy przedstawiono na następnej stronie (Rys. 4.1).
W toku prowadzonych testów okazało się jednak (i tak też przewidywano), że taka
podstawowa wersja nie jest wystarczająca. W związku z tym program wzbogacono
o nowe modele obliczeń, omówione szerzej w rozdziale szóstym i siódmym.
Zaprojektowano także graficzny interfejs użytkownika, który umożliwia m.in. wybór
chmury punktów (w formacie PCD), estymatora, modelu obliczeń, a także parametrów,
takich jak maksymalna liczba iteracji czy wartość progowa, decydująca o tym,
czy punkt uznawany jest za pasujący do modelu, czy też nie (Rys. 4.2).
26
Rys. 4.1 Schemat blokowy podstawowej wersji algorytmu
27
Rys. 4.2 Aplikacja pełniąca rolę środowiska testowego
W celu sprawnego prowadzenia testów niezbędne było również zapewnienie
odpowiednich przypadków testowych (w postaci chmur punktów). Z tego powodu
powstała mała aplikacja, wykorzystująca udostępniany przez bibliotekę PCL interfejs
do obsługi czujników takich jak Kinect. Ponieważ operacje wejścia i wyjścia
na chmurach punktów w formacie PCD wykonuje się łatwo (m.in. z tego powodu
zdecydowano się na ten format), w programie zaimplementowano również możliwość
zapisywania chmury punktów, „widzianej” przez Kinect’a w danej chwili.
Następny rozdział to prezentacja i omówienie wyników uzyskanych przy zastosowaniu
podstawowej wersji algorytmów dla różnych estymatorów.
28
5 Testy
W tym rozdziale przedstawiam wyniki uzyskane estymatorami: RANSAC, PROSAC,
MSAC, MLESAC, RRANSAC oraz RMSAC przy zastosowaniu modelu zwykłej
płaszczyzny. Ponieważ skupiamy się na wykrywaniu płaszczyzn, jako obiekty testowe
do wykrycia w scenie wybrano prostopadłościenne pudełka. W najprostszym przypadku
będzie to jedno duże pudełko, natomiast w kolejnych testach liczbę
prostopadłościanów, a więc i płaszczyzn do wykrycia będę zwiększać.
Wszystkie testy przeprowadzam na rzeczywistych chmurach pozyskanych poprzez
urządzenie Kinect. Ponadto, w trakcie eksperymentów ustaliłem, że estymatory dają
najlepsze efekty przy następujących parametrach działania: maksymalna liczba iteracji
równa 1000 oraz próg dopasowania (ang. threshold) równy 0,01.
5.1 Weryfikacja słuszności próbkowania chmury
Na początek poddaję weryfikacji tezę o konieczności ograniczenia liczby punktów
w chmurze pochodzącej z czujnika Kinect.
Już pierwszy test dowodzi słuszności tej tezy. Bez ograniczenia liczby punktów przez
próbkowanie czas obliczeń to, w zależności od estymatora,
5-8 sekund, natomiast stosując próbkowanie jesteśmy w stanie ten czas obniżyć
kilkukrotnie (Rys. 5.1).
29
Rys. 5.1 Porównanie czasów z próbkowaniem włączonym oraz wyłączonym, dla estymatora RANSAC
Zgodnie z teorią próbkowanie poprawia również jakość uzyskanych płaszczyzn (Rys.
5.2, Rys. 5.3).
Rys. 5.2 Chmura punktów zawierająca dwa pudełka
0 5000 10000 15000 20000
1
2
3
1415
1461
1590
4591
11294
16097
czas działania [ms]
ilość
pud
ełek
bez próbkowania
z próbkowaniem
30
Rys. 5.3 Porównanie działania algorytmu przy próbkowaniu wyłączonym (po lewej) oraz włączonym (po
prawej)
W przypadku wyłączonego próbkowania pojawia się niewłaściwe połączenie fragmentu
ściany dużego pudełka ze ścianą mniejszego pudełka. W kolejnych testach ta tendencja
była widoczna jeszcze bardziej (Rys. 5.4, Rys. 5.5, Rys. 5.6).
Rys. 5.4 Chmura punktów zawierająca trzy pudełka
31
Rys. 5.5 Porównanie działania algorytmu przy próbkowaniu wyłączonym (po lewej) oraz włączonym (po
prawej) – trzy pudełka
Rys. 5.6 Porównanie działania algorytmu przy próbkowaniu wyłączonym (po lewej) oraz włączonym (po
prawej) – sześć pudełek
Praktyka pokazuje, że najlepsze efekty uzyskuje się stosując próbkowanie wokselem
równym 1 cm i takiego też będziemy używać w dalszych testach. Samo filtrowanie jest
odtąd stałym elementem każdego testu i zajmuje zawsze w przybliżeniu ok. 1,4
sekundy. Z tego też względu, przy porównywaniu czasów poszczególnych
estymatorów, nie będziemy brali pod uwagę czasu filtrowania (jest bowiem taki sam dla
każdego estymatora).
32
5.2 Porównanie estymatorów
W tym podrozdziale porównuję efekty i czasy działań poszczególnych estymatorów:
RANSAC, PROSAC, MSAC, MLESAC, RMSAC oraz RRANSAC.
5.2.1 Jedno pudełko
Wejściowa scena przedstawia się następująco:
Rys. 5.7 Pierwszy test - jedno pudełko
Analiza czasów działania estymatorów natychmiast pozwala stwierdzić, że estymatory
MLESAC, RRANSAC i RMSAC zupełnie nie sprawdzają się w tych warunkach. Ich
działanie jest stanowczo zbyt długie (Rys. 5.8), a uzyskane płaszczyzny dalekie od
choćby zadowalających (Rys. 5.9). Z tego względu, te trzy estymatory nie będą
w kolejnych testach w ogóle brane pod uwagę.
33
Rys. 5.8 Pierwszy test - porównanie czasów działania estymatorów
Rys. 5.9 Pierwszy test – efekt działania estymatora MLESAC
0 10000 20000 30000 40000 50000
RANSAC
PROSAC
MSAC
MLESAC
RMSAC
RRANSAC
13
7
16
10522
46241
46838
czas działania [ms]
34
Z kolei estymatory RANSAC, PROSAC oraz MSAC radzą sobie bardzo dobrze:
w scenie było umieszczone jedno pudełko i należało wykryć trzy ściany tego pudełka.
Te trzy estymatory wykryły je bezbłędnie (Rys. 5.10). PROSAC okazał się być
najszybszy, z kolei czasy RANSAC’a oraz MSAC’a są zbliżone (z delikatnym
wskazaniem na RANSAC’a - Rys. 5.8).
Rys. 5.10 Pierwszy test - efekt działania estymatora RANSAC. Podobny efekt został uzyskany
estymatorem PROSAC oraz MSAC
35
5.2.2 Dwa pudełka
W teście została wykorzystana ta sama chmura punktów, co w poprzednim rozdziale
(Rys. 5.2). Efekty działania estymatorów prezentują się następująco:
Rys. 5.11 Drugi test - RANSAC
Rys. 5.12 Drugi test – PROSAC (po lewej) i MSAC (po prawej)
Pojawia się nowy problem: estymatory wykryły wszystkie sześć płaszczyzn,
ale PROSAC oraz MSAC niewłaściwie połączyły fragment ściany dużego pudełka
36
ze ścianą małego pudełka. RANSAC poradził sobie najlepiej, natomiast PROSAC
ponownie był najszybszy: jego przewaga czasowa nad RANSAC’iem oraz MSAC’iem
jest jeszcze wyraźniejsza (Rys. 5.13).
Rys. 5.13 Drugi test - porównanie czasów działania estymatorów
5.2.3 Trzy pudełka
Wejściowa scena jest taka sama co w poprzednim rozdziale (Rys. 5.4). Efekty
prezentują się następująco:
Rys. 5.14 Trzeci test - RANSAC
0 20 40 60 80
RANSAC
PROSAC
MSAC
61
23
64
czas działania [ms]
37
Rys. 5.15 Trzeci test - PROSAC
Rys. 5.16 Trzeci test – MSAC
Począwszy od tego testu, w wynikowych scenach zaczynają się pojawiać coraz większe
błędy: RANSAC wciąż wypada najlepiej, ale nie wykrył jednej ze ścian (ściana
mniejszego pudełka, znajdującego się dalej od czujnika) oraz dwukrotnie niewłaściwie
uznał dwie ściany pochodzące w rzeczywistości z różnych pudełek za jedną (górne
oraz „boczne” ściany mniejszych pudełek - Rys. 5.14). PROSAC popełnił ten sam błąd,
a ponadto nie wykrył poprawnie dwóch ścian oraz jedną ze ścian niepotrzebnie
rozdzielił na dwie części (Rys. 5.15). MSAC też połączył dwie ściany pochodzące
z różnych obiektów w jedną, a dodatkowo nie wykrył aż trzech ścian (Rys. 5.16).
38
Jeśli zaś chodzi o czasy, to nic się nie zmieniło, PROSAC pozostaje najszybszy z dużą
przewagą nad pozostałymi estymatorami (Rys. 5.17).
Rys. 5.17 Trzeci test - porównanie czasów działania estymatorów
5.2.4 Większa liczba pudełek
Następne testy, z większą ilością ścian do wykrycia, sprawiają coraz większe problemy
wszystkim estymatorom: niektóre ściany nie są wykrywane, inne bywają niewłaściwie
ze sobą łączone. PROSAC wciąż jest najszybszy, ale począwszy od testu z pięcioma
pudełkami, jego wyniki przestają być akceptowalne. RANSAC popełnia więcej błędów
niż wcześniej, ale wciąż jest najlepszy i przy tym działa nieco szybciej od MSAC’a.
Podsumowanie wszystkich testów zawarte jest w Tab. 2 oraz na Rys. 5.23.
0 50 100 150 200 250
RANSAC
PROSAC
MSAC
188
33
222
czas działania [ms]
39
Rys. 5.18 Chmura punktów zawierają pięć pudełek
Rys. 5.19 Efekt działania estymatora RANSAC. MSAC wypadł podobnie
40
Rys. 5.20 PROSAC nie przeszedł pozytywnie testu
Rys. 5.21 Chmura punktów zawierająca osiem pudełek
41
Rys. 5.22 RANSAC nie przeszedł pozytywnie testu
RANSAC PROSAC MSAC
ilość pudełek
ilość ścian
ilość wykrytych ścian
ilość błędów
ilość wykrytych ścian
ilość błędów
ilość wykrytych ścian
ilość błędów
1 3 3 0 3 0 3 0
2 4 4 0 4 2 4 0
2 6 6 0 6 2 6 1
3 9 8 2 7 3 6 1
5 13 7 3
za dużo błędów, nie przeszedł testu
7 4
6 13 11 4 10 4
6 12 10 3 11 3
8 16 za dużo błędów za dużo błędów
Tab. 2 Podsumowanie efektu wszystkich testów dla trzech najlepszych estymatorów. Na zielono
zaznaczono najlepsze wyniki w danym teście.
42
Rys. 5.23 Podsumowanie czasów trzech najlepszych estymatorów
5.3 Problem drugiego planu
Ciekawa sytuacja ma miejsce w momencie, gdy w scenie znajdzie się coś oprócz
prostopadłościennych pudełek. Test przeprowadzony z jednym pudełkiem
umieszczonym na pierwszym planie oraz „szumem” w postaci dużej liczby
przedmiotów znajdujących się na drugim planie pokazuje, że estymatory mają problem
z rozpoznawaniem obiektów w takim wypadku: popełniają dużo błędów oraz,
co gorsza, czas obliczeń wzrasta nawet o dwa rzędy wielkości (Rys. 5.28).
0 100 200 300 400 500 600 700 800
1
2
3
4
5
6
7
8
13
61
188
105
246
293
385
661
7
23
33
32
0
0
0
0
16
64
222
195
291
389
438
786
czas działania [ms]
ilość
pud
ełek
MSAC
PROSAC
RANSAC
43
Rys. 5.24 Chmura zawierająca jedno pudełko oraz przedmioty na drugim planie
Rys. 5.25 Błąd przy wykrywaniu przedniej ściany pudełka – nieuzasadniony pas w poprzek przedniej
ściany
44
Rys. 5.26 Chmura zawierająca trzy pudełka oraz przedmioty na drugim planie
Rys. 5.27 Całkowita porażka przy wykrywaniu dwóch przednich ścian
45
Rys. 5.28 Porównanie czasu działania w przypadku zaszumionego drugiego planu oraz w przypadku
braku szumu dla estymatora RANSAC
5.4 Wnioski
Testy wykazały, że wszystkie estymatory podatne są na łączenie ścian pochodzących
z różnych pudełek w jedną płaszczyznę. Problem jest tym wyraźniejszy, im większa jest
liczba ścian do wykrycia. Podobnie, żaden z algorytmów nie radzi sobie do końca
dobrze w warunkach „szumu” znajdującego się na drugim planie. W niektórych
przypadkach wyniki są po prostu nieakceptowalne.
W następnym rozdziale podejmuję próbę wyeliminowania, a przynajmniej
zmarginalizowania opisanych wyżej problemów: opisuję sposoby na poprawę wyników
oraz analizuję efekty tych działań.
0 2000 4000 6000 8000 10000 12000
1
2
3
4
3844
4595
4591
11857
13
61
105
192
czas działania [ms]
ilość
pud
ełek
brak szumu
szum w tle
46
6 Próba poprawy wyników
W tym rozdziale prezentuję metody, mające na celu optymalizację działania tak
jakościową, jak i czasową opisanych wcześniej estymatorów. Szczególnie rzucający się
w oczy jest problem niewłaściwego łączenia ze sobą punktów należących
w rzeczywistości do różnych ścian oraz czas działania estymatorów w przypadku
„przeszkadzającego” drugiego planu.
6.1 Szukanie płaszczyzn prostopadłych
W celu poprawy czasu działania algorytmu można wykorzystać fakt, że przedmiotami
szukanymi w scenie są prostopadłościany. Możemy wykorzystać właściwość tych brył
tj. fakt prostopadłych wzajemnie ścian, np. w następujący sposób: po znalezieniu
pierwszej płaszczyzny w scenie (zazwyczaj najlepszej, tj. zawierającej największą
liczbę punktów - zwykle jest to podłoga) ograniczyć przeszukiwanie sceny tylko do
płaszczyzn prostopadłych oraz równoległych do najlepszej płaszczyzny.
Można także zmodyfikować ten wariant i zamiast stałego odniesienia do pierwszej
znalezionej płaszczyzny, stosować wzorzec zmienny, tj. ograniczać przeszukiwanie
sceny do płaszczyzn prostopadłych bądź równoległych do np. ostatniej znalezionej
płaszczyzny. Takie podejście może dać lepsze efekty w przypadku, gdyby pierwsza
znaleziona płaszczyzna obarczona była dużym błędem. Z tego względu należy
to zweryfikować i poddać testom.
47
Rys. 6.1 Model szukania płaszczyzn prostopadłych (po lewej) oraz to samo w wariancie ze zmiennym
modelem referencyjnym (po prawej)
6.2 Podział chmury na podzbiory
Cechą charakterystyczną algorytmu RANSAC (a także jego odmian) jest fakt,
iż generuje on dwa rodzaje błędów: powierzchniowe i liniowe, tworzone przez punkty
ułożone w sekwencje linii lub pól rozproszonych wokół powierzchni dominującej.
Pomimo faktu, że punkty te tworzą jedną płaszczyznę matematyczną, z punktu widzenia
semantycznego nie są zgodne rzeczywistością, ponieważ należą do różnych obiektów.
Aby zmarginalizować te błędy, można wprowadzić dodatkowe ograniczenie dotyczące
łączności pomiędzy punktami wyodrębnionymi dla poszczególnych powierzchni.
Dokonuje się tego poprzez podział chmury punktów na mniejsze „podchmury”
(podzbiory): punkty reprezentujące połączone ze sobą elementy stanowią pojedynczą
„podchmurę”.
Algorytm podziału przedstawia się następująco:
1. Dla wejściowej chmury punktów stwórz reprezentację w postaci drzewa kd,
co umożliwi efektywne przeszukiwanie.
Szerzej o mechanizmie działania drzew kd w podrozdziale 6.2.1.
2. Stwórz pustą listę podzbiorów (klastrów) oraz kolejkę punktów do
sprawdzenia .
48
3. Dla każdego punktu wykonuj:
3.1. dodaj do kolejki ;
3.2. dla każdego punktu wykonuj:
3.2.1. szukaj punktów znajdujących się względem w odległości nie większej
niż zadana wartość progowa;
3.2.2. sprawdź każdego sąsiada czy był już analizowany. Jeśli nie był, dodaj
go do kolejki ;
3.3. kiedy wszystkie punkty z kolejki zostaną przeanalizowane, dodaj
zawartość do danego podzbioru , a następnie ustaw jako pustą listę.
4. Algorytm kończy się w momencie gdy każdy z punktów został
przeanalizowany i jest częścią któregoś podzbioru .
W ten sposób można pozbyć się nie tylko problemu wszystkich estymatorów, które
mają tendencję do łączenia niezwiązanych ze sobą elementów, ale również zauważalnie
przyspieszyć działanie samego algorytmu – szukanie punktów pasujących do modelu
odbywa się teraz na mniejszym podzbiorze.
Rys. 6.2 Efekt działania algorytmu bez podziału chmury na podzbiory (po lewej) oraz z podziałem (po
prawej)
6.2.1 Drzewo kd
Drzewo kd (skrót od drzewa k-wymiarowego) to struktura danych używana do dzielenia
przestrzeni. Drzewo kd jest drzewem binarnym, w którym w każdym węźle znajduje się
k-wymiarowy punkt. Każdy węzeł wewnętrzny tworzy hiperpłaszczyznę podziału, która
dzieli przestrzeń na dwie podprzestrzenie. Punkty po lewej stronie hiperpłaszczyzny
reprezentują lewe poddrzewo zaczynające się w tym węźle, a prawe punkty prawe
49
poddrzewo. Kierunek hiperpłaszczyzny jest wybierany zgodnie z wektorem normalnym
do niej. Przykładowo, jeżeli podział nastąpił prostopadle do osi X w punkcie x,
to wszystkie punkty z wartością mniejszą niż x należą do lewego poddrzewa, a większe
do prawego.
Rys. 6.3 Przykład dwuwymiarowego kd drzewa
6.3 „Lokalne” normalne
„Lokalne” normalne to ważna właściwość powierzchni geometrycznych, często
wykorzystywana w grafice komputerowej do zastosowania właściwego światła, które
generuje odpowiedni cień, czy innych efektów wizualnych. Przy wykrywaniu
płaszczyzn też będą niezwykle pomocne, wiadomo bowiem, że „lokalne” normalne dla
sąsiadujących ze sobą punktów nie powinny się między sobą wiele różnić, tzn. ich
różnica nie powinna być większa od zadanej wartości progowej (jeśli mają należeć do
tej samej płaszczyzny - Rys. 6.4).
50
Rys. 6.4 Przykład ilustrujący zasadę działania „lokalnych” normalnych. Obraz pochodzi z [12]
Generalnie, mając powierzchnię geometryczną znalezienie „lokalnej” normalnej jest
zadaniem trywialnym. W przypadku gdy mamy chmurę punktów P, złożoną z punktów
p = [x y z]T, wygląda następująco:
1. Wybierz zbiór punktów Q sąsiednich z punktem p.
2. Dopasuj lokalną płaszczyznę do zbioru punktów Q.
3. Policz normalną do tej płaszczyzny.
Rys. 6.5 „Lokalne” normalne dla zbiorów punktów. Obraz pochodzi z [12]
W ten sposób jesteśmy w stanie ocenić, czy punkty należą do tej samej płaszczyzny.
W następnym rozdziale prezentuję i omawiam efekty, jakie przyniosły wymienione
wyżej działania.
51
7 Porównanie zmodyfikowanych metod
W skutek działań omówionych w poprzednim rozdziale, powstało pięć nowych modeli
obliczeń:
• szukanie płaszczyzn prostopadłych i równoległych,
• szukanie płaszczyzn prostopadłych i równoległych przy zmiennym modelu
referencyjnym,
• szukanie płaszczyzn w chmurze podzielonej na podzbiory,
• szukanie płaszczyzn w oparciu o „lokalne” normalne,
• połączenie dwóch ostatnich technik: szukanie płaszczyzn w oparciu o „lokalne”
normalne w chmurze podzielonej na podzbiory.
W tym rozdziale prezentuję efekty działania wymienionych wyżej metod. Punktem
odniesienia jest model zwykłej płaszczyzny, omówiony w rozdz. 5. Analizowane
są przypadki sprawiające wcześniej największy problem: większa liczba pudełek
w scenie oraz „zaszumiony” drugi plan. W testach wykorzystano estymator RANSAC,
jako, że wypadł wcześniej najlepiej.
7.1 Większa liczba pudełek
W pierwszym teście wejściowa scena, złożona z pięciu pudełek jest taka sama jak
na Rys. 5.18. Efekty działania wszystkich metod zawarte są na następnych dwóch
stronach.
52
Rys. 7.1 Model zwykłej płaszczyzny (punkt odniesienia dla pozostałych metod)
Rys. 7.2 Model szukania płaszczyzn prostopadłych (po lewej) oraz to samo w wariancie ze zmiennym
modelem referencyjnym (po prawej)
53
Rys. 7.3 Model podziału chmury na podzbiory
Rys. 7.4 Modele wykorzystujący „lokalne” normalne (po lewej stronie) oraz to samo w wariancie z
podziałem chmury na podzbiory (po prawej stronie)
54
W przypadku metod: podziału chmury na podzbiory oraz użycia dwóch metod
wykorzystujących „lokalne” normalne widać wyraźną poprawę (w stosunku do tego co
było wcześniej): metoda podziału chmury pominęła tylko dwie ściany, a dwie kolejne
płaszczyzny połączyła w jedną. Metody wykorzystujące normalne pominęły trzy ściany
i również dwukrotnie łączyły dwie niezwiązane ze sobą płaszczyzny w jedną. Są to
jednak i tak wyniki znacznie lepsze niż w przypadku zwykłego modelu szukania
płaszczyzny.
Nieco gorzej wypadła metoda szukania płaszczyzn prostopadłych przy zmiennym
modelu referencyjnym. Natomiast w przypadku modelu szukania płaszczyzn
prostopadłych ze stałym modelem nie odnotowano poprawy jakościowej w stosunku do
zwykłej metody szukania płaszczyzn.
Jeśli zaś chodzi o czasy działania (Rys. 7.5) to metoda podziału chmury na podzbiory
jest zdecydowanie najszybsza (tak jak przewidywano). Podobnie, zgodnie
w przewidywaniami, duży przyrost wydajności odnotowano w przypadku metod
szukania płaszczyzn prostopadłych. Widać również, że metody wykorzystujące
normalne są niestety czasochłonne.
Rys. 7.5 Porównanie czasów działania poszczególnych metod
0 100 200 300 400 500 600
zwykła płaszczyzna
płaszczyzna prostopadła
płaszczyzna prostopadła(m. zmienny)
podział chmury
"lokalne" normalne
"lokalne" normalnewraz z podziałem
246
130
135
104
510
374
czas działania [ms]
55
Następny test przeprowadzony został w oparciu o chmurę punktów, zawierającą osiem
pudełek (Rys. 5.21). Efekty przedstawiono poniżej.
Rys. 7.6 Model zwykłej płaszczyzny (punkt odniesienia dla pozostałych metod)
Rys. 7.7 Model szukania płaszczyzn prostopadłych (po lewej) oraz to samo w wariancie ze zmiennym
modelem referencyjnym (po prawej)
56
Rys. 7.8 Model podziału chmury na podzbiory
Rys. 7.9 Modele wykorzystujący „lokalne” normalne (po lewej stronie) oraz to samo w wariancie z
podziałem chmury na podzbiory (po prawej stronie)
57
Potwierdza się wniosek z poprzedniego testu: model wykorzystujący podział chmury na
podzbiory jest właściwie bezkonkurencyjny. Model wykorzystujący normalne
w połączeniu z podziałem chmury również jest godny uwagi, ale ma problem
z gubieniem niektórych ścian. Podobnie jak w poprzednim teście, w przypadku modeli
szukających płaszczyzn prostopadłych lepiej wypadł model zmienny, jednak ciężko
mówić tu o dobrym wyniku. Właściwie należy uznać, że tylko dwa modele,
wykorzystujące podział chmury na podzbiory, przeszły pozytywnie test, przy czym,
podobnie jak w poprzednim teście, korzystanie z normalnych jest kosztowne czasowo.
Porównywanie czasów z pozostałymi metodami nie zostało przeprowadzone, ponieważ
nie przeszły one pozytywnie testu.
7.2 Problem drugiego planu
W celu weryfikacji poprawy uzyskanych efektów w sytuacji „zaszumionego” drugiego
planu w pierwszym teście wejściową scenę stanowić będzie chmura z Rys. 5.26. Efekty
przedstawiono poniżej.
Rys. 7.10 Porównanie czasów działania
0 1000 2000 3000 4000 5000
zwykła płaszczyzna
płaszczyzna prostopadła
płaszczyzna prostopadła(m. zmienny)
podział chmury
"lokalne" normalne
"lokalne" normalnewraz z podziałem
4591
2658
4290
123
2200
288
czas działania [ms]
58
Rys. 7.11 Model zwykłej płaszczyzny (punkt odniesienia dla pozostałych metod)
Rys. 7.12 Model szukania płaszczyzn prostopadłych (po lewej) oraz to samo w wariancie ze zmiennym
modelem referencyjnym (po prawej)
59
Rys. 7.13 Model podziału chmury na podzbiory
Rys. 7.14 Modele wykorzystujący „lokalne” normalne (po lewej stronie) oraz to samo w wariancie z
podziałem chmury na podzbiory (po prawej stronie)
Jak widać, pomijając model wykorzystujący tylko „lokalne” normalne, wszystkie
pozostałe metody wypadły lepiej aniżeli model wyjściowy. Jeśli zaś weźmiemy pod
uwagę czas działania, to okaże się, że metody wykorzystujące podział chmury
ponownie są bezkonkurencyjne.
60
W następnym teście wykorzystano chmurę punktów zamieszczoną poniżej.
Rys. 7.15 Chmura zawierająca cztery pudełka oraz przedmioty na drugim planie
Rys. 7.16 Model zwykłej płaszczyzny (punkt odniesienia dla pozostałych metod)
61
Rys. 7.17 Model szukania płaszczyzn prostopadłych (po lewej) oraz to samo w wariancie ze zmiennym
modelem referencyjnym (po prawej)
Rys. 7.18 Model podziału chmury na podzbiory
62
Rys. 7.19 Modele wykorzystujący „lokalne” normalne (po lewej stronie) oraz to samo w wariancie z
podziałem chmury na podzbiory (po prawej stronie)
Rys. 7.20 Porównanie czasów działania
Przedstawione wyniki pokazują, że tym razem metody wyszukujące płaszczyzny
prostopadłe nie zdały egzaminu. Jedynie metody bazujące na podziale chmury dały
rozsądne rezultaty. Jeśli zaś weźmiemy pod uwagę czas działania, to potwierdza się
fakt, iż te dwie metody nie mają sobie równych.
0 2000 4000 6000 8000 10000 12000
zwykła płaszczyzna
płaszczyzna prostopadła
płaszczyzna prostopadła(m. zmienny)
podział chmury
"lokalne" normalne
"lokalne" normalnewraz z podziałem
11857
6319
8914
144
1733
340
czas działania [ms]
63
zwykła płaszczyzna płaszczyzna prostopadła
płaszczyzna prostopadła (m. zmienny)
liczba pudełek
liczba ścian
liczba wykrytych ścian
liczba błędów
liczba wykrytych ścian
ilość błędów
liczba wykrytych ścian
liczba błędów
1 3 3 0 3 0 3 0
2 4 4 0 4 0 4 0
2 6 6 0 6 3 6 0
5 13 7 3 za dużo błędów 9 4
6 12 10 3 10 6 11 1
8 16 za dużo błędów za dużo błędów za dużo błędów
podział chmury "lokalne" normalne "lokalne" normalne
wraz z podziałem chmury
liczba pudełek
liczba ścian
liczba wykrytych ścian
liczba błędów
liczba wykrytych ścian
liczba błędów
liczba wykrytych ścian
liczba błędów
1 3 3 0 3 0 3 0
2 4 4 0 4 0 4 0
2 6 6 0 6 0 6 0
5 13 11 1 10 1 10 0
6 12 10 1 9 2 9 3
8 16 15 4 4 0 10 2
Tab. 3 Podsumowanie wyników testów dla omówionych sześciu metod (bez „szumu” na drugim planie).
Na zielono zaznaczono najlepsze wyniki w danym teście.
Tab. 3 przedstawia wyniki wszystkich testów dla omówionych metod (bez „szumu”
na drugim planie). Z danych zawartych w tabeli wynika, że przy małej liczbie pudełek
właściwie każda metoda daje dobre rezultaty. Problemy zaczynają się natomiast
w momencie, gdy liczba obiektów do wykrycia wzrasta. Przy dużej liczbie obiektów
najlepiej wypada metoda podziału chmury. Zaraz za nią znajduje się metoda podziału
wzbogacona o „lokalne” normalne.
64
zwykła płaszczyzna płaszczyzna prostopadła
płaszczyzna prostopadła (m. zmienny)
liczba pudełek
liczba ścian
liczba wykrytych ścian
liczba błędów
liczba wykrytych ścian
liczba błędów
liczba wykrytych ścian
liczba błędów
1 3 3 0 3 0 3 0
2 5 5 2 5 1 5 1
3 6 za dużo błędów
6 2 za dużo błędów
4 8 za dużo błędów
podział chmury "lokalne" normalne "lokalne" normalne
wraz z podziałem chmury
liczba pudełek
liczba ścian
liczba wykrytych ścian
liczba błędów
liczba wykrytych ścian
liczba błędów
liczba wykrytych ścian
liczba błędów
1 3 3 0 2 0 3 0
2 5 5 0 2 0 4 0
3 6 6 2 3 2 6 2
4 8 8 0 2 0 7 0
Tab. 4 Podsumowanie wyników testów dla omówionych sześciu metod przy „zaszumionym” drugim planie. Na zielono zaznaczono najlepsze wyniki w danym teście.
Tab. 4 zawiera podsumowanie wyników testów przy „zaszumionym” drugim planie.
Znajdują się tam zarówno testy, które opisałem w tej pracy, jak i takie, dla których nie
znalazło się tu już miejsca. Z danych zawartych w tej tabeli także możemy odczytać,
że przy niewielkiej liczbie obiektów wszystkie metody radzą sobie równie dobrze.
Natomiast przy większej liczbie obiektów przewaga metod bazujących na podziale
chmury jest jeszcze wyraźniejsza niż to było w przypadku danych zawartych w Tab. 3.
65
8 Podsumowanie
W tym rozdziale podsumowuję wszystkie testy – zarówno część pierwszą (porównanie
estymatorów), jak i drugą (sposoby poprawy rezultatów). Omawiam także potencjalne
możliwości rozwoju pracy oraz możliwe obszary zastosowania wykrywania obiektów
w praktyce.
8.1 Wnioski
Przeprowadzone testy pozwalają stwierdzić, iż RANSAC jest estymatorem, który
wykrywa płaszczyzny najlepiej. Z kolei PROSAC jest rozwiązaniem najszybszym,
jednak popełnia sporo błędów. MSAC jest również ciekawy, ale w zestawieniu
z RANSAC’iem wypada gorzej. Pozostałe estymatory w tych warunkach
nie sprawdziły się. Testy pokazały, że RANSAC, PROSAC oraz MSAC są szczególnie
dobre w przypadku segmentacji modeli nieskomplikowanych geometrycznie (PROSAC
właściwie może być brany pod uwagę tylko w takiej sytuacji). Wszystkie jednak
są podatne na łączenie w jedną płaszczyznę matematyczną punktów przynależących do
różnych, w rzeczywistości odrębnych obiektów. Zjawisko to nasila się tym bardziej,
im większa jest liczba płaszczyzn do wykrycia w scenie. Podobnie, wszystkie mają
problem z radzeniem sobie w warunkach „szumu” znajdującego się na drugim planie.
Działania podjęte w późniejszym etapie pracy częściowo eliminują te problemy, choć,
jak się okazuje, niecałkowicie. Algorytm wyszukiwania płaszczyzn prostopadłych przy
zmiennym modelu referencyjnym poprawił jakość wykrywanych płaszczyzn, jednak nie
na tyle, by móc go rekomendować. Ten sam algorytm przy stałym modelu
referencyjnym, którym jest pierwsza wykryta płaszczyzna, wypadł gorzej
i nie odnotował znaczącej poprawy w stosunku do pierwotnej metody. Obydwie metody
wykorzystujące prostopadłościenność wykrywanych obiektów dały poprawę szybkości
66
działania w zależności od testu o ok. 20-50% w stosunku do tego, co było na początku.
To niemało, choć inne metody okazały się jeszcze lepsze.
Metoda wykorzystująca „lokalne” normalne dopasowywała płaszczyzny lepiej od wyżej
wymienionych: udało się w znacznym stopniu ograniczyć problem łączenia ze sobą
odrębnych obiektów. Jednak poprawa jakości wykrywanych płaszczyzn, ma w tym
przypadku również negatywne konsekwencje. Mianowicie: czas wykonywania obliczeń
w stosunku do pierwotnej metody w przypadkach, gdy w scenie są tylko wyszukiwane
obiekty (brak „szumu” na drugim planie) wzrósł o nawet 100%. Na szczęście lepiej
było w przypadku, gdy został dodany „szum”, choć wynika to bardziej z faktu,
że pierwotna metoda nie radzi tam sobie w ogóle.
Na koniec dwa najlepsze modele obliczeń. Otrzymane rezultaty pokazują, że najbardziej
efektywne, tak jakościowo, jak i czasowo, są metody wykorzystujące podział chmury
punktów na podzbiory: zwykła metoda podziału oraz metoda korzystają dodatkowo
z „lokalnych” normalnych. Jednak, jak się okazało w toku prowadzonych testów,
w ogólnym przypadku wykorzystanie „lokalnych” normalnych nie przyniosło
spodziewanej poprawy rezultatów. Co więcej, liczenie normalnych wprowadza pewien
narzut czasowy i w związku z tym ta metoda działa dłużej niż „zwykła”. „Zwykła”
metoda podziału punktów nie tylko znacznie poprawiła jakość wykrywanych
płaszczyzn, wypadając na tym polu najlepiej, ale również skróciła czas wykonywania
obliczeń o ok. 60% w przypadku braku „szumu” oraz o ok. 98% w przypadku,
gdy „szum” jest obecny.
Wziąwszy to wszystko pod uwagę, ostatecznie najlepszym, spośród przetestowanych
algorytmów, sposobem na wykrywanie prostopadłościennych pudełek okazuje się być
połączenie estymatora RANSAC z modelem podziału chmury punktów na podzbiory.
8.2 Możliwości rozwoju pracy
Jak zostało wspomniane we wstępie, problematyka wykrywania trójwymiarowych
obiektów cieszy się coraz większym zainteresowaniem. Nie bez znaczenia jest tu fakt
dynamicznego rozwoju rynku urządzeń mobilnych. Jednak aby móc stosować
wykrywanie obiektów w życiu codziennym, trzeba rozwiązać jeden duży problem: cały
67
proces musi odbywać się w czasie rzeczywistym. Tak, by użytkownik komfortowo
korzystał z aplikacji.
Powszechnie przyjęło się, że płynny obraz zaczyna się od 24 klatek na sekundę,
co oznacza, że na przetwarzanie jednej sceny mamy 1000 ms / 24 = ok. 42 ms.
W chwili obecnej daleko jest do tego. Głównym powodem takiego stanu rzeczy jest
zbyt duża liczba punktów otrzymywana z urządzenia Kinect (jak bowiem zostało
ustalone, próbkowanie sceny w celu zmniejszenia liczby punktów zajmuje ok. 1,4 s).
Być może zmiana urządzenia rejestrującego np. na inteligentny telefon, a także sposobu
pozyskiwania punktów, otworzyłaby nowe możliwości w tym temacie.
68
Bibliografia
[1] Pawlik P., Mikrut S., Wyszukiwanie punktów charakterystycznych na potrzeby
łączenia zdjęć lotniczyc, 2006 [dostęp: 20 stycznia 2014],
http://journals.bg.agh.edu.pl/AUTOMATYKA/2006-03/Auto_407-412.pdf
[2] Rusu R. B., Semantic 3d object maps for everyday manipulation in human living
environments, Monachium 2009.
[3] Rusu R. B., The PCD (Point Cloud Data) file format, [dostęp: 3 grudnia 2013],
http://pointclouds.org/documentation/tutorials/pcd_file_format.php
[4] Wikipedia, Kinect, 2013 [dostęp: 17 grudnia 2013],
http://pl.wikipedia.org/wiki/Kinect
[5] Kowalczyk T., Kinect SDK – Wprowadzenie, 2011 [dostęp: 24 stycznia 2014],
http://msdn.microsoft.com/pl-pl/library/kinect-sdk--wprowadzenie.aspx
[6] Kasprzak W., Rozpoznawanie obrazów i sygnałów mowy, wyd. 1, Warszawa
2009, Rozpoznawanie znanego obiektu sztywnego, s. 162-167.
[7] Zuliani M., RANSAC for Dummies, 2012 [dostęp: 17 grudnia 2013],
http://vision.ece.ucsb.edu/~zuliani/Research/RANSAC/docs/RANSAC4Dummies.pdf
[8] Poręba M., Goulette F., Automatyczna detekcja płaszczyzn w chmurze punktów
w oparciu o algorytm RANSAC i elementy teorii grafów, 2012 [dostęp: 17
grudnia 2013], http://yadda.icm.edu.pl/baztech/element/bwmeta1.element.baztech-2530c9b7-
4dff-4264-a8d7-88059a51a0f1/c/poreba.pdf
[9] Rusu R. B., How to use Random Sample Consensus model, [dostęp: 3 grudnia
2013], http://pointclouds.org/documentation/tutorials/random_sample_consensus.php
[10] Chum O., Matas J., Matching with PROSAC - Progressive Sample Consensus,
2005 [dostęp: 17 grudnia 2013], https://dspace.cvut.cz/bitstream/handle/10467/9496/2005-
Matching-with-PROSAC-progressive-sample-consensus.pdf
[11] Torr P. H. S., Zisserman A., MLESAC: A new robust estimator with application
to estimating image geometry, 2000 [dostęp: 17 grudnia 2013],
http://www.robots.ox.ac.uk/~vgg/publications/papers/torr00.pdf
[12] Holzer S., PCL :: Segmentation, 2011 [dostęp: 3 grudnia 2013],
http://www.pointclouds.org/assets/files/presentations/ICCV2011-segmentation.pdf