🖼️ 🔬 🏥

SegNet & U-Net をイチから理解する

セマンティックセグメンテーションの2大モデルを徹底図解

🤔 そもそもセグメンテーションって何?

🖌️
ひとことで言うと
画像の全ピクセルに「これは何か」のラベルをつけるタスク。
画像分類が「この画像は猫」なのに対して、セグメンテーションは「このピクセルは猫、このピクセルは背景、このピクセルは木…」とピクセル単位で色分けする

タスクの違い(超重要)

画像分類
🐱
「猫」

画像全体に
1つのラベル

物体検出
🐱
「猫」+ 位置の四角

バウンディングボックス
(四角形で囲む)

セマンティック
セグメンテーション
ピクセル単位で色分け

全ピクセルにラベル
(猫/背景/空…)

セマンティックセグメンテーションの活用場面:
🚗 自動運転 → 道路/歩道/車/人/信号を塗り分ける
🏥 医療画像 → 臓器/腫瘍/正常組織を塗り分ける
🛰️ 衛星画像 → 建物/道路/森林/水域を塗り分ける
🤖 ロボット → 掴めるもの/障害物を見分ける

🏗️ 共通の考え方:エンコーダ・デコーダ構造

SegNetもU-Netも、「エンコーダ・デコーダ」という共通の構造を持っている。

📦
たとえ話:要約と復元
長い文章を「3行の要約」に縮め(エンコーダ)、
その要約から元の文章の内容を復元する(デコーダ)ようなイメージ。

画像の場合は:
大きな画像を小さく縮めて「何が写っているか」の特徴を抽出し(エンコーダ)、
その特徴から元のサイズのセグメンテーションマップを復元する(デコーダ)。

エンコーダ・デコーダの基本構造

入力画像
256×256
元のサイズ
128
×128
64
×64
32²
ボトルネック
64
×64
128
×128
出力マップ
256×256
ピクセル分類結果
← エンコーダ →
画像を縮小しながら
「何が写っているか」を理解する
← デコーダ →
元のサイズに戻しながら
「どこに何があるか」を復元する
問題点: エンコーダで画像を縮小するとき、「どこに何があるか」の位置情報が失われてしまう
デコーダで元のサイズに戻しても、物体の輪郭がぼやける

→ この「位置情報の損失」をどう防ぐかが、SegNetとU-Netの違い!

😱 エンコーダの「プーリング」で何が失われるのか?

エンコーダではMax Pooling(最大プーリング)で画像を半分に縮小する。
2×2の領域から最大値だけ残すので、サイズは半分になるが位置情報が失われる

Max Poolingの仕組み

プーリング前(4×4)
1
3
2
5
2
1
4
1
1
6
2
4
3
2
1
3
2×2ごとに色分け
Max Pooling
各2×2の
最大値だけ残す
プーリング後(2×2)
3
5
6
4
値は残るが
「元の場所」がわからない!

「3」は左上の2×2のどこにあった? → もうわからない 😱

📍
なぜ位置情報が大事?
セグメンテーションでは「猫がいる」だけでなく、「猫の輪郭はここ」というピクセル単位の位置が必要。
プーリングで位置がわからなくなると、デコーダで画像を拡大したときに輪郭がぼやける

SegNetとU-Netは、この問題を異なる方法で解決した!

🟢 SegNet(2015)

「プーリングの場所を覚えておく」作戦

ケンブリッジ大学が開発。自動運転の道路シーン認識を目的に設計。

📌
SegNetの核心アイデア
Max Poolingで最大値を選ぶとき、「最大値がどこにあったか」のインデックス(位置番号)を記憶しておく。
デコーダで画像を拡大するとき、記憶した位置に値を戻す。

名前:Pooling Indices(プーリング・インデックス)

SegNetの仕組み:Pooling Indicesを使ったアップサンプリング

① エンコーダ:Max Pooling
1
3★
2
5★
2
1
4
1
1
6★
2
4★
3
2
1
3
💾 位置を記憶: 右上 右上 右上 右上
② プーリング結果
3
5
6
4
+ 位置インデックスも保存
③ デコーダ:記憶した位置に戻す
0
3
0
5
0
0
0
0
0
6
0
4
0
0
0
0
元の位置に正確に値を戻せる!
残りは0で埋める → Convで補正
🎒
たとえ話:教室の席順メモ
授業の後、みんなが教室を出る(プーリング=縮小)。
でも「誰がどの席に座っていたか」を出席表にメモしておく
次の授業で教室に戻るとき(アップサンプリング=拡大)、
メモを見て元の席に座り直すことができる!

SegNetのPooling Indices = この「出席表メモ」

SegNetの全体構造

Conv+BN
+ReLU
64ch
Pool
💾
Conv+BN
+ReLU
128ch
Pool
💾
Conv+BN
+ReLU
256ch
Pool
💾
ボトル
ネック
512ch
📌
Up
Conv+BN
+ReLU
256ch
📌
Up
Conv+BN
+ReLU
128ch
📌
Up
出力
Nクラス
← エンコーダ(VGG16ベース)→
← デコーダ →
💾 = Pooling時に位置を記憶 📌 = 記憶した位置に値を戻す(Unpooling)
SegNetの特徴まとめ:
✅ エンコーダはVGG16がベース(学習済みの重みを再利用できる)
✅ Pooling Indicesで位置情報を保存 → デコーダで正確に復元
✅ 位置のインデックスだけ保存 → メモリ効率が良い(値そのものは保存しない)
✅ 主な用途:自動運転の道路シーン認識

🔵 U-Net(2015)

「エンコーダの情報を丸ごとデコーダに渡す」作戦

ドイツ・フライブルク大学が開発。少ない医療画像データでも高精度に動くことを目的に設計。

🌉
U-Netの核心アイデア
SegNetが「位置のメモだけ渡す」のに対して、U-Netは「エンコーダの特徴マップそのものをデコーダに丸ごとコピーして渡す」

この「橋渡し」を スキップ結合(Skip Connection)と呼ぶ。
エンコーダの各段階の情報がデコーダに直接流れるので、細かい位置情報や輪郭の情報がそのまま活用できる。

U-Netの構造(U字型)

Conv×2
64ch / 568×568
↓ Pool
Conv×2
128ch
↓ Pool
Conv×2
256ch
↓ Pool
Conv×2
512ch
↓ Pool
────── copy & crop ──────→
────── copy & crop ──────→
────── copy & crop ──────→
────── copy & crop ──────→
Conv×2
64ch → 出力
↑ Up
Conv×2
128ch
↑ Up
Conv×2
256ch
↑ Up
Conv×2
512ch
↑ Up
ボトルネック(1024ch)
↑ エンコーダ(縮小)
→ スキップ結合 →
↑ デコーダ(拡大)

全体を横から見ると「U」の字の形! → だから「U-Net」

🏫
たとえ話:授業のノートのコピー
SegNet=「誰がどの席か」のメモ(位置情報だけ)を渡す。軽い。
U-Net= 授業中に書いたノートそのもの(特徴マップ丸ごと)をコピーして渡す。情報量が多い。

U-Netのスキップ結合はエンコーダの全ての情報(値も位置も)をデコーダに直接渡すので、
より正確な輪郭を復元できる。ただしメモリは多く使う。

スキップ結合が輪郭を救う仕組み

エンコーダ浅い層の特徴
輪郭・エッジ
テクスチャ

位置情報が豊富
どこに」あるかがわかる

デコーダ深い層の特徴
意味情報
クラス判定

意味理解が豊富
何が」あるかがわかる

=
統合された結果
正確な輪郭
+正確な分類

どこに何が」あるか
両方わかる!

U-Netの特徴まとめ:
スキップ結合でエンコーダの特徴マップをデコーダに直接コピー
✅ 位置情報(輪郭)+ 意味情報(何があるか)の両方を活用 → 高精度な輪郭
少ないデータでも高精度(データ拡張を積極的に使用)
✅ 主な用途:医療画像(細胞、臓器のセグメンテーション)
✅ 名前の由来:構造が「U字型」だから

⚔️ SegNet vs U-Net ── 何が違うのか?

位置情報の渡し方が根本的に違う

📋
たとえ話で比較
引っ越しするとき…

SegNet方式:荷物は全部捨てて、「どの部屋に何があったかのメモ」だけ持っていく。新居で家具は新しく買う。(軽い!でも完全には再現できない)

U-Net方式:荷物を全部そのまま新居に持っていく(重い!でも完全に再現できる)

詳細比較表

SegNetU-Net
2015 2015
開発元 ケンブリッジ大学 フライブルク大学
エンコーダ VGG16ベース 独自設計
情報の
渡し方
Pooling Indices
(位置の番号だけ)
Skip Connection
(特徴マップ丸ごと)
メモリ
消費
少ない ✅ 多い
精度 良い 非常に良い ✅
特に輪郭が正確
少ない
データ
普通 強い ✅
Data Augmentation活用
主な
用途
自動運転
屋外シーン認識
医療画像
細胞セグメンテーション
構造の
名前の由来
Segmentation + Network U字型の構造

❓ 「スキップ結合」はResNetにもあったけど、違うの?

良い質問!ResNetのスキップ結合とU-Netのスキップ結合は、名前は同じだけど目的が全然違う

まとめ:
ResNet → 「足し算」(加算)。同じ解像度の層同士。深さの問題を解決。
U-Net → 「結合」(concatenation)。エンコーダ→デコーダ。位置情報の損失を解決。

名前は同じ「スキップ結合」だけど、やっていることは別物

🏁 全体まとめ

共通の課題
エンコーダのプーリングで
位置情報が失われる → 輪郭がぼやける
↓ 2つの異なるアプローチ
SegNet
Pooling Indices
位置の番号だけ記憶
→ メモリ節約
→ 自動運転向け
U-Net
Skip Connection
特徴マップを丸ごとコピー
→ 高精度な輪郭
→ 医療画像向け
G検定で問われるポイント:

SegNet:
Pooling Indices(プーリング時の位置インデックスを記憶)
✅ エンコーダはVGG16ベース
メモリ効率が良い
✅ 用途:自動運転の道路シーン認識

U-Net:
スキップ結合(Skip Connection)で特徴マップを丸ごとデコーダに渡す
U字型構造が名前の由来
少ないデータでも高精度(Data Augmentation活用)
✅ 用途:医療画像(細胞のセグメンテーション)

共通点:
✅ 両方ともエンコーダ・デコーダ構造
✅ 両方ともセマンティックセグメンテーションのモデル
✅ 両方とも2015年に発表