-
[Object Detection] NeckCS 공부/AI 2023. 5. 3. 23:42
Neck 이란?
- backbone과 head(검출이 이루어지는 실질적인 부분)를 이어주는 연결부
- backbone의 각각의 stages에서 서로 다른 feature maps를 추출
- Top-down 방식과 측면 연결을 통해서 기존의 convolutional network를 증강시킨다
- 이는 네트워크가 풍부하고 다양한 scale의 feature 층을 구성할 수 있도록 함
- 다양한 층 덕분에, 서로 다른 사이즈의 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 키움
- Recursive Feature Pyramid (RFP)
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 만들어냄
- ratio-invariant adaptive pooling: 다양한 scale의 feature map 생성
- C5 feature을 upsampling해서 3개의 feature map을 concat하고 Nx(1xhxw)의 값을 구함
- Conv1x1, Conv3x3, Sigmoid layer을 차례로 통과
- Nx(1xhxw) = spatial weight
- Nx(1xhxw)를 각 N개의 feature에 곱해 가중 summation
- Soft RoI Selection
- FPN: 하나의 feature map에서 RoI 계산해서 최적화는 아님
- PANet: 모든 feature map 이용했지만, max pool하여 정보 손실 가능성
- 이를 해결하기 위해 Soft RoI Selection 설계
- 모든 scale의 feature에서 RoI projection 진행 후 RoI pooling
- channel-wise 가중치 계산 후 가중합 사용
- PANet의 max pooling을 2번의 가중합으로 대체
'CS 공부 > AI' 카테고리의 다른 글
[Object Detection] EfficientDet (1) 2023.05.06 [Object Detection] 1 stage Detectors (0) 2023.05.04 [Object Detection] MMDetection과 Detectron2 (0) 2023.05.03 [Object Detection] 2 stage Detectors (0) 2023.05.03 [Object Detection] Overview (0) 2023.05.02