論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
物体検出
Object Detection
画像認識

🔖 キーワード索引

物体検出(Object Detection)を深く理解するために、 本ページで扱う主要キーワードを並べます。 クリックで該当セクションへジャンプ:

📍 文脈 🎨 直感 📐 IoU 定義 🔬 数式を言葉で読み解く 🧮 実値計算 🐍 Python 実装 ⚠️ 落とし穴 🌐 関連手法 🔗 関連用語 📚 関連グループ教材

💡 30秒で分かる結論

🍰 まずはやさしく

画像の中の物を探す技術です。

物の場所と名前を同時に知るために使います。

スマホで写真の人物を囲む機能に似ています。

この章では仕組みと評価の方法を学びます。

📍 文脈 — どこで使う概念か

🍰 まずはやさしく

画像認識という分野の主要な技術です。

どこに何があるかを正確に答えるために使います。

自動運転で歩行者を見つける時に役立ちます。

他の似た技術との違いについて解説します。

物体検出(Object Detection)は、 画像認識の中核タスクの 1 つ。 単純な「画像分類」(猫か犬か)より一段難しく、 「画像のどこに何があるか」を答えます。 自動運転(周辺車両・歩行者)、 監視カメラ、 製造業の品質検査など 産業応用が極めて多い領域です。

📍 文脈ボックス:あなたが今見ているもの

あなたは今、 コンピュータビジョン(CV)の中核タスクの一つである「物体検出」のページにいます。 CV のタスクは以下の階層で整理できます:

物体検出は自動運転(人・車・標識検知)、 監視カメラ、 医療画像(病変検出)、 小売(棚卸し)、 農業(果実検出)など実応用の多くで採用されています。

🎨 直感で掴む — 具体例で理解する

🍰 まずはやさしく

写真に付箋を貼るような作業です。

物の種類と自信の強さを記録するために使います。

部活の集合写真から友達を探す感覚です。

機械にとってなぜ難しいのかを考えます。

画像認識タスクの階層:

タスク出力
画像分類1 つのラベル「この画像は猫」
物体検出複数のボックス + ラベル「(100,50,200,150) に猫、 (300,100,400,300) に犬」
セマンティックセグメンテーションピクセル単位のラベル「このピクセル群が猫」
インスタンスセグメンテーションピクセル + 個体ID「猫1、 猫2 を区別」

物体検出は「いくつあるか分からない物体を検出」する必要があり、 アルゴリズム設計が複雑。 主流は 1 段階検出器(YOLO, SSD)と 2 段階検出器(Faster R-CNN)に分かれます。

🎨 直感で掴む

物体検出を「画像にラベル付き付箋を貼る作業」と考えてみましょう。 写真の中の犬・人・自転車それぞれに長方形の付箋を貼り、 「犬 92%」「人 88%」「自転車 76%」と書き込みます。 これがまさに物体検出器の出力です。

人間は瞬時にこれを行えますが、 機械にとっては難題です。 なぜなら:

そこで近年のモデルは「① 候補矩形を多数生成 → ② 各候補をクラス分類 + 矩形微調整 → ③ 重複矩形を間引く(NMS)」という流れで処理します。 これを 1 段階で同時にやるのが YOLO、 2 段階に分けるのが Faster R-CNN です。

モデル系代表特徴速度精度
2 段階検出Faster R-CNN, Mask R-CNN候補抽出 → 分類の二段構え
1 段階検出YOLO v3-v10, SSD, RetinaNetgrid + anchor で一発推論中〜高
Transformer 系DETR, Deformable DETRNMS 不要・end-to-end
Anchor-freeFCOS, CenterNetアンカー不要、 中心点予測中〜高

📐 定義・数式

🍰 まずはやさしく

正解との重なり具合を測るルールです。

AIの予測がどれくらい正しいか判定するために使います。

買い物で欲しい物を正確に見つける感覚です。

計算に使う重要な指標について説明します。

【IoU(Intersection over Union)】
$$\mathrm{IoU} = \frac{|A \cap B|}{|A \cup B|}$$
予測ボックス $A$ と正解ボックス $B$ の重なり率。 0〜1 の値。 IoU > 0.5 で「正解」と判定するのが慣例
【mAP(mean Average Precision)】
$$\mathrm{mAP} = \frac{1}{C} \sum_{c=1}^{C} \mathrm{AP}_c$$
クラス $c$ ごとの AP(Precision-Recall 曲線下面積)を平均した総合指標

📐 数式または定義

物体検出を支える 4 つの中核数式を順に示します。

(1) IoU(Intersection over Union): 予測矩形 A と正解矩形 B の重なり度合いを 0〜1 で測る指標。

$$\mathrm{IoU}(A, B) = \frac{\mathrm{Area}(A \cap B)}{\mathrm{Area}(A \cup B)} = \frac{|A \cap B|}{|A| + |B| - |A \cap B|}$$

(2) Precision / Recall: 検出された矩形のうち IoU≥τ の割合が Precision、 正解矩形のうち拾えたものの割合が Recall。

$$\mathrm{Precision} = \frac{TP}{TP + FP}, \quad \mathrm{Recall} = \frac{TP}{TP + FN}$$

(3) Average Precision(AP): 信頼度スコアの閾値を変えて描いた PR 曲線の下面積。

$$\mathrm{AP} = \int_0^1 P(r)\,dr \approx \sum_{i=1}^{N} (r_i - r_{i-1}) \cdot P_i$$

(4) mean Average Precision(mAP): 全クラスの AP の平均。

$$\mathrm{mAP} = \frac{1}{C} \sum_{c=1}^{C} \mathrm{AP}_c$$

(5) Non-Maximum Suppression(NMS): 重複矩形を間引くアルゴリズム。 同クラス内で IoU が閾値(例 0.5)以上の矩形のうち最高スコア以外を捨てる。

$$\mathrm{Keep}(b_i) \iff \forall j: s_j > s_i \Rightarrow \mathrm{IoU}(b_i, b_j) < \tau_{\mathrm{nms}}$$

🔬 記号・要素の読み解き

バウンディングボックス
(x, y, w, h) または (x1, y1, x2, y2) で物体を矩形で囲む
クラス
物体のカテゴリ(人、 車、 犬 など)
信頼度(confidence)
「この検出が正しい確率」
IoU
重なり率。 マッチング判定に使う
NMS(Non-Max Suppression)
重複検出を 1 つに統合する後処理
mAP
全クラスの総合精度

🔬 数式を言葉で読み解く

「数式を言葉で読み解く」ことは、 数学アレルギーを乗り越える最良の方法です。 各記号の意味を日本語で並べ直します:

記号意味物体検出での実体
A, B2 つの矩形(集合)予測 box と正解 box
A ∩ B共通部分(重なり領域)交差矩形の面積
A ∪ B和集合(合体領域)予測と正解の総面積
IoU=1完全一致予測 = 正解
IoU=0重なりゼロ完全外れ
TP, FP, FN真陽性 / 偽陽性 / 偽陰性IoU≥0.5 で正解 → TP、 過検出 → FP、 見落とし → FN
P(r)Recall=r での PrecisionPR 曲線の高さ
Cクラス数COCO なら 80, PASCAL VOC なら 20
τ_nmsNMS の IoU 閾値通常 0.45〜0.5

読み下し例: 「IoU = (重なりの面積) ÷ (合体の面積)。 IoU が 0.5 以上なら『当たり』とみなし、 PR 曲線を作って積分すると AP、 それをクラス平均すると mAP」。

🧮 数値例・実値計算

YOLOv5 等の代表モデルの性能比較(COCO データセット):

モデルmAP速度 (FPS)パラメータ数
YOLOv5s37.41407.2M
YOLOv5x50.73287M
Faster R-CNN42.0541M
DETR44.91041M
YOLOv8x53.94068M

速度と精度はトレードオフ。 リアルタイム用途(自動運転)は YOLO 系、 精度重視は R-CNN 系。

🧮 数式に値を入れて手で計算する: mAP の計算

合成データでクラス別 AP と平均 (mAP) を計算する。

Step 1: クラス別 AP

クラスAP
person0.85
car0.78
dog0.92
cat0.65

Step 2: mAP

mAP = (0.85+0.78+0.92+0.65)/4 = 3.20/4 = 0.80

🐍 Python で再現

1
2
3
import numpy as np
ap = np.array([0.85, 0.78, 0.92, 0.65])
print(f"mAP: {ap.mean():.3f}")

📤 実行結果

mAP: 0.800

💬 手計算 (Step 2) 0.80 と Python 出力が完全一致。

🐍 Python 実装例

最小コードで動かしてみる例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
from ultralytics import YOLO

# 事前学習済み YOLOv8 で物体検出
model = YOLO('yolov8n.pt')

# 画像で推論
results = model('image.jpg')

# 検出結果(バウンディングボックス + クラス + 信頼度)
for r in results:
    print(r.boxes.xyxy)  # 座標
    print(r.boxes.cls)   # クラスID
    print(r.boxes.conf)  # 信頼度

⚠️ よくある落とし穴

❌ 小さい物体の検出
高解像度画像での小物体は見逃しやすい。 マルチスケール検出や FPN を使う。
❌ クラス不均衡
「人」が大量、 「飛行機」が少しのデータだと学習が偏る。 Focal Loss や重み付け。
❌ アノテーションの質
境界ボックスの定義が人間でも揺れる。 アノテーションガイドラインを厳密に。
❌ 照明・角度変化
学習データと違う環境では性能が落ちる。 データ増強で頑健化。
❌ リアルタイム性
車両等の用途では遅延が致命的。 速度 vs 精度のバランスを慎重に。

⚠️ 落とし穴 - 拡張版

上記の基本的な落とし穴に加え、 現場で実際に遭遇する 10 個の追加注意点を解説。

  1. train/val リーク: 同じシーンの連続フレームを train と val に分けると擬似的に val 精度が高くなる。 シーン単位で分割すべし。
  2. 長尾分布の罠: COCO の上位 10 クラスで全インスタンスの 60% を占める。 LVIS では極端な long-tail のため class-balanced sampling 必須。
  3. アノテーション仕様の揺れ: 「自動車」を「車体のみ」とするか「窓・ミラー含む」とするかで box が変わる。 ガイドライン文書化が必須。
  4. 重複物体カウントエラー: 群衆検出で 1 人を 2 つに数える / 2 人を 1 つに数えるエラー。 Soft-NMS や Crowd-NMS で改善。
  5. 動的シーンへの過適合: 学習データが特定の街路パターンに偏ると未知シーンで一気に精度低下。 ドメイン多様性を確保。
  6. ラベルノイズ: アノテーターのミスで 5-10% のラベルが誤っているのは珍しくない。 Label cleaning, co-teaching 等で対応。
  7. 計算リソース過大評価: 「YOLO は 200 FPS」とあるが入力サイズ・バッチ・前処理を含めると実 30 FPS のことも。 自前環境での測定必須。
  8. 動画の時間整合性問題: 単フレーム検出を動画に適用すると、 同じ物体の box が小刻みにブレる。 時間平滑化 / トラッキング統合で対策。
  9. カラー空間問題: BGR / RGB の取り違えで精度激減。 OpenCV と PIL の違いに注意。
  10. 適切なライセンス確認: YOLOv5/v8 は GPL-3.0、 商用利用には別途ライセンス購入が必要。 プロジェクト初期に確認。

🗺 概念マップ:物体検出を取り巻く知識マップ

物体検出を中心にした関連概念のツリーマップ:

物体検出 (Object Detection)
├── 入力
│ ├── 静止画 (RGB / RGB-D / グレースケール / マルチスペクトル)
│ ├── 動画 (連続フレーム)
│ └── 点群 (LiDAR / ステレオ / RGB-D 深度)
├── アーキテクチャ
│ ├── 2 段階 (Faster R-CNN, Mask R-CNN, Cascade R-CNN)
│ ├── 1 段階 anchor-based (SSD, RetinaNet, YOLO v1-v5)
│ ├── 1 段階 anchor-free (FCOS, CenterNet, YOLOX, YOLOv8)
│ ├── Transformer (DETR, Deformable DETR, DINO, Co-DETR)
│ └── Open-vocab (OWL-ViT, Grounding DINO, GLIP)
├── 構成要素
│ ├── Backbone (ResNet, EfficientNet, Swin, ViT)
│ ├── Neck (FPN, PAN, BiFPN)
│ ├── Head (classification + regression)
│ └── Post-processing (NMS, Soft-NMS, score thresholding)
├── 学習
│ ├── 損失 (CE, Focal, Smooth L1, GIoU, CIoU)
│ ├── 対応付け (Max-IoU, ATSS, OTA, TAL)
│ ├── データ拡張 (Mosaic, MixUp, Copy-Paste, RandAugment)
│ └── 事前学習 (COCO pretrain, self-supervised)
├── 評価
│ ├── IoU / GIoU / DIoU / CIoU
│ ├── Precision / Recall / F1
│ ├── AP (11-point / 101-point / continuous)
│ └── mAP (@0.5, @0.75, @[0.5:0.95], AP_S/M/L)
├── デプロイ
│ ├── クラウド (GPU/TPU)
│ ├── エッジ (Jetson, Coral, Hailo)
│ ├── モバイル (CoreML, TFLite, ONNX Runtime Mobile)
│ └── 最適化 (TensorRT, INT8 量子化, pruning, distillation)
└── 応用
├── 自動運転 (人・車・標識・信号)
├── 監視 (侵入・異常行動)
├── 医療 (病変・組織)
├── 小売 (商品・客)
├── 農業 (果実・雑草)
├── スポーツ (選手・ボール)
├── 製造 (欠陥・部品)
└── 環境 (野生動物・植生)

🎯 まとめ

物体検出(Object Detection)は CV の中核タスクであり、 画像 1 枚から複数の (矩形, クラス, 信頼度) を出力する。 評価は IoUmAP が中心で、 代表モデルは Faster R-CNN(2 段階)、 YOLO(1 段階)、 DETR(Transformer)の 3 系統。 予測ボックスと正解ボックスの IoU が 0.5 を超えれば正解 (TP) と判定され、 位置ずれが大きくなるほど mAP は急激に低下する。 実応用では精度と速度のトレードオフ、 アノテーションコスト、 ドメインギャップに注意。 産業導入では自動運転・医療・小売・農業・スポーツなど幅広い分野で実用化されている。

📑 クイックリファレンス(チートシート)

現場で素早く参照できる物体検出チートシート:

状況推奨モデル理由
リアルタイム必須 (60+ FPS)YOLOv8n/s, YOLOv10n軽量・高速
精度最優先DINO-Swin-L, Co-DETRCOCO mAP 60+
バランス重視YOLOv8m/l, Faster R-CNN-FPN速度・精度両立
少データ (1 クラス<100 枚)転移学習 + 強力なデータ拡張pre-trained 重要
小物体多数FPN/PAN 付きモデル, 高解像度入力multi-scale が鍵
クラス不均衡Focal Loss + class-balanced samplinglong-tail 対策
未知クラス検出Grounding DINO, OWL-ViTopen-vocab
エッジ展開YOLOv8n + INT8 量子化省メモリ・低遅延
医療画像Faster R-CNN + Focal Lossrecall 重視
産業欠陥検査独自学習 YOLOv5 + ハードネガ採掘false alarm 削減

▶ よく使うコマンド・スニペット

# YOLOv8 ワンライナー推論
yolo detect predict model=yolov8n.pt source='path/to/image.jpg'

# YOLOv8 学習
yolo detect train data=dataset.yaml model=yolov8n.pt epochs=100 imgsz=640

# YOLOv8 検証
yolo detect val model=runs/detect/train/weights/best.pt data=dataset.yaml

# YOLOv8 → ONNX 変換
yolo export model=best.pt format=onnx

# TensorRT 変換
trtexec --onnx=best.onnx --saveEngine=best.engine --fp16

# Detectron2 (Faster R-CNN) 推論例
python demo/demo.py --config-file configs/COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml \\
  --input image.jpg --output output.jpg \\
  --opts MODEL.WEIGHTS detectron2://COCO-Detection/faster_rcnn_R_50_FPN_3x/137849458/model_final_280758.pkl
object detection セマンティックセグメンテーシ インスタンスセグメンテーショ キーポイント検出 3D 物体検出 Tracking-by-De Open-vocabular

🔗 隣接手法への橋渡し

「物体検出」は単独で完結せず、 前後の手法と組み合わさって価値が発揮される。 入力データの準備 (上流)・同目的の代替手法との比較 (並列)・結果の活用 (下流) という 3 軸で隣接領域を整理する。

この上流・並列・下流の対応を地図化することで、 「物体検出」を中核に据えた分析パイプライン (データ準備 → 手法選択 → 結果の検証と展開) の全体像が見えてくる。

🌳 手法選択フロー

「物体検出」を実際に使うとき、 何をどう選ぶかを順に判断する。 上から順に答えていくと、 使うべき手法と評価の仕方が決まる。

  1. 位置まで要るのか、 有無だけでよいか
    「写っているか」だけなら画像分類で足りる。 「どこに、 いくつ」が要るときに初めて物体検出を使う。 検出は学習データの作成コストが桁違いに高い。
  2. アノテーションを用意できるか
    矩形を 1 つずつ描く作業が要る。 数千枚なら数百時間規模。 用意できないなら、 学習済みモデルで検出できる一般物体に問題を寄せられないか検討する。
  3. 速さと精度のどちらが要るか
    映像をリアルタイムで処理するなら 1 段階検出(YOLO 系)。 精度を優先し 1 枚ずつ処理してよいなら 2 段階検出。
  4. 評価をどう定義したか
    検出は「どれくらい重なれば正解か」(IoU の閾値)で数値が大きく変わる。 閾値を明記しないと mAP は比較できない。

物体検出は分類より一段コストが高い。 「位置が本当に必要か」を最初に確かめると、 分類で済んで工数が数分の一になることがある。