🔭 🕳️ 🧩

PSPNet & DeepLab をイチから理解する

エンコーダ・デコーダに頼らないセグメンテーション手法

📖 おさらい:従来のセグメンテーションの問題

FCN → SegNet → U-Net とモデルが進化してきたが、共通の課題がまだ残っていた。

😱
FCN系の弱点
FCNやSegNet、U-Netはプーリングで画像を1/32まで縮小して、デコーダで元に戻す。
この過程で2つの問題が発生する:

① 位置情報が失われる(SegNet/U-Netで改善済み)
② 広い範囲の文脈情報が失われる(← これがまだ未解決!)

「文脈情報が失われる」ってどういうこと?

🚤
具体例で考えてみよう
湖に浮かんでいる「ボート」の画像を想像してみて。

ボート部分だけ見ると、形が車に似ていることがある。
でも「周りが水だ」とわかれば、これは車ではなくボートだと判断できる。

つまり、あるピクセルが何かを正しく判定するには、
そのピクセルだけでなく「周囲の広い範囲」の情報が必要。
これが「文脈(コンテキスト)」。

なぜ従来モデルは文脈を捉えにくい?

→ PSPNetとDeepLabは、この「もっと広い範囲を見たい」問題を
それぞれ異なるアプローチで解決した!

🔭 PSPNet(2017)

Pyramid Scene Parsing Network ── 複数スケールで「鳥の目」を手に入れる

香港中文大学が開発。ILSVRC 2016のシーン解析部門で優勝。

🏔️
PSPNetの核心アイデア
1つのスケールだけで見るから文脈がわからない。
なら「複数の縮尺で同時に見ればいい」

画像全体をざっくり見る目(広い文脈)と、
一部をしっかり見る目(細かい情報)を同時に持つ
これがPyramid Pooling Module(ピラミッドプーリングモジュール)

たとえ話で理解する

🗺️
たとえ話:地図の見方
知らない場所にいるとき、どうやって自分の位置を把握する?

足元だけ見る(従来のCNN)→ 「アスファルトの上にいる」→ 道路?駐車場?わからない

複数の縮尺で同時に見る(PSPNet):
🔴 足元を見る → 「アスファルトだ」
🟡 周囲10mを見る → 「白線がある」
🟢 周囲100mを見る → 「建物に囲まれている」
🔵 街全体を見る → 「住宅地の中だ」

全部合わせると → 「住宅地の中の道路にいる」と正確にわかる!

Pyramid Pooling Module の仕組み

特徴マップ(ResNetの出力)
例:60×60×2048
↓ 4つの異なるサイズでプーリング
1×1
赤レベル
画像全体を
1つの値に集約
最も広い文脈
橙レベル
4分割して
各エリアの特徴
やや広い文脈
黄レベル
9分割して
中程度の文脈
緑レベル
36分割して
細かい情報
↓ 全て元のサイズにアップサンプリングして結合(concatenate)
元の特徴マップ
→ 全スケールの情報 + 元の情報 を合体してクラス分類

なぜ「ピラミッド」なのか?

🔺
名前の由来
1×1 → 2×2 → 3×3 → 6×6 とだんだん細かくなっていく構造が、
ピラミッドの頂上(広くざっくり)から底辺(狭く詳細に)へと段階的になっている形に見える。
だからPyramid Pooling(ピラミッドプーリング)と呼ぶ。

PSPNetの全体構造

入力画像
ResNet
特徴抽出
(エンコーダ)
Pyramid
Pooling
Module
複数スケールで
文脈を取得
Conv
結合した情報
から分類
出力マップ
ピクセル分類

※ 対称的なデコーダはない。Pyramid Poolingで文脈を補って、そのまま分類する。

PSPNetの特徴まとめ:
Pyramid Pooling Module:複数スケール(1×1, 2×2, 3×3, 6×6)でプーリング
✅ エンコーダはResNetベース(VGGではない)
エンコーダ・デコーダ構造ではない(デコーダ不要)
広い文脈情報を取得できる → 「ボートと車の区別」のような判断が得意
ILSVRC 2016 シーン解析部門で優勝
✅ 名前の意味:Pyramid Scene Parsing Network(ピラミッド式シーン解析ネットワーク)

🕳️ DeepLab(2015〜)

「そもそも画像を縮小しなければいいのでは?」

Google Research が開発。バージョンが複数あり、v1(2015)→ v2 → v3 → v3+(2018)と進化。

💡
DeepLabの核心アイデア
SegNetやU-Netの苦労は「プーリングで縮小して失った情報をデコーダで復元する」こと。
DeepLabは発想を逆転させた:

「プーリングで縮小しすぎるのが問題なら、そもそも縮小しなければいい!」

でもプーリングの目的は「広い範囲を見るため」。縮小をやめたら広い範囲が見えなくなる。
→ そこで登場するのが Dilated Convolution(穴あき畳み込み)

Dilated Convolution(穴あき畳み込み)って何?

🕸️
たとえ話:虫メガネ vs 望遠鏡
普通の3×3畳み込み=虫メガネ。小さい範囲をしっかり見る。
Dilated Convolution=望遠鏡。同じ9点しか見ないけど、点の間を「飛ばして」見ることで広い範囲をカバーする。

パラメータ数は増えないのに、見える範囲(受容野)だけが広がる

普通の畳み込み vs Dilated Convolution

普通の3×3畳み込み
(rate = 1)
受容野 = 3×3
パラメータ = 9個
Dilated Conv(穴あき)
(rate = 2)
受容野 = 5×5
パラメータ = 同じ9個

フィルターの間に「穴」を空けて飛ばし読み → パラメータ数は同じなのに見える範囲が広がる!

Dilated Convolutionのポイント:
✅ 別名:Atrous Convolution(à trous = フランス語で「穴付き」の意味)
rate(膨張率)を大きくすると穴が広がり、受容野がさらに拡大
パラメータ数を増やさずに受容野を広げられる
解像度を下げずに広い範囲を見られる → プーリングの代替

ASPP:Dilated Convを複数スケールで使う

DeepLab v2以降では、rateの異なるDilated Convを複数並列で使う技術が追加された。
これをASPP(Atrous Spatial Pyramid Pooling)と呼ぶ。

👀
たとえ話:異なる倍率の望遠鏡
3倍の望遠鏡、6倍の望遠鏡、12倍の望遠鏡を同時に使って
それぞれの見え方を合わせて総合的に判断する。
→ 近くも遠くもバランスよく見える。

ASPPの仕組み

入力特徴マップ
↓ 同じ入力に対して4つの処理を並列で実行
1×1 Conv
最も狭い
受容野
Dilated
rate=6
やや広い
Dilated
rate=12
広い
Dilated
rate=18
最も広い
↓ 全ての結果を結合(concatenate)
統合された特徴マップ → クラス分類
🤝
ASPPとPSPNetのPyramid Poolingは似てる?
はい、発想は非常に似ています
どちらも「複数スケールで情報を集める」。

PSPNet → 異なるサイズでプーリングして文脈を集める
DeepLab → 異なるrateでDilated Convolutionして文脈を集める

「プーリングで集める」か「穴あき畳み込みで集める」かの違い。

DeepLabの進化の歴史

バージョン主な技術特徴
DeepLab v1 2015 Dilated Conv + CRF Dilated Convを初めて導入。
後処理にCRF(条件付き確率場)を使って輪郭を整えた。
DeepLab v2 2017 ASPP + CRF 複数のrateのDilated Convを並列で実行するASPPを追加。ResNetベースに。
DeepLab v3 2017 改良版ASPP ASPPを改良。CRFを廃止してネットワーク内で完結。Batch Normalization追加。
DeepLab v3+ 2018 ASPP + デコーダ追加 シンプルなデコーダを追加して輪郭の精度をさらに向上。現在最も広く使われるバージョン
DeepLabの特徴まとめ:
Dilated Convolution(Atrous Convolution)で解像度を保ちながら広い範囲を見る
ASPPで複数スケールの文脈情報を取得(v2以降)
プーリングを減らすことで解像度の低下を防ぐ(デコーダ不要のアプローチ)
Google Researchが開発
✅ v3+ではデコーダも追加 → エンコーダ・デコーダ+Dilated Conv のハイブリッド

🔗 ちなみに:WaveNetのDilated Causal Convolutionとの関係

以前、音声モデルのWaveNetで「Dilated Causal Convolution」を学んだよね。実は同じ「Dilated」の仲間!

共通点:フィルターに穴を空けてパラメータ数を増やさずに受容野を広げる
違い:DeepLabは2D画像で全方向。WaveNetは1D時系列で過去のみ(因果的)。

⚔️ PSPNet vs DeepLab ── 何が違うのか?

PSPNetDeepLab(v3)
2017 2015〜2018(v1〜v3+)
開発元 香港中文大学 Google Research
エンコーダ ResNet ResNet / Xception
広い文脈を
得る方法
Pyramid Pooling
複数サイズでプーリング
→ 結合
ASPP (Dilated Conv)
複数rateの穴あき畳み込み
→ 結合
解像度の
保持
通常のプーリングで
縮小される
Dilated Convで
解像度を保持 ✅
デコーダ なし v3+でシンプルなデコーダ追加
発想 「複数スケールで
文脈を補う
「そもそも解像度を
落とさない
🏠
たとえ話で比較
散らかった部屋を片付けたい(=位置情報の損失を解決したい)とき:

SegNet / U-Net方式:散らかしてから元に戻す(デコーダで復元)
PSPNet方式:散らかった後に、複数の角度から部屋を見て補う(ピラミッド)
DeepLab方式:そもそも散らかさない(Dilated Convで解像度を保つ)

🏁 セグメンテーションモデルの全体系譜

FCN(2015)
セマンティックセグメンテーションの元祖
全結合層→1×1 Conv + Transposed Conv
↓ FCNの弱点を異なるアプローチで解決
エンコーダ・デコーダ系
SegNet
Pooling Indices
で位置を復元
U-Net
Skip Connectionで
特徴マップを直接渡す
文脈情報補強系
PSPNet
Pyramid Poolingで
複数スケールの文脈
DeepLab
Dilated Conv + ASPP
で解像度を保持
インスタンスSeg系
Mask R-CNN
物体検出ベースで
個体ごとにマスク生成
G検定で問われるポイント:

PSPNet:
Pyramid Pooling Module(複数スケールのプーリング)
✅ エンコーダはResNetベース
広い文脈情報を取得して精度向上
✅ エンコーダ・デコーダ構造ではない

DeepLab:
Dilated Convolution(Atrous Convolution)=穴あき畳み込み
ASPP(Atrous Spatial Pyramid Pooling)で複数スケール対応
解像度を下げずに広い受容野を実現
Google Researchが開発
✅ v3+でデコーダを追加

共通点:
✅ 両方とも「複数スケールの文脈情報」を活用
✅ 両方ともResNetをエンコーダとして使用
✅ 「プーリングで縮小してデコーダで復元」とは異なるアプローチ

セグメンテーション全体の設計思想:
FCN系 →「縮小して復元する」(SegNet / U-Net)
PSPNet →「文脈を補うことで精度を上げる」
DeepLab →「そもそも縮小しない