Feature Pyramid Network (FPN)
特徴ピラミッドネットワーク(FPN)は、深い層の意味的特徴と、細かな高解像度の特徴を統合し、検出器が大小さまざまな物体を検出できるようにします。
特徴ピラミッドネットワーク (FPN) は、バックボーンの複数解像度の特徴マップをピラミッド状に変換するネックアーキテクチャです。各レベルは強い意味情報を持ち、物体サイズの範囲に対応します。Facebook AI ResearchがFeature Pyramid Networks for Object Detection(CVPR 2017)で発表したFPNは、標準的な畳み込みニューラルネットワーク (CNN)にトップダウン経路とラテラル接続を追加します。これにより、深い層が捉えた物体の特徴を保ちながら、高解像度レベルで小さな物体を検出できます。FPNおよびその派生方式は、現代の多くの物体検出アーキテクチャやインスタンスセグメンテーションモデルで、バックボーンと検出ヘッドの間に配置されています。
検出器にマルチスケール特徴が必要な理由#
CNNバックボーンは深くなるにつれてダウンサンプリングするため、最終特徴マップは意味情報が豊富な一方で解像度が粗くなります。ストライド32では、20ピクセルの物体はグリッドの1セルにも満たない範囲にしか収まりません。初期の特徴マップは細かな空間情報を保ち、主にエッジやテクスチャに反応します。FPN以前の検出器には、それぞれ欠点のある3つの選択肢がありました。複数スケールの画像ピラミッドでネットワークを実行する方法は精度が高いものの、処理速度が数倍遅くなります。元祖Faster R-CNNのように最終マップだけから予測する方法は高速ですが、小さな物体の検出性能が低くなります。SSDのように複数のバックボーン段階から予測する方法は、低レベル特徴の弱さを避けるためネットワークの高い段階から開始し、その結果、小さな物体に必要な高解像度マップを利用できません。FPNは1回のforward passで画像ピラミッドと同等のマルチスケール対応を実現し、FPNを備えたFaster R-CNNは、GPU上で毎秒5フレームの速度を保ちながら、COCO検出における単一モデルの最先端記録を更新しました。
FPNの仕組み#
FPNは3つのステップでピラミッドを構築します。
- ボトムアップ経路: バックボーンの通常のforward passです。FPNは、ResNetではストライド4、8、16、32に対応するC2からC5と呼ばれる各段階の最終特徴マップを使用します。
- トップダウン経路: 最も粗いレベルから始めて、各マップを最近傍補間で2倍にアップサンプリングし、高レベルの意味情報をより細かなレベルへ伝えます。
- ラテラル接続: 1×1畳み込みで各バックボーンマップを共通の幅である256チャネルに変換し、その結果を1つ上のレベルからアップサンプリングしたマップに要素ごとに加算します。さらに3×3畳み込みで合計を平滑化し、アップサンプリングによるアーティファクトを低減します。出力のP2からP5はすべて256チャネルなので、重みを共有する1つの予測ヘッドを各レベルで実行できます。
Torchvisionには、バックボーンマップを順序付き辞書として受け取る、すぐに使えるFeaturePyramidNetworkモジュールが含まれています。
from collections import OrderedDict
import torch
from torchvision.ops import FeaturePyramidNetwork
# ストライド8、16、32での640x640画像に対するバックボーン出力 (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),
)
# ラテラル1x1畳み込みとトップダウン経路により、すべてのレベルのチャネル数が256になります
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))c3 (1, 256, 80, 80)、c4 (1, 256, 40, 40)、c5 (1, 256, 20, 20)が出力されます。各レベルは空間サイズを保ち、3つすべてのチャネル幅が共通になります。これにより、1つのヘッドであらゆるスケールに対応できます。
用途#
- 航空写真・衛星画像: 衛星画像解析やドローン映像では、車両、人、建物がわずか数ピクセルにしかならないことが多いため、検出器はピラミッドのストライド4およびストライド8のレベルに依存します。
- インスタンスセグメンテーション: Detectron2で利用できるMask R-CNNは、ボックスとマスクを予測する前に、各領域のサイズに基づいてピラミッドのレベルを割り当てます。
- パノプティックセグメンテーション: Panoptic FPNは同じピラミッドにセマンティックセグメンテーション用のブランチを追加し、数えられる物体に加えて、道路や空などの領域にもラベルを付けます。
- 自動運転車: 1つのカメラフレームには、画像の半分を占める近くのトラックと、わずか数ピクセルの高さしかない遠くの歩行者や信号機が同時に映ります。
FPNとPANet、BiFPNなどのネックの比較#
FPNのトップダウン経路を起点に、レベル間の情報の流れを変えるネック方式が数多く生まれました。
- PANet: FPNのトップダウン経路の後にボトムアップ経路を追加し、位置が正確な細かな特徴から最上位レベルまでの経路を短縮します。PANetはCOCO 2017インスタンスセグメンテーションチャレンジで1位を獲得しました。
- BiFPN: EfficientDetのネックでは、トップダウンとボトムアップの融合を複数回繰り返し、入力が1つしかないノードを取り除き、融合する各入力の重みを学習します。
- NAS-FPN: ニューラルアーキテクチャ探索で見つけたピラミッド構成を複数回重ねる方式です。
- U-Net: スキップ接続を介して粗い特徴と細かな特徴を統合し、フル解像度で一度だけ予測します。そのため、マルチスケール検出よりもピクセル単位のセグメンテーションに適しています。
YOLO26は、連結によって各レベルを融合するFPNとPANを組み合わせたネックを使用します。2段階のアップサンプリングでストライド32のコンテキストをストライド8のレベルまで伝え、2つのストライド付き畳み込みで細部を上位へ戻し、ヘッドはストライド8、16、32のP3、P4、P5から予測します。yolo26-p2.yamlバリアントは、非常に小さな物体向けにストライド4のP2レベルをピラミッドに追加します。その結果、YOLO26nの融合前の計算量は6.1から9.5 GFLOPsに増加します。










