Rozpoznawanie znaków drogowych przy użyciu sieci neuronowej Kohonena.
Sławomir Sudół Raport wykonany w ramach projektu z kursu "Artificial Intelligence" |
Prowadzący: |
dr inż. Witold Paluszyński |
Data: 12.01.2012
|
Traffic sign recognition using Kohonen Neural Network
Sławomir Sudół The project described in this report has been completed to fulfill the requirements for the course: 'Artificial Intelligence'. |
Instructor: |
Witold Paluszyński, Ph.D |
Date: January 12th, 2012 |
1. Wstęp
Celem projektu było stworzenie aplikacji, która może zostać użyta w rozpoznawaniu znaków drogowych. Aby go osiągnąć zdecydowałem się na następujące, ogólne założenia:
· Dane wejściowe – znaki drogowe – podawane są w formie nieprzetworzonej. Implikuje to wykonanie rozbudowanego modułu wstępnego przetwarzania w aplikacji, aby rozpoznać i odseparować znak drogowy od innych obiektów znajdujących się na zdjęciu.
· Rozpoznawanie wzoru znaku wykonane jest za pomocą sieci neuronowej Kohonena. Dalsze założenia dotyczące parametrów sieci zostaną omówione w dalszej części dokumentu.
2. Implementacja
Aplikacja została podzielona na trzy części:
· Preprocessor
· Engine
· View
Preprocessor odpowiedzialny jest za wczytanie zdjęcia oraz przetworzenie go do postaci umożliwiającej wykorzystanie przez sieć neuronową. Wczytany obraz powinien być w formacie JPEG. Pierwszym krokiem przetwarzania jest zlokalizowanie określonego kształtu znaku. W trakcie realizacji tej funkcjonalności ustaliłem, że znaki powinny mieć kształt zbliżony do okręgu. Aby dokonać lokalizacji kształtu znaku, skorzystałem z biblioteki OpenCV, która oferuje m.in. możliwość nałożenia filtra czy detekcję krawędzi kształtów obecnych na zdjęciu. Do odnajdywania znaków dopasowałem parametry:
· Odległość między dwoma potencjalnymi znakami – 600 pikseli – powoduje brak możliwości rozpoznania dwóch lub więcej znaków znajdujących się obok siebie. W zasadzie na obrazie można rozpoznać tylko jeden znak. Z drugiej strony eliminuje się wszelkie kształty, które przynajmniej częściowo przypominają okrąg, a znajdują się w pobliżu znaku np. lampy i światła pojazdów mogące zostać potraktowane jako potencjalny znak.
· Minimalna średnica znaku – 40 pikseli – co zapobiega wykrywania tzw. fałszywych pozytywów. Zbyt wyczulony detektor wykrywa wiele kształtów zbliżonych kształtem do okrągłego niezależnie od wielkości.
· Maksymalna średnica znaku – 500 pikseli – aby dwa (lub więcej) owalne kształty, znacznie od siebie oddalone, nie powodowały rozpoznania jako jednego obiektu.
Wykryty i wycięty znak jest następnie normalizowany do wielkości 30x30 pikseli. Obecne kolory są redukowane do dwóch – czarnego i białego. Redukcja wykonywana jest za pomocą funkcji bibliotecznej języka Java (*). Po takiej obróbce obraz jest reprezentowany przez macierz 900 elementów (neuronów wejściowych) o wartościach -0.5 i 0.5 odpowiednio dla koloru czarnego i białego. Sieć Kohonena pracuje optymalnie, gdy neurony wejściowe posiadają wartości symetryczne względem zera w przedziale [-1, 1].
Kolejnym elementem aplikacji jest Engine. Zawiera on implementację sieci neuronowej Kohonena. Poniżej wypisałem kilka istotnych cech sieci Kohonena.
· Nie zawiera ukrytych warstw między warstwą neuronów wejściowych i warstwą neuronów wyjściowych.
· Przy przejściach między neuronami nie korzysta się z funkcji aktywacji
· Ilość rozpoznawalnych (trenowanych) wzorców jest równa ilości neuronów wyjściowych
· Uczenie sieci jest bez nadzoru.
Sieć z dwoma warstwami może rozwiązywać tylko liniowo separowalne problemy. Aby sieć mogła rozwiązywać skomplikowane problemy, używa się wektoru wejściowego z dużą liczbą neuronów. Na podstawie wzorca podawanego na wejście sieci, po każdej iteracji algorytmu otrzymuje się tylko jeden neuron zwycięski ze zbioru neuronów wyjściowych. Poniżej zaprezentowany został algorytm, według którego pracuje sieć Kohonena.
3. Testy i wnioski
Do przetestowania sieci neuronowej przygotowałem zbiór 60 zdjęć znaków drogowych. Zostały one ręcznie wyselekcjonowane z większego zbioru, który zawierał również 2 rodzaje zdjęć:
· rozmazane
· z wieloma znakami o niewielkich rozmiarach.
Zdjęcia wyselekcjonowane przeszły etap preprocessingu co oznacza, że znak drogowy został zidentyfikowany, wycięty oraz zmieniony na postać znormalizowaną.
Zgromadzone zdjęcia wykonane zostały zarówno w świetle słonecznym jak i po zmroku. Jakość każdego to 2592 x 1936 pikseli.
Jak widać, wartości w macierzy wag są losowe.
Błąd wyraża wartość, która mówi jak dobrze sieć jest aktualnie wytrenowana. Ta informacja jest potrzebna do stworzenia macierzy poprawek, która jest wykorzystywana do wyregulowania wag między neuronami. Każdy wektor wejściowy, będący elementem zbioru treningowego, jest prezentowany aktualnie istniejącej sieci neuronów. Sprawdzamy który neuron wygrał i staramy się zoptymalizować wagi, tak aby przy kolejnej iteracji algorytmu odpowiedź sieci była lepsza. Ilość wygranych każdego neuronu wyjściowego jest zapisywana. Ostatecznie, przed zakończeniem trenowania sieci, każdy neuron powinien wygrać przynajmniej jeden raz. Dlatego istotnym krokiem jest śledzenie wygranych poszczególnych neuronów i jeśli dany neuron wygrywa zbyt często, przy jednej z iteracji nie jest brany pod uwagę jako potencjalny zwycięzca.
Jeśli po zaprezentowaniu elementu ze zbioru treningowego sieci z poprawionymi wagami w poprzednim kroku, przeliczony błąd w obecnym kroku wynosi mniej niż 0.05, to oznacza brak korzyści z kolejnych iteracji i można zakończyć algorytm uczenia. W tym momencie sieć neuronowa reprezentuje najlepszą możliwą konfigurację przy dobranych parametrach wejściowych i danym zbiorze treningowym.
Sieć neuronowa uczy się ze współczynnikiem 0.5. Ta wartość została ustawiona po odpowiedniej ilości testów. Do nauki wybrałem metodę addytywną.
Podsumowując, parametry sieci neuronowej są następujące:
· Zbiór treningowy składa się z 7 obrazków, które przedstawiają idealnie odwzorowane znaki drogowe. Wybrałem okrągłe znaki zakazu:
· Współczynnik uczenia – 0.5
· Akceptowalny poziom błędu – 0.05
· Metoda nauki – addytywna
· Neuron zwycięzcy nie wpływa na wagi neuronów sąsiadów
Po nauczeniu sieci rozpoznawania znaków oraz wyselekcjonowaniu zdjęć, na których poprawnie udało się rozpoznać znak drogowy, przeszedłem do badań skuteczności działania sieci neuronowej. W tym celu użyłem 23 zdjęcia wykonane w świetle naturalnym jak i sztucznym podobne jakościowo do tych, które umieściłem poniżej.
Widok po wczytaniu jednego ze zdjęć ze zbioru testowego i próbie rozpoznania:
Poniższa ilustracja przedstawia sytuację, gdy znak został błędnie rozpoznany:
Po wykonanym eksperymencie otrzymałem następujące rezultaty:
· 8 zdjęć zostało rozpoznane – skuteczność około 35%
· Znaki takie jak „Zakaz wjazdu samochodów ciężarowych” lub “Zakaz wjazdu” są dominujące nad innymi w tym sensie, że wygrywają częściej od pozostałych.
· Kolejność wprowadzanych danych treningowych ma znaczenie. Innymi słowy struktura sieci może się różnić w zależności od kolejności prezentowanych obrazów.
Wnioski, które udało mi się wysnuć na podstawie przeprowadzonego badania:
· Przy wykonanej ilości zdjęć – 60 i wyselekcjonowaniu około 23 zdjęć z poprawnie rozpoznanym owalnym kształtem, trudno oszacować zachowanie stworzonego przeze mnie narzędzia w normalnych warunkach. Mam tu na myśli pobieranie obrazów z kamery umieszczonej na samochodzie. Podejrzewam, że przy dużej ilości zdjęć jednego znaku szansa na jego zlokalizowanie i rozpoznanie znacznie wzrośnie.
· Zbiór treningowy pozbawiony zdjęć podobnych do tych, które znajdują się w zbiorze testowym, nie pozwolił sieci neuronowej na skuteczną naukę.
· Po poprawnym rozpoznaniu znaku, powinien on zostać dołączony do zbioru treningowego, aby spowodować lepszą adaptację sieci do rzeczywistych warunków.
1. Literatura
· Jeff Heaton, Introduction to Neural Networks for Java, 2ndEdition, Heaton Research
· http://www.naukajazdy.pl/index.html