.wp-block-jetpack-rating-star span.screen-reader-text { border: 0; clip: rect(1px, 1px, 1px, 1px); clip-path: inset(50%); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; word-wrap: normal; }

サイトアイコン NegativeMindException

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

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


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


次はSegNetについて。

SegNet

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

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



もともとは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で構成されている。対称構造のようなネットワーク構成↓

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以前は、学習を効率的に進めるために以下のように様々な対処方法が提案されていた↓

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についてまとめよう。


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


スポンサーリンク

関連記事

cvui:OpenCVのための軽量GUIライブラリ

OpenCVでiPhone6sのカメラをキャリブレーションする

ZBrushトレーニング

Mitsuba 2:オープンソースの物理ベースレンダラ

Cartographer:オープンソースのSLAMライブラリ

画像生成AI Stable Diffusionで遊ぶ

R-CNN (Regions with CNN features):ディープラーニングによる一般物体...

池袋パルコで3Dのバーチャルフィッティング『ウェアラブル クロージング バイ アーバンリサーチ』

Theia:オープンソースのStructure from Motionライブラリ

3D復元技術の情報リンク集

顔検出・認識のAPI・ライブラリ・ソフトウェアのリスト

「ベンジャミン·バトン数奇な人生」でどうやってCGの顔を作ったのか

画像認識による位置情報取得 - Semi-Direct Monocular Visual Odome...

Regard3D:オープンソースのStructure from Motionツール

AR (Augmented Reality)とDR (Diminished Reality)

FCN (Fully Convolutional Network):ディープラーニングによるSema...

CGAN (Conditional GAN):条件付き敵対的生成ネットワーク

Dlib:C++の機械学習ライブラリ

NumSharp:C#で使えるNumPyライクな数値計算ライブラリ

PyTorch3D:3Dコンピュータービジョンライブラリ

GoogleのDeep Learning論文

MLDemos:機械学習について理解するための可視化ツール

UnityでOpenCVを使うには?

機械学習に役立つPythonライブラリ一覧

OpenCV3.3.0でsfmモジュールのビルドに成功!

represent

OpenCV 3.1のsfmモジュールを試す

Rerun:マルチモーダルデータの可視化アプリとSDK

Google製オープンソース機械学習ライブラリ『TensorFlow』のWindows版が公開された

統計的な顔モデル

CNN Explainer:畳み込みニューラルネットワーク可視化ツール

Houdiniのライセンスの種類

.NETで使えるTensorFlowライクなニューラルネットワークライブラリ『NeuralNetwo...

OpenCVで顔のランドマークを検出する『Facemark API』

3D Gaussian Splatting:リアルタイム描画できるRadiance Fields

ニューラルネットワークと深層学習

OpenGV:画像からカメラの3次元位置・姿勢を推定するライブラリ

OpenCVの顔検出過程を可視化した動画

写真に3Dオブジェクトを違和感無く合成する『3DPhotoMagic』

Runway ML:クリエイターのための機械学習ツール

Faceshiftで表情をキャプチャしてBlender上でMakeHumanのメッシュを動かすデモ

OpenCVのfindEssentialMat関数を使ったサンプルを読んでみる

モバイルバージョンを終了