Projekt ma na celu stworzenie programu potrafiącego rozpoznawać markę danego samochodu na podstawie zdjęcia. Na zdjęciu musi być widoczny znaczek firmowy samochodu. Do wykonania zadania postanowiłem użyć program napisany w języku C++, wykorzystujący klasyfikator Haar’a, udostępniony wraz z biblioteką OpenCV. Podczas wykonywania projektu, ze względu na liczbę potrzebnych do jego wykonania zdjęć uczących i czas uczenia klasyfikatora, postanowiłem ograniczyć się do rozpoznawania znaczka jednej marki (audi) znajdującego się z przodu samochodu (na czarnym tle tworzonym przez grill samochodu). Rozpoznawanie innych znaczków można wykonać analogicznie. Wyniki uzyskanych eksperymentów są zadowalające. Aby były bardzo dobre należałoby douczyć sieć, co wiązałoby się z około tygodniową pracą komputera.
The aim of this project is to create a program that can identify brand of given car by photo. The house mark of the car must be exposed on the photo. To perform the task I decided to use the program written in C++ using Haar's classifier, accessible with OpenCV library. Carrying out the project, due to big amount of learning photos and time needed to learn the classifier, I decided to confine the program to identify house mark of one brand (Audi) placed in front of the car (on the black background created by the grill of the car). Identification of the other house marks can be performed similarly. The results of obtained experiments seem satisfying. In order to make them very good the network should be improved, what would be connected with almost week-long work of the computer.
Moim zadaniem było stworzenie programu rozpoznającego danych samochód ze zdjęcia. Głównymi cechami charakterystycznymi danego samochodu jest jego marka i model. Ponieważ modeli samochodów jest bardzo dużo chciałem, aby program potrafił rozpoznawać markę samochodu. Cechą wspólną samochodów danej marki jest niewątpliwie znaczek firmowy, który każda marka posiada. Jest on umieszczony z przodu i z tyłu każdego modelu samochodu. Znaczki umieszczone z przodu samochodu cechuje podobne otoczenie dla wszystkich modeli danej marki. Są one zasadniczo umieszczane w trzech miejscach:
Rys. 2. Przykładowe wykrycie znaczka.
W przypadku znaczków umieszczonych na masce, z powodu ich słabej widoczności rozpoznawanie marki samochodu należałoby oprzeć o inne cechy charakterystyczne dla danej marki (jak np. kształt świateł czy kształt grilla).
Po głębszym zapoznaniu się z możliwościami rozpoznawania znaczków firmowych samochodów postanowiłem skupić się na autach jednej marki. Wybór padł na markę audi ponieważ znaczek firmowy mocno odbiega od pozostałych swoim kształtem (nie jest okrągły lub prawie okrągły jak większość), nie posiada żadnych mało widocznych szczegółów, a przy zdjęciach z przodu samochodu (do których się ograniczyłem) jest on prawie zawsze umieszczony na czarnym grillu, który dobrze z nim kontrastuje.
Do rozpoznawania znaczku postanowiłem zastosować klasyfikator Haar'a. Pierwszym etapem pracy było zgromadzenie bazy zdjęć pozytywnych (zawierających znaczek audi), oraz negatywnych (na których znajdowały się inne samochody). Aby odpowiednio nauczyć klasyfikator wymaganych jest bardzo dużo zdjęć (kilka tysięcy). Z tego powodu postanowiłem nie wykonywać pojedynczych zdjęć, ale kręcić filmy, a następnie rozbierać je na poszczególne klatki. Rozdzielczość zdjęć użytych do nauki to 640x480, były one w formacie BMP i posiadały 256 kolorów. W ten sposób uzyskałem około 2000 zdjęć zawierających znaczek audi i około 4000 zdjęć tła. Następnym etapem była filtracja zdjęć pozytywnych, ponieważ niektóre były rozmazane (z powodu przemieszczania aparatu podczas kręcenia filmów), inne nieostre, albo źle oświetlone. Po filtracji zostało prawie 1000 zdjęć zawierających w wyraźny znaczek audi. Około 10% zdjęć ze zbioru pozytywnych i 5% ze zbioru zdjęć negatywnych zostało odłożone do późniejszych testów programu.
Następnie na każdym z około 900 pozytywnych zdjęć trzeba było określić położenie znaczka. Kolejnym etapem było wycięcie znaczka audi ze zdjęć pozytywnych i znormalizowanie go. Ze względu na kształt tego znaczka przeprowadziłem normalizację do rozmiaru 30x14 pikseli.
Po stworzeniu bazy uczącej i testującej, przystąpiłem do nauki klasyfikatora Haar'a. Nauka podzielona była na poziomy. Nauka każdego następnego poziomu trwała około 3 razy dłużej niż poprzedniego. Łączna nauka klasyfikatora trwała ponad 3 dni, pomimo tego osiągnięte rezultaty nie są w pełni satysfakcjonujące (niestety nauka następnego poziomu zajęłaby dodatkowo około tygodnia).
W moich badaniach skorzystałem z gotowego programu udostępnianego wraz z biblioteką OpenCV. Wprowadziłem do niego tylko kilka drobnych modyfikacji. Program był napisany w jeżyku C++ z użyciem darmowego środowiska Visual Express.
Program działa w różnych trybach, w zależności od argumentów podanych przy jego wywoływaniu. Może on szukać wzorca w podanej sekwencji wideo, w obrazie pobieranym na bieżąco z kamery, na danym zdjęciu, lub liście zdjęć.
W moim przypadku skorzystałem z funkcji wyszukiwania wzorca na zdjęciach podając przy wywołaniu plik zawierający listę zdjęć. Program wyświetlał okno z pierwszym zdjęciem z listy i w razie wykrycia wzorca oznaczał miejsce wystąpienia go czerwonym okręgiem, po czym nadpisywał dane zdjęcie. Po wciśnięciu spacji program przechodził do analizy następnego zdjęcia.
Rys. 2. Przykładowe wykrycie znaczka.
Rys. 3. Inny przykład wykrycia znaczka.
Rys. 4. Przykład w którym znaczek nie został niestety rozpoznany.
Do przykładów pozytywnych zostało wykorzystanych 5 różnych modeli samochodów marki audi. Każdy z modeli dostarczył programowi około 180 zdjęć uczących. Znaczki wzięte do nauki miały jednakową wielkość, bez względu na model z którego pochodziły, ponieważ wszystkie zostały znormalizowane do rozmiaru 30x14. Do testowania programu posłużyły zdjęcia tych samych modeli, z tym że zdjęcia testowe nie brały udziału w procesie uczenia. Każdy sfilmowany przeze mnie model audi dostarczył 20 zdjęć testowych. Oto wyniki rozpoznawania znaczka dla każdego z nich:
model 1 | model 2 | model 3 | model 4 | model 5 | łącznie | |
Liczba zdjęć testowych. | 20 | 20 | 20 | 20 | 20 | 100 |
Właściwie rozpoznane. | 17 | 11 | 5 | 0 | 4 | 37 |
Nie rozpoznane. | 3 | 9 | 15 | 20 | 16 | 63 |
Skuteczność rozpoznawania.[%] | 85 | 55 | 25 | 0 | 20 | 37 |
Tab. 1. Ilość poprawnie rozpoznanych znaczków wśród pozytywnych przykładów.
Do przykładów negatywnych wykorzystano 11 modeli samochodów różnych marek. Każdy z modeli dostarczył programowi ponad 300 zdjęć uczących. Do testowania programu posłużyły zdjęcia tych samych modeli, z tym że zdjęcia testowe nie brały udziału w procesie uczenia. Oto wyniki testów dla każdego z 11 modeli negatywnych:
model 1 | model 2 | model 3 | model 4 | model 5 | model 6 | model 7 | model 8 | model 9 | model 10 | model 11 | łącznie | |
Liczba zdjęć testowych. | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 220 |
Błędnie rozpoznane. | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Znaczek nie rozpoznany. | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 220 |
Szansa błędnego rozpoznania.[%] | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Tab. 1. Ilość poprawnie rozpoznanych znaczków.
Patrząc na wyniki badań zamieszczonych w tabelach widać, iż program poradził sobie bardzo dobrze z rozpoznawaniem modelu 1 samochodu. Wyniki rozpoznawania modelu 2 są średnie, natomiast trzech pozostałych modeli raczej niezadowalające. Gdy po przeprowadzaniu badań przyjrzałem się lepiej zdjęciom stwierdziłem, że model 1 i 2 zajmują trochę więcej miejsca w kadrze, niż pozostałe trzy, a zatem same znaczki tych aut są bardziej wyraźne (większe). Dodatkowo grille dwóch pierwszych modeli były duże, dzięki temu na około znaczka było dużo "czarnego pola". W przypadku trzech pozostałych modeli grille były szerokie, ale kończyły się zaraz powyżej i poniżej znaczka. Przez to znaczek mógł od góry i od dołu zlewać się z chromowaną obwódką grilla.
Jeżeli chodzi o mylenie się stworzonego przeze mnie systemu rozpoznawania samochodów marki audi, muszę przyznać, iż nie odnotowałem takich problemów. Żadne z negatywnych zdjęć testowych nie zostało błędnie zaklasyfikowane jako audi. Wniosek z tego płynący jest taki, że jeżeli program zaklasyfikuje obiekt na zdjęciu jako audi, to na pewno się nie pomylił.
Po realizacji tego zadania uważam, że program wykorzystujący klasyfikator Haar'a, dostarczony wraz z darmową biblioteką OpenCV nadaje się do detekcji wybranego obiektu (wyuczonego wcześniej wzorca) na zdjęciu. Natomiast samo zagadnienie rozpoznawania znaczków samochodów ze zdjęć jest kwestią trudną. W moim przypadku wybrałem tylko jeden znaczek, który wydał mi się w miarę charakterystyczny i posiadający odróżniające się od niego tło (znaczki audi zawsze znajdują się na grillu). Mimo tego, tylko w niektórych przypadkach programowi udało się rozpoznać znaczek. Myślę, iż w przypadku np. znaczka bmw, który to "położony" jest na masce samochodu, jest okrągły (jak wiele ze znaczków) i mniejszy od audi prawidłowe rozpoznawanie mogłoby być bardzo trudne.