SegNet:ディープラーニングによるSemantic Segmentation手法

FCN (Fully Convolutional Network)に引き続きSemantic Segmentation手法のお勉強。



次はSegNetについて。

SegNet

SegNetはPAMI 2017のSegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentationで提案されているSemantic Segmentation手法。

立派なプロジェクトページもあり、ソースコードも公開されている。

SegNet Technical Description

もともとはCVPR 2015SegNet: A Deep Convolutional Encoder-Decoder Architecture for Robust Semantic Pixel-Wise Labellingとして投稿されていた研究らしい。(その版はarXivにある)

ここ最近は論文の公開形態が複雑ですね。学会に採択されていなくても、arXivに投稿されていれば他の論文で引用されるようになった。


スポンサーリンク


SegNetFCNと同様に全結合層を持たず、入力画像に対してpixel単位でどの物体クラスに属するかのラベルを出力する。
FCNとの大きな違いはメモリ効率。

Encoder-Decoder構造

SegNetは、入力画像から特徴マップを抽出するEncoderと、抽出した特徴マップと元の画像のpixel位置の対応関係をマッピングするDecoderで構成されている。対称構造のようなネットワーク構成↓

SegNet

FCNでは、途中の各pooling層の特徴マップをアップサンプリング・連結して利用していたが、そのために各特徴マップを一時的に保持する必要があり、メモリ効率が悪かった。

SegNetでは、Encoderでpoolingした位置をmax-pooling indexとして記憶しておき、Decoderで特徴マップをそのindex位置にアップサンプリングすることでメモリ効率を高めている。

Encoder

画像から特徴マップを抽出するEncoderには、一般物体認識用に学習したVGG-16の13層の畳み込み層を流用しfine-tuningする。(お決まりのテクニックですね)

そして、Decoderでのアップサンプリング時に利用するために、pooling層でのmax-poolingでどのpixel位置(max-pooling index)の値を取ってきたかを記録しておく。


スポンサーリンク
Batch Normalization (バッチ正規化)

ネットワーク図で明示的に記載されているので、ここでBatch Normalization (バッチ正規化)について解説。

Batch Normalizationは2015年に発表されたBatch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shiftで提案された勾配消失・勾配爆発を防ぐための手法。

通常、ニューラルネットワークの学習は、学習データセットを少量のサブセット(ミニバッチ)に分け、そのサブセットごとにネットワークのパラメータ更新を行うミニバッチ学習で行う。
しかし、ネットワークの構造が深くなると、ある層での特徴の分布(特徴マップ)がミニバッチごとに大きく変化する内部共変量シフトが発生し、学習が効率的に進まなくなる。

Batch Normalizationはこの内部共変量シフトが起こらないように、各層においてミニバッチごとに特徴分布が偏らないように調整する。

Batch Normalization以前は、学習を効率的に進めるために以下のように様々な対処方法が提案されていた↓

  • ネットワークの重みの初期値を事前学習する
  • 学習係数(learning rate)を下げる
  • ネットワークの自由度を制約する(Dropoutなど)

Batch Normalizationの登場により、これらの方法を使わなくても学習プロセスを安定化させて高速に学習できるようになった。

Batch Normalizationは全結合や畳み込みの後、活性化関数(ReLUなど)の前に行われる。ネットワーク構造の全体像を表す図では活性化関数と同様に記載を省略されることが多いです。

Decoder

Encoderで抽出された特徴マップはpooling層を経てサイズが小さくなっているため、Decoderでは特徴マップをアップサンプリングで徐々に大きくして元の画像サイズに戻していく。これによって画像上の物体のpixel位置とsegmentationのpixel位置を対応させる。

DecoderEncoderの順序を反転してpooling層をアップサンプリング層に置き換えたような構造となっている。
SegNetDecoderで行われる逆畳み込みとFCNで行われる逆畳み込みとの大きな違いは、Encoderのpooling層で記録したmax-pooling indexを使用して特徴マップをアップサンプリングしてから畳み込みを行う点。

以下の図のa, b, c, dが特徴マップのpixel値だとすると、Decoderのアップサンプリング層では特徴マップの各画素をEncoderのpooling層で記録しておいたindex位置へ戻すだけで、それ以外のpixelは空(0)で埋める。

このアップサンプリングは逆pooling(un-pooling)とも呼ばれる。

そして、このアップサンプリングした特徴マップに対して畳み込みを行う。

サンプルコード

SegNetのシンプルなPyTorch実装ならこの辺りかな↓
https://github.com/delta-onera/segnet_pytorch

SegNetに限らず、Semantic Segmentation系のPyTorch実装をひとまとめにしたリポジトリがGitHubにあった↓
https://github.com/meetshah1995/pytorch-semseg

次はU-Netについてまとめよう。



スポンサーリンク

関連記事

iPhoneで3D写真が撮れるアプリ『seene』
ニューラルネットワークで画像分類
OpenMVSのサンプルを動かしてみる
Paul Debevec
ベイズ推定とグラフィカルモデル
インタラクティブにComputer Visionコーディングができるツール『Live CV』
Google製オープンソース機械学習ライブラリ『TensorFlow』のWindows版が公開された
PythonのStructure from Motionライブラリ『OpenSfM』
Structure from Motion (多視点画像からの3次元形状復元)
Photogrammetry (写真測量法)
Deep Learningとその他の機械学習手法の性能比較
Adobeの手振れ補正機能『ワープスタビライザー』の秘密
書籍『仕事ではじめる機械学習』を読みました
オープンソースのStructure from Motionライブラリ『Theia』
CGのためのディープラーニング
ディープラーニング
書籍『3次元コンピュータビジョン計算ハンドブック』を購入
BlenderのPython環境にPyTorchをインストールする
書籍『OpenCV 3 プログラミングブック』を購入
顔追跡による擬似3D表示『Dynamic Perspective』
pythonの機械学習ライブラリ『scikit-learn』
3D復元技術の情報リンク集
疑似3D写真が撮れるiPhoneアプリ『Seene』がアップデートでついにフル3Dモデルが撮影できる...
OpenGVのライブラリ構成
AfterEffectsプラグイン開発
Windows10でPyTorchをインストールしてVSCodeで使う
Active Appearance Models(AAM)
機械学習のオープンソースソフトウェアフォーラム『mloss(machine learning ope...
コンピュータビジョンの技術マップ
RefineNet (Multi-Path Refinement Network):ディープラーニン...
OpenCV バージョン4がリリースされた!
オープンソースの顔の動作解析ツールキット『OpenFace』
OpenCV 3.1のsfmモジュールを試す
画像処理を基礎から学べるキーエンスのサイト『画像道場』
2D→3D復元技術で使われる用語まとめ
機械学習について最近知った情報
MeshroomでPhotogrammetry
Googleが画像解析旅行ガイドアプリのJetpac社を買収
スマホのカメラで3Dスキャンできるアプリ『Qlone』
ドットインストールのWordPress入門レッスン
オープンソースの汎用レンダラ『Mitsuba 2』
スクラッチで既存のキャラクターを立体化したい

コメント