Faster R-CNN 논문 요약

Faster R-CNN 

논문명: Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks (2015)

저자: Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun


요약


1. Fast R-CNN의 경우 Regional proposal을 만드는데 너무 많은 시간이 소요됨
- Selective search의 경우 이미지 당 2초가 소요됨. 따라서 Selective Search + Fast R-CNN 조합으로는 real-time analysis가 불가능 함

2. Region Proposal Networks (RPNs)을 통해 이미지당 10ms라는 속도로
proposal 추출 가능하며, RPN + Fast R-CNN 조합을 통해 이미지당 10%의 속도 (대략 198ms)로 구현 가능 함

3. 특히, RPN + Fast R-CNN의 경우 정확도(Accuracy) 또 기존의 Selective Search + Fast R-CNN 보다 더욱 높게 나타남. 즉, 정확도와 속도 모두를 향상 시킬 수 있는 방법 임.

 Object proposal
   - Grouping super-pixels:  Selective search 등
   - Sliding windows: EdgeBoxes 등
   - Object proposal은 외부 별도의 모듈로써 도입 되었음

 Object detection
   -  R-CNN
   -  Bounding box 생성:
        OverFeat, MultiBox, DeepMask

  Faster R-CNN
   - 두 가지 모듈로 구성 되어 있음
      1) RPN (Fully convolutional network로 Region proposal 수행)
      2) Fast R-CNN
   - attention 알고리즘으로 RPN 모듈이 Fast R-CNN 모듈에게 어디를 봐야하는지를
      알려줌
   - RPN과 Fast R-CNN이 같은 set of convolution layers를 공유하는 것이 중요 함





주요 내용 정리


1) Regional Proposal Networks
   - 이미지를 받아서 여러 정사각형 형태의 proposal을 생성하며, 각각의 proposal은
      objectness score가 있다.
   - RPN은 Fully Convolutional network으로 진행하며, 이번 실험에서는 ZF 및 VGG16을 이용하였다. (ZF는 5개의 공유가능한 convol layers, VGG는 13개 있음)
   - Proposal 생성을 위해 작은 Fully Convolutional network을 마지막 공유 가능한 convolution layer로 생성된 feature map에 slide 시킨다.
   - 이 작은 network는 map 상에서 n x n (여기서는 n=3) 윈도우를 input으로 가지며, 각 윈도우는 ZF의 경우 256-d, VGG16의 경우 512-d의 feature로 매핑된다.  이러한 feature 들은 box- regression layer 및 box-classification layer로 input으로 쓰이게 된다.


2)  Anchors
  - sliding 윈도우는 각 location마다 최대 k개의 proposal을 만들어 낸다. 따라서 reg layer는 총 4k output이 나오며 (k * 4개의 좌표 값), cls layer는 2k의 스코어 output이 나온다. (two-class softmax layer로써 object 또는 not object의 확률값 임).  각각의 proposal은 anchor라고 부르며, sliding 윈도우에 중심 위치를 가지고 있으며 각각의 스케일과 형태를 가지고 있다. 이번 실험에서는 기본적으로 3개의 스케일과 3개의 형태 비율을 가지고 각각의 sliding 윈도우 마다 총 9개의 anchor를 생성한다. 따라서, WxH의 feature map에 대해서 총 WHk개의 anchor가 생성이 된다.







   - Translation-Invariant anchors
     만약 이미지 안의 object에 대해 translation이 일어난다면, proposal도 역시 translation이 되어야하며, proposal을 만드는 function도 마찬가지로 translation 전/후의 이미지에서 같은 proposal을 만들어내어야 한다.  우리의 실험은 Translation-invariant를 보장하지만, Multibox 같은 경우에는 보장이 안되고, 또한 anchor를 이용한 방법은 Multibox 대비 파라미터 수가 낮기 때문에 overfitting의 가능성도 낮아진다. 특히, PASCAL VOC같이 작은 양의 데이터에 대해서 overfitting의 위험이 낮게 예상된다.

   - Multi-scale Anchors as Regression References
   다양한 스케일을 구현하는 방법에는 여러가지가 있다. 1) 각 이미지를 re-size한 후 각각 다른 크기의 이미지에 대해 feature map을 구하는 것.  시간이 많이 소요된다.
2) feature map 상에서 여러 크기의 sliding window를 사용하는 것. 즉, 다른 필터 사이즈 가진 sliding 윈도우를 이용해서 여러 스케일을 구현한다.
3) anchor를 활용한 방법. bounding box를 다양한 스케일과 형태의 anchor box를 이용해 분류하고 회귀하는 방법이다. 이 방법은 동일한 스케일의 이미지와 feature map에만 의존하며, 동일한 사이즈의 필터 (slidng 윈도우)를 사용한다.
따라서 우리는 여러 스케일이 아닌 한 가지의 스케일 이미지에 대해 CNN features를 추출할 수 있으며, 이것은 Fast R-CNN detector에 의해 완성된다. 이러한 multi-scale anchors는 쉽게 다양한 스케일을 싸고 빠르게 구현 가능한 방법이다.

3) Loss function
 RPN 학습 시, R-CNN과 유사한 방법으로, ground-truth와 0.7 이상의 IOU를 가진 anchor를 positive로 레이블링을 하며, 0.3이하는 negative로 한다. 따라서 0.3과 0.7 사이의 anchor는 학습에 영향을 미치지 못한다. R-CNN과 또한 유사하게 ground-truth와의 분류와 위치에 대한 차이를 가지고 loss function을 구성하며, lamda 값은 크게 영향을 미치지 않는 것으로 실험 결과가 보여주고 있다. 기존의 Bounding box는 여러사이즈의 ROI에서 추출된 feature를 대상으로 이루어지지만, 여기서는 features가 feature map 상의 3x3이다. 따라서 k개의 다른 bounding box regressors가 훈련되며, 각각의 regressor는 한개의 스케일과 형태를 담당하며 regressor들은 서로 weight를 공유 안한다. 따라서, feauture는 동일한 스케일/형태이더라도 anchor scheme 덕분에 다양한 스케일/형태의 box를 예측할 수 있다.





4) Training RPN
미니 배치는 하나의 이미지의 positive와 negative anchors들로 이루어짐. positive와 negative 비율을 1:1로 하나의 이미지에서 총 256 anchors를 sampling 한다. 만약에 positive anchor 가 128개 이하면, negative로 나머지를 채운다.
- new layers: 랜덤 가우시안 분포로 초기화 (reg layer, cls layer)
- 기존 shared convolution layer: ImageNet pre-training
- ZF net은 모두 fine-tuning, VGG는 CONV_3_1 부터 fine-tuning. why? 메모리 saving

즉, RPN에서 weights 는 conv layer의 weight 와 cls, reg layer의 weight 이다. 이 weight들의 최적값을 찾는 것이 RPN의 목적인 것이다.

5) Sharing Features for RPN and Fast R-CNN
1) alterating training: RPN 학습 - 생성된 proposals로 F-RCNN 학습 - F-RCNN으로 tune 된 network를 RPN 초기화로 사용 - 계속 반복. 이 논문에서 사용 함
2) Approximate joint training: RPN과 F-RCNN이 하나의 네트워크로 통합
3) Non-Approximate joint training

Alterating training
 1) RPN을 학습 (ImageNet pre-trained로 conv layer 초기화 및 fine-tune 수행)
    - batch#1 : Image 1의 anchor를 가지고 학습 함
 2) 1)의 proposal (batch)을 이용해 Fast R-CNN 학습 (ImageNet pre-trained conv layer
     로 초기화 및 proposal로 fine-tune)
 3) 2)의 conv layer weight를 RPN의 conv layer 초기화에 사용. 즉, 공유하는 conv layer는 2)값으로 fix하고 cls, reg layer만 fine-tune.
 4)  공유하는 con layer는 fix시키고 Fast R-CNN의 고유의 layer (fc 등) fine-tune 수행





6) Implementation Details
이미지는 모두 single scale (resize = 짧은 변 기준 600) 3개의 scale과 3개의 aspect ratio를 가지고 9개의 anchor 생성 함. 다량의 이미지를 생성 하지 않기 떄문에 효율 적임.
이미지에 경계에 존재하는 anchor는 학습시에 무시 됨. 즉, 사진당 20000개의 anchor중 6000개만 사용함. (이중 256개만 샘플링해서 batch에 사용). 하지만 test에서는 무시 안 함.
NMS를 사용해서 전체 6000개의 anchor 중, IOU가 0.7 이상인 2000개의 proposal만 남긴다. 즉, 학습 시에는 2000개의 proposal을 학습하지만, test시에는 속도 및 정확도 테스트를 위해 다양한 top-N proposal을 사용하여 실험을 진행하였다.


7) 결과
다양한 실험을 수행 한 결과, 공유 기반의 ZF+RPN이 우수한 성능을 보임. 특히 NMS를 적용할 경우 proposal 숫자는 줄이면서 정확도는 향상되는 결과가 있음 (false alarm 적음)
또한 test time에서 cls, reg 각각의 효용성도 테스트 함 (특히, reg가 없으면 다양한 anchor들을 위치 보정 없이 raw로 쓰게 되어 결과가 안 좋을 수 밖에 없다.)
즉, RPN이 SS에 비해 우위에 있는 것은, RPN은 학습이라는 컨셉이 있기 때문이다.
기존 ss를 활용한 fast r-cnn 대비 1/10 정도의 속도로 가능한 것이 장점이다.


8) 기타
 We have demonstrated that Faster R-CNN benefits more from better features, thanks to the fact that the RPN completely learns to propose regions by neural networks.
A score threshold of 0.6 is used to display these images. The running time for obtaining these results is 198ms per image, including all steps.
RPN은 Ground-truth에 대해서 분류 없이 object score랑 bounding box에 대한 값을 training “Objectness” measures membership to a set of object classes vs. background.
cls layer는 two-class softmax layer이다. 즉, object가 있는지 없는지에 대한 score 산출
즉, RPN에서는input이 anchor가 되며, 학습 시에 positive anchor와 negative anchor로 배치를 만들어서 학습하며, anchor마다 object score, bound box 좌표가 산출된다.

Comments

Popular posts from this blog

Tensorflow tutorial #1

Image preprocessing with Numpy and Scipy