Feature Pyramid Network (FPN)
특징 피라미드 네트워크(FPN)는 깊은 의미 특징과 세밀한 고해상도 특징을 결합해 검출기가 크고 작은 객체를 모두 찾도록 합니다.
Feature Pyramid Network (FPN)는 backbone의 다중 해상도 feature map을 피라미드로 변환하는 neck 아키텍처입니다. 피라미드의 각 레벨은 강한 의미 정보를 담고 있으며, 다양한 객체 크기에 대응합니다. Facebook AI Research가 Feature Pyramid Networks for Object Detection(CVPR 2017)에서 처음 소개한 이 방식은 표준 합성곱 신경망(CNN)에 하향식 경로와 측면 연결을 추가합니다. 이를 통해 작은 객체를 고해상도 레벨에서 탐지하면서도, 객체의 형태에 대한 깊은 레이어의 정보를 유지할 수 있습니다. FPN과 그 후속 구조는 대부분의 최신 객체 탐지 아키텍처 및 인스턴스 분할 모델에서 backbone과 detection head 사이에 위치합니다.
탐지기에 다중 스케일 feature가 필요한 이유#
CNN backbone은 깊어질수록 다운샘플링되므로 마지막 feature map은 의미 정보가 강하지만 해상도가 낮습니다. stride 32에서는 20픽셀 크기의 객체가 그리드 셀 하나보다 작게 표현됩니다. 초기 feature map은 세밀한 공간 정보를 유지하며 주로 에지와 텍스처에 반응합니다. FPN이 등장하기 전 탐지기에는 각각 단점이 있는 세 가지 선택지가 있었습니다. 여러 스케일의 이미지 피라미드에 네트워크를 적용하면 정확하지만 속도가 몇 배 느려집니다. 기존 Faster R-CNN처럼 마지막 맵만으로 예측하면 빠르지만 작은 객체에 약합니다. SSD처럼 backbone의 여러 단계를 사용하면 약한 저수준 feature를 피하려고 네트워크 상단부터 시작하므로, 작은 객체에 필요한 고해상도 맵을 활용하지 못합니다. FPN은 단일 forward pass로 이미지 피라미드의 다중 스케일 범위를 확보합니다. FPN을 적용한 Faster R-CNN은 COCO 탐지에서 단일 모델 기준으로 새로운 최고 성능을 달성했고, GPU에서 초당 5프레임으로 동작했습니다.
FPN의 작동 방식#
FPN은 세 단계로 피라미드를 구성합니다:
- 상향식 경로: Backbone의 일반적인 forward pass입니다. FPN은 ResNet에서 stride가 4, 8, 16, 32인 C2~C5로 표시된 각 단계의 마지막 feature map을 사용합니다.
- 하향식 경로: 가장 거친 레벨에서 시작해 각 맵을 최근접 이웃 보간법으로 2배 업샘플링하여, 고수준 의미 정보를 더 세밀한 레벨로 전달합니다.
- 측면 연결: 1×1 합성곱으로 각 backbone 맵의 채널 수를 256으로 통일합니다. 그 결과를 상위 레벨에서 업샘플링한 맵과 요소별로 더하고, 3×3 합성곱으로 합산 결과를 평활화해 업샘플링 아티팩트를 줄입니다. 출력인 P2~P5는 모두 채널 수가 256이므로, 가중치를 공유하는 예측 head 하나를 모든 레벨에서 사용할 수 있습니다.
Torchvision에는 backbone 맵을 순서가 지정된 딕셔너리로 받는 즉시 사용할 수 있는 FeaturePyramidNetwork 모듈이 포함되어 있습니다.
from collections import OrderedDict
import torch
from torchvision.ops import FeaturePyramidNetwork
# 640x640 이미지에 대해 stride 8, 16, 32에서 출력되는 backbone 결과(ResNet-50 채널 수)
features = OrderedDict(
c3=torch.randn(1, 512, 80, 80),
c4=torch.randn(1, 1024, 40, 40),
c5=torch.randn(1, 2048, 20, 20),
)
# 측면 1x1 conv와 하향식 경로로 모든 레벨의 채널 수를 256으로 통일합니다
fpn = FeaturePyramidNetwork(in_channels_list=[512, 1024, 2048], out_channels=256)
pyramid = fpn(features)
for name, level in pyramid.items():
print(name, tuple(level.shape))c3 (1, 256, 80, 80), c4 (1, 256, 40, 40), c5 (1, 256, 20, 20)가 출력됩니다. 각 레벨은 공간 크기를 유지하며, 세 레벨의 채널 폭이 동일해져 하나의 head로 모든 스케일을 처리할 수 있습니다.
응용 분야#
- 항공 및 위성 이미지: 위성 이미지 분석과 드론 영상에서 차량, 사람, 건물은 몇 픽셀에 불과한 경우가 많으므로 탐지기는 피라미드의 stride 4 및 stride 8 레벨에 의존합니다.
- 인스턴스 분할: Detectron2에서 사용할 수 있는 Mask R-CNN은 box와 mask를 예측하기 전에 각 영역의 크기에 따라 피라미드 레벨을 지정합니다.
- 파놉틱 분할: Panoptic FPN은 동일한 피라미드에 semantic segmentation 분기를 추가하여, 셀 수 있는 객체와 함께 도로와 하늘 같은 배경 영역에도 레이블을 지정합니다.
- 자율주행 차량: 단일 카메라 프레임에는 이미지 절반을 차지하는 가까운 트럭과, 몇 픽셀 높이에 불과한 먼 보행자 및 신호등이 함께 담깁니다.
FPN과 PANet, BiFPN 및 기타 neck 구조 비교#
FPN의 하향식 경로는 레벨 간 정보 흐름을 바꾸는 여러 neck 구조의 출발점이 되었습니다:
- PANet: FPN의 하향식 경로 뒤에 상향식 경로를 추가하여, 위치 정보가 정확한 세밀한 feature에서 상위 레벨까지의 경로를 단축합니다. PANet은 COCO 2017 인스턴스 분할 챌린지에서 1위를 차지했습니다.
- BiFPN: EfficientDet의 neck은 하향식 및 상향식 융합을 여러 차례 반복하고, 입력이 하나뿐인 노드를 제거하며, 융합하는 각 입력의 가중치를 학습합니다.
- NAS-FPN: 신경망 아키텍처 탐색으로 찾아낸 피라미드 구조를 여러 번 쌓은 방식입니다.
- U-Net: 스킵 연결을 통해 거친 feature와 세밀한 feature를 병합한 다음 전체 해상도에서 한 번 예측합니다. 따라서 다중 스케일 탐지보다 픽셀 단위 분할에 더 적합합니다.
YOLO26은 연결(concatenation) 방식으로 레벨을 융합하는 FPN-plus-PAN neck을 사용합니다. 두 번의 업샘플링으로 stride 32의 컨텍스트를 stride 8 레벨까지 전달하고, 두 번의 stride 합성곱으로 세부 정보를 다시 위로 전달합니다. head는 stride 8, 16, 32의 P3, P4, P5에서 예측합니다. yolo26-p2.yaml 변형은 매우 작은 객체를 위해 stride 4의 P2 레벨을 피라미드에 추가하며, 그 결과 YOLO26n의 융합 전 연산량은 6.1에서 9.5 GFLOPs로 증가합니다.










