포스트

FPN의 Top-down, Lateral Connection은 멀티스케일 특징을 어떻게 살리나

FPN의 답은 간단합니다. 깊은 층의 강한 의미 정보는 위에서 아래로 올리고, 같은 해상도의 얕은 feature와 lateral connection으로 합쳐 모든 scale에 쓸 수 있는 피라미드를 만듭니다. 입력 이미지 피라미드를 여러 번 처리하는 대신 한 backbone의 계산을 재사용한다는 점이 핵심입니다. 구현을 볼 때는 각 stage의 공간 크기, channel과 upsampling 뒤 lateral 합이 정확히 맞는지 확인해야 합니다.

이미지 피라미드가 느렸던 이유

서로 다른 크기의 물체를 찾는 가장 직접적인 방법은 입력 이미지를 여러 scale로 만든 뒤 각각 feature를 계산하는 것입니다. 범위는 넓지만 scale마다 독립적으로 계산하므로 느리고 메모리 비용도 큽니다.

여러 피라미드 구성 방식

기존 글의 네 가지 비교를 독자 관점에서 줄이면 다음과 같습니다.

  • 이미지 자체를 여러 크기로 처리: 강력하지만 scale마다 계산합니다.
  • 마지막 단일 feature만 사용: 빠르지만 여러 scale의 표현을 버립니다.
  • CNN 중간 feature를 그대로 사용: 해상도는 다양하지만 얕은 층의 의미가 약합니다.
  • FPN: CNN의 계층을 재사용하면서 top-down과 lateral connection으로 의미를 보강합니다.

FPN의 목표는 별도 이미지 피라미드를 계속 계산하지 않고도 모든 scale에서 강한 feature를 얻는 것입니다.

FPN의 top-down 구성

Bottom-up과 Top-down이 만나는 지점

Bottom-up pathway는 일반 convolution network가 계산하는 feature 계층입니다. 단계가 깊어질수록 feature map의 공간 크기는 줄고, 원문에서는 scale이 단계마다 2배씩 변한다고 설명합니다.

ResNet에서는 각 stage의 마지막 residual block 출력을 사용하고, 메모리 때문에 conv1은 피라미드에서 제외합니다.

FPN 전체 구조

Top-down pathway는 깊은 feature를 2배 upsampling해 더 높은 해상도로 올립니다. 그러나 upsampling만 하면 얕은 층에 남아 있던 위치 정보가 복구되지 않습니다. 그래서 같은 공간 크기의 bottom-up feature를 lateral connection으로 합칩니다.

연산 순서는 다음과 같습니다.

  1. 깊은 feature를 2배 upsampling합니다.
  2. 대응하는 bottom-up feature를 1×1 convolution으로 채널 수를 맞춥니다.
  3. 두 feature를 합칩니다.
  4. aliasing 효과를 줄이기 위해 3×3 convolution으로 최종 feature를 만듭니다.

피라미드 모든 레벨에서 classifier와 regressor를 공유할 수 있도록 feature 차원은 256으로 설정합니다.

이 구조를 “고해상도 feature를 쓴다” 하나로만 설명하면 부족합니다. 고해상도 위치 정보에 깊은 층의 의미 정보가 결합된다는 점이 핵심입니다.

RPN과 Fast R-CNN에는 어떻게 연결되는가

논문에서는 Faster R-CNN에 FPN을 적용합니다.

FPN을 적용한 detection 흐름

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 benchmark

FPN 비교 결과

이 숫자는 논문의 구성과 데이터셋에 묶인 결과이지, FPN을 붙인 모든 모델의 고정 개선폭은 아닙니다. 실제 구조를 읽을 때는 다음을 먼저 확인해야 합니다.

  1. 어떤 backbone stage가 bottom-up 입력인지 봅니다.
  2. upsampling과 1×1 lateral 연결이 같은 해상도에서 만나는지 봅니다.
  3. 각 레벨의 출력 채널 수와 head 공유 여부를 확인합니다.
  4. 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를 어떻게 쓰는지까지 연결해야 합니다.

함께 읽으면 이해가 이어지는 글

자주 묻는 질문

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까지 포함한 지연을 측정하고, 사용하지 않는 레벨을 추가하는 것이 항상 이득이라고 가정하지 않습니다.

THE END / OPSOAI

여기까지 읽었습니다

핵심 장면을 한 번 더 떠올려 보세요. 이해가 남았다면 이 책은 제 역할을 다했습니다.

다른 책 고르기
표지 1

키와 좌우 스와이프를 지원합니다. 읽던 페이지는 이 기기에 저장됩니다.

CONTENTS

이 책의 목차

    8개 장 13 분읽는 시간