takuroooのブログ

勉強したこととか

Fully Convolutional Networks for Semantic Segmentation(CVPR2015)

SemanticSegmention関連の論文メモ
図は論文からの引用

目次

概要

クラス分類用の学習済みモデルをfine tuningして全結合層なしモデルを構築しSemanticSegmentationに応用。深い層のsemantic informationと浅い層のappearance informationを統合するskip architectureを導入することで正確な推論を行う。

論文リンク

https://arxiv.org/pdf/1605.06211.pdf

著者

  • UC Berkeley
    • Evan Shelhamer
    • Jonathan Long
    • Trevor Darrell

提案手法

f:id:takuroooooo:20190501215334p:plain まず学習済みのモデル(論文ではVGG16)の全結合層を畳み込み層に置き換えて完全畳み込みネットワークのベースを作る。全結合層がなくなることで任意のサイズの入力を受け付けることができる。

f:id:takuroooooo:20190501215519p:plain 上記図のconv7までがベースのネットワーク。これにskip architectureを追加する。これによってPoolingによって失われたローカルな情報が深い層の特徴マップに伝播される。
skip architectureの追加の仕方によって3つのモデルができる。(FCN32s/FCN16s/FCN8s)

FCN32s

  • skip architectureなしのモデル。
  • conv7の出力を32倍拡大して最終的な推論結果を出力する。
  • 拡大にはbilinear upsamplingのパラメータで初期化された学習不可deconvolution層を使う。
  • FCN32s/FCN16s/FCN8sの最後のdeconvolution層は拡大する倍率以外は全て同じ条件になっている。

FCN16s

  • skip architectureありのモデル。
  • pool4からの特徴マップをconv7の出力に加算する。
  • pool4/conv7の出力と解像度が合わないためにconv7層の出力を2倍に拡大する。
  • 拡大にはbilinear upsamplingのパラメータで初期化された学習可能なdeconvolution層を使う。
  • pool4/conv7の出力の加算結果を16倍拡大して最終的な推論結果を出力する。

FCN8s

  • skip architectureありのモデル。
  • FCN16sに対してさらにpool3からの特徴マップを加算する。
  • pool3/pool4/conv7の出力の解像度を合わせるためにpool4の出力を2倍、conv7層の出力を4倍にする。
  • 拡大にはbilinear upsamplingのパラメータで初期化された学習可能なdeconvolution層を使う。
  • pool3/pool4/conv7の出力の加算結果を8倍拡大して最終的な推論結果を出力する。

結果

f:id:takuroooooo:20190501222406p:plain
以前のSOTAであるSDSとの比較。

f:id:takuroooooo:20190501222358p:plain
FCN32s/FCN16s/FCN8sの比較。
FCN8sが一番性能が良く、skip architectureが有効なことが示されている。

f:id:takuroooooo:20190501222414p:plain
FCN8sはskip architectureによって正確な推論が可能となっている。一方、skip architectureがないFCN32sではpoolingによって詳細な位置情報がかけてしまっているため推論結果がぼやけたイメージになってしまっている。

実装

github.com

参考リンク

[.html:title]
meetshah1995.github.io

cv-tricks.com

warmspringwinds.github.io

自分の実装

PyTorch

github.com

Keras

github.com