Faster R-CNN 부수기 [백 병장의 CV 부수기 4편]
이전 글에서 R-CNN(Regions with CNN features)와 이를 개선한 Fast R-CNN을 살펴보았다.
Fast R-CNN은 R-CNN에 Spatial Pyramid Pooling을 활용한 ROI Pooling을 적용하여 학습과 실행 속도를 대폭 개선하고, 모델을 한 번에 end-to-end 학습이 가능하도록 하였다.
그러나, 여전히 Region Proposal을 CPU상에서 Selective Search 알고리즘으로 수행하여, 이미지별로 2천개의 ROI를 만드는 데 많은 시간이 소요되는 단점이 있었다.
Faster R-CNN은 비로소 이 문제마저 해결하여, R-CNN을 매우 빠르게 동작하게 만든 모델이다.
논문 제목에서 부터 「Regional Proposal Network를 활용한 실시간 객체 인식을 향하여」라는 자신감 있는 모습을 보여주는데, SPP Net의 저자인 Kaiming He, R-CNN과 Fast R-CNN의 저자인 Ross Girshick이 2저자, 3저자로 참여했다.
Main Idea
R-CNN에서는 CPU에서 Selective Search 알고리즘을 활용하여 2천개의 ROI(Region of Interest)를 찾아내었다.
이 과정을 연산이 빠른 GPU에서 수행되도록 하기위해, 연구진은 Region Proposal Network(RPN)라는 CNN 모델을 제안한다. CNN을 활용해 Region Proposal을 수행함으로써 연산이 빨라짐은 물론이고, RPN이 잘 학습되면 성능 향상 효과까지 볼 수 있게 되었다.
모델 구조 분석
Faster R-CNN은 다음 순서로 동작한다.
- 입력된 원본 이미지를 CNN에 통과시켜 feature map으로 만든다. (논문에서는 vgg)
- 이 feature map을 RPN에 넣어 region proposal을 얻는다.
- 이 region들을 feature map에 다시 투사하고, 이를 이용해 최종 분류를 수행한다.
모델 구조가 상당히 복잡한데, 아래 이미지를 보고 분석해보자.
- 가장 처음 원본 이미지가 통과하는 Pre-Trained CNN (VGG)
- Region Proposal을 수행하는 RPN
- 최종적으로 인식을 수행하는 Fast R-CNN
Region Proposal Network (RPN)
Dense Sampling
픽셀 단위로 Region을 만드는 Selective Search 대신, 연구진은 CNN에서 동작 가능한 Dense Sampling을 사용하였다.
Dense Sampling은 단순하게, 이미지를 $n\times n$ 개의 grid로 잘라서 각 grid를 region으로 사용하는 방식이다.
예를 들어, $1000 \times 500$ 크기의 이미지가 있고, sub-sampling ratio(이미지를 자르는 기준이 되는 비율)가 $\frac{1}{100}$이라면, 이미지는 $10 \times 5$개의 grid로 분할되며, 각 grid가 CNN을 통과하여 나오는 값은 원본 이미지에서 $100\times 100$ 크기의 영역을 의미한다.
다만 이런 방법을 사용하면 당연하게도 모든 Region이 정사각형 형태가 되고, 실제 이미지 속의 객체는 정사각형 이외에 다양한 형태를 띄기에 문제가 된다.
Anchor
이런 문제를 해결하기 위한 방법이 Anchor다.
Anchor는 사전에 지정된 다양한 비율과 크기의 box로, 단순히 정사각형 모양의 영역을 sliding window 방식으로 적용하여 정사각형 모양의 Region들을 얻어내는 대신, 각 영역에 다양한 모양의 Anchor들을 적용해 봄으로써 다양한 형태의 Region들을 얻을 수 있게 하였다.
논문에서는 (1:1, 1:2, 2:1) 비율(aspect ratio)을 갖는 (128, 256, 512) 너비(width)의 Anchor 9개를 사전 정의하여, 각 grid를 중심으로 해당 Anchor들을 적용하여 Region들을 얻었다.
Region Proposal Network 구조
RPN이 동작하는 과정을 살펴보자.
1에서 CNN을 통과하여 얻은 feature map에 다시 $3\times 3$ 합성곱 연산을 한다. 이때, padding을 1로 하여 원본 feature map의 크기를 유지하고, 256개의 채널을 얻는다.
(즉, $H\times W \times C$ feature map 입력을 $H \times W \times 256$로 만든다.)
이 feature map에 $1\times 1$ 합성곱을 수행하여 Classification과 Bounding Box Regression을 수행한다.
이 단계에서, Classification은 객체를 분류하지 않고 객체의 존재 여부만을 판별한다.
이 과정에서 Anchor를 적용하여 각 grid의 9개 Anchor 별로 해당 Anchor에 객체가 존재하는지를 판별하게 된다.
(이 부분이 영 이해가 안된다. 추후에 다시 공부하고 다듬어봐야겠다.)
결과적으로, 객체가 존재하는지 Classification과 Bounding Box를 얻게 되는데, 아직 RPN에서 Region Proposal을 하고 있는 중인데 벌써 결과가 나온 이유는, 이를 통해 RPN을 학습시키기 위함이다.
Region Proposal
RPN에서 얻은 객체의 존재 확률을 기반으로, 객체가 존재할 확률이 높은 상위 $k$개의 Region들을 추려낸다.
해당 Region들을 Bounding Box Regressor로 다듬고, Non Max Suppression(NMS, OverFeat글에서 설명)를 통해 겹치는 Bounding Box들을 제거한다.
이렇게 얻은 ROI들을 맨 처음 CNN을 통과하여 얻어낸 feature map에 투영하고, 이를 Fast R-CNN 구조의 모델에 통과시켜 최종 결과를 얻는다.
Alternating Training
Faster R-CNN의 학습과정은 아래와 같이 진행된다.
- 사전학습된 CNN(VGG)를 가져온다. (V0)
- 먼저, RPN을 한번 학습시킨다. (R0 -> R1)
- 학습된 R1을 가지고 VGG를 파인 튜닝하고, Fast R-CNN 모델도 학습시킨다. (V0 -> V1, F0 -> F1)
- 이제 다시 RPN을 학습시킴. (R1 -> R2)
- 마지막으로 Fast R-CNN을 다시 학습시킴. (F1 -> F2)
증말 복잡도 하다...
결론
전체적으로 이해하기 상당히 어려웠고, Anchor 사용하는 부분은 몇 번 읽어는데도 이해가 안 됐다.
결국 Region Proposal도 신경망 기반으로 하여 R-CNN을 빠르게 만들었다는 건 확실히 알겠고, 이 과정에서 성능까지 향상했다니 대단한 것 같다.
다만 역시 이해가 만족스럽지 않아서, 다음 주에는 이 논문을 조금 더 살펴보는 시간을 가져야겠다.
CV 부수기 시리즈가 끝나면 구현을 한 번 해봐도 괜찮을 것 같다.
참고자료
- Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks - Shaoqing Ren et al. arxiv
- 갈아먹는 Object Detection [4] Faster R-CNN - 염창동형준킴
- Faster R-CNN 논문(Faster R-CNN: Towards Real-Time ObjectDetection with Region Proposal Networks) 리뷰 - herbwood
- (논문리뷰&재구현) Faster R-CNN 설명 및 정리 - Kanghee Lee
- Object Detection and Classification using R-CNNs - ankur6ue