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


次はSegNetについて。
SegNet
SegNetはPAMI 2017のSegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentationで提案されているSemantic Segmentation手法。
立派なプロジェクトページもあり、ソースコードも公開されている。
もともとはCVPR 2015にSegNet: A Deep Convolutional Encoder-Decoder Architecture for Robust Semantic Pixel-Wise Labellingとして投稿されていた研究らしい。(その版はarXivにある)
ここ最近は論文の公開形態が複雑ですね。学会に採択されていなくても、arXivに投稿されていれば他の論文で引用されるようになった。
SegNetもFCNと同様に全結合層を持たず、入力画像に対してpixel単位でどの物体クラスに属するかのラベルを出力する。
FCNとの大きな違いはメモリ効率。
Encoder-Decoder構造
SegNetは、入力画像から特徴マップを抽出するEncoderと、抽出した特徴マップと元の画像のpixel位置の対応関係をマッピングするDecoderで構成されている。対称構造のようなネットワーク構成↓
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位置を対応させる。
DecoderはEncoderの順序を反転してpooling層をアップサンプリング層に置き換えたような構造となっている。
SegNetのDecoderで行われる逆畳み込みと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についてまとめよう。


関連記事
OpenCVのfindEssentialMat関数を使ったサ...
SSD (Single Shot Multibox Dete...
CNN Explainer:畳み込みニューラルネットワーク可...
Kubric:機械学習用アノテーション付き動画生成パイプライ...
UnrealCV:コンピュータビジョン研究のためのUnrea...
顔追跡による擬似3D表示『Dynamic Perspecti...
ドットインストールのWordPress入門レッスン
MLDemos:機械学習について理解するための可視化ツール
Multi-View Environment:複数画像から3...
書籍『3次元コンピュータビジョン計算ハンドブック』を購入
uvでWindows11のPython環境を管理する
OpenCV3.3.0でsfmモジュールのビルドに成功!
BlenderのPython環境にPyTorchをインストー...
OpenMVS:Multi-View Stereoによる3次...
OpenCV 3.3.0 contribのsfmモジュールの...
YOLO (You Only Look Once):ディープ...
UnityユーザーがUnreal Engineの使い方を学ぶ...
Cartographer:オープンソースのSLAMライブラリ
ツールの補助で効率的に研究論文を読む
Googleが画像解析旅行ガイドアプリのJetpac社を買収
OpenGV:画像からカメラの3次元位置・姿勢を推定するライ...
Faster R-CNN:ディープラーニングによる一般物体検...
Structure from Motion (多視点画像から...
全脳アーキテクチャ勉強会
BGSLibrary:OpenCVベースの背景差分ライブラリ
AfterEffectsプラグイン開発
ニューラルネットワークで画像分類
Rerun:マルチモーダルデータの可視化アプリとSDK
機械学習手法『Random Forest』
OpenCVで動画の手ぶれ補正
BlenderProc:Blenderで機械学習用の画像デー...
Caffe:読みやすくて高速なディープラーニングのフレームワ...
コンピュータビジョンの技術マップ
OpenCV バージョン4がリリースされた!
iOSで使えるJetpac社の物体認識SDK『DeepBel...
openMVGをWindows10 Visual Studi...
Point Cloud Libraryに動画フォーマットが追...
ベイズ推定とグラフィカルモデル
TensorFlowでCGを微分できる『TensorFlow...
OpenSfM:PythonのStructure from ...
KelpNet:C#で使える可読性重視のディープラーニングラ...
Super Resolution:OpenCVの超解像処理モ...




コメント