← Назад к вопросам

Что такое Feature Pyramid Network (FPN)?

2.7 Senior🔥 111 комментариев
#Глубокое обучение#Машинное обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Feature Pyramid Network (FPN)

Feature Pyramid Network — это архитектура для компьютерного зрения, которая строит иерархию признаков на разных масштабах. Она была предложена в 2016 году и стала стандартом для detection и segmentation задач.

Проблема: мультимасштабные объекты

В реальных изображениях объекты имеют разные размеры:

  • Маленькие объекты (лица людей на фото толпы)
  • Средние объекты (автомобили)
  • Крупные объекты (здания)

Раньше решали это так:

  1. Создавали image pyramid — несколько копий изображения в разном масштабе
  2. Пропускали через CNN каждую версию
  3. Объединяли результаты

Проблема: очень медленно! Нужно 3-5 forward pass для одного изображения.

FPN решает это эффективнее.

Архитектура FPN

FPN имеет три ключевых компонента:

1. Bottom-up pathway (encoder, backbone):

  • ResNet или другой CNN проходит через изображение один раз
  • Выдаёт feature maps на разных уровнях глубины
  • Например: C2, C3, C4, C5 (каждый в 2x раз меньше по размеру)
Изображение (512x512)
  |-> Conv Block -> C2 (128x128, 256 channels)
  |-> Conv Block -> C3 (64x64, 512 channels)
  |-> Conv Block -> C4 (32x32, 1024 channels)
  |-> Conv Block -> C5 (16x16, 2048 channels)

2. Top-down pathway (decoder):

  • Начинаем с самого глубокого feature map C5
  • Уменьшаем пространственно (например, 16x16 -> 32x32)
  • Используем біlinear upsampling или transpose convolution
C5 (16x16) -> Upsample -> P5' (32x32)
C4 (32x32) -> Lateral Conv -> Merge with P5' -> P4
C3 (64x64) -> Lateral Conv -> Merge with P4' -> P3
C2 (128x128) -> Lateral Conv -> Merge with P3' -> P2

3. Lateral connections (1x1 convolutions):

  • На каждом уровне, 1x1 convolution приводит все feature maps к одной размерности (обычно 256 channels)
  • Затем делаем element-wise addition с upsampled версией следующего уровня
# Псевдокод lateral connection
lateral_conv = Conv1x1(C4, 256 channels)  # приведём к 256
p5_upsampled = Upsample(P5)  # увеличим P5 в размере
P4 = lateral_conv + p5_upsampled  # merge

Результат

На выходе получаем pyramid признаков на разных масштабах:

  • P2: 128x128, для маленьких объектов
  • P3: 64x64, для средних объектов
  • P4: 32x32, для крупных объектов
  • P5: 16x16, для очень крупных объектов

Каждый уровень имеет информацию о признаках со ВСЕГО изображения (спасибо backbone CNN).

Пример реализации PyTorch

import torch
import torch.nn as nn
import torch.nn.functional as F

class FPN(nn.Module):
    def __init__(self, backbone, in_channels, out_channels=256):
        super().__init__()
        self.backbone = backbone
        
        # Lateral 1x1 convolutions
        self.lateral_convs = nn.ModuleList()
        self.fpn_convs = nn.ModuleList()
        
        for in_ch in in_channels:
            lateral = nn.Conv2d(in_ch, out_channels, kernel_size=1)
            fpn_conv = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1)
            self.lateral_convs.append(lateral)
            self.fpn_convs.append(fpn_conv)
    
    def forward(self, x):
        # Backbone features: C2, C3, C4, C5
        c2, c3, c4, c5 = self.backbone(x)
        features = [c2, c3, c4, c5]
        
        # Top-down path
        laterals = []
        for i, feature in enumerate(features[::-1]):  # C5 -> C2
            lateral = self.lateral_convs[i](feature)
            laterals.append(lateral)
        
        # Build FPN
        fpn_features = []
        for i in range(len(laterals)):
            if i == 0:
                p = laterals[0]  # P5 (самый глубокий)
            else:
                # Upsample предыдущий уровень и добавить
                p = F.interpolate(
                    laterals[i-1], 
                    size=laterals[i].shape[-2:],
                    mode='nearest'
                )
                p = p + laterals[i]
            
            # 3x3 convolution
            p = self.fpn_convs[i](p)
            fpn_features.append(p)
        
        # Вернуть в исходном порядке: P2, P3, P4, P5
        return fpn_features[::-1]

Эффективность

Сравнение с image pyramid:

Image Pyramid:

  • N forward pass (для 4 масштабов = 4x медленнее)
  • N раз больше памяти

FPN:

  • 1 forward pass backbone
  • Небольшой overhead для lateral/FPN convolutions
  • 3-5x ускорение!

Применение

1. Object Detection (Faster R-CNN with FPN):

  • RPN (Region Proposal Network) работает на всех уровнях P2-P5
  • Маленькие объекты детектируются на P2 (высокое разрешение)
  • Крупные объекты на P5 (низкое разрешение)
Изображение
  |
  FPN -> P2, P3, P4, P5
  |
  RPN на каждом уровне -> proposals разных размеров
  |
  ROI Align на каждом P_i
  |
  Classification + Bounding box regression

2. Segmentation (Mask R-CNN):

  • Аналогично, но с дополнительной маской для каждого объекта

3. Keypoint Detection (Human Pose):

  • Определение положения частей тела (суставы, голова)

Варианты и улучшения

Bi-FPN (EfficientDet):

  • Двусторонний path: вверх AND вниз
  • Позволяет информации течь в обе стороны
  • Лучшая эффективность

NAS-FPN (Neural Architecture Search):

  • Используют NAS для автоматического поиска лучшей структуры FPN
  • Находят более эффективные конфигурации

Weighted FPN:

  • Добавляют learnable weights при merging feature maps
  • Модель учит, какие уровни важнее

Почему FPN работает так хорошо?

  1. Семантичность на всех масштабах: высокоуровневые признаки распространяются на все разрешения
  2. Эффективность: один pass backbone вместо многих
  3. Мультимасштабность: явно обрабатываем объекты разных размеров
  4. Простота интеграции: легко добавить к существующим CNN

Когда использовать FPN

  • Object detection — почти всегда FPN
  • Segmentation — поддержит или улучшит качество
  • Instance segmentation (Mask R-CNN) — обязательно
  • Panoptic segmentation — да
  • Image classification — не нужна (flat features достаточно)

Результаты

FPN является основой для всех современных детекторов:

  • RetinaNet
  • EfficientDet
  • YOLOv3+
  • Faster R-CNN (улучшенная версия)

Без FPN или её вариантов, сложно достичь state-of-the-art accuracy на detection задачах.

FPN — это один из самых влиятельных papers в computer vision. Простая, элегантная идея, которая работает.