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

U-Net: Convolutional Networks for Biomedical Image Segmentation

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

目次

概要

コンテキスト情報を抽出するcontracting pathとアップサンプリングを行うexpansive pathを持ち、contracting pathの特徴マップを対応するexpansive pathにスキップ結合することでコンテキスト情報を抽出しつつ、正確な位置情報を伝播するU構造のネットワークの提案。

論文リンク

https://arxiv.org/pdf/1505.04597.pdf

著者

  • University of Freiburg
    • Olaf Ronneberger
    • Philipp Fischer
    • Thomas Brox

提案手法

f:id:takuroooooo:20190428004411p:plain

U-Net

特徴抽出を行うcontracting pathと画像を拡大するexpansive pathをもつU-Netを提案。

  • contracting path
    • 3x3 conv(paddingなし) + ReLUを2回 + 2x2 max pooling(stride2) のセットを繰り返すことでダウンサンプリングをしつつ特徴抽出を行っていく。
  • expansive path
    • 2x2 convによってチャネル数を半分にし画像の縦横をそれぞれ2倍にアップサンプリングする。
    • 対応するcontracting pathからの特徴マップをcropしてアップサンプリングされた特徴マップと結合する。これによりダウンサンプリングによって失われた位置情報が伝播される。
    • 結合した特徴マップを3x3 conv + ReLUで処理する。
  • final layer
    • 最後に1x1 convでch数を任意の数に調整する。

結果

f:id:takuroooooo:20190428013407p:plain 医療画像タスクの結果

実装

Keras
github.com

PyTorch
github.com

動画

www.youtube.com

メモ

  • 医療画像タスクはデータが少ない。そのためデータ拡張が重要になってくる。
  • 医療画像タスクは同じクラスが密接しているため(細胞とか)オブジェクトを分離することが難しい。本論文では細胞の境界のロスを大きくさせることで境界部分を分離して検出できるように工夫した。
  • 画面の端で畳み込みをする場合は、ミラーリングすることで画素がない領域を埋めるようにした。(Overlap-tile strategy )
  • FCNとの違い
    • スキップ結合するときにFCNは加算だがU-Netはconcatした後に畳み込みをする。
    • FCNは、中間のアップサンプリングは(bilinear upsamplingで初期化された) 学習可能なdconvolution filterで最終層のアップサンプリングは、学習不可なbilinear interpolation。U-Netは同様にdconvolutionを使うが初期値については特に指定されていない。

Pyramid Scene Parsing Network(CVPR2017)

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

目次

概要

pyramid pooling moduleを使って異なる大きさの特徴マップを生成、利用することで画像全体と局所的なコンテキスト情報を使って推論するpyramid scene parsing networkの提案。

論文リンク

https://arxiv.org/pdf/1612.01105v2.pdf

著者

  • The Chinese University of Hong Kong
    • Hengshuang Zhao
    • Xiaojuan Qi
    • Xiaogang Wang
    • Jiaya Jia
  • SenseTime Group Limited
    • Jianping Shi

従来の課題

f:id:takuroooooo:20190424200231p:plain 1. Mismatched Relationship
コンテキスト情報をうまく使えないため、複雑なシーンで誤検出してしまう問題。
例えば、図2の1行目ではボートを車と誤判定している。しかし、川の上に車があることは滅多にない。
2. Confusion Categories
類似したカテゴリを混同してしまうことで誤検出してしまう問題。
例えば、図2の2行目では高層ビル(灰色)とビル(茶色)が混ざって予測されている。この問題はカテゴリ間の関係を利用することで改善する。
3. Inconspicuous Classes
小さいオブジェクトを検出するのが困難である問題。また大きいオブジェクトは受容野のサイズを超えることがある。これらは不連続な予測を発生される原因になる。
例えば、図2の3行目では、枕はシーツに類似しているためFCNは枕をシーツと誤検出している。これを改善するためには、目立たないカテゴリのオブジェクトが含まれている異なるサブリージョンに注意を払う必要がある。

これらの問題はコンテキストの関係と異なる受容野のグローバルな情報に関連している。

解決策

f:id:takuroooooo:20190425091407p:plain

pyramid pooling module

  • 受容野のサイズはコンテキス情報をどれくらい利用しているかの指標になる。ResNetの受容野は理論的には入力画像サイズを超えているが、実際は高層の受容野サイズは理論よりは小さいため、多くのネットワークはグローバルな情報を十分取り込めていない。
  • これを解決するためpyramid pooling moduleを使う。
  • pyramid pooling moduleはCNNが出力した特徴マップから異なるサイズの特徴マップを出力する。(論文だと1x1,2x2,3x3,6x6の4つの異なるサイズを出力している。)
  • 次に1x1 convolutionで特徴マップのchサイズを1/Nに変換する。Nはpyramidの数。論文だと4つ。
  • 次にオリジナルの特徴マップとサイズを合わせるためにbilinear interpolationで拡大する。拡大した特徴マップとオリジナル特徴マップをconcatする。

結果

f:id:takuroooooo:20190425234631p:plain

ADE20K validation setの結果

f:id:takuroooooo:20190425234800p:plain

ADE20K 結果画像

実装

https://github.com/Lextal/pspnet-pytorch github.com

動画

www.youtube.com

メモ

  • pyramid pooling moduleで行っている特徴マップを複数の任意のサイズにpoolingする処理はSPPNetで既に行われている。(PyTorchではAdaptiveMaxPool2dAdaptiveAvgPool2dで同様のことができる。)
  • poolingはmax poolingよりaverate poolingの方が性能が良かった。
  • ResNetにdilated convolutionを組み込むことで特徴マップの解像度低下を1/8に抑えている。
  • データ拡張以下のものが使われた。
    • random mirror
    • random resize(0.5倍〜2倍)
    • random rotation(-10度〜10度)
    • random Gaussian blur