Wizualizacja danych sensorycznych Rozpoznawanie

Transkrypt

Wizualizacja danych sensorycznych Rozpoznawanie
Wizualizacja danych sensorycznych
Rozpoznawanie podstawowych
figur geometrycznych
z wykorzystaniem kamerki internetowej
Mariusz Rachuta
Wrocław, 11 czerwca 2009 roku
1
Wstęp
Celem projektu jest opracowanie oprogramowania, które wykorzystując kamerę internetową, umożliwi rozpoznawanie określonych obiektów w czasie rzeczywistym.
Cyfrowe przetwarzanie obrazów jest szeroką dziedziną. Zajmuje się reprezentacją obrazu w postaci cyfrowej
oraz algorytmami jego przetwarzania, które pełnią wiele funkcji, m.in.: wykrywają krawędzie, filtrują obraz,
jak i przeprowadzają różne transformacje geometryczne. Operacje te maja najczęściej na celu znalezienie oraz
zidentyfikowanie różnych obiektów na obrazie. W projekcie natomiast zostanie zaprezentowane inne podejscie,
opartne na odpowiednio wytrenowanym kaskadowym klasyfikatorze bazującym na własnościach Haara (Haar-like
features).
2
Klasyfikator Haara
Obrazy, dostarczane przez kamerę internetową, na których znajduje się poszukiwany obiekt, zawierają wiele
utrudnień tj. nierównomierne oświetlenie, zróżnicowana kolorystyka obiektu, jak i to, że najczęśniej obiekt nie
jest skierowany na wprost kamery, tylko jest lekko obrócony w którymś kierunku.
Trudno w takim przypadku odszukać jednoznaczne cechy, które mogłyby posłużyć do efektywnego wykrycia
obiektu. W takim przypadku wykorzystuje się model statystyczny (klasyfikator).
2.1
Sposób działania klasyfikatora Haara
Klasyfikator Haara w celu zlokalizowania poszukiwanego obiektu na obrazie stosuje technikę przesuwnego
okna. Detekcja realizowana jest poprzez przesuwanie okna przeszukiwania wzdłuż obrazu i sprawdzaniu przynależności aktualnego regionu do poszukiwanej klasy obiektów. Klasyfikator jest skalowalny, dzięki czemu może
wykrywać elementy niezależnie od ich wielkości. Każda cecha (rysunek 1) jest opisywana poprzez swój szablon
(związany z jej kształtem), pozycję względem okna przeszukiwania i rozmiar (współczynnik skali). Składa się z
dwóch lub trzech połączonych „białych” i „czarnych” prostokątnych obszarów ustawionych pionowo lub obróconych o kąt 45◦ [2]. Szczegółowy opis działania algorytmu można znaleźć w pracy [1].
Rysunek 1: Cechy wykorzystywane w klasyfikacji
2.2
Konstrukcja własnego klasyfikatora Haara
Aby użyć klasyfikatora, najpierw trzeba go wytrenować. Umożliwia to użyta w projekcie biblioteka OpenCV
[3] [4]. Zawiera ona narzędzia potrzebne do tworzenia oraz wykorzystania klasyfikatorów Haara w swoim projekcie.
1
Wytrenowany klasyfikator jest zapisywany w postaci pliku XML, który następnie wczytujemy w programie i
używamy do detekcji obiektów.
Narzędzia służące do stworzenia własnego klasyfikatora znajdują się w podkatalogu bin katalogu głównego
biblioteki. Natomiast opis ich użycia znajduje się w katalogu apps/HaarTraining/doc/. Niestety nie jest on
kompletny i użycie tych narzędzi sprawiło dużo problemów. Jednak ostatecznie udało się go uruchomić, a
poszczególne etapy trenowania klasyfikatora zostaną opisane w kolejnych podrozdziałach.
2.3
Tworzenie zbioru obrazów uczących
Proces uczenia takiego klasyfikatora, w odniesieniu do konkretnego obiektu, wymaga wygenerowania zestawu
próbek pozytywnych (zawierających obiekt) oraz próbek negatywnych (obrazy nie zawierające poszukiwanego
obiektu). Te dwa zbiory tworza tzw. zestaw uczący, z którego w trakcie uczenia, wydobywane są rozmaite cechy
obiektu. Spośród nich wybierane są te, które reprezentują poszukiwany obiekt najlepiej i dzięki temu mogą być
wykorzystane do klasyfikacji [2]. Zbiory uczące powinny być jak największe, nawet do 5000 próbek pozytywnych,
jak i negatywnych.
Możemy utworzyć zbiór próbek (jak i obrazów testowych, wykorzystywanych później do testowania klasyfikatora), wykorzystując narzędzie opencv_createsamples.
Lista opcji z jakimi możemy wywołać tę aplikację jest następująca:
./opencv_createsamples
[-info <collection_file_name>]
[-img <image_file_name>]
[-vec <vec_file_name>]
[-bg <background_file_name>]
[-num <number_of_samples = 1000>]
[-bgcolor <background_color = 0>]
[-inv] [-randinv] [-bgthresh <background_color_threshold = 80>]
[-maxidev <max_intensity_deviation = 40>]
[-maxxangle <max_x_rotation_angle = 1.100000>]
[-maxyangle <max_y_rotation_angle = 1.100000>]
[-maxzangle <max_z_rotation_angle = 0.500000>]
[-show [<scale = 4.000000>]]
[-w <sample_width = 24>]
[-h <sample_height = 24>]slj
Program createsamples można użyć na cztery różne sposoby (co może być trochę dezorentujące): do tworzenia próbek na podstawie jednego obrazu zawierającego szukany obiekt, na podstawie kilku takich obrazów, do
tworzenia obrazów testowych oraz do wyświetlania wektora utworzonych w ten sposób obrazów.
Zajmijmy się pierwszą funkcją – tworzenie próbek na podstawie jednego obrazka. Użycie tej funkcji wymaga
wywołania programu, co najmniej z opcjami -img, -bg, -vec oraz utworzenia pliku negatywy.txt o przykładowej
zawartości:
img/obrazek1.jpg
img/obrazek2.jpg
img/obrazek3.jpg
...
Poniższe wywołanie spowoduje wygenerowanie, na podstawie jednego zdjęcia zawierajacego poszukiwany
obiekt, 50 próbek o wymiarach 20x20 pikseli, z których każda będzie miała inne tło.
./opencv_createsamples -img trojkat.png -num 50 -bg negatywy.txt -vec trojkat.vec
2
-maxxangle 0.6 -maxyangle 0.6 -maxzangle 0.3 -maxidev 100 -bgcolor 1 -bgthresh
0 -w 20 -h 20
Lepszej jakości (bardziej różnorodne) próbki uzyskamy, jeśli wzorcem będzie kilka zdjęć tego samego, nieznacznie różniącego się, obiektu.
Wtedy powinniśmy posłużyć się poleceniem:
./opencv_createsamples -info samples.dat -vec samples.vec -w 20 -h 20
Format pliku samples.dat powinien być następujący:
img/img1.jpg 1 140 100 45 45
img/img2.jpg 2 100 200 50 50 50 30 25 25
img/img3.jpg 1 0 0 20 20
...
gdzie po nazwie pliku jest kolejno liczba poprawnych obiektów oraz współrzedne prostokątów w których
poszukiwane obiekty się znajdują.
Utwórzmy jeszcze obrazy testowe, które użyjemy później do testowania naszego klasyfikatora.
./opencv_createsamples -img trojkat.png -num 50 -bg negatywy.txt -info
testTrojkat.dat -maxxangle 0.6 -maxyangle 0.6 -maxzangle 0.3 -maxidev 100 -bgcolor 1 -bgthresh 0
Ostatnią funkcją, w jakiej możemy wykorzystać program opencv_createsamples, to wyświetlanie wektora
wygenerowanych próbek:
./opencv_createsamples -vec samples.vec -w 20 -h 20
2.4
Trenowanie klasyfikatora
Teraz możemy przejść do trenowania klasyfikatora. Służy do tego program opencv_haartraining, który jest
dostępny z następującymi opcjami.
./opencv_haartraining
-data <dir_name>
-vec <vec_file_name>
-bg <background_file_name>
[-npos <number_of_positive_samples = 2000>]
[-nneg <number_of_negative_samples = 2000>]
[-nstages <number_of_stages = 14>]
[-nsplits <number_of_splits = 1>]
[-mem <memory_in_MB = 200>]
[-sym (default)] [-nonsym]
[-minhitrate <min_hit_rate = 0.995000>]
[-maxfalsealarm <max_false_alarm_rate = 0.500000>]
[-weighttrimming <weight_trimming = 0.950000>]
[-eqw]
[-mode <BASIC (default) | CORE | ALL>]
[-w <sample_width = 24>]
[-h <sample_height = 24>]
[-bt <DAB | RAB | LB | GAB (default)>]
[-err <misclass (default) | gini | entropy>]
[-maxtreesplits <max_number_of_splits_in_tree_cascade = 0>]
[-minpos <min_number_of_positive_samples_per_cluster = 500>]
3
Poniższe wywołanie programu trenuje klasyfikator o nazwie „trojkat”, na podstawie wektora 50 obrazów pozytywnych „trojkat.vec” oraz 20 obrazów negatywnych ze ścieżkami w pliku „negatywy.txt”. Klasyfikator będzie
zbudowany maksymalnie z 20 stopni. Opcja -sym informuje o tym, że poszukiwany obiekt jest symetryczny, a
-mode ALL, że zostanie użyty rozszerzony zbiór cech haara.
./opencv_haartraining -data trojkat -vec trojkat.vec -bg negatywy.txt -nstages
15 -nsplits 2 -minhitrate 0.999 -maxfalsealarm 0.5 -npos 50 -nneg 20 -w 20 -h
20 -sym -mode ALL
2.5
Sprawdzanie wytrenowanego klasyfikatora
Po wytrenowaniu klasyfikatora można go wytestować za pomocą programu opencv_performance, który można
wywołać z następującymi opcjami:
Usage: ./opencv_performance
-data <classifier_directory_name>
-info <collection_file_name>
[-maxSizeDiff <max_size_difference = 1.500000>]
[-maxPosDiff <max_position_difference = 0.300000>]
[-sf <scale_factor = 1.200000>]
[-ni]
[-nos <number_of_stages = -1>]
[-rs <roc_size = 40>]
[-w <sample_width = 24>]
[-h <sample_height = 24>]k
Przykładowe wywołanie:
./opencv_performance -data trojkat.xml -info testTrojkat.dat
W efekcie jego działania otrzymamy tabelę statystyk, w której jest zawarta m.in. informacja o liczbie obiektów
znalezionych poprawnie, nie znalezionych oraz znalezionych błędnie.
+================================+======+======+======+
|
File Name
| Hits |Missed| False|
+================================+======+======+======+
|
0001_0153_0054_0004.jpg|
0|
1|
0|
+--------------------------------+------+------+------+
....
+--------------------------------+------+------+------+
|
Total|
27|
3|
11|
+================================+======+======+======+
Number of stages: 9
Number of weak classifiers: 9
Total time: 1.000000
9
27
11
0.900000
0.366667
27
11
0.900000
0.366667
16
1
0.533333
0.033333
4
0
0.133333
0.000000
1
0
0.033333
0.000000
4
0
0
0
....
3
0
0
0
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
Wykrywanie prostych figur - eksperymenty
W ramach projektu wytrenowano własne klasyfikatory umożliwiające wykrywanie podstawowych obiektów
geometrycznych, a konkretnie trójkąta, koła oraz znaku X.
Podczas trenowania koniecznie należy pamiętać o odpowiednim ustawieniu opcji symetryczności (-sym lub
-nonsym), w zależności od kształtu obiektu.
W celu znalezienia najlepiej wytrenowanego klasyfikatora dla każdej z figur przeprowadzono metodą prób i
błędów „treningi” dla różnych parametrów tzn. różnej liczby próbek pozytywnych, próbek negatywnych oraz
maksymalnego stopnia klasyfikatora. Ponadto okazało się, że wytrenowanie 20-stopniowego klasyfikatora w przypadku 200 zdjęć negatywnych i tylu samo pozytywnych, na komputerze z procesorem 2 Ghz zajmuje około
godzinę. Ponieważ testowane figury nie są skomplikowane, to zadowalające efekty uzyskuje się już dla małej
liczby próbek (20 zdjęć negatywnych i pozytywnych). Duże ilości próbek (kilka tysięcy) powinno stosować się w
przypadku bardziej skomplikowanych obiektów (np. klasyfikator wykrywający twarz człowieka)
Na podstawie wstępnego rozeznania postanowiono przeprowadzić testy dla następujących wartości: 10, 20 i
50 próbek pozytywnych; 10, 20 i 50 próbek pozytywnych oraz od 14 do 19 stopni klasyfikatora.
5
3.1
Wykrywanie trójkątów
L. stopni Trafionych Nietrafionych Błędnie
10 zdjęć pozytywnych i 10 negatywnych
14
31
19
212
15
32
18
71
16
29
21
52
17
28
22
46
18
28
22
46
19
27
23
40
20 zdjęć pozytywnych i 10 negatywnych
14
1
49
0
15
1
49
0
16
1
49
0
17
1
49
0
18
1
49
0
19
1
49
0
20 zdjęć pozytywnych i 20 negatywnych
14
0
50
0
15
0
50
0
16
0
50
0
17
0
50
0
18
0
50
0
19
0
50
0
20 zdjęć pozytywnych i 50 negatywnych
14
20
30
17
15
20
30
17
16
20
30
17
17
17
33
20
18
17
33
20
19
17
33
20
50 zdjęć pozytywnych i 10 negatywnych
14
1
49
22
15
0
50
0
16
0
50
0
17
0
50
0
18
0
50
0
19
0
50
0
Zgodnie z wynikami w tabeli, w przypadku trójkąta, najlepszy klasyfikator udało się wytrenować przy użyciu
10 zdjęć pozytywnych, 10 negatywnych oraz z ograniczeniem -nstages ustawionym na 15. Wyniki działania tego
klasyfikatora można zobaczyć na rysunkach 2 i 3.
Jak widać program wykrywa trójkąty, jednak tylko te, które są ustawione podstawą względnie równolegle
do sfilmowanej klatki (podczas trenowania była ustawiona opcja -sym oraz trudno wymagać od klasyfikatora
aż takiej „inteligencji”) Widać również, że wykrywa inne rzeczy, czego można było się spodziewać po wynikach
z tabeli – dla 50 zdjęć testowych 71 trójkątów wykrył błędnie (na każdym zdjęciu testowym był tylko jeden
trójkąt).
6
Rysunek 2: Wykrywanie trójkątów – przykład pierwszy
Rysunek 3: Wykrywanie trójkątów – przykład drugi
7
3.2
Wykrywanie kół
Zgodnie z tabelą, dla koła udało się uzyskać bardzo dobrej jakości klasyfikator już przy małej ilości próbek.
Wykrył on aż 47 na 50 kół! Jako ostateczny wybrano klasyfikator dla 16 stopni, gdyż miał najmniej błędnych
wykryć.
L. stopni Trafionych Nietrafionych Błędnie
20 zdjęć pozytywnych i 10 negatywnych
14
47
3
128
15
47
3
128
16
47
3
72
17
44
6
6
18
44
6
6
19
41
9
4
20 zdjęć pozytywnych i 20 negatywnych
14
0
50
0
15
0
50
0
16
0
50
0
17
0
50
0
18
0
50
0
19
0
50
0
20 zdjec pozytywnych i 50 negatywnych
14
1
3
4
15
1
3
4
16
1
3
4
17
1
3
4
18
1
3
4
19
1
3
4
50 zdjec pozytywnych i 10 negatywnych
14
0
50
0
15
0
50
0
16
0
50
0
17
0
50
0
18
0
50
0
19
0
50
0
3.3
Wykrywanie znaków X
Dla znaku X zostało przeprowadzone mniej testów. Okazały się one bardziej czasochłonne niż pozostałe. Przykładowo dla 19-sto stopniowego klasyfikatora po dwóch godzinach nie udało się uzyskać rezultatu i zaprzestano
trenowania. Efekt najlepszego z uzyskanych klasyfikatorów można zobaczyć na rysunku 5.
8
Rysunek 4: Wykrywanie kół
L. stopni Trafionych Nietrafionych Błędnie
10 zdjęć pozytywnych i 10 negatywnych
14
6
44
0
15
15
35
1
16
6
44
0
17
4
46
0
18
4
46
0
20 zdjęć pozytywnych i 10 negatywnych
14
26
24
40
15
27
23
43
16
19
31
15
17
19
31
15
18
19
31
15
4
Podsumowanie
Przeprowadzone eksperymenty dały zadowalające wyniki. Jak widać na zdjęciach klasyfikatory dość dobrze
radziły sobie z rozpoznawaniem testowanych figur, choć sam proces znalezienia najlepszego z nich okazał się
trudny.
Okazuje się, że dla badanych figur dobre klasyfikatory uzyskuje się dla małej liczby zdjęć testowych. Wynika
to zapewne z prostoty samych figur (szczególnie koła).
Najważniejszym etapem w trenowaniu klasyfikatorów dla bardziej złożonych obiektów jest uzyskanie próbek
testowych o dobrych parametrach. Najlepsze są próbki trafnie reprezentujące możliwe odkształcenia obiektu,
stąd zapewne dla oryginalnych zdjęć (nie wygenrowanych komputerowo) uzyskanoby lepsze wyniki.
9
Rysunek 5: Wykrywanie znaków X
Literatura
[1] Pual Viola, Michael J. Jones, Rapid Object Detection using a Boosted Cascade of Simple Features, IEEE
CVPR, 2001.
[2] Marcin Namysł Wykorzystanie systemu wizyjnego do rozpoznawania emocji człowieka Praca dyplomowa,
magisterska, Wrocław 2008
[3] OpenCV Library - źródła http://sourceforge.net/projects/opencvlibrary/
[4] OpenCV Library - dokumentacja http://opencv.willowgarage.com/wiki/
10