物体検出 — どこに、何が、どれくらい確かに

画像全体に1つのラベルを付ける分類から一歩進み、「画像のどこに何があるか」を四角い枠(バウンディングボックス)で当てるのが物体検出です。窓の走査から IoU・NMS・グリッド検出(YOLOの直感)まで、自動運転や監視カメラを支える技術の核心を動かして理解します。

1. 検出 = 分類 + 位置回帰

検出器の出力は、物体1つにつき次の6つの数の組です。

つまり検出とは分類と回帰の合わせ技です。厄介なのは、画像によって物体の数が0個かもしれないし20個かもしれないこと。出力の個数が決まっていない問題は、ニューラルネットの「固定長の出力」と相性が悪いのです。

最も素朴な解決策はこうです — 分類器なら前のレッスンで作った。ならばあらゆる位置・あらゆる大きさの窓を切り出して、片っ端から分類器にかければいい。これがスライディングウィンドウ法です。

2. 窓で走査する — 素朴だが莫大

スライディングウィンドウ — 窓が走査し「車らしさ」ヒートマップができる
オレンジの枠が現在の窓、赤の濃さが各位置での「車らしさ」スコア。窓サイズを切り替えると、車の大きさに合った窓のときだけスコアが高くなるのが分かります。下のカウンタは分類器を呼んだ回数 — 3サイズ走査するだけで千回超えです。

実際の検出では位置 × スケール × アスペクト比の全組合せを試すので、1枚あたり数万〜数十万回の評価になりえます。動画(毎秒30枚)ではまったく間に合いません。2014年の R-CNN は「物体がありそうな候補領域を先に約2000個に絞ってから CNN にかける」という発想でこれを緩和しましたが、それでも1枚に数十秒かかりました。

POINT — 検出の歴史は「評価回数との戦い」 スライディングウィンドウ(全部試す)→ R-CNN(候補2000個に絞る)→ Fast/Faster R-CNN(特徴マップを1回だけ計算して使い回す)→ YOLO/SSD(ネット1回で全部出す)。どの進化も「CNN を何回走らせるか」を減らす方向に進んできた。

3. 重なりの物差し IoU と、重複を消す NMS

検出には「予測した枠がどれくらい正解の枠と合っているか」を測る物差しが要ります。それが IoU(Intersection over Union)です。

IoU(A, B) = |A ∩ B| / |A ∪ B| 共通部分の面積 ÷ 2つの枠を合わせた領域の面積。完全一致で1、離れていれば0。慣例では IoU ≥ 0.5 で「当たり」扱い

IoU にはもう1つ重要な仕事があります。検出器は1つの物体の周りに少しずつずれた枠を何個も出してしまうため、重複を1つに束ねる後処理が必要です。それが NMS(Non-Maximum Suppression:非最大抑制)です。

  1. 残っている候補の中で最高信頼度の枠を選んで確定する
  2. 確定した枠と IoU ≥ 閾値 の候補を「同じ物体の重複」とみなして削除する
  3. 候補がなくなるまで 1〜2 を繰り返す
IoUとNMS — ステップ実行で重複が消えていく
2台の車の周りに9個の候補(数字は信頼度スコア)。ボタンで NMS を1手ずつ進めると、緑の確定枠との IoU が計算され(赤い塗り=交差領域)、閾値以上の箱が消えます。閾値 0.3〜0.5 でちょうど2台。0.6以上に上げる/0.1以下に下げると何が起きるか試してください。
POINT — NMS閾値のトレードオフ 閾値が高いと重複が消えきらず同じ車を何度も検出する。低いと、隣に並んだ別の車まで「重複」として消してしまう。人混みや渋滞のような物体どうしが本当に重なるシーンでは、NMS は原理的なジレンマを抱える — これが後述の DETR のように「NMS をなくす」研究が生まれた理由でもある。

4. 一発で全部予測 — グリッド検出(YOLO の直感)

スライディングウィンドウの無駄は、同じ画素を何百回も CNN に通すことでした。YOLO(You Only Look Once)の発想は大胆です — 画像を S×S のグリッドに分け、各セルに「自分の担当領域の物体の枠・信頼度・クラス」を予測させる。ネットワークの出力を最初から S×S×(枠+信頼度+クラス) の形にしておけば、たった1回の順伝播で全セルの予測が同時に出てきます。

グリッド検出 — 1回のネット実行で49セルが一斉に予測する
緑の波が「1回の順伝播」。全セルが同時に枠を予測し(セルの緑の濃さ=信頼度)、信頼度閾値でふるいにかけ、NMSで重複を束ねると最終検出だけが残ります。閾値を下げると誤検出が増え、NMSを切ると同じ車に複数の枠が付くのを確認してください。

速度差は歴然です。スライディングウィンドウが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 も不要になる
注意 — 学習を歪める「背景の洪水」 グリッドやアンカーの予測のほとんど(数千〜数万個中の99%以上)は物体のない背景。何も工夫しないと損失が「簡単な背景」に支配され、肝心の物体を学べない。前レッスンのクラス不均衡の極端版である。Hard Negative Mining(難しい背景だけ学習に使う)や Focal Loss(簡単な例の損失を減衰させる)はこのために生まれた。
一歩先へ — アンカーとアンカーフリー 実際の YOLO/SSD は各セルにアンカーと呼ばれる複数のひな型枠(縦長・横長・大小)を置き、「どのひな型からのズレか」を回帰する。ひな型が良い初期値になり学習が安定する一方、アンカーの設計・割当てはハイパーパラメータの塊だった。近年は FCOS や CenterNet のように点から直接枠を回帰するアンカーフリーが主流になり、さらに DETR は検出を「集合予測」として定式化してアンカーも NMS も捨てた。道具は変わっても「分類+位置回帰」という本質は変わらない。

6. まとめ