FPN의 답은 간단합니다. 깊은 층의 강한 의미 정보는 위에서 아래로 올리고, 같은 해상도의 얕은 feature와 lateral connection으로 합쳐 모든 scale에 쓸 수 있는 피라미드를 만듭니다. 입력 이미지 피라미드를 여러 번 처리하는 대신 한 backbone의 계산을 재사용한다는 점이 핵심입니다. 구현을 볼 때는 각 stage의 공간 크기, channel과 upsampling 뒤 lateral 합이 정확히 맞는지 확인해야 합니다.
FPN의 Top-down, Lateral Connection은 멀티스케일 특징을 어떻게 살리나
이미지 피라미드가 느렸던 이유
서로 다른 크기의 물체를 찾는 가장 직접적인 방법은 입력 이미지를 여러 scale로 만든 뒤 각각 feature를 계산하는 것입니다. 범위는 넓지만 scale마다 독립적으로 계산하므로 느리고 메모리 비용도 큽니다.
기존 글의 네 가지 비교를 독자 관점에서 줄이면 다음과 같습니다.
- 이미지 자체를 여러 크기로 처리: 강력하지만 scale마다 계산합니다.
- 마지막 단일 feature만 사용: 빠르지만 여러 scale의 표현을 버립니다.
- CNN 중간 feature를 그대로 사용: 해상도는 다양하지만 얕은 층의 의미가 약합니다.
- FPN: CNN의 계층을 재사용하면서 top-down과 lateral connection으로 의미를 보강합니다.
FPN의 목표는 별도 이미지 피라미드를 계속 계산하지 않고도 모든 scale에서 강한 feature를 얻는 것입니다.
Bottom-up과 Top-down이 만나는 지점
Bottom-up pathway는 일반 convolution network가 계산하는 feature 계층입니다. 단계가 깊어질수록 feature map의 공간 크기는 줄고, 원문에서는 scale이 단계마다 2배씩 변한다고 설명합니다.
ResNet에서는 각 stage의 마지막 residual block 출력을 사용하고, 메모리 때문에 conv1은 피라미드에서 제외합니다.
Top-down pathway는 깊은 feature를 2배 upsampling해 더 높은 해상도로 올립니다. 그러나 upsampling만 하면 얕은 층에 남아 있던 위치 정보가 복구되지 않습니다. 그래서 같은 공간 크기의 bottom-up feature를 lateral connection으로 합칩니다.
연산 순서는 다음과 같습니다.
- 깊은 feature를 2배 upsampling합니다.
- 대응하는 bottom-up feature를 1×1 convolution으로 채널 수를 맞춥니다.
- 두 feature를 합칩니다.
- aliasing 효과를 줄이기 위해 3×3 convolution으로 최종 feature를 만듭니다.
피라미드 모든 레벨에서 classifier와 regressor를 공유할 수 있도록 feature 차원은 256으로 설정합니다.
이 구조를 “고해상도 feature를 쓴다” 하나로만 설명하면 부족합니다. 고해상도 위치 정보에 깊은 층의 의미 정보가 결합된다는 점이 핵심입니다.
RPN과 Fast R-CNN에는 어떻게 연결되는가
논문에서는 Faster R-CNN에 FPN을 적용합니다.
RPN은 3×3 sliding window에서 object 여부와 bounding box를 예측합니다. 단일 feature map 대신 FPN의 각 레벨에 같은 head를 붙이고, 서로 다른 크기의 anchor를 레벨별로 할당합니다.
\[\{32^2, 64^2, 128^2, 256^2, 512^2\}\]각 scale에는 1:2, 1:1, 2:1의 세 종횡비를 둡니다. 원문은 이를 총 15종의 anchor로 정리합니다. 학습 label은 IoU 0.7 이상이면 양성, 0.3보다 낮으면 음성으로 지정합니다.
Fast R-CNN 쪽에서는 크기가 다른 RoI를 어느 피라미드 레벨에서 읽을지 정해야 합니다.
\[k = k_0 + \log_2 \left( \frac{\sqrt{wh}}{224} \right)\]- w, h: RoI의 너비와 높이
- 224: ImageNet pretraining 크기
- k₀: 기준 레벨이며 원문에서는 4
- Pk: 선택할 피라미드 레벨
예를 들어 RoI scale이 기준의 절반이 되면 더 높은 해상도의 k=3 레벨에 매핑한다는 직관입니다.
논문 수치를 적용할 때의 주의
기존 글은 RPN의 Average Recall이 8.0 point, COCO AP가 2.3 point, PASCAL AP가 3.8 point 개선됐다고 기록합니다.
이 숫자는 논문의 구성과 데이터셋에 묶인 결과이지, FPN을 붙인 모든 모델의 고정 개선폭은 아닙니다. 실제 구조를 읽을 때는 다음을 먼저 확인해야 합니다.
- 어떤 backbone stage가 bottom-up 입력인지 봅니다.
- upsampling과 1×1 lateral 연결이 같은 해상도에서 만나는지 봅니다.
- 각 레벨의 출력 채널 수와 head 공유 여부를 확인합니다.
- RPN anchor 또는 RoI가 어느 레벨에 배정되는지 확인합니다.
더 자세한 근거는 FPN 논문과 기존 글이 사용한 FPN 그림 해설에서 확인할 수 있습니다.
Faster R-CNN 전체 구현법보다 여러 scale의 feature가 어디서 합쳐지는지 판단하는 데 범위를 맞춘 글입니다.
Feature shape를 따라가며 구조를 검증하는 법
Bottom-up 경로에서 각 stage의 출력 shape를 먼저 적습니다. 깊어질수록 공간 크기는 줄고 의미 표현은 강해집니다. Top-down 경로는 가장 깊은 feature에서 시작해 공간 크기를 키우며, 같은 크기의 bottom-up feature를 1×1 lateral convolution으로 channel을 맞춘 뒤 더합니다.
합산 뒤의 각 피라미드 레벨은 독립적인 검출 입력으로 쓰일 수 있습니다. 이때 head가 레벨마다 공유되는지, anchor scale이나 RoI가 어느 레벨에 배정되는지를 확인합니다. FPN이 feature를 만들었다고 해도 배정 규칙이 데이터의 물체 크기와 맞지 않으면 원하는 scale이 충분히 학습되지 않을 수 있습니다.
오류가 나면 의미와 shape를 나눕니다. Tensor 크기가 맞지 않는다면 upsampling 비율, stage 선택, channel 변환을 보고, 실행은 되지만 작은 물체가 약하다면 고해상도 레벨의 positive 수와 입력 정보가 남아 있는지 봅니다. 모든 레벨을 단순히 추가하는 것보다 실제 head가 그 feature를 어떻게 쓰는지까지 연결해야 합니다.
함께 읽으면 이해가 이어지는 글
- Deep SORT의 코사인 거리는 어디에 쓰일까: Feature Gallery와 추적 코드 흐름 — Deep SORT가 검출마다 붙은 appearance feature를 target별 gallery와 코사인 거리로 비교하는 과정을 설명합니다. frame별 detection 필터링, NMS, predict, update…
- SSD는 왜 8,732개 Default Box를 쓰나: 멀티스케일 구조 계산 — SSD의 여섯 feature map에서 8,732개 default box가 만들어지는 계산과 ground truth matching, localization, confidence loss, hard negative mining을…
- 얼굴 인식이 자꾸 틀리는 이유: 검출, 정렬, FaceNet Triplet Loss 점검 — 얼굴 검출부터 landmark 정렬, embedding 거리 비교까지 FaceNet 파이프라인을 단계별로 나누고 실패 지점을 설명합니다.
자주 묻는 질문
FPN은 입력 이미지를 여러 크기로 반복 추론하나요?
기본 FPN은 한 입력의 backbone 내부에서 서로 다른 해상도 feature를 사용합니다. 깊은 의미 정보를 top-down으로 올리고 같은 크기의 lateral feature와 합쳐 피라미드를 만듭니다.
Lateral connection에 1×1 convolution을 쓰는 이유는 무엇인가요?
Bottom-up feature의 channel을 top-down feature와 맞추고 같은 해상도에서 더할 수 있게 하기 위해서입니다. 공간 크기는 upsampling으로 맞춥니다.
FPN을 붙이면 모든 작은 물체 문제가 해결되나요?
아닙니다. 고해상도 feature에 의미 정보를 보강하지만 입력에서 세부 정보가 이미 사라졌거나 레벨 배정과 head가 맞지 않으면 작은 물체 오류는 남습니다.
FPN 그림을 코드와 대조하는 최소 절차
Backbone forward에서 반환하는 stage 이름과 shape를 출력하고, neck이 받는 순서와 맞춥니다. Top-down upsampling 직후의 공간 크기와 lateral convolution 결과가 같아야 더할 수 있습니다. 합산 뒤 smoothing convolution이 있는지와 최종 레벨 목록의 stride도 기록합니다.
고정 입력 하나로 각 피라미드 feature의 통계와 head output shape를 확인합니다. 한 레벨만 값이 비정상적으로 작거나 head가 일부 레벨을 사용하지 않는다면 그림상 연결과 실제 config가 다를 수 있습니다. 이 절차를 통과한 뒤 물체 크기별 결과를 봐야 구조 오류와 학습 결과를 구분할 수 있습니다.
메모리와 속도도 레벨 수에 따라 달라집니다. 모든 고해상도 feature를 유지하면 작은 물체에 유용한 정보를 얻는 대신 메모리 사용이 커질 수 있습니다. 배포 장치에서 실제 head까지 포함한 지연을 측정하고, 사용하지 않는 레벨을 추가하는 것이 항상 이득이라고 가정하지 않습니다.
←→ 키와 좌우 스와이프를 지원합니다. 읽던 페이지는 이 기기에 저장됩니다.