#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で手を動かして確かめてみてください。