Abstract
이전 feature pyramid는 different scales를 recognition 하기 위한 basic component로써 사용되어왔습니다. 하지만 이 당시의 object detectors는 feature pyramids가 compute and memory intensive해서 사용을 피했었습니다.
이를 해결하기 위해 inherent multiscale인 pyramidal hierarchy 기반 top-down architecture를 제안합니다.
Introduction
위의 Fig 1.에는 지금까지의 feature pyramid에 대한 내용이 담겨 있습니다.
Featurized image pyramid
이는 Fig 1의 (a)에 해당합니다. 초기 단계의 feature pyramid이고, hand engineered features 입니다. 예를 들어 이미지를 줌인, 줌아웃 하면서 특징을 골라내는 방법을 사용했었습니다.
Single feature map
Fig 1.의 (b)에 해당하는 내용으로, Deep Convolutional Networks로 계산하고 이 계산된 것은 higher level semantics를 갖습니다.
처음으로 DL의 convolutional networks를 사용한 형태이고 이 Deep CNN을 사용해서 변화하는 scale에 대해 robust한 성질을 띄게 되었습니다.
Single input scale에 대해 계산된 feature로의 recognition을 편하게 했습니다. 하지만 이는 pyramid 형태가 아니고 더 나은 accuracy를 위해 pyramid 구조 일 필요가 있습니다.
Pyramidal feature hierarchy
Fig 1.의 (c)에 해당되는 내용입니다. 이는 inherent multiscale을 갖습니다.
각 단계는 각 다른 spatial resolution을 갖고 high resolution의 경우 low level features를 갖고 있어서 해를 끼칠 수도 있다고 합니다.
위와 같은 방법들이 이 논문이 나오기 전까지의 feature pyramid 구조인데, 어떻게 하면 hierarchy 형식의 pyramid를 잘 사용할 수 있을까요?
이에 대한 답으로 논문에서는 FPN(feature pyramid network)를 제시합니다. 이는 Fig 1. (d)입니다.
FPN을 사용함으로써 모든 level에서의 rich semantics를 갖고 single input image scale로 빠르게 build 합니다.
Feature Pyramid Networks
논문에서의 goal은 low~high level로부터의 semantics를 갖는 ConvNet을 이용해 pyramidal feature hierarchy를 구성하는 것 입니다. (FPN)
임의 size의 단독 image를 input으로 받고 multiple layers에서 feature map에 비례하여 크기 된 outputs를 갖습니다.
fpn은 backbone (feature extractor)와 independent 해서 조립하듯이 사용이 가능합니다.
FPN의 구성은
- Bottom-up pathway
- Top-down pathway & Lateral connections
이 두 단계로 이루어져 있습니다.
Bottom-up pathway
Fig 3.의 윗부분.
Backbone Convolutional Networks의 feed forward computation 부분이고 여기에서 여러 scaling steps를 통해 input과 output의 scale이 같으면 동일한 stage로 여깁니다.
논문에서는 어떤 block (residual block) 형태를 가지고 있는 ResNet을 예시로 들었으며, 각 stage의 마지막 output을 \({C_2,C_3,C_4,C_5}\)로 표기했습니다.
Top-down pathway & Lateral connections
Fig 3.의 아래부분.
Top-down pathway는 upscaling을 통해 higher resolution feature를 얻는 단계를 가리킵니다. Fig 3.의 아랫방향 화살표를 의미하겠죠.
Bottom-up pathway들을 거친 마지막 output은 channel이 굉장히 농축되어있고, resolution이 작은 형태로 나오게 되는데 (Resnet의 경우 Channel은 2048) 이 마지막 output에 대해 1x1 convolution을 적용해서 2048 -> 256 channel로 바꿔줍니다.
이는 FPN의 output 중 하나가 되며 이를 upscaling 하면서 다음 단계로 나아갑니다. (upscaling 시 bottom up에서 동일한 stage에서는 같은 resolution이 되도록 upscaling)
Lateral connection은 Fig 3.에서 Bottom-up pathway와 Top-down pathway를 잇는 옆 방향의 화살표이며 이 때 위에서 언급 했듯이 top-down의 경우 각 stage의 channel은 256으로 통일 되어 있고 resolution만 upscaling해 나가는 형식입니다.
이 때 동일한 stage끼리는 resolution이 같고 channel의 경우만 다르기 때문에 1x1 convolution을 사용해서 channel을 맞춰 준 다음 merge(add) 해줍니다.
이렇게 Top-down, lateral의 과정을 거쳐서 합해진 maps는 3x3 conv를 적용해줘서 Aliasing 효과를 줄였습니다.
이 과정들을 통해 각 stage에 대한 output을 \({P_2, P_3,P_4, P_5}\)로 표현했습니다.
위의 과정에서 bottom up의 feature map은 lower level semantics를 갖지만 정위적 정보는 더 정확하기 때문에 lower level + higher level 을 통하여 richer semantics를 갖도록 했습니다.
Feature Pyramid Networks for RPN
이제 이 FPN에 대한 output을 어떻게 적용할 건가가 문제인데, RPN의 경우 Anchor boxes와 연관이 깊습니다.
그래서 각 level 당 single scale을 갖는 anchors를 지정해줍니다.
\({32^2,64^2,128^2,256^2,512^2}\)
그리고 ratio는 동일하게 {1:2, 2:1, 1:1}로 지정됩니다.
Source Code
Resnet에 대한 간단한 코드는 아래 링크에 있습니다
https://github.com/yhy258/FPN_Resnet/blob/master/fpn_resnet.py