on
[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