Haar kaskadni klasifikator


Motivacija

Kaskadni klasifikatori sa Haar karakteristikama prvi put su upotrebljeni i formulisani kao rešenje problema detekcije ljudskog lica na slici (Viola-Jones). Ovakvi sistemi kao osnovni zahtev imaju da treba da budu veoma efikasni i na slabim platformama, tako da mogu da funkcionišu u realnom vremenu na prihvatljiv način. Kaskadni klasifikatori predstavljaju način upotrebe više klasifikatora kako bi se dobilo pouzdanije rešenje, tako što se informacija na izlazu prethodnog klasifikatora koristi kako bi se trenutnom klasifikatoru pružila dodatna informacija o obrađivanim podacima. Efikasnost i veća pouzdanost se postiže i upotrebom samih Haar karakteristika slike koje se veoma brzo izračunavaju, pritom pružajući dodatne informacije bitne za detekciju objekata, za razliku od nestrukturiranih karakteristika poput boje i osvetljenja.

Za razliku od pokušaja rešavanja detekcije saobraćajnih znakova upotrebom tipičnog klasifikatora, kaskadni klasifikator se obučava na osnovu kako pozitivnih, tako i negativnih primera, čime bi neki od problema prethodno navedenog pristupa trebali biti rešeni.


Postupak

Postupak za pripremu i upotrebu kaskadnog klasifikatora zasnovanog na Haar osobinama slike sastoji se od prikupljanja podataka, obučavanja klasifikatora i na kraju primene obučenog klasifikatora na konkretnim primerima.

Podaci

Skup podataka koji je upotrebljavan za obučavanje klasifikatora je GTSRB skup saobraćajnih znakova, dok je za validaciju i proveru klasifikatora primenjenog za detekciju objekata upotrebljavan GTSDB skup scena sa anotiranim saobraćajnim znakovima. Za negativni skup korišćene su nasumične slike koje ne sadrže objekte od interesa.

Zbog veoma velike zahtevnosti izračunavanja i obučavanja pouzdanog klasifikatora, gde je za dovoljno dobar klasifikator neophodan dovoljno veliki skup kako pozitivnih i negativnih slika, tako i dovoljan broj iteracija kako bi klasifikator postao dovoljno pouzdan, u ovom slučaju ispitivan je klasifikator za neke kategorije znakova.

Obučavanje

Obučavanje klasifikatora zasniva se na upotrebi alata OpenCV distribucije za obučavanje kaskadnih klasifikatora. Pozitivni i negativni uzorci slika razvrstani su i obeleženi na način propisan tehničkom dokumentacijom.

Kako bi se poboljšale performanse u smislu pouzdanosti klasifikatora, pozitivni uzorci za obučavanje kreiraju se tako što se na osnovni pozitivni uzorak slike primene geometrijske i svetlosne transformacije, a zatim postave na pozadinu koju čini neki od negativnih uzoraka, kako bi se u što većoj meri smanjila verovatnoća lažnog pogotka. Skripta za generisanje uzoraka napisana je i upotrebljena na osnovu postojeće OpenCV distribucije koja poseduje funkciju za kreiranje uzoraka za obučavanje - opencv_createsamples. Na ovaj način se od manjeg broja uzoraka transformacijama može postići veći broj raznolikih slika koje omogućavaju da klasifikator nakon obučavanja bude precizniji.

Veličina uzorka slike varirana je od 20x20 do 40x40 piksela. Broj pozitivnih i negativnih uzoraka je u odnosu 1:1, dok je broj klasifikatora za kaskadu od 15 do 20. Klasifikator se obučava tako da je minimalna verovatnoća pogotka što veća, veća od 0.95, dok je najveća verovatnoća lažnog pogotka postavljena na 0.5.

Boosting algoritam koji se koristi je Gentle AdaBoost. Boosting je tehnika uz pomoću koje se skup slabih klasifikatora kombinuje tako da se formira jak klasifikator.

Primena obučenog klasifikatora

Primer 1

Neophodni moduli se učitavaju i postavlja se ranije obučeni kaskadni klasifikator. Slika za detekciju se učitava i prevodi iz RGB u grayscale domen.

Veličina pozitivnih uzoraka je 24x24 piksela, pozitivni hit rate je 99.5%, minimalni false alarm je 50%, dok se upotrebljavaju sve Haar karakteristike (horizontalne, vertikalne i rotirane).


In [26]:
import cv2
from matplotlib import pyplot as plt

cv2.ocl.setUseOpenCL(False)

stop_cascade = cv2.CascadeClassifier('models/stop/stop_win.xml')
street_1 = cv2.imread('models/00074.png')
street_2 = cv2.imread('models/00115.png')
street_3 = cv2.imread('models/00140.png')

gray_1 = cv2.cvtColor(street_1,cv2.COLOR_RGB2GRAY)
gray_2 = cv2.cvtColor(street_2,cv2.COLOR_RGB2GRAY)
gray_3 = cv2.cvtColor(street_3,cv2.COLOR_RGB2GRAY)

Kako bi se detektovali objekti koji nisu nužno veličine obučavajućeg skupa, primenjuje se multi scale detekcija, gde se sliding window površina skalira u skladu sa parametrom scaleFactor. Rezultat poziva klasifikatora jesu regioni u kojima je detektovan potencijalni znak.


In [27]:
detected_1 = stop_cascade.detectMultiScale(
    gray_1, 
    scaleFactor=1.1, 
    minNeighbors=30
    )

for (x,y,w,h) in detected_1:
    cv2.rectangle(street_1,(x,y),(x+w,y+h),(255,0,0),2)

plt.imshow(cv2.cvtColor(street_1,cv2.COLOR_BGR2RGB))
plt.show()



In [28]:
detected_2 = stop_cascade.detectMultiScale(
    gray_2, 
    scaleFactor=1.1, 
    minNeighbors=30
    )

for (x,y,w,h) in detected_2:
    cv2.rectangle(street_2,(x,y),(x+w,y+h),(255,0,0),2)

plt.imshow(cv2.cvtColor(street_2,cv2.COLOR_BGR2RGB))
plt.show()



In [29]:
detected_3 = stop_cascade.detectMultiScale(
    gray_3, 
    scaleFactor=1.1, 
    minNeighbors=30
    )

for (x,y,w,h) in detected_3:
    cv2.rectangle(street_3,(x,y),(x+w,y+h),(255,0,0),2)

plt.imshow(cv2.cvtColor(street_3,cv2.COLOR_BGR2RGB))
plt.show()


Predhodni primeri demonstrirali su upotrebu obučenog Haar kaskadnog klasifikatora za stop znak. Moguće je uočiti da je moguće da će se javiti lažne detekcije. Moguće je i da je region u kojem se znak nalazi suviše mali (suviše udaljen znak), gde će detektor takav region smatrati za negativni po pitanju detekcije, zbog suviše male površine u smislu veličine znaka, da bi se on mogao pozitivno detektovati.

Primer 2

Kaskadni klasifikator koji obuhvata manje skupove svih mogućih znakova obučen je, veličina uzorka je 20x20, minimalni hit rate je 99.5%, false alarm 50%, a obuhvata samo osnovne Haar karakteristike: horizontalne i vertikalne.


In [34]:
import cv2
from matplotlib import pyplot as plt

cv2.ocl.setUseOpenCL(False)

stop_cascade = cv2.CascadeClassifier('models/test/cascade_win.xml')
street_1 = cv2.imread('models/00879.png')
street_2 = cv2.imread('models/00882.png')
street_3 = cv2.imread('models/00140.png')

gray_1 = cv2.cvtColor(street_1,cv2.COLOR_RGB2GRAY)
gray_2 = cv2.cvtColor(street_2,cv2.COLOR_RGB2GRAY)
gray_3 = cv2.cvtColor(street_3,cv2.COLOR_RGB2GRAY)

In [35]:
detected_1 = stop_cascade.detectMultiScale(
    gray_1, 
    scaleFactor=1.1, 
    minNeighbors=30
    )

for (x,y,w,h) in detected_1:
    cv2.rectangle(street_1,(x,y),(x+w,y+h),(255,0,0),2)

plt.imshow(cv2.cvtColor(street_1,cv2.COLOR_BGR2RGB))
plt.show()



In [36]:
detected_2 = stop_cascade.detectMultiScale(
    gray_2, 
    scaleFactor=1.1, 
    minNeighbors=30
    )

for (x,y,w,h) in detected_2:
    cv2.rectangle(street_2,(x,y),(x+w,y+h),(255,0,0),2)

plt.imshow(cv2.cvtColor(street_2,cv2.COLOR_BGR2RGB))
plt.show()



In [37]:
detected_3 = stop_cascade.detectMultiScale(
    gray_3, 
    scaleFactor=1.1, 
    minNeighbors=30
    )

for (x,y,w,h) in detected_3:
    cv2.rectangle(street_3,(x,y),(x+w,y+h),(255,0,0),2)

plt.imshow(cv2.cvtColor(street_3,cv2.COLOR_BGR2RGB))
plt.show()



Diskusija

Haar kaskadni klasifikator predstavlja veliko poboljšanje u odnosu na ranije ostvarene performanse. Predstavlja potencijalno real time rešenje u smislu vremenskog ograničenja zbog veoma brze obrade slike i detekcije objekata.

Objekti su statični u smislu izgleda i pozicije, sa manjim varijansama koje je moguće kompenzovati dobrim skupom podataka gde će takve varijanse biti unete u procesu kreiranja pozitivnih primera. Slabiji procenat pogodaka svodi se na regione slike koji su suviše udaljeni, dok se u zavisnosti od obučavanja javlja veliki broj lažnih pogodaka.

Smanjenje broja lažnih pogodaka svodi se na kreiranje velikog skupa podataka kako pozitivnih, a pre svega mogućih negativnih slika i uspešnom obučavanju. Obučavanje preciznog i pouzdanog klasifikatora je moguće, ali zahteva velike prostorne i vremenske resurse u zavisnosti od konfiguracije računara i vrste klasifikatora. Haar kaskadni klasifikator istorijski je među prvim metodama za uspešnu detekciju ljudskog lica i dokazano je efikasan, tako da ovaj pristup predstavlja jedno od mogućih pozitivnih rešenja.

Detekcija svih znakova mogla bi se ostvariti kreiranjem velikog kaskadnog klasifikatora na osnovu svih Haar karakteristika (vertikalne, horizontalne, rotirane), uz veliki broj pozitivnih i negativnih primera. Kako bi ovaj klasifikator bio robustan potrebno je intenzivno obučavanje i veliki broj primera, pre svega negativnih. Međutim, za ovaj poduhvat potrebni su resursi i vreme koje je u proseku više od nedelju dana za obučavanje.

Drugi pristup je obučavanje više klasifikatora i njihovo serijsko primenjivanje na sliku. Ovaj pristup je povoljniji jer se mogu dodavati dodatni klasifikatori i u istom momentu se vrši i detekcija i klasifikacija objekata, međutim, zahteva mnogo više računanja i real time performanse bile bi smanjene u zavisnosti od broja takvih klasifikatora.



In [ ]: