一般物体認識

General Object Recognition — 画像の中の「何」を識別する技術
🔰 初心者

「一般物体認識」ってよく聞きますが、普通の画像認識とどう違うんですか?

🎓 上級者

一般物体認識は、画像の中に写っている物体が何であるかを識別するタスクだよ。「特定の1種類」ではなく、あらゆるカテゴリの物体を対象にする点が最大の特徴なんだ。まずは「特定物体認識」との違いから見ていこう。

🔍 特定物体認識 vs 一般物体認識

特定物体認識

特定の個体を識別する(=同定)
  • 対象: 特定の個体(東京タワー、モナリザ など)
  • 問い: 「これはあの○○か?」
  • 手法: 照合・マッチングが中心
  • 例: 顔認証、ランドマーク認識

一般物体認識

カテゴリを識別する(=分類)
  • 対象: カテゴリ全般(犬、車、椅子 など)
  • 問い: 「これはか?」
  • 手法: 特徴抽出+分類器
  • 例: 自動運転の障害物認識、商品分類
G検定での頻出ポイント

特定物体認識=「あの個体か?」(同定)
一般物体認識=「何のカテゴリか?」(分類)

この違いは試験でよく問われる!

⚠️ 一般物体認識が難しい理由
🔰 初心者

一般物体認識はなぜ難しいんですか?

🎓 上級者

同じカテゴリでも見た目が全然違ったり、環境によって見え方が大きく変わるからだよ。主な5つの要因を見てみよう。

一般物体認識が難しい5つの理由 一般物体 認識 ① クラス内変動 同じ「犬」でも見た目が全然違う ② 遮蔽(オクルージョン) 物体の一部が隠れている ③ 照明変動 光源の方向・明るさで見え方が変化 ④ 背景の複雑さ 自然画像は背景が複雑 ⑤ 視点変動 正面・横・上から見ると形が変わる これらの要因が組み合わさることで、一般物体認識は非常に困難なタスクになる
📋 一般物体認識の主要サブタスク
🔰 初心者

一般物体認識にもいろんな種類があるんですか?

🎓 上級者

そうだよ。「何があるか」だけでなく「どこにあるか」「どの画素が何か」まで、タスクによって粒度が違うんだ。代表的な4つのサブタスクを見ていこう。

一般物体認識の4つのサブタスク ← シンプル ——————————— 精密 → 画像分類 Classification 🐕 画像全体 → 犬 画像1枚に1ラベル 物体検出 Detection 🐕 🐈 犬 📦 猫 📦 同定(位置)+分類(カテゴリ) セマンティック セグメンテーション 背景 画素ごとにクラス分類 個体の区別はしない インスタンス セグメンテーション 犬A 犬B 背景 画素ごと+個体の区別 最も精密なタスク 各タスクの代表的手法 画像分類 VGG / ResNet EfficientNet 物体検出 R-CNN系 / YOLO SSD セマンティック FCN / SegNet U-Net / DeepLab インスタンス Mask R-CNN YOLACT シンプル(分類のみ) 精密(画素+個体)
🎯 物体検出 = 同定 + 分類
🔰 初心者

物体検出では「同定」と「分類」をするって聞いたんですが、どう違うんですか?

🎓 上級者

物体検出は2つの処理の組み合わせなんだ。同定は「どこにあるか・物体か背景か」の判断、分類は「何のカテゴリか」の判定。この2つをまとめて行うのが物体検出だよ。

同定(Localization)

物体の位置を特定する
  • 問い: 「画像のどこに物体がある?」
  • 判断: 「この領域は物体?背景?」
  • 出力: バウンディングボックス(位置)

分類(Classification)

カテゴリを判定する
  • 問い: 「その物体は何のカテゴリか?」
  • 判断: 「犬?猫?車?」
  • 出力: クラスラベル
📦 関心領域(RoI)とバウンディングボックス
🔰 初心者

「関心領域」と「バウンディングボックス」って何が違うんですか?

🎓 上級者

どちらも物体を囲む矩形だけど、関心領域(RoI)は途中段階の候補の枠で、バウンディングボックスは最終出力の確定した枠なんだ。

関心領域(RoI)バウンディングボックス
役割「ここに物体がありそう」という候補の枠最終的に確定した物体の枠
段階途中(候補提案の段階)最終出力
大量(R-CNNでは約2000個)物体の数だけ
表現候補領域(x, y, 幅, 高さ) の4値
関心領域 → バウンディングボックスの流れ ① 関心領域を提案 「ここに物体がありそう」 候補を大量に生成 ② 分類+判定 各候補を「物体 or 背景」判定 +カテゴリを分類 ③ バウンディングボックス 位置を調整して最終出力 (x, y, 幅, 高さ) + クラスラベル
🔬 2段階型の物体検出手法(R-CNN系)
🔰 初心者

R-CNNからFaster R-CNNまで、どう進化したんですか?

🎓 上級者

一言でいうとボトルネックを1つずつ解消して高速化した歴史だよ。何が遅かったのか、それをどう解決したかを追うとわかりやすいんだ。

R-CNN(2014年)

CNNを物体検出に初めて本格的に適用した手法

Selective Search(画像処理の古典手法)で約2000個の関心領域を生成
② 各領域を1つずつCNNに通して特徴を抽出
③ SVMで分類、回帰で位置を調整

問題点: 候補が2000個あればCNNを2000回実行 → 非常に遅い

Fast R-CNN(2015年)

「CNNを何度も回す」問題を解決

画像全体を1回だけCNNに通して特徴マップを作成
② Selective Searchで候補領域を提案
③ 特徴マップから候補領域に対応する部分を切り出す(RoI Pooling
④ 分類+位置調整

改善: CNNが1回で済み、R-CNNの約10倍に高速化
残った問題: Selective Search自体がまだ遅い

Faster R-CNN(2015年)

全工程をNNで完結させた手法

① 画像全体を1回だけCNNに通す
RPN(Region Proposal Network)で候補領域を提案 → Selective Search不要に
③ RoI Poolingで特徴を切り出し
④ 分類+位置調整

RPN: 特徴マップ上の各位置で「ここに物体があるか?」を判定。アンカーボックス(様々なサイズ・比率の枠)を基準に候補を生成する。

R-CNN系の進化:何が改善されたか R-CNN (2014) 候補生成: Selective Search CNN実行: 候補ごとに毎回 🐌 遅い(CNN約2000回) 分類: SVM(別モデル) CNN統合 Fast R-CNN (2015) 候補生成: Selective Search CNN実行: 画像全体で1回 ⚡ 約10倍に高速化 RoI Poolingを導入 RPN導入 Faster R-CNN (2015) 候補生成: RPN(NNで実行) CNN実行: 画像全体で1回 🚀 全工程がNNで完結 アンカーボックスで候補生成 ボトルネックを順番に解消: CNNの重複実行 → Selective Searchの遅さ
R-CNNFast R-CNNFaster R-CNN
候補生成Selective SearchSelective SearchRPN(NN)
CNN実行候補ごとに毎回画像全体で1回画像全体で1回
何を解決?CNNで検出を実現CNNの重複実行を排除Selective Searchも排除
速度遅い中程度高速
1段階型の物体検出手法(YOLO / SSD)
🔰 初心者

2段階型は候補を出してから分類するんですよね。1段階型はどう違うんですか?

🎓 上級者

1段階型は候補提案なしで、検出と分類を同時に一括で行うんだ。だからとにかく速い!

YOLO(You Only Look Once)

画像を1回見るだけで検出(2016年)
  • 画像を格子(グリッド)に分割(例: 7×7)
  • 各セルが「自分の中に物体の中心があるか?」を判定
  • バウンディングボックスとクラスを同時に予測
  • 弱点: 小さい物体の検出が苦手

SSD(Single Shot MultiBox Detector)

複数スケールで同時に検出(2016年)
  • CNNの複数の層から特徴マップを取得
  • 大きい特徴マップ → 小さい物体を検出
  • 小さい特徴マップ → 大きい物体を検出
  • YOLOの「小さい物体が苦手」を改善
2段階型 vs 1段階型の使い分け

精度重視 → 2段階型(R-CNN系): 医療画像など
速度重視 → 1段階型(YOLO/SSD): 自動運転、監視カメラなど

🔺 FPN(Feature Pyramid Network)— マルチスケール特徴抽出
🔰 初心者

SSDは複数の層から特徴を取って大小の物体を検出するって話でしたが、もっと上手くやる方法はないんですか?

🎓 上級者

まさにその改良がFPNだよ。CNNの各層の特徴マップを上位層から下位層へ統合していくことで、すべてのスケールで「意味的に豊富な」特徴マップを作り出すんだ。

FPN(Feature Pyramid Network)(2017年)

Facebook AI Research(Tsung-Yi Linら)が提案。物体検出の精度を大幅に向上させた汎用的な特徴抽出手法。

CNNの問題点:浅い層は解像度が高く位置情報が豊富だが意味的な情報が弱い。深い層は意味的な情報が豊富だが解像度が低い。

FPNの解決策:深い層の意味的な情報をトップダウン経路で浅い層に伝え、横方向の接続(Lateral Connection)で各スケールの特徴マップを統合する。これにより全スケールで「高解像度+高い意味情報」の特徴マップが得られる。

FPN(Feature Pyramid Network)の構造 ボトムアップ経路 (通常のCNN) C2(高解像度) 位置情報◎ 意味情報△ C3 C4 C5(低解像度) 位置情報△ 意味情報◎ トップダウン経路 (FPNが追加) P5 P4 P3 P2(高解像度) 位置情報◎ 意味情報◎ 横方向の接続 (1x1 Conv + 加算) 検出に使用 小さい物体 中くらいの物体 大きい物体 深い層の意味情報を浅い層に伝達 → 全スケールで高品質な特徴マップを実現
FPNの構造 — ボトムアップ+トップダウン+横方向接続でマルチスケール特徴を統合
FPNが使われている手法

FPNは汎用的な特徴抽出モジュールなので、さまざまな検出・セグメンテーション手法と組み合わせて使われている:

Faster R-CNN + FPN → 小さい物体の検出精度が大幅に向上
Mask R-CNN → FPNをバックボーンに使用(インスタンスセグメンテーション)
RetinaNet → FPN + Focal Loss で1段階型の精度を2段階型レベルに向上

📐 物体検出の評価指標
🔰 初心者

物体検出の精度って、どうやって測るんですか?

🎓 上級者

物体検出には独自の評価指標があるよ。予測ボックスの正確さを測るIoU、モデル全体の精度を測るmAP、そして重複する検出を整理するNMSの3つを押さえよう。

指標正式名称説明ポイント
IoU Intersection over Union 予測ボックスと正解ボックスの重なり度合いを測る。
IoU = 交差領域 / 和集合領域
通常 IoU ≥ 0.5 で「正解」とみなす。1.0が完全一致。
mAP mean Average Precision 各クラスのAverage Precision(AP)の平均値。物体検出モデルの総合的な精度評価指標。 APはPrecision-Recallカーブの下の面積。mAPが高いほど優秀なモデル。
NMS Non-Maximum Suppression
(非最大値抑制)
重複する検出ボックスを除去する後処理。最も確信度の高いボックスを残し、IoUが閾値以上の他のボックスを削除する。 1つの物体に対して複数のボックスが出力されるのを防ぐ。
NMS(Non-Maximum Suppression)の処理の流れ

① すべての検出ボックスを確信度の高い順に並べる
② 最も確信度の高いボックスを「採用」として残す
③ 採用したボックスとIoUが閾値以上(大きく重なる)の他のボックスを削除
④ 残ったボックスで②③を繰り返す

これにより、同じ物体に対する重複検出が除去され、物体ごとに1つのボックスだけが残る。

🧩 セマンティックセグメンテーション
🔰 初心者

セグメンテーションって物体検出とどう違うんですか?

🎓 上級者

物体検出は矩形の枠で囲むけど、セグメンテーションは画素ごとに「犬」「背景」とラベルをつけるんだ。物体の輪郭に沿って正確に領域を分けるよ。

FCN(Fully Convolutional Network)(2015年)

セマンティックセグメンテーションの元祖

通常のCNNは最後に全結合層があり、出力は「犬: 95%」のような1ラベル。FCNはこの全結合層をすべて畳み込み層に置き換え、入力と同じサイズの「画素ごとのクラスマップ」を出力できるようにした。

弱点: 畳み込み・プーリングで解像度が下がるため、出力がぼやける

SegNet(2015年)

Max Poolingの位置情報を記憶して境界をシャープに復元

エンコーダ・デコーダ構造を採用。エンコーダ(圧縮)→ デコーダ(復元)。

ポイントはMax Poolingの位置インデックスを記憶しておくこと。通常のMax Poolingは最大値の位置を捨てるが、SegNetはその位置を覚えておき、デコーダのMax Unpoolingで元の位置に値を戻す。これにより物体の境界がシャープに復元される。

U-Net(2015年)

スキップ接続で位置情報を補う。医療画像で広く使用

構造がアルファベットの「U」の形をしたエンコーダ・デコーダ構造。最大の特徴はスキップ接続

エンコーダの各段階の特徴を、対応するデコーダの段階に直接コピーして結合する。エンコーダで圧縮すると「何があるか」はわかるが「どこにあるか」の位置情報が失われる → スキップ接続で高解像度の位置情報を直接補う。

強み: 少ないデータでも高精度。医療画像(細胞、臓器のセグメンテーション)で広く使用。

U-Netの構造(スキップ接続) エンコーダ(圧縮) 高解像度の特徴 中解像度 ボトルネック 最も圧縮された表現 デコーダ(復元) 高解像度に復元 中解像度 スキップ接続(コピー+結合) スキップ接続(コピー+結合) エンコーダの位置情報をデコーダに直接送り、精密な復元を実現
🎭 インスタンスセグメンテーション
🔰 初心者

セマンティックセグメンテーションだけじゃダメなんですか?

🎓 上級者

セマンティックだと同じ「犬」は全部まとめて「犬」としか分からない。犬Aと犬Bを区別したいときにインスタンスセグメンテーションが必要なんだ。

Mask R-CNN(2017年)

精度重視の代表手法(2段階型ベース)
  • Faster R-CNNにマスク予測の分岐を追加
  • 各候補領域で「この画素は物体か背景か」も予測
  • 出力: クラス+バウンディングボックス+マスク
  • 精度が高いが処理はやや重い

YOLACT(2019年)

速度重視のリアルタイム手法(1段階型)
  • マスクの部品(プロトタイプ)を事前に生成
  • 各物体ごとに「どの部品をどう組み合わせるか」の係数を予測
  • 部品 × 係数でマスクを合成
  • Mask R-CNNより高速だが精度はやや劣る
📊 セグメンテーション手法まとめ
手法種別構造の特徴ポイント
FCNセマンティック全結合層→畳み込み層に置換セグメンテーションの元祖
SegNetセマンティックエンコーダ・デコーダ+Max Poolingの位置記憶境界がシャープに復元
U-Netセマンティックエンコーダ・デコーダ+スキップ接続少データ・医療画像向け
DeepLabセマンティックAtrous Convolution(膨張畳み込み)広い受容野を確保
Mask R-CNNインスタンスFaster R-CNN+マスク分岐精度重視の代表手法
YOLACTインスタンス1段階型+マスク部品の合成速度重視(リアルタイム)
🏃 姿勢推定(Pose Estimation)
🔰 初心者

物体検出やセグメンテーション以外にも、画像から情報を取り出すタスクはあるんですか?

🎓 上級者

姿勢推定というタスクがあるよ。画像から人の関節の位置(キーポイント)を検出して、体の骨格構造を推定するんだ。スポーツ分析やAR、ジェスチャー認識などに使われている。

姿勢推定の2つのアプローチ

トップダウン方式:まず人物を検出(バウンディングボックス)→ 各人物ごとにキーポイントを推定
→ 精度が高いが、人数が多いと遅くなる

ボトムアップ方式:まず画像全体からすべてのキーポイントを検出 → キーポイントをグループ化して各人物に割り当て
→ 人数が増えても速度が落ちにくい

OpenPose(2017年)

カーネギーメロン大学(CMU)が開発。リアルタイムで複数人の姿勢を同時に推定できるモデル。

ボトムアップ方式の代表手法。画像全体から全員のキーポイントを一度に検出し、PAF(Part Affinity Fields)という仕組みで「どのキーポイントが同じ人に属するか」を判定する。

PAF(Part Affinity Fields)とは:関節と関節の間の「つながりの方向と強さ」を表す2Dベクトル場。たとえば「右肩→右肘」の方向場を学習しておけば、複数人がいても正しいペアで関節をつなげられる。

OpenPoseの処理フロー(ボトムアップ方式) 入力画像 複数人が写った 画像 CNN 特徴マップを 抽出 キーポイント検出 全員の関節位置を検出 PAF(Part Affinity Fields) 関節間のつながりを推定 グループ化 キーポイントを 人物ごとにまとめる キーポイント(関節の位置)とPAF(関節間の方向・強さ)を同時に推定 → 人数が増えても処理速度が落ちにくい(ボトムアップの利点)
OpenPoseの処理フロー — PAFで複数人のキーポイントを正しくグループ化
OpenPoseの応用例

スポーツ分析:選手のフォーム解析、動作の定量評価
ジェスチャー認識:手話認識、UIの非接触操作
AR/VR:体の動きに合わせたアバター制御
医療・リハビリ:患者の歩行分析、姿勢矯正

📝 まとめ
G検定で押さえるべきポイント