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