#10 人工知能入門 CNN画像認識

実際の構成例——分類・検出・セグメンテーション

3つの代表的タスク

CNN(画像認識)の応用は主に3つのタスクに分類されます。それぞれを具体的な構成例とユースケースで見ていきましょう。

タスク          問い                        出力例
────────────────────────────────────────────
画像分類      「この画像は何?」            「犬: 94%」
物体検出      「どこに何がある?」          「(100,50,80,80) 犬: 0.94」
セグメンテーション 「各ピクセルは何?」    ピクセルごとのラベルマップ

タスク1: 画像分類

構成例: ResNet-50 + 全結合ヘッド

[入力: 224×224×3]

[ResNet-50 バックボーン]
  Conv → BN → ReLU → MaxPool
  Residual Block × 16

[Global Average Pooling]   2048次元ベクトルに圧縮

[全結合層 + Dropout(0.5)]  2048 → 256

[全結合層]                 256 → クラス数

[Softmax]

[出力: 各クラスの確率]
# PyTorchでの実装イメージ
import torchvision.models as models
import torch.nn as nn

# 学習済みResNet-50を読み込む
backbone = models.resnet50(pretrained=True)
backbone.fc = nn.Identity()  # 元のFC層を除去

# 分類ヘッドを定義
head = nn.Sequential(
    nn.Dropout(0.5),
    nn.Linear(2048, 256),
    nn.ReLU(),
    nn.Linear(256, num_classes),
)

代表的なユースケース

ユースケースデータクラス数
製品の良品・不良品判定(工場検品)製品画像2〜10
皮膚疾患の種類判定(医療)皮膚画像7〜30
農作物の病気診断葉の写真10〜50
顧客の感情分類(表情認識)顔画像6〜8

タスク2: 物体検出

構成例: YOLO系の考え方

YOLO(You Only Look Once)は「画像を一度見るだけで複数の物体を検出する」リアルタイム検出器です。

基本的な考え方:グリッドセルとアンカーボックス

入力画像(416×416)をグリッドに分割:
┌───┬───┬───┐
│   │   │   │
├───┼───┼───┤  例: 13×13のグリッド
│ ● │   │   │
├───┼───┼───┤  ●がある中央グリッドセルが
│   │   │   │    物体を検出する責任を持つ
└───┴───┴───┘

各グリッドセルが3つのアンカーボックスを持つ:
  アンカー1: 横長(車向け)
  アンカー2: 縦長(人向け)
  アンカー3: 正方形(一般物体)

各グリッドセル×各アンカーボックスが出力する情報:

[tx, ty, tw, th] : バウンディングボックスのオフセット(回帰)
[confidence]     : 物体らしさスコア(0〜1)
[p1, p2, ..., pn]: 各クラスの確率

代表的なYOLOバージョン:

YOLOv1 (2016): 速い!でも小さい物体が苦手
YOLOv3 (2018): マルチスケール検出で精度向上
YOLOv5 (2020): PyTorchベースで使いやすい
YOLOv8 (2023): 最新、高速・高精度のバランス

代表的なユースケース

ユースケース内容
自動運転歩行者・車・信号・標識の検出
防犯カメラ不審者・侵入者の検出
工場ライン製品の傷・異物の検出
医療画像腫瘍・病変の位置特定

タスク3: セマンティックセグメンテーション

構成例: U-Net(エンコーダ・デコーダ構造)

U-Netは医療画像解析のために開発されたモデルですが、今は汎用的なセグメンテーションで広く使われます。

エンコーダ(バックボーン):
  224×224×3
    ↓ Conv → ReLU × 2 → MaxPool
  112×112×64
    ↓ Conv → ReLU × 2 → MaxPool
  56×56×128
    ↓ Conv → ReLU × 2 → MaxPool
  28×28×256
    ↓ Conv → ReLU × 2 → MaxPool
  14×14×512 ← ボトルネック

デコーダ:
  14×14×512
    ↓ UpSampling × 2 → Conv → ReLU ← 28×28×256(スキップ接続)
  28×28×256
    ↓ UpSampling × 2 → Conv → ReLU ← 56×56×128(スキップ接続)
  56×56×128
    ...
  224×224×クラス数
    ↓ Softmax(ピクセルごと)
  224×224(各ピクセルのクラスラベル)

スキップ接続がポイントです。エンコーダの「詳細な位置情報」をデコーダに直接つなぐことで、精密なセグメンテーションが可能になります。

代表的なユースケース

ユースケース内容
医療画像解析MRIで腫瘍の輪郭を自動抽出
自動運転道路・車線・歩道・建物を分類
衛星画像解析農地・森林・建物・水域を分類
製造業製品の傷の形状と範囲を特定

タスクの選び方

「画像に何が写っているか知りたい」
  → 画像分類

「どこに何があるか知りたい(矩形で十分)」
  → 物体検出

「どこに何があるかをピクセル単位で知りたい」
  → セマンティックセグメンテーション

精度要件と計算コストのトレードオフも考慮します:

計算コスト:  分類 < 検出 < セグメンテーション
精度の細かさ: 分類 < 検出 < セグメンテーション

まとめ

  • 画像分類: ResNet + GAP + FC層。1画像1ラベルのシンプルなタスク
  • 物体検出: YOLO系が定番。グリッドセル×アンカーボックスで位置とクラスを同時出力
  • セグメンテーション: U-Netのエンコーダデコーダとスキップコネクションでピクセルごとの分類
  • 実際の応用(医療・自動運転・工場検品)ではタスクの性質に合った構成を選ぶ

これでCNNシリーズ全10回が完了しました。「画像はピクセルの数値」という出発点から、畳み込み・プーリング・バックボーン・ヘッド・転移学習・実際の構成例まで一通り学びました。ぜひ実際にPyTorchやKerasで手を動かして確かめてみてください。