物体検出 — どこに、何が、どれくらい確かに
画像全体に1つのラベルを付ける分類から一歩進み、「画像のどこに何があるか」を四角い枠(バウンディングボックス)で当てるのが物体検出です。窓の走査から IoU・NMS・グリッド検出(YOLOの直感)まで、自動運転や監視カメラを支える技術の核心を動かして理解します。
1. 検出 = 分類 + 位置回帰
検出器の出力は、物体1つにつき次の6つの数の組です。
- 位置とサイズ:枠の中心 (x, y) と幅・高さ (w, h) — 連続値を当てる回帰
- クラス:枠の中身が何か — 分類
- 信頼度:そこに本当に物体がある確からしさ
つまり検出とは分類と回帰の合わせ技です。厄介なのは、画像によって物体の数が0個かもしれないし20個かもしれないこと。出力の個数が決まっていない問題は、ニューラルネットの「固定長の出力」と相性が悪いのです。
最も素朴な解決策はこうです — 分類器なら前のレッスンで作った。ならばあらゆる位置・あらゆる大きさの窓を切り出して、片っ端から分類器にかければいい。これがスライディングウィンドウ法です。
2. 窓で走査する — 素朴だが莫大
実際の検出では位置 × スケール × アスペクト比の全組合せを試すので、1枚あたり数万〜数十万回の評価になりえます。動画(毎秒30枚)ではまったく間に合いません。2014年の R-CNN は「物体がありそうな候補領域を先に約2000個に絞ってから CNN にかける」という発想でこれを緩和しましたが、それでも1枚に数十秒かかりました。
3. 重なりの物差し IoU と、重複を消す NMS
検出には「予測した枠がどれくらい正解の枠と合っているか」を測る物差しが要ります。それが IoU(Intersection over Union)です。
IoU にはもう1つ重要な仕事があります。検出器は1つの物体の周りに少しずつずれた枠を何個も出してしまうため、重複を1つに束ねる後処理が必要です。それが NMS(Non-Maximum Suppression:非最大抑制)です。
- 残っている候補の中で最高信頼度の枠を選んで確定する
- 確定した枠と IoU ≥ 閾値 の候補を「同じ物体の重複」とみなして削除する
- 候補がなくなるまで 1〜2 を繰り返す
4. 一発で全部予測 — グリッド検出(YOLO の直感)
スライディングウィンドウの無駄は、同じ画素を何百回も CNN に通すことでした。YOLO(You Only Look Once)の発想は大胆です — 画像を S×S のグリッドに分け、各セルに「自分の担当領域の物体の枠・信頼度・クラス」を予測させる。ネットワークの出力を最初から S×S×(枠+信頼度+クラス) の形にしておけば、たった1回の順伝播で全セルの予測が同時に出てきます。
速度差は歴然です。スライディングウィンドウが1枚に数千回の分類器評価を必要としたのに対し、グリッド検出はネットワーク1回。この差が「毎秒30〜100枚」というリアルタイム検出を可能にし、自動運転やロボットに検出器を載せられるようになりました。精度と速度のバランスから、現在の実務では1段階検出器が第一候補です。
5. 検出器の系譜 — 2段階 vs 1段階
| 系統 | 代表 | しくみ | 速度 | 特徴 |
|---|---|---|---|---|
| 2段階 | R-CNN → Fast → Faster R-CNN | ①候補領域を出す ②各領域を分類・回帰 | 遅め(〜10fps級) | 高精度。小さい物体に強い傾向 |
| 1段階 | YOLO系 / SSD / RetinaNet | グリッド上で枠+クラスを一発回帰 | 速い(30〜100fps級) | リアルタイム向き。実務の主力 |
| Transformer系 | DETR | 物体の「集合」を直接予測 | 中くらい | アンカーも NMS も不要になる |
6. まとめ
- 検出 = 分類 + 位置回帰。出力は (x, y, w, h, 信頼度, クラス) の可変個の集合。
- スライディングウィンドウは素朴だが、位置×スケールの組合せで評価回数が爆発する。
- IoU は枠の重なりの物差し(評価にも学習にも使う)。NMS は最高スコアを残して重複を消す後処理で、閾値にはトレードオフがある。
- グリッド検出(1段階)はネット1回で全予測を出し、リアルタイム検出を実現した。精度重視なら2段階、NMS 不要の DETR 系も台頭。
- 次のレッスンでは、枠よりさらに細かく画素単位で物体を切り出すセグメンテーションに進む。