ステータス:ドラフト(2026-10-13)、一部実測。 IoU・アンカー・NMS の例はノートPCの CPU で直接実行した数値です(
code/05_boxes.py、1秒以内)。論文の数値は原文を開いて条件とともに転記しました。ハードウェアは等級で記載しています。 作成ルール:実測データが基本であり、測定できなかったものは「未実測」と表示します。
目次
- 1. 検出とは、そして IoU
- 2. R-CNN(2014):候補ごとに CNN
- 3. Fast R-CNN(2015):CNN は画像全体に1回
- 4. Faster R-CNN(2015):候補探しもネットワークが行う
- 5. その次:FPN
- 6. 限界
- 7. 我々のプロジェクトとのつながり
- 参考文献
1. 検出とは、そして IoU
分類は「この画像に何があるか」、 検出は「何がどこにいくつあるか」です。出力は物体ごとの枠 (x1, y1, x2, y2) とクラス、そして信頼度です。
枠がどれくらい合っているかは IoU(Intersection over Union)で測定します。2つの枠の重なった面積を合計の面積で割った値であり、完全に重なっていれば1、重なっていなければ0になります。手動で計算すると以下のようになります(実測)。
| 正解の枠 | 予測の枠 | IoU |
|---|---|---|
| (0, 0, 10, 10) | (5, 0, 15, 10) 半分だけ重なる | 0.333 |
| (0, 0, 10, 10) | (5, 5, 15, 15) 角だけ重なる | 0.143 |
| (0, 0, 10, 10) | (1, 1, 11, 11) 1マスずれる | 0.681 |
| (0, 0, 10, 10) | (20, 20, 30, 30) 離れている | 0.000 |
「半分だけ重なっていても」IoU は 0.5 ではなく 0.33 です。1マスずれるだけでも 0.68 に下がります。物体が小さいほど数ピクセルの誤差で IoU が大きく揺らぐという点は、卓球のボールのように小さな物体で枠の検出が難しい理由の1つです。検出論文の「AP」・「mAP」は IoU のしきい値(通常 0.5、COCO は 0.5–0.95 の平均)を超えたものを正解として計算した精度-再現率曲線の面積です(計算は第6回で実際にやってみます)。
検出の根本的な難しさは 物体の数と大きさを事前に知らないということです。分類のように出力の数えを固定することはできません。二段階検出器は次のように答えます。「まず物体のありそうな候補を多めに抽出し、候補ごとに分類器を回そう。」
2. R-CNN(2014):候補ごとに CNN
Girshickらの R-CNN は第1回の AlexNet が示した CNN の特徴量を検出に応用した最初の成功です。
- 候補の枠:色や質感が似ている領域を結合していく古典アルゴリズム(selective search)により、画像あたり約2,000個の候補を抽出します。
- CNN の特徴量:候補ごとに画像を切り抜いて 227×227 に拡大し(周囲16pxの余白を含む)、CNN に入力します。
- 分類と補正:クラスごとに線形 SVM で判定し、枠の位置を微修正する回帰を別々に学習します。枠の補正だけでも mAP が 3〜4ポイント向上しました。
結果(論文):PASCAL VOC 2010 mAP 53.7%、VOC 2012 53.3%(従来最高より相対的に30%以上高い)、ILSVRC2013 検出 31.4%(OverFeat 24.3%)。しかし 画像1枚あたり GPU で13秒、CPU で53秒かかりました。2,000個の候補ごとに CNN を個別に実行するためです。重なり合う候補が同じ画素を2,000回再計算していることになります。
3. Fast R-CNN(2015):CNN は画像全体に1回
解決策は順番を入れ替えることです。画像 全体を CNN に1回通過させて特徴マップを作成し、候補の枠はその 特徴マップ上で 切り出します。
- RoI プーリング:大きさがまちまちな候補領域を特徴マップ上で固定サイズ(VGG16の場合は 7×7)に分割し、マスごとに最大値を取り出します。そうすることで後続の全結合層に入力できるようになります。
- マルチタスク損失:分類の損失と枠の補正の損失(smooth L1:誤差が1より小さければ二乗、大きければ絶対値)を足し合わせて1つのネットワークで同時に学習します。SVM と回帰を別々に学習していた R-CNN の複数の段階を1つに統合しました。
結果(論文、VGG16、データセンター用 GPU 1基):学習 9.5時間(R-CNN は 84時間)、テスト画像1枚あたり 0.32秒(R-CNN と比較して 213倍 高速)。VOC 2007 mAP 66.9%(07データ)・70.0%(07+12)、VOC 2012 65.7%・68.4%。しかしここで残ったボトルネックは CNN ではなく 候補の枠を抽出する selective search でした。次回の論文(Faster R-CNN)の表を見ると、selective search + Fast R-CNN は画像あたり 1,830ms であり、Fast R-CNN の本体は 0.3秒前後なので、残りの大半は候補探しにかかっています。
4. Faster R-CNN(2015):候補探しもネットワークが行う
Renらは候補探し自体を CNN の特徴量上の小さなネットワークである RPN(Region Proposal Network)に置き換えました。RPN は検出器と同一の特徴マップを共有するため、候補をほぼタダで得ることができます。
アンカー
RPN は特徴マップの各マスに予め定めておいた 基準の枠(アンカー) を k 個配置します。基本は面積 128²・256²・512² × アスペクト比 1:1・1:2・2:1 = 9個です。モデルはアンカーごとに2つの事柄を出力します。
- このアンカーに物体があるか(物体/背景のスコア)
- アンカーをどれくらい移動させて拡大すれば物体に合うか(4つの補正値)
枠を最初から当てるのではなく、「基準の枠からどれくらい修正するか」を予測させることが核心です。大きな物体・小さな物体・長い物体がそれぞれ似たようなアンカーから出発するため、学習が容易になります。
やってみる:アンカーの配置とラベル付け
1000×600の画像、特徴マップのストライド16でアンカーを配置してみました(実測)。
| 項目 | 我々の計算 | 論文 |
|---|---|---|
| 特徴マップのマスの数 | 62×37 = 2,294 | 約 2,400(60×40) |
| アンカーの数 | 20,646 | 約 20,000 |
| 画像の外に出ないアンカー | 8,044 | 約 6,000(学習に使用するもの) |
最後の行はアンカーの中心や大きさを定める詳細なルール(四捨五入、中心をマスのどこに置くか)によって異なるように見え、原因は別途確認していません。
ラベルのルールは IoU が 0.7 を超えていれば陽性(物体)、0.3 未満であれば陰性(背景)、その間は学習から除外します。幅 180 × 高さ 240 の物体(例:画面の中の選手の半身)を1つ置いてラベル付けを試してみました。
IoU>0.7 양성 0개, IoU<0.3 음성 7,502개, 사이(무시) 542개, 가장 잘 맞는 앵커 IoU 0.659
가장 잘 맞는 앵커 [232, 168, 488, 424] → 보정값 tx,ty,tw,th = [0.117, 0.016, -0.352, -0.065]
陽性が0個になります。9種類のアンカーの大きさや比率がこの物体とぴったり合致していなければ、0.7 を超えるアンカーが存在しない場合があります。そのため論文では、「正解の枠ごとに IoU が最も高いアンカーも陽性とする」というルールを併用しています。このルールがない場合、この物体は学習から丸ごと除外されてしまいます。アンカーの設計(大きさや比率)がデータの物体の形状と合致していなければならないこと、そして合致していない場合に生じる穴をルールで埋めることを示す例です。
補正値は tx = (정답 중심 x − 앵커 중심 x) / 앵커 너비, tw = log(정답 너비 / 앵커 너비) の形式をとります。アンカーの大きさで割り、対数を使用することで、大きな物体と小さな物体の誤差が同程度の大きさの数値になるようにします。
NMS:重なった候補の削除
1つの物体に対して似たような候補が複数出力されるため、 非最大値抑制(NMS)で整理します。スコアが最も高い枠を残し、それとの IoU がしきい値を超える残りの枠を削除した上で繰り返します。選手2人が半分ほど重なって立っているシーンの4つの候補(選手 A に 0・1、選手 B に 2・3)で試してみました(実測)。
| NMS のしきい値 | 残った候補 | 結果 |
|---|---|---|
| 0.3 | [0] | 選手 B を 見逃し(A と B の IoU は 0.33) |
| 0.5 | [0, 2] | 正解 |
| 0.9 | [0, 2, 1] | 選手 A が 2回 検出される(0 と 1 の IoU は 0.86) |
1つのしきい値だけで「重なり合った異なる物体」と「同一物体の重複」を同時に切り分けることはできません。これが人混みのシーンで NMS が弱い理由であり、第8回の DETR が NMS を排除しようとした動機でもあります。
結果(論文)
RPN は候補を NMS(しきい値 0.7)により約2,000個に絞り込み、テスト時は300個のみを使用します。selective search の2,000個よりも少ない候補でより正確でした。
| 項目 | 値 | 条件 |
|---|---|---|
| 速度 | 画像あたり 198ms(約 5fps) | VGG-16、データセンター用 GPU 1基。selective search + Fast R-CNN は 1,830ms |
| VOC 2007 | mAP 73.2% | 07+12 で学習 |
| VOC 2012 | mAP 70.4% | 07++12 で学習 |
| COCO test-dev | AP@0.5 42.7, AP@[.5,.95] 21.9 | VGG-16、trainval で学習 |
5. その次:FPN
物体の大きさが多様である場合、特徴マップ1枚だけでは不十分です。FPN(Feature Pyramid Network, 2017)は深い層の特徴量を2倍ずつ拡大しながら下へ降ろし(上から下へ)、同じ解像度の浅い層の特徴量を 1×1 畳み込みで合わせて 足し合わせる ピラミッドを構築します。小さな物体は高解像度の層から、大きな物体は低解像度の層から見つけます。第3回の U-Net と考え方が似ています。Faster R-CNN に FPN(ResNet-101)を組み合わせると、COCO test-dev の AP は 36.2 でした(単一モデル)。
6. 限界
- 遅い。 二段階(候補 → 判定)は正確ですが、リアルタイム処理には重すぎます。5fps は秒間60コマの卓球の映像には到底及びません。第6回の単段階検出器がこの問題をターゲットにしています。
- 手動で定めた箇所が多い。 アンカーの大きさや比率、IoU 0.7/0.3 のしきい値、NMS のしきい値のいずれも人間が定めています。4節の実験のように、これらの値がデータと合致していないと知らぬ間に穴が生じます。
- 小さな物体。 ストライド16の特徴マップの1マスは 16×16 画素です。直径 3–12px の卓球のボールは1マスよりも小さいです。
7. 我々のプロジェクトとのつながり
TT Score はボールを 枠ではなく ヒートマップで探します(第3回)。上記の3つの制限がすべてピンポン球に該当するからです。代わりに、箱検出器は人を探すのに使います。精密姿勢分析は、人検出器(RTMDet)で人の箱をまず探し、その箱を切り抜いて関節を探す「トップダウン(top-down)」方式です(TT Scoreモデル解剖第4回)。検出器 → 切り抜いて精密判定という構造が、2段階検出器の考え方と同じです。
TTの一言。 半分だけ重なってもIoUは0.33です。箱当ては思ったより厳しい試験です。
参考文献
- Girshick, R., Donahue, J., Darrell, T., Malik, J. (2014). Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation. CVPR 2014. https://arxiv.org/abs/1311.2524
- Girshick, R. (2015). Fast R-CNN. ICCV 2015. https://arxiv.org/abs/1504.08083
- Ren, S., He, K., Girshick, R., Sun, J. (2015). Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks. NeurIPS 2015. https://arxiv.org/abs/1506.01497
- Lin, T.-Y. et al. (2017). Feature Pyramid Networks for Object Detection. https://arxiv.org/abs/1612.03144
- サンプルコードと出力: このフォルダーの
code/05_boxes.py,code/05_boxes.out.txt