공부기록

Faster R-CNN 논문 리뷰 본문

분석/논문

Faster R-CNN 논문 리뷰

맘모스빵러버 2021. 4. 6. 15:27

Fast R-CNN은 R-CNN의 복잡한 training/test pipeline을 통합함으로써 눈에띄는 성능향상(속도, 정확도)을 가져왔지만, Real-time object detector에 한 발짝 더 다가가기에는 여전히 속도면에서 아쉬운 부분이 남아있었습니다.

 

Faster R-CNN의 주요 논점은, Fast R-CNN에서 가장 큰 계산부하를 차지하는 regionproposal 생성을 새로운  방식으로 대체하고, 이를 모델 내부로 통합 시키는 것이다. 이이 고안된 것이 바로 아래 그림의 RPN(region proposal networks)입니다.

기존 Fast RCNN 구조를 그대로 계승하면서 selective search를 제거하고 RPN을 통해서 RoI를 계산합니다. 이를 통해서 GPU를 통한 RoI 계산이 가능해졌으며, RoI 계산 역시도 학습시켜 정확도를 높일 수 있었습니다. 이를 통해 RPN은 Selective Search가 2000개의 RoI를 계산하는 데 반해 800개 정도의 RoI를 계산하면서도 더 높은 정확도를 보입니다. 

위 구조를 보면  Feature Map을 먼저 추출한 다음 이를 RPN에 전달하여 RoI를 계산합니다. 여기서 얻은 RoI로 RoI Pooling을 진행한 다음 클래시피케이션을 진행하여 Object Detection을 수행하게 됩니다. 

 

RPN이 동작하는 알고리즘은 다음과 같습니다. 

 

1. CNN을 통해 뽑아낸 피쳐 맵을 입력으로 받습니다. 이 때, 피쳐맵의 크기를 H x W x C로 잡습니다. 각각 가로, 세로, 체널 수 입니다.

 

2. 피쳐맵에 3x3 컨볼루션을 256 혹은 512 체널만큼 수행합니다. 위 그림에서 intermediate layer에 해당합니다. 이 때, padding을 1로 설정해주어 H x W가 보존될 수 있도록 해줍니다. intermediate layer 수행 결과 H x W x 256 or H x W x 512 크기의 두 번째 피쳐 맵을 얻습니다.

 

3. 두 번째 피쳐맵을 입력 받아서 classification과 bounding box regression 예측 값을 계산해주어야 합니다. 이 때 주의해야할 점은 Fully Connected Layer가 아니라 1 x 1 컨볼루션을 이용하여 계산하는 Fully Convolution Network의 특징을 갖습니다. 이는 입력 이미지의 크기에 상관없이 동작할 수 있도록 하기 위함입니다.

 

4. 먼저 Classification을 수행하기 위해서 1 x 1 컨볼루션을 (2(오브젝트 인지 아닌지 나타내는 지표 수) x 9(앵커 개수)) 체널 수 만큼 수행해주며, 그 결과로 H x W x 18 크기의 피쳐맵을 얻습니다. H x W 상의 하나의 인덱스는 피쳐맵 상의 좌표를 의미하고, 그 아래 18개의 체널은 각각 해당 좌표를 앵커로 삼아 k개의 앵커 박스들이 object인지 아닌지에 대한 예측 값을 담고 있습니다. 즉, 한번의 1x1 컨볼루션으로 H x W 개의 앵커 좌표들에 대한 예측을 모두 수행한 것입니다. 이제 이 값들을 적절히 reshape 해준 다음 Softmax를 적용하여 해당 앵커가 오브젝트일 확률 값을 얻습니다.

 

5. 두 번째로 Bounding Box Regression 예측 값을 얻기 위한 1 x 1 컨볼루션을 (4 x 9) 체널 수 만큼 수행합니다. 리그레션이기 때문에 결과로 얻은 값을 그대로 사용합니다.

 

6. 이제 앞서 얻은 값들로 RoI를 계산해야합니다. 먼저 Classification을 통해서 얻은 물체일 확률 값들을 정렬한 다음, 높은 순으로 K개의 앵커만 추려냅니다. 그 다음 K개의 앵커들에 각각 Bounding box regression을 적용해줍니다. 그 다음 Non-Maximum-Suppression을 적용하여 RoI을 구해줍니다.

 

이렇게 RPN을 이용해서 RoI를 추론해내는 구조를 알아보았습니다. 이렇게 찾은 RoI를 다시 첫 번째 피쳐맵에 project 한 다음 RoI Pooling을 적용하고, 이를 다시 클래시피케이션에 적용하면 물체의 종류도 알아낼 수 있게 됩니다. 

 


여기서 잠깐 Anchor Box에 대해 알아보겠습니다.

 

 

Anchor box는 sliding window의 각 위치에서 Bounding Box의 후보로 사용되는 상자입니다. 이는 기존에 두루 사용되던 Image/Feature pyramids와 Multiple-scaled sliding window와 다음과 같은 차이를 보입니다.

직관적으로 설명하자면, 동일한 크기의 sliding window를 이동시키며 window의 위치를 중심으로 사전에 정의된 다양한 비율/크기의 anchor box들을 적용하여 feature를 추출하는 것입니다. 이는 image/feature pyramids처럼 image 크기를 조정할 필요가 없으며, multiple-scaled sliding window처럼 filter 크기를 변경할 필요도 없으므로 계산효율이 높은 방식이라 할 수 있습니다. 논문에서는 3가지 크기와 3가지 비율의, 총 9개의 anchor box들을 사용하였습니다.

Labeling to each anchor (Object? or Backgound?)

특정 anchor에 positive label이 할당되는 데에는 다음과 같은 기준이 있습니다.

  1. 가장 높은 Intersection-over-Union(IoU)을 가지고 있는 anchor.
  2. IoU > 0.7 을 만족하는 anchor.

2번 기준만으로는 아주 드물게 Object를 잡아내지 못하는 경우가 있어서 후에 1번 기준이 추가되었습니다.

반면, IoU가 0.3보다 낮은 anchor에 대해선 non-positive anchor로 간주합니다.


이제 RPN을 학습시키기 위한 로스를 알아보겠습니다.

RPN은 앞서서 Classification과 Bouding Box Regression을 수행하였는데요, 로스 펑션은 이 두 가지 테스크에서 얻은 로스를 엮은 형태를 취하고 있습니다.

Multi Task Loss

여기서 i는 하나의 앵커를 말합니다. pi는 classsification을 통해서 얻은 해당 엥커가 오브젝트일 확률을 의미합니다. ti는 bounding box regression을 통해서 얻은 박스 조정 값 벡터를 의미합니다. pi*와 ti*는 ground truth 라벨에 해당합니다. Classification은  log loss를 통해서 계산합니다. regression loss의 경우 smoothL1 함수를 사용합니다.

 

smoothL1 Loss Function

 

특이한 점은 각각 Ncls와 Nreg 나누어 주는 부분이 있습니다. 이는 특별한 의미를 갖는 것은 아니고 Ncls는 minibatch 사이즈이며 논문에서는 256입니다. Nreg는 엥커 개수에 해당하며 약 2400개 (256 x 9)에 해당합니다. 람다는 Classifiaction Loss와 Regression Loss 사이에 가중치를 조절해주는 부분인데 논문에서는 10으로 설정되어 있어, 사실상 두 로스는 동일하게 가중치가 매겨집니다.

 

이상으로 RPN을 학습시키기 위한 로스 펑션에 대해서 알아보았습니다. 나머지는 Fast R-CNN을 학습시킨 로스 펑션이 동일하게 적용됩니다.


다음으로는 training에 대하여 다뤄보겠습니다.

전체 모델을 한번에 학습시키기란 매우 어려운 작업이빈다 RPN이 제대로 RoI를 계산해내지 못하는데 뒷 단의 Classification 레이어가 제대로 학습될리가 없습니다. 논문에서는 4단계에 걸쳐서 모델을 번갈아서 학습시키는 alternating training 기법을 취합니다.

 

1. ImageNet pretrained 모델을 불러온 다음, RPN을 학습시킨다.

2. 1 단계에서 학습시킨 RPN에서 기본 CNN을 제외한 Region Proposal 레이어만 가져온다. 이를 활용하여 Fast RCNN을 학습시킨다. 이 때 ,  처음 피쳐맵을 추출하는 CNN까지 fine tune 시킨다. 

3. 앞서 학습시킨 Fast RCNN과 RPN을 불러온 다음, 다른 웨이트들은 고정하고 RPN에 해당하는 레이어들만 fine tune 시킨다. 여기서부터 RPN과 Fast RCNN이 컨볼루션 웨이트를 공유하게 된다.

4. 마지막으로 공유하는 CNN과 RPN은 고정시킨 채, Fast R-CNN에 해당하는 레이어만 fine tune 시킨다.

 

[출처] yeomko.tistory.com/17

 

갈아먹는 Object Detection [4] Faster R-CNN

지난 글 갈아먹는 Object Detection [1] R-CNN 갈아먹는 Object Detection [2] Spatial Pyramid Pooling Network 갈아먹는 Object Detection [3] Fast R-CNN 들어가며 Fast-RCNN에 이어서 오늘은 Faster R-CNN..

yeomko.tistory.com

curt-park.github.io/2017-03-17/faster-rcnn/

 

[분석] Faster R-CNN

Paper study of Faster R-CNN published in Jan. 2016

curt-park.github.io

arxiv.org/abs/1506.01497

 

Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

State-of-the-art object detection networks depend on region proposal algorithms to hypothesize object locations. Advances like SPPnet and Fast R-CNN have reduced the running time of these detection networks, exposing region proposal computation as a bottle

arxiv.org

 

'분석 > 논문' 카테고리의 다른 글

EfficientDet 논문 리뷰  (2) 2021.05.12
YOLO 논문 리뷰  (1) 2021.04.13
FAST R-CNN 논문 리뷰  (0) 2021.04.06
R-CNN 논문 리뷰  (0) 2021.03.29
[논문] VGGNet(2015) 리뷰 및 정리 (3)  (1) 2021.03.16