[Week9] Object Detection - Neck [Day2]

[Week9] Object Detection - Neck [Day2]

1. Neck

1.1 Overview

History

Neck은 무엇인가?

위는 기존 2-stage 방식 backbone의 마지막 feature map을 RPN에 통과시키게 됨 근데 왜 마지막 feature map을 활용해야 할까? => 중간의 feature map들도 활용해보자

Neck 등장

Neck은 왜 필요한가? low-level의 feature map은 선, 점, 기울기 등의 정보와 작은 객체를 잘 표현 high-level의 feature map은 object의 semantic한 정보와 큰 객체를 잘 표현 따라서 Neck을 활용하여 두 정보를 다 활용 다양한 크기의 객체를 더 잘 탐지 하게 됨

그렇다면 Neck을 활용하지 않고 여러 level에서의 feature map을 활용하면 되지 않냐?

Neck을 활용하여 하위 level의 feature는 semantic이 약하므로 상대적으로 semantic이 강한 상위 feature와의 교환이 필요함 결국 low-level부터 high-level feature를 적절히 섞어주고 region을 뽑음으로써 작은 객체를 더 잘 탐지하게 됨

1.2 Feature Pyramid Network (FPN)

FPN이전에는 이미지 사이즈를 조절하여 작은 객체를 탐지하고자 했음

마지막 feature map만 활용해보자

중간중간 feature map을 그대로 활용해보자 (SSD)

*FPN은 어떤것을 보완했나?

high level에서 low level로 semantic 정보 전달 필요

따라서 top-down path way 추가 Pyramid 구조를 통해서 high level 정보를 low level에 순차적으로 전달 Low level = Early stage = Bottom High level = Late stage = Top

Bottom-up

Top-down

두 level을 어떻게 적절히 섞을까? Lateral connections

high-level은 up sampling, low-level은 1x1 conv로 채널을 늘려줌 element-wise 연산으로 합쳐줌. (더해줌?) Nearest Neighbor Upsampling

Pipeline (Backbone : ResNet)

ResNet

Neck의 Lateral connections 4개의 stage를 bottom-up과 top-down에서 lateral connection이 일어남 이후 RPN을 거쳐 RoI를 뽑음 RoI가 어떤 스테이지로부터 나온것인지 mapping을 해줌

어떤 stage의 feature map으로부터 roi projection을 진행할지 알 수 있음

결과

Code Build laterals : 각 feature map 마다 다른 채널을 맞춰주는 단계

Build Top-down : channel을 맞춘 후 top-down 형식으로 feature map 교환

Build outputs : 최종 3x3 convolution을 통과하여 RPN으로 들어갈 feature 완성

1.3 Path Aggregation Network (PANet)

*Problem in FPN

ResNet은 많은 conv와 pooling이 존재

low-level feature가 backbone을 통과하는 과정에서 제대로 high-level로 전달될 수 있을까?

*Bottom-up Path Augmentation

기존 FPN에서 (b) bottom-up path way를 하나 추가 해주었음

*Adaptive Feature Pooling

기존 FPN방식은 불과 몇 픽셀 차이로 인해 stage가 나뉘어 버리는 문제가 있음

따라서 각 stage의 roi를 projection해서 사용하지 않고, AFP에서는 모든 RoI를 FC layer로 합침

*Code

FPN : Top-down에 3x3 convolution layer 통과하는 것 까지 동일

Add bottom-up : FPN을 통과한 후, bottom-up path를 더해줌

Build outputs : 이후 FPN과 마찬가지로 학습을 위해 3x3 convolution layer 통과

2. After FPN

2.1 DetectoRS

*Motivation

Looking and thinking twice Region proposal networks(RPN) Cascade R-CNN

*주요구성

Recursive Feature Pyramid (RFP)

Switchable Atrous Convolution (SAC)

*Recursive Feature Pyramid (RFP)

Neck 정보를 backbone이 다시 학습하는 방식

좌측 red box는 FPN과 동일

FPN feature를 다시 backbone에 넣는 과정이 ASPP가 이루어짐

단점 : FLOPs가 매우 증가

What is ASPP?

receptive field를 증가 시키는 방법 receptive field를 증가시키고 pooling하여 concat

2.2 Bi-directional Feature Pyramid (BiFPN)

*Pipeline

기존 노드들을 제거하여 간단하고 효율적으로 바꿈

하지만 high-level feature와 low-level feature을 합치는 과정에서 단순 summation을 하면 정보가 섞일 수없음

따라서 Weighted Feature Fusion 방법 제안

*Weighted Feature Fusion

FPN과 같이 단순 summation을 하는 것이 아니라 각 feature별로 가중치를 부여한 뒤 summation

모델 사이즈의 증가는 거의 없음

feature별 가중치를 통해 중요한 feature를 강조하여 성능 상승

2.3 NASFPN

*Motivation

기존의 FPN, PANet

Top-down or bottom up pathway

단순 일방향(top->bottom or bottom ->top) summation 보다 좋은 방법이 있을까?

그렇다면 FPN 아키텍처를 NAS (Neural architecture search)를 통해서 찾자!

*Architecture

*Search

*Stacking

NAS를 활용했을때 같은 FLOPs에서 성능이 좋음

*단점

COCO dataset, ResNet기준으로 찾은 architecture, 범용적이지 못함 Parameter가 많이 소요

High search cost 다른 Dataset이나 backbone에서 가장 좋은 성능을 내는 architecture를 찾기 위해 새로운 search cost

2.4 AugFPN

*Overview

Problems in FPN 서로 다른 level의 feature간의 semantic차이 Highest feature map의 정보 손실 1개의 feature map에서 RoI 생성

주요 구성 Consistent Supervision Residual Feature Augmentation Soft RoI Selection

*Residual Feature Augmentation

Ratio-invariant Adaptive Pooling 다양한 scale의 feature map 생성 Adaptive Spatial Fusion(256 channels) : transformer 처럼 중요도를 스스로 학습 N 개의 feature에 대해 가중치를 두고 summation을 하는 방법 concat후 1x1 conv로 Cxhxw로 만들어주고, 3x3 conv로 다시 Nx(Cxhxw)로 만듦 channel wise sigmoid 연산을통해 Nx (1xhxw)를 만듦 N x (1xhxw)의 의미는 각각의 픽셀별로 3개의 value가 나타나고, 각 픽셀의 중요도를 나타낼 수 있음

-> spatial weight

*Soft RoI Selection

FPN과 같이 하나의 feature map에서 RoI를 계산하는 경우 sub-optimal

이를 해결하기 위해 PANet에서 모든 feature map을 이용했지만, max pool하여 정보 손실 가능성

이를 해결하기 위해 Soft RoI Selection을 설계

모든 scale의 feature에서 RoI projection 진행 후 RoI pooling

Channel-wise 가중치 계산 후 가중 합을 사용

PANet의 max pooling을 학습 가능한 가중 합으로 대체

*Experiment

from http://baekchef1215.tistory.com/52 by ccl(A) rewrite - 2021-09-28 16:26:19