Fully Convolutional Network ── セマンティックセグメンテーションの元祖
画像分類のCNN(VGG16など)の構造を思い出してみよう。
↑ この「全結合層」が問題!
特徴マップ(2D)を1列に引き伸ばす(flatten)。
「上にあった」「左にあった」という空間情報が全て失われる。
全結合層はニューロンの数が固定されているので、入力画像のサイズが1種類に固定されてしまう。
違うサイズの画像は処理できない。
2Dの特徴マップを1列に潰してから処理
→ 位置情報消失
→ 出力は数値のみ(「猫:0.95」)
2Dの構造を保ったままチャネル数だけ変換
→ 位置情報そのまま
→ 出力はヒートマップ(各位置×各クラス)
1×1畳み込みで空間情報は保てたけど、エンコーダ部分のプーリングで画像が1/32に縮小されている。
元が224×224なら、この時点で7×7しかない。セグメンテーションには元のサイズに戻す必要がある。
大 → 小(縮小)
小 → 大(拡大)
Transposed Convolutionは「学習可能なアップサンプリング」。
単純な引き伸ばしではなく、フィルターの重みを学習して賢く拡大する。
一気に32倍に拡大すると、どうしても輪郭がガタガタになる。
そこでFCNは「中間層の特徴マップを足し合わせる」ことで精度を改善した。
1/32から一気に32倍拡大 → 輪郭がガタガタ 😢
中間層(Pool4)の情報を足す → 少し精度UP 😊
中間層2つ(Pool4 + Pool3)の情報を足す → 輪郭がかなり正確 😍
全結合層を畳み込みに置き換えるだけでセグメンテーションが可能に。入力サイズも自由に。
VGG16等の学習済みモデルをそのまま流用できることを示した。ゼロから学習する必要がない。
SegNet、U-Net、PSPNet、DeepLab、Mask R-CNN… 全てFCNの発想が土台。