본문 바로가기

Research/Paper

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



* Haar like feature

**  integral image

심플하다.. 수평방향으로  현재 pixel과 이전 픽셀을 더하고 이 결과값을 다시 인풋으로 해서 수직방향으로 더하면 Integral 이미지, 즉, 적분 이미지가 된다.

ref) 참고


coding) 

  for(int j=0; j<h; j++) _integral[j][0] = _image[j][0];

  for(int j=0; j<h; j++) // horizontal direction weighted sum

                for(int i=1; i<w; i++)

                        _integral[j][i] = (_integral[j][i-1]+_image[j][i]);    

        for(int i=0; i<w; i++) // vertical direction weighted sum

                for(int j=1; j<h; j++)

                        _integral[j][i] += _integral[j-1][i];        



 ** haar like feature

*** (개념) 흰색에서 검은색을 빼준다.

      *** 위의 그림에서 첫번째 haar like feature 구현.


(0, 0)                                                          ..                 (0,w)

|---------------------------------------------|

|     A           |       B            |        B'      | ..

|---------------------------------------------| ..

|     C           |       D            |        D'     | ...

|---------------------------------------------|

.....

 



      .....                                                                         (w,h)


있다면 실제 D이 하얀색, D'가 검은색인 2 rectangle의 Haar like feature을 구현한다면, 

즉, D-D' 을 구한다는 의미이다. 이는 다음과 같이 나타낼수 있다.

D region  = D-C-B+A;

D' region = (A+B+C+D+B'+D')-(A+B+B')-(A+B+C+D)+(A+B)


// Rect white(D), Rect black(D')

// integral = integral image

           // D

                double white_region = integral [white.y+white.height][white.x+white.width]-

                        integral [white.y][white.x+white.width]-

                        integral [white.y+white.height][white.x]+

                        integral [white.y][white.x]; 

             // D'

                double black_region =  integral [black.y+black.height][black.x+black.width]-

                        integral [white.y][black.x+black.width]-

                        integral [white.y+white.height][white.x+white.width]+

                        integral [black.y][black.x];


double haar = white_region-black_region;


**** 이런식으로 해서 2 rectanle, 4 retangle등을 만들수 있다. 

*** Rainer Lienhart(위의 그림 오른편)가 제안하 회전된 (titled) Haar feature는 어떻게 구현해야 할까? paper보고 별로 와닿지 않아서 (어떻게 해야할지 몰라서),여기 [링크1] 를 참고했다. 




45도를 회전한 Haar feature인데, 위의 그림에서 입력값은 (x=4, y=1)'s w = 4, h = 3 인 사각형을 입력 받는다. 좀 특이하다. 익숙치않음.


  *** Rotated Summed Area Table



이를 이용하여 사각형 영역을 계산한다.


즉, 다음과 같이, 구할수 있다. 입력값은 바로 위에 말한대로..



(위의 링크1 에 위의 그림처럼 하면되는데, tilted integral image(?)를 왜 저렇게 만드는지는 이해하지 못했음 ㅠㅠ )


링크 1에서 보면 다음과 같은 예가 나온다.


double img[13][15] =

            { //  0 1 2 3 4 5 6 7 8 9 A B C D E

          /*0*/ { 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9 },

          /*1*/ { 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9 },

          /*2*/ { 9,9,9,9,9,1,1,9,9,9,9,9,9,9,9 },

          /*3*/ { 9,9,9,9,1,1,1,1,9,9,9,9,9,9,9 },

          /*4*/ { 9,9,9,1,1,1,1,1,1,9,9,9,9,9,9 },

          /*5*/ { 9,9,1,1,1,1,1,1,1,1,9,9,9,9,9 },

          /*6*/ { 9,9,9,1,1,1,1,1,1,1,1,9,9,9,9 },

          /*7*/ { 9,9,9,9,1,1,1,1,1,1,1,1,9,9,9 },

          /*8*/ { 9,9,9,9,9,1,1,1,1,1,1,9,9,9,9 },

          /*9*/ { 9,9,9,9,9,9,1,1,1,1,9,9,9,9,9 },

          /*A*/ { 9,9,9,9,9,9,9,1,1,9,9,9,9,9,9 },

          /*B*/ { 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9 },

          /*C*/ { 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9  },

            };


        int x = 6, y = 2, h = 4, w = 6;

        integral =  titledintegralimage(img);  // 위의 링크1 참고    


        int a = integral [y - 1 + (1)][x - 1 + (2)];

        int b = integral [y + w - 1 + (1)][x + w - 1 + (2)];

        int c = integral [y + w - 1 + h + (1)][x + w - 1 - h + (2)];

        int d = integral [y + h - 1 + (1)][x - h - 1 + (2)];


RecSum(r) = (-a + b - c + d); 

48이 나온다 위의 배열에서 1이 48개다.

※ 우선은 이거를 제거하고 해볼예정


Next Adaboost + Haar like feaure