Two-Stage Object Detectors
2段階物体検出器は、候補領域を提案した後、それぞれを分類して調整します。Faster R-CNNの仕組み、R-CNNの系統、トレードオフについて解説します。
2段階物体検出器は、処理を2つのステップに分ける物体検出モデルです。第1段階では、画像内に物体が含まれている可能性のある領域を提案し、第2段階では各領域を分類してバウンディングボックスを調整します。R-CNNファミリーは2014年から2018年にかけてこの設計を確立し、長年にわたり検出とインスタンスセグメンテーションのベンチマークを牽引しました。1段階物体検出器は領域提案のステップを省き、密なグリッドから1回の処理で全ボックスを予測するため、ほとんどのリアルタイムシステムで採用されています。
2段階検出器の仕組み#
バックボーンの畳み込みニューラルネットワークは、通常、その上に特徴ピラミッドネットワーク(FPN)を配置し、画像全体の特徴マップを一度計算します。第1段階では、領域提案ネットワーク(RPN)が特徴マップ上の各位置にあるアンカーボックスの集合を物体らしさに基づいてスコア付けし、アンカーを変形するオフセットを回帰します。Faster R-CNNでは、各位置につき、3つのサイズと3つのアスペクト比を組み合わせた9個のアンカーを使います。非最大抑制(NMS)によって重複する候補領域を除去し、スコア上位の領域が第2段階に渡されます。原著論文では、テスト時に画像あたり300個でした。第2段階では、RoI poolingまたは、より精密な後継手法であるRoIAlignによって、各候補領域の固定サイズの特徴グリッドを切り出します。小さなヘッドが各切り出し領域について、背景クラスを含むクラスと、クラス固有のボックスオフセットを予測します。
torchvisionのFaster R-CNNにRPNのフォワードフックを設定すると、第2段階がどれほどの処理を受け取るかを確認できます。
import urllib.request
from PIL import Image
from torchvision.models.detection import FasterRCNN_ResNet50_FPN_V2_Weights, fasterrcnn_resnet50_fpn_v2
# Load Faster R-CNN with a ResNet-50 FPN backbone, pretrained on COCO
weights = FasterRCNN_ResNet50_FPN_V2_Weights.DEFAULT
model = fasterrcnn_resnet50_fpn_v2(weights=weights).eval()
image = Image.open(urllib.request.urlopen("https://ultralytics.com/images/bus.jpg"))
# Report how many regions the first stage, the region proposal network, passes on
model.rpn.register_forward_hook(lambda module, inputs, output: print(f"Stage 1: {len(output[0][0])} proposals"))
# The second stage classifies and refines every proposal
detections = model([weights.transforms()(image)])[0]
labels = detections["labels"][detections["scores"] > 0.5]
print(f"Stage 2: {len(labels)} objects {[weights.meta['categories'][i] for i in labels]}")Stage 1: 1000 proposalsとStage 2: 6 objects ['person', 'bus', 'person', 'person', 'person', 'tie']が出力されます。torchvisionは推論時に画像あたり1,000個の候補領域を保持し、第2段階でその中から信頼度の高い検出結果を6個に絞り込みます。
R-CNNファミリー#
- R-CNN(2014年): Selective searchで約2,000個の領域を提案し、各領域を固定サイズに変形してCNNに個別に渡します。特徴をサポートベクターマシンで分類するため、VGG-16バックボーンを使った検出はGPU上で画像あたり47秒かかりました。
- Fast R-CNN(2015年): 特徴マップを一度だけ計算し、RoI poolingで各候補領域の特徴をそこからプーリングすることで、VGG-16の学習はR-CNNの9倍、テストは213倍高速になりました。
- Faster R-CNN(2015年): RPNがselective searchに置き換わり、バックボーンの特徴を共有するため、候補領域の生成コストはほぼゼロになり、検出器全体で毎秒5フレームを実現しました。
- Mask R-CNN(2017年): 第3のブランチが各領域のピクセルマスクを予測し、検出器をインスタンスセグメンテーションモデルに拡張します。また、RoIAlignは、RoI poolingで丸められていた位置において、正確な小数位置から特徴をサンプリングします。
- Cascade R-CNN(2018年): IoU閾値を0.5、0.6、0.7と段階的に高めて学習した3つの第2段階ヘッドが、それぞれ1つ前のヘッドのボックスを調整し、位置特定をより精密にします。
2段階検出器と1段階検出器の比較#
RPNは、分類器が見る前に背景の大部分を除外するため、第2段階では、物体が一定の割合(Fast R-CNNでは25%)を占めるようにサンプリングした領域を使って学習し、それぞれの正確な位置からプーリングした特徴で分類します。1段階検出器は密なグリッド上のすべての位置をスコア付けします。RetinaNetでは画像あたり約100,000個の候補になりますが、2017年に焦点損失が簡単な背景候補の重みを下げるまでは、精度で2段階検出器に劣っていました。現在の1段階モデルは、レイテンシを大幅に抑えながら2段階検出器と同等以上の精度を実現しています。また、単一のネットワークはエッジハードウェアへのエクスポートが簡単なため、現在、2段階モデルは主に研究用ベースラインやDetectron2などのライブラリで使われています。Ultralyticsのauto_annotateは、データアノテーションのために、2つのモデル間で同じ提案後に精緻化する処理を適用します。YOLO26検出器がボックスを提案し、各ボックスをプロンプトとして与えられたMetaのSegment Anything Model(SAM)が、その内部の物体をセグメント化してセグメンテーションラベルを作成します。
実際のアプリケーション#
- 医用画像: Mask R-CNNの派生モデルは、顕微鏡画像やCTスキャンで個々の細胞、核、病変を検出して輪郭を描きます。計数や測定には、各インスタンスに独自のマスクが必要です。
- 文書レイアウト解析: 360,000枚を超えるページ画像を含むPubLayNetベンチマークでは、テキスト認識の前にテキストブロック、タイトル、リスト、表、図を特定するため、Faster R-CNNとMask R-CNNのモデルが学習されました。
- 航空画像:Oriented R-CNNはRPNを拡張して回転領域を提案するため、第2段階でDOTAデータセット内の船、飛行機、車両の回転バウンディングボックスを出力します。










