[논문] NAS-FPN: Learning Scalable Feature Pyramid Architecture for Object Detection

:memo: 논문 리딩 스터디 #20: 강화학습을 통해 최적의 Object Detector 모델 구조를 찾는 NAS-FPN 논문을 읽고 정리해봅니다.


논문 링크: NAS-FPN: Learning Scalable Feature Pyramid Architecture for Object Detection

Abstract

딥 러닝을 이용한 Object Detection Network의 구조, 특히 Feature Pyramid Network의 구조는 지금까지 수동으로 디자인되었습니다. 또한 최근 FPN의 발전 방향은, 모든 Pyramid layer에서 강한(Semantically Strong) Feature를 만들어낼 수 있도록 모든 Layer들간의 Cross-scale connection을 어떻게 연결하는지에 초점을 맞춥니다. 논문에서는 RetinaNet 구조를 기반으로 해서 Neural Architecture Search로 최적의 Layer 연결 구조를 탐색합니다. 이렇게 자동으로 생성한 모델은 SOTA 모델보다 좋은 성능을 보였습니다.

Introduction

Object Detection은 Localization + Classification 문제로, Feature layer가 얼마나 강한지(Semantically Strong) 에 따라 성능이 결정됩니다. 또한 다양한 Scale에서의 물체를 검출해야하기 때문에, 최근의 많은 Detector 구조는 Backbone Network에서 추출한 Feature layer들을 피라미드 형태로 다시 쌓아 사용합니다. 이를 Pyramidal feature representations 라고 부릅니다.

FPN은 이 피라미드 구조를 차용한 대표적인 구조로써, Backbone Network의 각 레벨의 Feature layer를 사용하여 Feature Pyramid를 만듭니다.

사진에서 보이듯이, FPN은 기본적으로 최상위 Feature에서부터 Upsampling을 반복해서 Feature Pyramid를 만듭니다. 그 후 피라미드의 각 Layer와 같은 Resolution을 가지는 Backbone Network의 Feature layer에 1x1 Conv를 적용하여 피라미드의 해당 레이어에 더하는 작업을 수행합니다. 이를 Lateral Connection 이라고 하며, FPN이 모든 레이어에서 강한 Feature를 가질 수 있도록 해주는 원동력이 됩니다.

최근의 PANet 등 많은 연구는 이러한 FPN 구조가 Optimal하지 않음을 인식하고, 단순한 Pyramidal 구조에서 벗어나 피라미드의 여러 Layer에 더 다양한 연결을 시도하고 있습니다. 또한 논문에서는 이러한 모든 연결을 Cross-scale Connection 이라고 칭합니다. 지금까지의 연구들은 이러한 Connection들을 직접 사람의 직관으로 디자인해왔습니다. 하지만 더욱 강력한 성능의 Feature Pyramid를 만들기 위해서는 더욱 많은 레이어를 쌓아야 함이 자명하고, 레이어의 수가 많아질수록 Connection은 지수적으로 증가하므로 이를 디자인하는데에는 분명한 한계가 존재합니다.

이 논문에서는 급부상하고 있는 Model Architecture 탐색 방법인 NAS (Neural Architecture Search) 를 차용하여, 주어진 Pyramid의 모든 레이어에서 최고의 Feature를 만들어낼 수 있도록 최적의 Cross-scale Connection들을 찾아냅니다. 그리고 Backbone Network에 상관없이 이렇게 만들어내는 FPN이 매우 좋은 성능을 낸다는 것을 보여줍니다.

Method

학습한 FPN의 성능 체크를 위해서 RetinaNet을 Base framework로 설정했습니다. 따라서 이 논문에서 설정한 주요 목표는, RetinaNet의 성능을 가장 높이는 최적의 FPN 구조를 찾는 것입니다. 모델의 Approach를 설명하는 네트워크 구조가 아래 그림에 나타나 있습니다. 그림과 같이 나머지 Architecture는 그대로 놓고, FPN의 최적 구조를 탐색하는 모양입니다.

FPN의 구조를 탐색하는데에는 Neural Architecture Search가 사용됩니다. NAS는 주어진 Task를 수행하는 최적의 Model Architecture를 찾기 위한 학습 방법으로, Reinforcement Learning 을 이용합니다. Model의 구조를 변경하며 탐색할 수 있는 Search space를 설정해주면, RNN 구조의 Controller가 그 안을 탐색하면서 하나의 Model 구조를 만들어냅니다(Child Model) . 이렇게 만들어진 Child Model을 학습하여 모델의 성능을 평가할 수 있는 수치를 구하고, 이를 RNN Controller에 Reward로 제공하여 Controller가 더 높은 성능을 내는 Child Model을 만들도록 학습시킵니다. 이를 반복하여 최적의 모델 구조를 만들어내는 것이 NAS의 골자입니다.

Architecture Search Space

NAS로 최적의 FPN을 탐색하기 위하여 Architecture Search Space를 정의합니다. 논문이 Focus하는 부분은 Cross-scale Connection을 어떻게 만드냐이기 때문에, 이 Connection을 효과적으로 구현할 수 있는 Merging Cell 이라는 개념을 도입하여 사용합니다.

Feature Pyramid Network

일단 RetinaNet에 사용될 목표 Pyramid Network의 구조를 설정합니다. Input feature layer 5개를 사용하며 \(\{C_3, C_4, C_5, C_6, C_7\}\) 로 표현됩니다. 또한 각 layer는 \(\{8, 16, 32, 64, 128\}\) 의 Feature stride를 가지고 있습니다. \(C_6\)과 \(C_7\)은 \(C_5\)에 stride 2와 4의 Max pooling을 적용하여 만듭니다. 이렇게 선택된 Input feature layer들은 Merging cell들의 연속으로 Cross-scale connection을 구현하는 Pyramid Network으로 전달됩니다. Pyramid는 출력 Feature layers \(\{P_3, P_4, P_5, P_6, P_7\}\)을 만들어냅니다. 이 과정에서 \(\{C_n\}\)과 \(\{P_n\}\) 은 같은 Scale(같은 Feature Stride)를 가집니다. 또한 네트워크의 Feature layer 입력과 출력은 5개씩이지만, 중간의 Merging Cell은 몇번이고 쌓아서 사용할 수 있습니다. 이 논문에서는 이 Merging Cell의 개수를 조절해서 Speed와 Accuracy의 Tradeoff를 맞춥니다.

Merging Cell

Merging Cell은 FPN을 구현하는 기본 단위입니다. FPN의 골자는 두 개의 Feature layer를 합쳐서 더욱 강력한 Feature layer를 만들고, 이를 반복하여 Pyramid 형태로 쌓는 것으로, Feature layer를 더하는 작업이 Cross-scale connection을 구현하여 피라미드의 Feature를 더욱 강력하게 만듭니다. 논문에서는 Feature layer를 더하는 작업을 수행하는 Merging Cell 이라는 구조를 이용하여 모델을 설계합니다. Merging Cell이 동작하는 구조는 아래 사진과 같습니다.

Pyramid에서 두 개의 Feature layer를 선택해서 Merging Cell에 입력하여 하나의 Feature layer로 합친 후, 기존 Pyramid의 맨 아래에 합쳐진 Layer를 추가합니다. 새로 만들어진 Feature layer는 다른 Merging Cell에 입력될 수 있습니다. Merging Cell이 동작하는 방식을 정리하면 아래와 같습니다.

  1. Pyramid에서 Merging Cell에 입력될 첫 번째 Feature layer \(h_i\)를 뽑습니다.
  2. Pyramid에서 Merging Cell에 입력될 두 번째 Feature layer \(h_j\)를 뽑습니다.
  3. 두 layer를 합쳐 만들어낼 Output feature의 Resolution을 결정합니다.
  4. 미리 정의된 Binary Operation을 적용하여 \(h_i\)와 \(h_j\)를 합쳐 3번에서 결정한 Resolution의 Feature layer를 생성합니다.

Merging Cell에 사용되는 Binary Operation 은 두 가지로, \(\text{sum}\)과 \(\text{global pooling}\) 입니다. 아래의 그림에 그 구조가 나타나 있습니다. 논문에서는 PANet의 방향을 따라 FPN의 디자인에서 Convolution Layer들이 사라지기를 바랬습니다. 때문에 Merging Cell에 입력되는 Feature layer들은 합치는 연산을 수행하기 전에, Nearest Neighbor Upsampling 또는 Max pooling을 통해 Output Resolution에 맞춰집니다. 이렇게 출력되는 Output layer는 순서대로 ReLU - 3x3 Conv - BatchNorm에 연결되어 새로운 Feature Layer가 됩니다. Conv를 없애고 싶다면서???

Pyramid Network에 입력되는 5개의 Input feature layer가 Merging Cell에 입력될 수 있는 초기 후보를 구성합니다. 그리고 Merging Cell의 출력으로 나온 새로운 Feature layer는 기존 Pyramid의 뒤에 붙여져, 다음 Merging Cell의 입력으로 선택될 수 있는 후보가 됩니다. 따라서 Architecture search를 진행하는 도중에는 같은 Resolution을 가지는 여러 개의 Feature layer가 피라미드에 동시에 존재할 수 있습니다. 또한 모델의 연산량을 줄이기 위해서, 최종 Pyramid에 포함되지 않는 중간 단계의 Output feature layer를 만드는 Merging Cell의 경우, Stride 8의 Feature layer는 입력으로 사용할 수 없도록 처리하였습니다.

마지막 5개의 Merging Cell들은 최종 Output Pyramid \(\{P_3, P_4, P_5, P_6, P_7\}\)에 포함될 Feature layer들을 생성합니다. 또한, Output layer에 직접적으로 연결되지 않은 모든 Feature layer는 같은 Resolution의 Output layer에 더해집니다(\(\text{sum}\)).

개인적으로 아래의 Figure가 NAS-FPN을 이해하는데에 결정적인 도움을 주었습니다. NAS-FPN이 Search하는 도중의 Child Model들을 Plot한 그림입니다.

Experiments

NAS-FPN의 Capacity는 Merging Cell을 얼마나 사용하여 Pyramid를 얼마나 쌓느냐와 Pyramid 내의 Feature dimension을 어떻게 하냐에 영향을 받습니다. 이를 확인한 실험 내용과 결과에 대한 내용입니다.

Implementation Details

RetinaNet을 베이스로 하여 64장의 Image batch size로 TPU에서 트레이닝하였습니다. 상세 구현 사항을 보면 아래와 같습니다.

  • 트레이닝시에, Input image를 0.8~1.2배로 Random scaling Augmentation
  • 모든 Convolution layer 뒤에는 Batch Normalization Layer
  • Focal loss의 factor \(\alpha = 0.25, \gamma = 1.5\)
  • SGD with Momentum 0.9, Weight decay 0.0001
  • 총 50 Epoch 트레이닝했으며, 첫 30 Epoch은 0.08의 Learning rate를 사용하였고 30, 40 Epoch에 각각 0.1배씩 줄임.

Architecture Search for NAS-FPN

Controller

RNN Controller는 Search space를 한번 탐색해서 하나의 Child Model을 만들어냅니다. 이 과정에서 Controller는 Merging Cell의 총 개수를 알고 있고, 각 Merging Cell의 입력 Feature와 출력 Resolution, 사용할 Binary Operation 종류를 각 Cell마다 결정합니다. 또한 이런 과정을 거쳐서 만들어지는 Pyramid Network 내의 Feature layer들의 순서까지 Controller가 결정하게 됩니다. Controller는 Proxy task 라는, 일종의 Pre-training 과정을 거친 후 학습에 들어갑니다. Controller를 학습시키는 Reward는 학습시킨 Child Model의 AP입니다. AP가 높을수록 큰 Reward를 주는 방식입니다.

Discovered feature pyramid architectures

이렇게 트레이닝시킨 RNN Controller가 만들어낸 FPN 구조를 보니 신기한 결과를 얻을 수 있었습니다. 큰 Reward를 받은 NAS-FPN의 Child Model 구조를 Plot해보니까, Controller가 몇몇 중요한 Cross-scale Connection을 빠르게 찾아낸 것을 볼 수 있었습니다. 예를 들어, Controller는 High-resolution feature layer들끼리의 Connection을 찾아냈습니다. 이는 작은 물체를 찾아내는 역할을 하는 High-resolution feature를 강력하게 만들어 FPN의 성능을 크게 올릴 가능성이 큽니다.

Controller의 학습이 거의 수렴하고 난 후에는, 기존 FPN과 다르게 Top-down과 Bottom-up Connection을 다양하게 가지고 있는 모양의 FPN을 만들어내고 있었습니다. 또 한 가지 흥미로운 관찰은, 학습이 진행될수록 Feature의 재사용을 더욱 영리하게 설계한다는 것입니다. Controller가 수렴에 가까워갈수록 Merging Cell은 Pyramid 내 Input feature 후보들에서 랜덤으로 두 개를 선택하는 대신, Merging Cell이 새로 생성한 Layer를 사용하여 이전에 만들어진 Feature Representation을 효과적으로 재사용하는 방법을 알아가는 모습을 보였습니다.

Scalable Feature Pyramid Architecture

NAS-FPN의 방법을 이용하면, 다양한 구조의 FPN을 효과적으로 만들어낼 수 있습니다. 그리고 NAS-FPN과 Vanilla FPN을 비교해보았을 때, 똑같이 더 깊게 Pyramid를 쌓아도 성능에는 큰 차이를 보임을 확인했습니다. 아래 그림에서 확인되는 바와 같이 Vanilla FPN은 Pyramid를 더 깊게 쌓는다고 해서 무조건 성능이 좋아지지는 않았으나, NAS-FPN은 성능이 꾸준히 좋아지는 모습입니다.

이와 같은 결과에서 주목할 점은, 기존에 Manually design된 FPN Architecture에 비해 NAS-FPN이 다양한 Scale에 훨씬 효과적으로 대응한다는 점입니다. Proxy task에서 3개의 layer만 쌓은 Pyramid만 학습해서 사용해도, 전체 7개 layer를 모두 적용한 Pyramid Network를 학습할 때의 성능 향상에 도움을 준다는 실험 결과가 이를 뒷받침합니다.

또 논문에서 중요하게 다루는 결과는, Backbone Network에 상관없이 NAS-FPN이 Detector의 성능 향상에 큰 도움을 주었다는 점입니다. 아래는 Backbone Network를 다르게 하면서 AP를 측정한 결과인데, 특히 MobileNet과 같이 가벼운 Backbone Network를 사용한 모델에서 더욱 큰 성능 향상을 보여주는 모습입니다.