본문 바로가기

Research/Paper

[Object Detection] Robust Real-Time Object Detection (1)

논문 정보

Paul Viola, and Michael Jones. International Journal of Computer Vision 57(2):137--154 (2002)


Haarr like feature..



Integral image : 현재 위치 (x, y)는 (0, 0)~(x~y)의 Pixel값들의 Sum으로 표시, 일종의 적분 이미지, 그러나 매우 단순해보임. 가능하나? 이런 생각이 듬.

왜? 매우 빠른 (극도의) feature 추출 방법을 선보임. 이는 Scale space에서 보다 강력함. (논문에서 11 pyramid 이미지에서 15fps)


이런 Integral image를 이용하여, 위의 4가지형태의 Haar like feature를 생성 수직/수평/대각선형태(이는 방향성을 지니고 있음) 즉, 두영역에서의 차이 = (흰영역 - 검은 영역) 이런식으로 계산, 그리고 두 영역은 같은 Size로 구성.


Learning..


- Adaboost를 적용. boosting - weak classifier의 결합 을 통해.

- weak란 의미는 Learner가 최고의 분류함수를 기대하지 않기때문에 쓰임.

- 첫번째 학습후에, 다음 학습은 이전의 분류기에 의해 부적확하게 분류된 것들을 강조하면서 re-weight된다. (첫번째 분류기보다 두번째 분류기가 더 강한듯!~)

- Greedy feature selection process : 작은 수의 좋은 feature를 선택함.

- 하나의 weak classifier는 하나의 feature로써만 구성됨. 이는  positive/negative data로 베스트하게 분리된 하나의 사각형 feature를 선택하도록 디자인.

- 각 weak classifier는 optimal threshold classification.

-  hj(x) : weak classifier를 다음과 같이 표현함.


hj(x) = 1, if p(j)*fj(x) < p(j)*threshold(j)

          0, otherwise


x = 24x24 sub window

p = parity 


** j 는 발생 시킨 haar like feature중의 하나란 의미

** f(x)의 x는 발생시킨 특정 haar like feature의 위치 

** 그러므로, f(x)는 그 위치의 haar like feature의 실제 값, 1 dimension이므로, a single feature가 적용됨을 알 수 있음.

** threshold는 haar like feature중의 하나 즉, 이 값이 기준이 되서, 이때의 전체 데이터셋과 평가

즉, 

for( i = a haarlike feature..)

for( j= a training set)

threshold = haar_like_features[i][j];

for( k= a training set){ 

// eval : optimal threshold 

weak classifier(threshold,, p, feature[i][k]);

..

// optimal (min) threshold - 아래 adaboost 참고

..

}

대충 이런 구조를 가진다는 의미

여기서, 이런 구조를 가지기 때문에, a weighted majority vote란 개념이 나오는듯~



- adaboost 학습알고리즘


(웹에서 찾아보니 이게 논문과 거의 같음)


복잡하게 되어 있는데 간단히 설명하면, 


* 초기 weight값을 정해야하는데, 이는 1/training_size 로 설정한다.

double weight[training_size];

for( int i=0; i<training_size; i++) weight[i] = 1./training_size;

T는 일정의 iteration인듯하다. 그냥 대충(?) 정해라.

for( int i=0; i<T; i++) 안에서 부터 시작한다.

** T는 최종 선형 선형 결합하는 weak classifier의 개수

** 위의 로직상 T는 feature의 dimension과 같이 해야하지 않을까?

* weak learn과 update weight는 당연히 위의 for문안에 놓인다.

* weak learn

** 주어진 training data에서 최소 에러를 갖는 Classifier를 찾는 것이다.  위의 3번째를 구현해야하는데(이 부분이 위의 사진과 약간 다르나 거의 같다)


for( int i=0; i<feature_dim; i++){

for(int j=0; j<data_size; j++){

error += (weight[j]*ABS(data[j][i]-labelled_data[j]));

}

if(error<threshold_data){

min_index = i;

threshold_data = error;

}

}

return weak_classifier = min_index;

** 보시는 거와 같이 리턴값(weak_classifier)은 feature의 index중의 하나를 리턴한다. 이것이 classifier의 index와 같다.(약간 논문설명이..??) 논란의 여지가 있지만, 보통 임의의 iteration를 지정하는듯, condition이 있다면, iteration < feature_dim ?? 추정

* update weight(위의 그림에서 4~5번)

** weight error를 구한다.

for(int i=0; i<data_size; i++) {

sum+=weight[i];

if(data[i][weak_classifier ]!=labelled_data[j]) error_weight+=weight[i];

}

error_weight = error_weight/sum;

weight_error = ((1-error_weight)/error_weight); // alpha = log((1-err)/err);

weakClassifier[weak_classifier] = weight_error;


** update 

for(int i=0; i<data_size; i++) 

if(data[i][weak_classifier ]!=labelled_data[j])  weight[i]= weight[i]*weight_error;

* 대충이런데 haar feature를 실적용할때 더 고민해야할듯 ㅠㅠ

** 대충 구조는 비슷하나, haar like feature = single feature를 적용하는데 있어서 차이를 보임.

* adaboost는 따로 디테일하게 포스트를 해야할듯~

- Cascade

* 각 Stage는 Adaboost Classifiers.

* 일종의 decision tree 형태(유사하나 동일하지는 않다)


* 전체 구조는

** Cascade Stage

Adaboost

Weak classifier

** 의문) 

*** 각 Stage는 똑같은 Training Set으로 반복 적용하는가?

*** 그러면, 무엇가 다른(update)가 존재해야하는데 what?

** cascade training 과정(중요성) 다음의 값을 Optimal 하게 찾는것이다.

*** Classifier stage의 수

*** 각 stage의 feature의 수

*** 각 스테이지의 Threshold


※ 이 제가 쓴 포스트들은 그냥 완성본이 아니라, 틀릴수도, 수정될수도, 덧붙혀질수도, 지워질수도 있습니다.


  • Next Post implementation



Reference

[1] http://cs.nju.edu.cn/wujx/RareEvent/rare_event.htm

[2] http://sijoo.tistory.com/52

[3] http://blog.naver.com/PostView.nhn?blogId=neverabandon&logNo=100167461139