Wrocław 1.06.2008
This report describes an attempt to create a image recognition based system, that determines if lessons are taking place in lab07 (a laboratory in Wroclaw University of Technology). As image source, we used an IP-camera, located near ceiling of the laboratory. At the beginning we tried to create a system, based on feature extraction and a classifier. We've found very hard to extract more than two different features. The main problem were chairs which changed their location very often, and different light sources. Finally we used artificial neural network as a classifier (we've tested four different networks).
Projekt zakładał opracowanie systemu, który na podstawie obrazów z kamery internetowej umożliwi określenie czy w laboratorium odbywają się zajęcia. Kamera została umieszczona w sali 07 w budynku C-3, zdjęcia pobrano przez Internet, losowo, w przeciągu 10 dni.
W założeniach początkowych planowaliśmy wyekstrahowanie kilku (około 6) cech z każdego obrazka. Następnie cechy miały być wykorzystane do klasyfikacji za pomocą wybranego empirycznie klasyfikatora
W czasie zbierania zdjęć okazało się, że nawet człowiekowi sprawia trudność jednoznaczne określenie czy zajęcia się odbywają czy też nie. Dodatkowo w trakcie realizacji ekstrakcji cech okazało się że poważny problem na sali stanowią krzesła, które mogą przyjąć dowolną lokalizację na sali. Ponadto zmienne oświetlenie w sali i niekorzystne dla kamer internetowych światło jarzeniówek sprawiły, że udało się wyekstrahować tylko dwie cechy.
Pierwszą cechą jaką udało się uzyskać było znalezienie na obrazie koloru skóry. Drugą cechą było odnajdywanie ciemnych obiektów na tle białej ściany. Przyjęto obszar w którym nie powinny się znajdować krzesła i po odpowiedniej normalizacji uzyskano zadowalające efekty.
Efekt transformacji wyciągającej kolor skóry (po lewej) i znajdowania ciemnych obszarów na tle ściany (po prawej)
Już druga cecha wprowadziła znaczne ograniczenia - założenie że scena jest statyczna i nawet niewielka zmiana ustawienia kamery lub powieszenie kalendarza w sali może powodować, że potrzebna będzie solidna przeróbka algorytmów. Takie rozwiązanie było z oczywistych względów nie do przyjęcia.
Za wzorzec uznano arbitralne wyniki ręcznej klasyfikacji, czy zajęcia się odbywają czy też nie. W czasie klasyfikacji ręcznej staraliśmy się przestrzegać założenia, że zajęcia odbywają się kiedy na obrazkach widać współpracę grupy ludzi. Graniczne przypadki ilustrują poniższe fotografie:
Pomimo że na fotografii znajdują się osoby, uznano że zajęcia się nie odbywają.
Na tej fotografii widać że jest grupa osób które ze sobą współpracują, uznano że w tej chwili odbywają się zajęcia.
Do przetwarzania obrazów wykorzystano darmowy pakiet OpenCV. Program główny został napisany w środowisku Visual Studio 2005 w wersji legalnej, dostępnej dla studentów wydziału Elektroniki PWR w ramach MSDNAA.
Aby z obrazu wejściowego, uzyskać próbki dla sieci neuronowej, należy dokonać kilkuetapowej obróbki obrazu. W pierwszej kolejności usuwane są zakłócenia. Wykorzystano do tego dwufazowe wygładzanie. Pierwsza faza to wygładzanie przez rozmazanie (blur), druga to wygładzanie przez uśrednianie (median). Następnie obrazek jest konwertowany z RGB do skali szarości, oraz poddawany normalizacji. Tak przygotowany obrazek jest próbkowany, w zależności od wybranej sieci neuronowej próbkowane jest 120 (12x10) lub 480 (24x20) pikseli. Wartość maksymalna jasności piksela jest ograniczana do 250, ułatwia to późniejszą konwersję z zakresu jasności 0-250, na 0-1 ze zmiennym przecinkiem.
Na fotografii widać efekt przetwarzania obrazu (punkty oznaczają miejsca pobrania próbki)
Ze spróbkowanych i przeliczonych punktów tworzony jest wektor wejściowy dla sieci neuronowej.
Jako symulator sieci neuronowych wykorzystano darmowy pakiet SNNS. W ramach eksperymentu, przygotowano 4 różne sieci. Są to sieci typu feedforward, o 120 lub 480 neuronach wejściowych 6,12 lub 18 neuronach ukrytych i jednym neuronie wyjściowym. Wszystkie połączenia są typu full-connection. Dla zachowania przejrzystości ilustracji, na obrazkach zostało wyłączone rysowanie linii łączących neurony.
Najmniejsza sieć - o 120 węzłach wejściowych i 6 ukrytych
Największa sieć - o 480 węzłach wejściowych i 18 ukrytych
Program napisany w ramach projektu umożliwia utworzenie pliku .pat zawierającego wzór uczący dla
programu SNNS, oraz sprawdzenie serii za pomocą 4 wbudowanych sieci neuronowych.
Program działa w konsoli w systemie Windows.
Widok okna tytułowego programu
Folderem roboczym programu jest "C:/Obrazy/". W tym folderze powinny znajdować się dwa podfoldery: "C:/Obrazy/Pozytywne" i "C:/Obrazy/Negatywne". W folderach powinny znajdować się zdjęcia zatytułowane IMAGE(n).jpg, gdzie n jest liczbą indeksującą począwszy od 1 do maksymalnie 1000. Ważne żeby zachowana była ciągłość indeksowania. Program szuka obrazków o kolejnych indeksach, które mogą być pomieszane w podfolderach, jeżeli nie znajdzie obrazka o kolejnym indeksie w jednym ani w drugim folderze, uznaje że seria zdjęć została zakończona.
Po uruchomieniu programu powita nas okno tytułowe, aby utworzyć wzór dla programu SNNS należy wpisać z klawiatury "1" i zatwierdzić klawiszem ENTER. Następnie program zapyta nas z ilu obrazków ma się składać wzór. Wpisujemy właściwą liczbą i zatwierdzamy klawiszem ENTER. Teraz musimy wpisać nazwę pliku jaki nadamy wzorowi. Program automatycznie dodaje rozszerzenie .pat, plik znajdzie się w katalogu C:/Obrazy. Ostatnią rzeczą jaką musimy określić przed selekcją zdjęć, jest dla którego typu sieci tworzymy wzór. Wyświetlane są wszystkie cztery typy, należy wybrać czy sieć ma mieć 120 czy 480 neuronów wyjściowych, tyle zostanie zapisane we wzorze. Najważniejszym i ostatnim etapem jest wybranie zdjęć do wzoru, program wyświetla zdjęcie oraz zapyta czy ma ono zostać dodane do wzoru, możemy wcisnąć "t"(tak) i program wyświetli okienko z obrobionym obrazem (naciśnięcie dowolnego klawisza spowoduje zniknięcie okna i przejście do kolejnego obrazka) lub "n"(nie) - program wyświetli kolejne zdjęcie. Trzeba zwrócić uwagę na to że wprowadzanie znaków z klawiatury jest możliwe tylko przy aktywnym oknie z wyświetlanym obrazkiem. Naciśnięcie "q" (koniec) spowoduje zakończenie pracy programu, jednak wygenerowany wzór nie będzie poprawny. Kiedy dodamy ostatnie zdjęcie do wzoru, program automatycznie kończy działanie.
Widok programu w czasie tworzenia wzoru
Dzięki programowi snns2c wyeksportowano wyuczone sieci do funkcji języka C. Program snns2c
generuje plik C oraz h dla danej sieci .net. Pliki te dodano do programu głównego, przez co
można z nich korzystać w napisanym na potrzeby projektu programie.
Tryb testowania zdjęć wymaga od użytkownika podania zbliżonych parametrów co tryb tworzenia wzoru.
Istotną różnicą jest fakt że można wybrać tryb "a" automatyczny, kiedy program sam testuje wszystkie
zdjęcia z testu, a na koniec wyświetla statystykę. W tym trybie zdjęcia nie są wyświetlane.
W trybie "p" ręcznym, możemy sami zdecydować czy wyświetlone zdjęcie ma być testowane czy nie. Każdorazowo
program wyświetla wynik z sieci, a po wybraniu "q" koniec, program wyświetla statystykę z testowanych obrazów.
Ponieważ można testować wielokrotnie to samo zdjęcie (program porusza się w pętli po serii zdjęć) statystyki
mają charakter poglądowy. W utworzonym pliku .log można odczytać szczegółowy przebieg testu, pass - oznacza poprawną
odpowiedź sieci, fail - niepoprawną
Widok programu w czasie testowania obrazów
Przykładowy plik z danymi po weryfikacji:
Jako serię uczącą wybrano 50 zdjęć, 20 pozytywnych (są zajęcia) i 30 negatywnych (nie ma zajęć). Sieć uczono za pomocą algorytmu Standard Backpropagation, przy 100000 powtórzeń (kolejność losowa). Na wykresach błędu widać że zwiększanie liczby powtórzeń nie poprawi wyników, które po 100000 powtórzeń były zadowalające.
Przebieg błędu w trakcie uczenia sieci.
Za pomocą wyuczonych sieci przebadano 55 plików z obrazami. Wśród tych obrazów znajdowało się 20 obrazów pozytywnych i 35 negatywnych. Po przebadaniu obrazów za pomocą 4 sieci uzyskano następujące wyniki:
Liczba neuronów | Poprawnie rozpoznanych | Skuteczność [%] |
120 wejściowych 6 ukrytych | 53 | 96 |
120 wejściowych 12 ukrytych | 53 | 96 |
480 wejściowych 12 ukrytych | 53 | 96 |
480 wejściowych 18 ukrytych | 53 | 96 |
Okazało się że wszystkie sieci uzyskały zbliżoną skuteczność. Jednak sieci popełniały błąd na innych zdjęciach.
Zdjęcia sklasyfikowane błędnie przez sieci o 120 wejściach
Zdjęcia sklasyfikowane błędnie przez sieci o 480 wejściach
Widać że w przypadku sieci o 120 wejściach, jedno ze zdjęć powinno ewidentnie zostać zaklasyfikowane jako negatywne (brak zajęć), gdyż nie znajdują się na nim żadne osoby. Pozostałe źle zaklasyfikowane zdjęcia pokazują że sieci nie prawidłowo zaklasyfikować obrazów na których jest kilka osób.
Aby poprawić wyniki zwiększono serię uczącą do 80 obrazów, przez co seria testowa ograniczyła się do 25 obrazów. Uzyskano następujące wyniki:
Liczba neuronów | Poprawnie rozpoznanych | Skuteczność [%] |
120 wejściowych 6 ukrytych | 24 | 96 |
120 wejściowych 12 ukrytych | 24 | 96 |
480 wejściowych 12 ukrytych | 25 | 100 |
480 wejściowych 18 ukrytych | 25 | 100 |
Sieć o 120 wejściach nie potrafiła poradzić sobie z obrazem:
Zdjęcie sklasyfikowane błędnie przez sieci o 120 wejściach
Początkowe założenia trzeba było mocno zmienić, aby udało się zrealizować założenia. Rozwiązanie początkowe (bazujące na przetwarzaniu obrazów w celu ekstrakcji cech) można było stosować do końca, jednak przy najdrobniejszym poruszeniu kamery, lub drobnej zmiany na scenie - np. powieszenie kolorowego kalendarza, albo zapisanie tablicy na czerwono, klasyfikator pogubiłby się. Przyjęte rozwiązanie bazujące na sieciach neuronowych, jest nieco bardziej trywialne, jednak daje znacznie lepsze efekty. W trakcie ręcznej klasyfikacji zdjęć, pojawił się kolejny problem - nawet człowiek nie jest w stanie jasno określić czy na sali odbywają się zajęcia, czy tylko siedzi tam grupka osób korzystając z komputerów. Dokonano klasyfikacji arbitralnej, korzystając z faktu że sieć neuronowa nauczy się naszej metodologii klasyfikowania zdjęć. Udało się zrealizować cel zadania w zadowalającym stopniu. Okazało się że mniejsza sieć neuronowa - składająca się ze 120 neuronów wejściowych - jest za mała żeby poradzić sobie z problemem. Widać to kiedy po zwiększeniu liczebności serii uczącej - nie udało się poprawić jej wyników - nadal nie rozpoznaje zdjęć, które są dość "oczywiste". Natomiast sieć o 480 neuronach wejściowych, po wydłużeniu serii uczącej, poprawiła swoją skuteczność. Liczba neuronów ukrytych w sieci, nie odgrywała znaczącego wpływu na wyniki.