#07 人工知能入門 CNN画像認識
ヘッド——特徴をタスクの答えに変換する
ヘッドとは何か
前回バックボーンが「特徴を抽出するエンジン」だと学びました。では、その特徴をどう「答え」に変換するのか。それがヘッド(Head)の役割です。
[バックボーン] → [特徴マップ] → [ヘッド] → [答え]
↑共通 ↑タスクによって変わる
ヘッドはタスクによって異なります。「猫か犬か」を答えるなら分類ヘッド、画像の中の物体を囲む枠を出すなら検出ヘッド、各ピクセルがどの物体かを答えるならセグメンテーションヘッドです。
分類ヘッド(Classification Head)
分類ヘッドは最もシンプルです。「この画像は何クラスか」を確率で答えます。
バックボーンの出力(特徴マップ)
↓
[Global Average Pooling] ← 7×7×512 → 512次元ベクトルに圧縮
↓
[全結合層(FC)] ← 512 → クラス数(例: 1000)
↓
[Softmax] ← 確率分布に変換(合計=1)
↓
出力: [犬: 0.85, 猫: 0.10, 鳥: 0.05, ...]
シンプルさが強み: パラメータが少なく、転移学習でヘッドだけ付け替えやすい。
検出ヘッド(Detection Head)
物体検出では「どこに何があるか」を答えます。2つの情報が必要です:
- バウンディングボックス: 物体を囲む矩形の位置とサイズ (x, y, w, h)
- クラス確率: その矩形内の物体が何かの確率
バックボーンの出力
↓
[検出ヘッド]
↓
複数の出力(アンカーボックスごと):
├── x座標のオフセット(数値回帰)
├── y座標のオフセット(数値回帰)
├── 幅のスケール(数値回帰)
├── 高さのスケール(数値回帰)
├── 物体らしさのスコア(0〜1)
└── クラス確率 [犬: 0.8, 猫: 0.1, ...]
アンカーボックス(Anchor Box): 事前に定義したサイズ・縦横比の候補枠です。「大きい横長」「小さい正方形」など複数を用意し、どの候補枠に一番近いかを回帰します。
セグメンテーションヘッド(Segmentation Head)
セマンティックセグメンテーション(意味的分割)では「各ピクセルがどのクラスに属するか」を答えます。
入力: 224×224×3
↓
[バックボーン(Encoder)] ← 情報を圧縮しながら特徴抽出
→ 7×7×512
↓
[セグメンテーションヘッド(Decoder)] ← 情報を拡大して解像度を戻す
→ 224×224×クラス数
↓
出力: 各ピクセルのクラス確率マップ
(例: ピクセル(100,150) → 「人間: 0.95, 背景: 0.04, 車: 0.01」)
エンコーダで圧縮した情報をデコーダで元のサイズに戻す「U字型」の構造がよく使われます(U-Net)。
エンコーダ・デコーダ構造
セグメンテーションの構造を図解すると:
224×224 → 112×112 → 56×56 → 28×28 → 14×14
[Conv] [Conv] [Conv] [Conv] ← Encoder
↓
224×224 ← 112×112 ← 56×56 ← 28×28 ← 14×14
[出力] [UpConv] [UpConv] [UpConv] ← Decoder
(UpConv: アップサンプリング + 畳み込みでサイズを拡大する)
U-Netではエンコーダの特徴マップをデコーダに「スキップコネクション」で直接つなぎ、詳細情報の喪失を防ぎます。
3つのヘッドの比較
| ヘッドの種類 | 出力形式 | 代表的な使用例 |
|---|---|---|
| 分類ヘッド | クラス確率ベクトル(1次元) | 画像分類、疾患診断 |
| 検出ヘッド | バウンディングボックス+クラス確率 | 物体検出、顔検出 |
| セグメンテーションヘッド | ピクセルごとのクラスマップ(2次元) | 自動運転(車線検出)、医療画像 |
バックボーンとヘッドの分業
この分業構造の最大のメリットは再利用性です。
バックボーン(ImageNetで学習済み)
├── + 分類ヘッド → 犬猫分類器
├── + 検出ヘッド → 歩行者検出器
└── + セグメンテーションヘッド → 医療画像解析
同じバックボーンを使い回せるため、それぞれのタスクでゼロから学習する必要がありません。
まとめ
- ヘッドはバックボーンの出力(特徴マップ)をタスクの答えに変換する部分
- 分類ヘッド: GAP + 全結合 + Softmaxで「何のクラスか」を確率で出す
- 検出ヘッド: バウンディングボックスの位置とクラスを同時に出す
- セグメンテーションヘッド: エンコーダ・デコーダ構造で各ピクセルのクラスを出す
- バックボーンとヘッドを分けることでモデルの再利用・付け替えが容易になる
次回は、学習済みのバックボーンを賢く使い回す——転移学習について学びます。