サイトアイコン NegativeMindException

RefineNet (Multi-Path Refinement Network):ディープラーニングによるSemantic Segmentation手法

FCN, SegNet, U-Net, PSPNetに引き続き、ディープラーニングによるSemantic Segmentation手法のお勉強。


ディープラーニングによるSemantic Segmentationアルゴリズムまとめ
これまで勉強したディープラーニングによるSemantic Segmentation手法のアルゴリズム一覧。


次はRefineNet (Multi-Path Refinement Network)について。


RefineNet (Multi-Path Refinement Network)

RefineNet(Multi-Path Refinement Network)は、CVPR 2017で発表されたRefineNet: Multi-Path Refinement Networks for High-Resolution Semantic Segmentationで提案されたSemantic Segmentation手法。RefineNetEncoderDecoder構造で設計されている。



これまで、CNNベースのSemantic Segmentation手法は、Encoderで特徴マップを抽出する過程でsub-sampling(down-sampling)を頻繁に行うため、画像のディティールが失われてしまう欠点があった。(そしてそれを克服する方法が模索されてきた)

この問題に対し、RefineNetではEncoderの各層で出力される解像度の違う特徴マップを段階的に結合するアプローチを取り、各ステップで行う畳み込み処理にResNet (Residual Network)のresidual connection(skip connection)の仕組みを採用することで学習効率を高めている。

RefineNetのネットワーク構造

RefineNetEncoderImageNetで学習済みのResNet101を利用する。ResNet101の各層から出力される特徴マップを解像度ごと(元の画像の1/4, 1/8, 1/16, 1/32)に4つに分け、それぞれのサイズの特徴マップをDecoderへの入力とする。

Decoderには、入力される各サイズの特徴マップに対応して4つのRefineNet block (RefineNet-1, RefineNet-2, RefineNet-3, RefineNet-4)があり、小さい解像度の特徴マップから段階的にRefineNet blockを適用してアップサンプリング・連結していき、画像のディティールを捉えられるよう工夫されている。

そして、最終的に得られるSemantic Segmentation結果(元画像の1/4の解像度)を、バイリニア補間で元の画像サイズへアップサンプリングする。

RefineNet block

上記図中の1番下で最低解像度(1/32)の特徴マップを入力するRefineNet block (RefineNet-4)のみ1pathの入力で、他のRefineNet block (RefineNet-1~3)は2path入力となっているが、4つのRefineNet blockは基本的に同じ構造をしている。
RefineNet blockは、任意の解像度・チャンネル数の特徴マップを任意の枚数入力できるよう一般化した設計となっている↓


スポンサーリンク

Adaptive Conv

RefineNet blockの内部では、まずImageNetで学習済みのResNetの重みをSemantic Segmentationタスク用にfine-tuningするためのAdaptive Conv (Adaptive Convolution Set)がある。

RCU (Residual Conv Unit)

Adaptive Convには、ResNetResidual ModuleからBatch Normalizationを無くして単純化したRCU (Residual Convolution Unit)が2つあり、入力された各特徴マップを畳み込む。
ここで適用される畳み込みフィルタの数はRefineNet blockごとに変えており、入力が1pathのみのRefineNet-4では512、それ以外(RefineNet-1~3)では256に設定されている。

Multi-Resolution Fusion

次に、入力された2つの特徴マップをMulti-Resolution Fusionで結合する。(入力が1Pathの場合は何もせずにMulti-Resolution Fusionを通過する)

Multi-Resolution Fusionでは、まず2つの特徴マップのチャンネル数を揃えるために畳み込みを行った後、解像度の大きい方の特徴マップに合わせて小さい方の特徴マップをアップサンプリングする。
そして、同じチャンネル数・解像度になった2つの特徴マップを結合して高解像度な特徴マップを得る。

Chained Residual Pooling

次に、Chained Residual Poolingで画像の広い範囲から背景のコンテキストを捉える。

Chained Residual Poolingは複数のpooingブロックを連鎖する構成になっており、1つのpoolingブロックが5×5のmax pooling層と3×3の畳み込み層のセットで構成されている。

Chained Residual Poolingでは、前のpoolingブロックの出力を次のpoolingブロックの入力とする階層構造により、前のpooling結果を再利用している。これによって、大きなpoolingウィンドウを使用しなくても、画像の大域的な特徴を捉えることができる。ここで行うpoolingのstrideは1なので、特徴マップのサイズは変わらない。
各poolingブロックから出力される特徴マップは、residual connectionによるsum(足し合わせ)で統合される。足し合わせる際の重みは各poolingブロックの最後の畳み込み層で学習する。

Output Conv

RefineNet blockの最後に、もう1つRCU (Residual Conv Unit)がある。つまり、各RefineNet blockには合計3つのRCUが配置されている。

RefineNet block (RefineNet-2~4)での振る舞いを最後のRefineNet block (RefineNet-1)に反映させるために、ネットワークの最終層のSoftmax関数の前にRCUを2つ追加する。
こうして各RefineNet blockで段階的にアップサンプリング・結合した特徴マップに非線形関数を適用して最終的な特徴マップを得る。

サンプルコード

例のごとくPyTorchの実装例↓
https://github.com/thomasjpfan/pytorch_refinenet

次は再び一般物体検出に戻ってMask R-CNNについて勉強しよう↓


ディープラーニングによる一般物体検出アルゴリズムまとめ
これまで勉強したディープラーニングによる一般物体検出手法のアルゴリズム一覧。

ディープラーニングによるSemantic Segmentationアルゴリズムまとめ
これまで勉強したディープラーニングによるSemantic Segmentation手法のアルゴリズム一覧。


スポンサーリンク

関連記事

  • CGAN (Conditional GAN):条件付き敵対的生成ネットワーク
  • FreeMoCap Project:オープンソースのマーカーレスモーションキャプチャ
  • Super Resolution:OpenCVの超解像処理モジュール
  • .NETで使えるTensorFlowライクなニューラルネットワークライブラリ『NeuralNetwo...
  • Digital Emily Project:人間の顔をそっくりそのままCGで復元する
  • TensorSpace.js:ニューラルネットワークの構造を可視化するフレームワーク
  • 顔検出・認識のAPI・ライブラリ・ソフトウェアのリスト
  • SVM (Support Vector Machine)
  • PyTorch3D:3Dコンピュータービジョンライブラリ
  • OpenCVでカメラ画像から自己位置認識 (Visual Odometry)
  • 写真から3Dメッシュの生成・編集ができる無料ツール『Autodesk Memento』
  • SDカードサイズのコンピューター『Intel Edison』
  • U-Net:ディープラーニングによるSemantic Segmentation手法
  • GAN (Generative Adversarial Networks):敵対的生成ネットワーク
  • 海外ドラマのChromaKey
  • C#で使える遺伝的アルゴリズムライブラリ『GeneticSharp』
  • DCGAN (Deep Convolutional GAN):畳み込みニューラルネットワークによる敵...
  • ニューラルネットワークと深層学習
  • Faceshiftで表情をキャプチャしてBlender上でMakeHumanのメッシュを動かすデモ
  • Google Colaboratoryで遊ぶ準備
  • Qlone:スマホのカメラで3Dスキャンできるアプリ
  • OpenAR:OpenCVベースのマーカーARライブラリ
  • Adobe MAX 2015
  • KelpNet:C#で使える可読性重視のディープラーニングライブラリ
  • ポイントクラウドコンソーシアム
  • OpenGV:画像からカメラの3次元位置・姿勢を推定するライブラリ
  • Kubric:機械学習用アノテーション付き動画生成パイプライン
  • OpenCVでiPhone6sのカメラをキャリブレーションする
  • Kaolin:3Dディープラーニング用のPyTorchライブラリ
  • R-CNN (Regions with CNN features):ディープラーニングによる一般物体...
  • UnityユーザーがUnreal Engineの使い方を学ぶには?
  • COLMAP:オープンソースのSfM・MVSツール
  • iPhoneで3D写真が撮れるアプリ『seene』
  • NumSharp:C#で使えるNumPyライクな数値計算ライブラリ
  • 第1回 3D勉強会@関東『SLAMチュートリアル大会』
  • ニューラルネットワークで画像分類
  • オープンソースの顔認識フレームワーク『OpenBR』
  • Two Minute Papers:先端研究を短時間で紹介するYouTubeチャンネル
  • Multi-View Environment:複数画像から3次元形状を再構築するライブラリ
  • 画像認識による位置情報取得 - Semi-Direct Monocular Visual Odome...
  • OpenCV 3.1から追加されたSfMモジュール
  • OpenCVで顔のランドマークを検出する『Facemark API』
  • モバイルバージョンを終了