Что такое Feature Pyramid Network (FPN)?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Feature Pyramid Network (FPN)
Feature Pyramid Network — это архитектура для компьютерного зрения, которая строит иерархию признаков на разных масштабах. Она была предложена в 2016 году и стала стандартом для detection и segmentation задач.
Проблема: мультимасштабные объекты
В реальных изображениях объекты имеют разные размеры:
- Маленькие объекты (лица людей на фото толпы)
- Средние объекты (автомобили)
- Крупные объекты (здания)
Раньше решали это так:
- Создавали image pyramid — несколько копий изображения в разном масштабе
- Пропускали через CNN каждую версию
- Объединяли результаты
Проблема: очень медленно! Нужно 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 работает так хорошо?
- Семантичность на всех масштабах: высокоуровневые признаки распространяются на все разрешения
- Эффективность: один pass backbone вместо многих
- Мультимасштабность: явно обрабатываем объекты разных размеров
- Простота интеграции: легко добавить к существующим 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. Простая, элегантная идея, которая работает.