CS 공부/AI

[Object Detection] Neck

imsmile2000 2023. 5. 3. 23:42

Neck 이란?


  • backbone과 head(검출이 이루어지는 실질적인 부분)를 이어주는 연결부
  • backbone의 각각의 stages에서 서로 다른 feature maps를 추출
    1. Top-down 방식과 측면 연결을 통해서 기존의 convolutional network를 증강시킨다
    2. 이는 네트워크가 풍부하고 다양한 scale의 feature 층을 구성할 수 있도록 함
    3. 다양한 층 덕분에, 서로 다른 사이즈의 object 검출 가능
  • neck이 필요한 이유
    • 다양한 크기의 객체를 더 잘 탐지하기 위해서
    • neck이 없으면 작은 사이즈의 객체 탐지 못함

 

 

다양한 Neck의 종류


FPN (Feature Pyramid Network)

  • 대표적인 Neck
  • high level에서 low level로 semantic 정보 전달해주는 top-down path way 추가
    • pyramid 구조를 통해 high level 정보를 low level에 순차적으로 전달
  • Lateral connections
    • 의미론적으로 강한 특징 계층을 up-sampling 하여 고해상도를 가진 낮은 계층의 특징과 연결하는 방식 
    • Top-down path way: Nearset Neighbor Upsampling 진행 (16x16 -> 32x32)
    • Bottom-up path way: 1x1 conv 진행 (채널 64 -> 128)
    • 최종: 32x32x128

 

  • Pipeline
    • Backbone: ResNet

wh가 작을수록, p2,3에서 RoI projection 진행, 커질수록 p4,5에서 진행

  • Contribution
    • 여러 scale의 물체를 탐지하기 위해 설계
    • 이를 달성하기 위해 여러 크기의 feature을 사용해야할 필요가 있음

 

  • Summary
    • Bottom up(backbone)에서 다양한 크기의 feature map 추출
    • 다양한 크기의 feature map의 semantic을 교환하기 위해 top-down 방식 사용

 

  • Code
# Build laterals: 각 feature map마다 다른 채널을 맞춰주는 단계
laterals=[lateral_conv(intputs[i]) for i, lateral_conv in enumerate(self.lateral_convs)

# Build top-down: 채널 맞춘 후 top-down 형식으로 feature map 교환
for i in range(3,0,-1):
	prev_shape=laterals[i-1].shape[2:]
    laterals[i-1]+=F.interpolate(laterals[i],size=prev_shape)
    
# Build outputs: 최종 3x3 conv 통과하여 RPN으로 들어갈 feature 완성
outs=[self.fpn_convs[i](laterals[i]) for i in range(4)]

 

 

PANet (Path Aggregation Network)

  • FPN의 네트워크가 매우 길어 low level의 feature가 high level로 제대로 전달이 안될 수 있다는 단점이 있음
    • 해결방법 Bottom-up Path Augmentation: bottom-up을 한번 더 해줌
  • RoI가 미세하게 차이나도 feature map은 큰 차이가 발생함
    • 해결방법 Adaptive Feature Pooling: RoI stage를 하나만 정하지 않고 모든 feature map으로부터 RoI projection 진행

 

  • Code
# FPN: top-down에 3x3 convolution layer 통과
inter_outs=[self.convs[i](laterals[i]) for i in range(4)]

# Add bottom-up: FPN 통과 후, bottom-up path 더해줌
for i in range(3):
	inter_outs[i+1]+=self.downsample_convs[i](inter_outs[i])
    
# Build outputs: 이후 FPN과 마찬가지로 학습을 위해 3x3 conv layer 통과
outs.append(inter_outs[0])
outs.extend([self.pafpn_convs[i-1](inter_outs[i]) for i in range(1,4)])

 

DetectoRS

  • RPN과 Cascade R-CNN에서 영감을 얻음
  • 주요 구성: RFP, SAC
    • Recursive Feature Pyramid (RFP)
      • FPN의 정보를 backbone에 넘겨줄 때 ASPP 과정 사용
    • Atrous Convolution: receptive field 키움

 

BiFPN

  • Weighted Feature Fusion
    • FPN과 같이 단순 summation을 하는 것이 아니라 각 feature 별로 가중치 부여한뒤 summation
    • 모델 사이즈 증가는 거의 x
    • feature별 가중치를 통해 feature을 강조하여 성능 상승

 

NASFPN

  • 기존의 FPN, PANet의 단순 일방향(top->bottom / bottom ->top)보다 좋은 방법을 찾다가
  • NAS(Neural Architecture Search)를 통해서 FPN 아키텍쳐를 찾음

 

  • 단점
    • COCO dataset, ResNet 기준으로 architecture 찾아서 범용적이지 못함 (파라미터 많음)
    • High search cost: 다른 데이터셋이나 backbone에서 가장 좋은 성능을 내는 architecture을 찾기 위해 새로 찾아야함 

 

AugFPN

  • 주요 구성
    • Consistent Supervision
    • Residual Feature Augmentation : C5 feature을 기준으로 M6 만들어냄
      1. ratio-invariant adaptive pooling: 다양한 scale의 feature map 생성
      2. C5 feature을 upsampling해서 3개의 feature map을 concat하고 Nx(1xhxw)의 값을 구함
        • Conv1x1, Conv3x3, Sigmoid layer을 차례로 통과
        • Nx(1xhxw) = spatial weight
      3. Nx(1xhxw)를 각 N개의 feature에 곱해 가중  summation
    • Soft  RoI Selection
      • FPN: 하나의 feature map에서 RoI 계산해서 최적화는 아님
      • PANet: 모든 feature map 이용했지만, max pool하여 정보 손실 가능성
      • 이를 해결하기 위해 Soft RoI Selection 설계
        1. 모든 scale의 feature에서 RoI projection 진행 후 RoI pooling
        2. channel-wise 가중치 계산 후 가중합 사용
        3. PANet의 max pooling을 2번의 가중합으로 대체