Rozpoznawanie znaków drogowych
Autorzy: Przemysław Bojko
Data: 30 czerwca 2009
Raport opisuje projekt opracowany aby spełnić wymagania kursu: Metody i algorytmy sztucznej inteligencji.
Identyfying roadsign.
Authors: Przemysław Bojko
Date: June 30, 2009
This report describes a project done to fulfill the requirements for the course: Methods and algorithms of artificial intelligence.
1.Abstract:
Of this project I want to create a program that can identify roadsigns which we have on the photo. I use a ready program accessible with OpenCV library. I decided to use the program written in C++ using Haar's classifier. I have to do a lot of picture where can we find roadsign. I decided to find one roadsign – rigth of way.
1.Streszczenie:
Celem projektu było stworzenie programu który umożliwia rozpoznawanie znaków drogowych na zdjęciach. W tym celu posłużyłem się gotowymi programami udostępnionymi wraz z biblioteką Open CV. Wykorzystują one klasyfikator Haar'a który umożliwia stworzenie bazy wiedzy. W tym celu należało zgromadzić zdjęcia zawierające dany znak. Do projektu wybrałem jeden znak drogowy – znak pierwszeństwa.
2.Opis zadania:
Moim zadaniem było stworzenie programu, który umożliwi wykrywanie znaku pierwszeństwa na dowolnym zdjęciu wykonanym w kabinie samochodu. Klasyfikator Haar'a wymaga bardzo dużej bazy zdjęć na której znajduje się dany obiekt. W tym celu podczas jazdy po ulicach Legnicy zrobiłem ok 2000 zdjęć. Wśród nich znajdowały się zdjęcia zawierające znak pierwszeństwa (ok 500 zdjęć), znak ustąp pierwszeństwa (ok 500 zdjęć), oraz inne zdjęcia które posłużyły jako zdjęcia negatywne dla klasyfikatora.
Mając gotowe zdjęcia podzieliłem je na dwie grupy, zdjęcia pozytywne (zawierające znak), oraz zdjęcia negatywne (brak znaku, rozmazanie, część znaku, reklama w tle). Najbardziej czasochłonne okazało się stworzenie pliku, który zawiera informacje o nazwach plików, położeniu znaku na zdjęciu, oraz jego rozmiarze. Przykładowa struktura takiego pliku:
gl\IMG_4571.jpg 1 466 668 53 53
gl\IMG_4572.jpg 1 483 642 78 78,
gdzie po nazwie pliku występują kolejno:
liczba obiektów na zdjeciu
współrzędna x obiektu,
współrzędna y obiektu,
szerokość obiektu,
wysokość obiektu.
Najprostszym sposobem odczytywania tych danych ze zdjęciabyło wykorzystanie programu IrfanView. Po stworzeniu takiego pliku należało znormalizować rozmiar znaku (do rozmiaru 20 x 20 pikseli). Należało także stworzyć bazę zdjęć do testowania poprawności działania programu. W tym celu zrobiłem dodatkowo ok 200 zdjęć. Tworzenie bazy testującej polega na stworzeniu pliku z listą zdjęć testowych.
Kolejnym krokiem było uruchomienie programu (dostarczonego wraz z biblioteką) który uczył klasyfikator. Ze względu na bardzo małą liczbę zdjęć (powinno ich być ponad tysiąc) udało mi się przeprowadzić klasyfikator przez 14 etapów. Program utworzył plik cascade.xml w którym znajdowała się baza wiedzy. Przy jej pomocy został uruchomiony program testujący działanie programu.
3.Opis implementacji programowej
W moim projekcie wykorzystałem przykładowe programy dostarczone wraz z biblioteką OpenCV.
4.Przykłady działania programu
Poprawnie
odnaleziony znak.
Błąd
programu, wskazany jest znak i korona drzewa.
5.Zestawienie wyników
Wykorzystując wcześniej utworzoną listę plików testowych sprawdziłem działanie programu. Na każdym testowym zdjęciu znajdował się znak pierwszeństwa. Klasyfikator w połowie przypadków prawidłowo odnalazł znak, rzadko wskazywał błędne miejsce.
6.Podsumowanie wyników i wnioski.
Okazuje się że stworzenie własnego klasyfikatora wymaga bardzo dużo czasu. Wymagana jest bardzo duża liczbą zdjęć uczących dzięki czemu możemy uzyskać zadowalające wyniki. Poprawność ta zależy również od czasu (ilości kroków) które zezwolą klasyfikatorowi na poprawną naukę. Rozpoznawanie pojedynczego znaku drogowego wydaje się proste ze względu na jednorodny kształt oraz kolor. Jednakże każdy znak był inaczej oświetlony i był robiony pod innym kątem co przeszkadzało w poprawnym interpretowaniu znaku ze zdjęć. W moim projekcie posiadałem małą bazę zdjęć aby uzyskać celujący wyniki. Co jest zaskakujące, przy testowaniu działania programu wykorzystałem również zdjęcia którymi posłużyłem się przy uczeniu klasyfikatora. W niektórych przypadkach znaki nie były poprawnie odnalezione.
Uważam, iż program wykorzystujący klasyfikator Haar'a, wraz z biblioteką OpenCV sprawdza się w znajdowaniu wybranego obiektu ze zdjęcia. Wybrałem jeden znak drogowy, który wydał mi się charakterystyczny i posiadający odróżniające się od niego tło. W niektórych przypadkach programowi udało się rozpoznać znaczek. Jest to satysfakcjonujący wynik uwzględniając fakt że robiłem to po raz pierwszy.
Z projektu wyniosłem wiele wniosków. Wiem iż powinienem zrobić więcej lepszej jakości zdjęć, bo choć dużo ich zrobiłem program nie dał rady nauczyć się rozpoznawać znak ze wszystkich przypadkach. Największe powodzenie odnalezienia znaku mają zdjęcia zrobione na wprost niego. Zmiany kąta, oświetlenia wpływają negatywnie.
7.Zestawienie wykorzystanych materiałów źródłowych.
8.Narzędzia użyte do realizacji projektu:
biblioteka OpenCV (freeware)
IrfanView (freeware)