Feature Pyramid Network (FPN)
Uma rede piramidal de atributos (FPN) combina atributos semânticos profundos com atributos detalhados de alta resolução, permitindo que os detectores encontrem objetos grandes e pequenos.
Uma Rede de Pirâmide de Características (FPN) é uma arquitetura de neck que transforma os mapas de características de várias resoluções de uma backbone numa pirâmide em que cada nível contém informação semântica forte e corresponde a uma gama de tamanhos de objetos. Apresentada pela Facebook AI Research em Redes de Pirâmide de Características para Deteção de Objetos (CVPR 2017), acrescenta um percurso de cima para baixo e ligações laterais a uma rede neuronal convolucional (CNN) padrão, para que os objetos pequenos possam ser detetados em níveis de alta resolução que ainda preservam o conhecimento das camadas profundas sobre o aspeto dos objetos. As FPN e as suas sucessoras situam-se entre a backbone e a cabeça de deteção na maioria das arquiteturas modernas de deteção de objetos e dos modelos de segmentação de instâncias.
Porque é que os detetores precisam de características multiescala#
Uma backbone CNN reduz a resolução à medida que aprofunda a rede, por isso o seu último mapa de características tem semântica forte e resolução grosseira: com stride 32, um objeto de 20 píxeis ocupa menos de uma célula da grelha. Os primeiros mapas de características preservam os detalhes espaciais finos e respondem sobretudo a arestas e texturas. Antes da FPN, os detetores tinham três opções, cada uma com um custo. Executar a rede numa pirâmide de imagens com várias escalas é preciso e várias vezes mais lento. Fazer previsões apenas a partir do último mapa, como fazia originalmente o Faster R-CNN, é rápido, mas tem um desempenho fraco com objetos pequenos. Fazer previsões a partir de várias etapas da backbone, como faz o SSD, começa numa parte mais profunda da rede para evitar características de baixo nível fracas e, por isso, não aproveita os mapas de alta resolução de que os objetos pequenos precisam. A FPN obtém a cobertura multiescala de uma pirâmide de imagens numa única passagem forward, e o Faster R-CNN com FPN estabeleceu um novo estado da arte de modelo único na deteção no COCO, executando a 5 fotogramas por segundo numa GPU.
Como funciona uma FPN#
Uma FPN constrói a sua pirâmide em três etapas:
- Percurso de baixo para cima: A passagem forward normal da backbone. A FPN recebe o último mapa de características de cada etapa, identificados de C2 a C5 com strides de 4, 8, 16 e 32 numa ResNet.
- Percurso de cima para baixo: A partir do nível mais grosseiro, cada mapa é ampliado por um fator de 2 com interpolação do vizinho mais próximo, levando a semântica de alto nível para os níveis mais finos.
- Ligações laterais: Uma convolução 1×1 ajusta cada mapa da backbone a uma largura comum de 256 canais; o resultado é somado elemento a elemento ao mapa ampliado do nível acima, e uma convolução 3×3 suaviza a soma para reduzir os artefactos de ampliação. As saídas, de P2 a P5, têm todas 256 canais, pelo que uma única cabeça de previsão com pesos partilhados funciona em todos os níveis.
O Torchvision inclui um módulo FeaturePyramidNetwork pronto a usar, que recebe os mapas da backbone sob a forma de um dicionário ordenado.
from collections import OrderedDict
import torch
from torchvision.ops import FeaturePyramidNetwork
# Saídas da backbone para uma imagem de 640x640 com strides de 8, 16 e 32 (contagem de canais da 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),
)
# As convoluções laterais 1x1 e o percurso de cima para baixo dão a cada nível os mesmos 256 canais
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))Imprime c3 (1, 256, 80, 80), c4 (1, 256, 40, 40) e c5 (1, 256, 20, 20): cada nível mantém o seu tamanho espacial e os três passam a partilhar a mesma largura de canais, o que permite que uma única cabeça sirva todas as escalas.
Aplicações#
- Imagens aéreas e de satélite: Veículos, pessoas e edifícios em análise de imagens de satélite e imagens de drones ocupam muitas vezes apenas alguns píxeis, por isso os detetores dependem dos níveis de stride 4 e stride 8 da pirâmide.
- Segmentação de instâncias: O Mask R-CNN, disponível no Detectron2, atribui cada região a um nível da pirâmide com base no seu tamanho antes de prever a respetiva caixa e máscara.
- Segmentação panóptica: A Panoptic FPN acrescenta um ramo de segmentação semântica à mesma pirâmide, identificando elementos como a estrada e o céu, além dos objetos contáveis.
- Veículos autónomos: Um único fotograma de uma câmara pode mostrar camiões próximos que ocupam metade da imagem e peões e semáforos distantes com apenas alguns píxeis de altura.
FPN vs. PANet, BiFPN e outros necks#
O percurso de cima para baixo da FPN foi o ponto de partida para uma família de necks que alteram o fluxo de informação entre níveis:
- PANet: Acrescenta um percurso de baixo para cima após o percurso de cima para baixo da FPN, encurtando o caminho entre as características finas e bem localizadas e os níveis superiores. A PANet ficou em primeiro lugar no desafio de segmentação de instâncias COCO 2017.
- BiFPN: O neck do EfficientDet repete várias vezes a fusão de cima para baixo e de baixo para cima, remove os nós com apenas uma entrada e aprende um peso para cada entrada que funde.
- NAS-FPN: Uma disposição de pirâmide encontrada através de pesquisa de arquiteturas neuronais e empilhada várias vezes.
- U-Net: Também combina características grosseiras e finas através de ligações skip e, em seguida, faz uma única previsão à resolução total, o que a torna mais adequada à segmentação por píxel do que à deteção multiescala.
YOLO26 usa um neck FPN mais PAN que funde níveis por concatenação: duas etapas de ampliação levam o contexto de stride 32 até ao nível de stride 8, duas convoluções com stride levam os detalhes de volta para cima, e a cabeça faz previsões a partir de P3, P4 e P5 com strides de 8, 16 e 32. A variante yolo26-p2.yaml estende a pirâmide com um nível P2 de stride 4 para objetos muito pequenos, o que aumenta o cálculo não fundido do YOLO26n de 6.1 para 9.5 GFLOPs.










