Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

unetLayers

セマンティック セグメンテーションの U-Net 層の作成

説明

lgraph = unetLayers(imageSize,numClasses) は U-Net ネットワークを返します。unetLayers には、入力イメージ内のすべてのピクセルのカテゴリカル ラベルを予測するための、ネットワークのピクセル分類層が含まれています。

unetLayers を使用して、U-Net ネットワーク アーキテクチャを作成します。Deep Learning Toolbox™ の関数 trainNetwork (Deep Learning Toolbox) を使用してネットワークに学習させなければなりません。

[lgraph,outputSize] = unetLayers(imageSize,numClasses) は、U-Net ネットワークからの出力サイズも返します。

___ = unetLayers(imageSize,numClasses,Name,Value) は、名前と値のペアの引数を 1 つ以上使用してオプションを指定します。各プロパティ名を引用符で囲みます。たとえば、unetLayers(imageSize,numClasses,'NumFirstEncoderFilters',64) は、さらに最初の符号化器ステージの出力チャネルの数を 64 に設定します。

すべて折りたたむ

深さ 3 の符号化器/復号化器を持つ U-Net ネットワークを作成します。

imageSize = [480 640 3];
numClasses = 5;
encoderDepth = 3;
lgraph = unetLayers(imageSize,numClasses,'EncoderDepth',encoderDepth)
lgraph = 
  LayerGraph with properties:

     InputNames: {'ImageInputLayer'}
    OutputNames: {'Segmentation-Layer'}
         Layers: [46x1 nnet.cnn.layer.Layer]
    Connections: [48x2 table]

ネットワークを表示します。

plot(lgraph)

Figure contains an axes object. The axes object contains an object of type graphplot.

学習イメージとピクセル ラベルをワークスペースに読み込みます。

dataSetDir = fullfile(toolboxdir('vision'),'visiondata','triangleImages');
imageDir = fullfile(dataSetDir,'trainingImages');
labelDir = fullfile(dataSetDir,'trainingLabels');

学習イメージを保存する imageDatastore オブジェクトを作成します。

imds = imageDatastore(imageDir);

クラス名と関連するラベル ID を定義します。

classNames = ["triangle","background"];
labelIDs   = [255 0];

学習イメージのグラウンド トゥルース ピクセル ラベルを保存する pixelLabelDatastore オブジェクトを作成します。

pxds = pixelLabelDatastore(labelDir,classNames,labelIDs);

U-Net ネットワークを作成します。

imageSize = [32 32];
numClasses = 2;
lgraph = unetLayers(imageSize, numClasses)
lgraph = 
  LayerGraph with properties:

         Layers: [58×1 nnet.cnn.layer.Layer]
    Connections: [61×2 table]
     InputNames: {'ImageInputLayer'}
    OutputNames: {'Segmentation-Layer'}

ネットワークの学習用のデータストアを作成します。

ds = combine(imds,pxds);

学習オプションを設定します。

options = trainingOptions('sgdm', ...
    'InitialLearnRate',1e-3, ...
    'MaxEpochs',20, ...
    'VerboseFrequency',10);

ネットワークに学習をさせます。

net = trainNetwork(ds,lgraph,options)
Training on single CPU.
Initializing input data normalization.
|========================================================================================|
|  Epoch  |  Iteration  |  Time Elapsed  |  Mini-batch  |  Mini-batch  |  Base Learning  |
|         |             |   (hh:mm:ss)   |   Accuracy   |     Loss     |      Rate       |
|========================================================================================|
|       1 |           1 |       00:00:04 |       75.57% |       2.4341 |          0.0010 |
|      10 |          10 |       00:00:36 |       96.02% |       0.4517 |          0.0010 |
|      20 |          20 |       00:01:13 |       97.62% |       0.2324 |          0.0010 |
|========================================================================================|
net = 
  DAGNetwork with properties:

         Layers: [58×1 nnet.cnn.layer.Layer]
    Connections: [61×2 table]
     InputNames: {'ImageInputLayer'}
    OutputNames: {'Segmentation-Layer'}

入力引数

すべて折りたたむ

ネットワーク入力のイメージ サイズ。以下として指定します。

  • [height, width] 形式の 2 要素ベクトル。

  • [height, width, depth] 形式の 3 要素ベクトル。depth はイメージ チャネルの数です。depth は、RGB イメージの場合は 3、グレースケール イメージの場合は 1、マルチスペクトル イメージおよびハイパースペクトル イメージの場合はチャネル数に設定します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

セマンティック セグメンテーションのクラス数。1 より大きい整数で指定します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

名前と値の引数

例: 'EncoderDepth',3

符号化器の深さ。正の整数で指定します。U-Net は、符号化器のサブネットワークと、対応する復号化器のサブネットワークで構成されます。これらのネットワークの深さが、処理中に入力イメージがダウンサンプリングされるか、アップサンプリングされる回数を決定します。符号化器ネットワークは、入力イメージを係数 2D でダウンサンプリングします。D は EncoderDepth の値です。復号化器ネットワークは符号化器ネットワーク出力を係数 2D でアップサンプリングします。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

メモ

NumOutputChannels は、NumFirstEncoderFilters に名前が変更されており、将来のリリースではサポートされなくなります。代わりに NumFirstEncoderFilters を使用してください。

1 番目の符号化器ステージの出力チャネル数。正の整数または正の整数のベクトルとして指定します。後続の各符号化器ステージでは、出力チャネル数が 2 倍になります。unetLayers は、各復号化器ステージの出力チャネル数を、対応する符号化器ステージの出力チャネル数と一致するように設定します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

1 番目の符号化器ステージの出力チャネル数。正の整数または正の整数のベクトルとして指定します。後続の各符号化器ステージでは、出力チャネル数が 2 倍になります。関数 unetLayers は、各復号化器ステージの出力チャネル数を、対応する符号化器ステージの出力チャネル数と一致するように設定します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

畳み込み層のフィルター サイズ。正の奇数の整数または正の奇数の整数の 2 要素の行ベクトルとして指定します。一般的な値は、[3, 7] の範囲にあります。

FilterSize説明
スカラーフィルターは正方形です。
2 要素の行ベクトル

フィルターのサイズは [height width] です。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

パディングのタイプ。'same' または 'valid' として指定します。パディングのタイプは、符号化器サブネットワークと復号化器サブネットワークの convolution2dLayer (Deep Learning Toolbox) のパディング スタイルを指定します。出力の特徴マップの空間サイズは、パディングのタイプによって異なります。指定するパディングのタイプによって次のようになります。

  • 'same' — 出力と入力の特徴マップのサイズが同じになるように、畳み込み層への入力にゼロ パディングが適用されます。

  • 'valid' — 畳み込み層への入力にはゼロ パディングが適用されません。畳み込み層は、ゼロ パディングなしで計算された畳み込みの値のみを返します。出力の特徴マップは入力の特徴マップより小さくなります。

メモ

最大プーリング層への入力の height と width が必ず偶数になるように、ネットワーク入力のイメージ サイズを次の基準のいずれかに適合するように選択します。

  • 'ConvolutionPadding''same' として指定する場合、入力イメージの height と width は 2D の倍数でなければなりません。

  • 'ConvolutionPadding''valid' として指定する場合、入力イメージの height と width は、heighti=1D2i(fh1)widthi=1D2i(fw1) が 2D の倍数になるように選択しなければなりません。

    ここで、fh と fw は、それぞれ 2 次元畳み込みカーネルの高さと幅です。D は符号化器の深さです。

データ型: char | string

出力引数

すべて折りたたむ

U-Net ネットワーク アーキテクチャを表す層。layerGraph (Deep Learning Toolbox) オブジェクトとして返されます。

ネットワーク出力のイメージ サイズ。[height, width, channels] の形式の 3 要素ベクトルとして返されます。channels は、出力チャネル数であり、入力で指定されているクラス数と等しくなります。ネットワークからの出力イメージの height と width は、畳み込みのパディングのタイプによって異なります。

  • 'ConvolutionPadding''same' として指定すると、ネットワークの出力イメージと入力イメージの height と width は同じになります。

  • 'ConvolutionPadding''valid' として指定すると、ネットワークの出力イメージの height と width はネットワークの入力イメージのものより小さくなります。

データ型: double

詳細

すべて折りたたむ

U-Net アーキテクチャ

  • U-Net アーキテクチャは、ブリッジ セクションで接続された符号化器のサブネットワークと復号化器のサブネットワークで構成されます。

  • U-Net アーキテクチャの符号化器と復号化器のサブネットワークは、複数のステージで構成されます。符号化器と復号化器のサブネットワークの深さを指定する EncoderDepth によってステージ数が設定されます。

  • U-Net 符号化器サブネットワーク内のステージは、2 組の畳み込み層および ReLU 層と、それに続く 2 x 2 の最大プーリング層で構成されます。復号化器のサブネットワークは、アップサンプリング用の転置畳み込み層と、それに続く 2 組の畳み込み層および ReLU 層で構成されます。

  • ブリッジ セクションは、2 組の畳み込み層および ReLU 層で構成されます。

  • すべての畳み込み層のバイアス項はゼロに初期化されます。

  • 符号化器と復号化器のサブネットワーク内の畳み込み層の重みは 'He' 重み初期化メソッド[2]を使用して初期化されます。

ヒント

  • 畳み込み層で 'same' パディングを使用すると、入力から出力まで同じデータ サイズが維持され、幅広い入力イメージ サイズの使用が可能になります。

  • 大きなイメージをシームレスにセグメント化するにはパッチベースのアプローチを使用します。Image Processing Toolbox™ の関数 randomPatchExtractionDatastore を使用してイメージ パッチを抽出できます。

  • パッチベースのアプローチを使用してセグメンテーションを行う際に、境界のアーティファクトが生じるのを防ぐには、'valid' パディングを使用します。

  • 関数 unetLayers を使用して作成したネットワークは、trainNetwork (Deep Learning Toolbox) で学習させた後、GPU コード生成に使用できます。詳細と例については、コード生成 (Deep Learning Toolbox)を参照してください。

参照

[1] Ronneberger, O., P. Fischer, and T. Brox. "U-Net: Convolutional Networks for Biomedical Image Segmentation." Medical Image Computing and Computer-Assisted Intervention (MICCAI). Vol. 9351, 2015, pp. 234–241.

[2] He, K., X. Zhang, S. Ren, and J. Sun. "Delving Deep Into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification." Proceedings of the IEEE International Conference on Computer Vision. 2015, 1026–1034.

拡張機能

バージョン履歴

R2018b で導入

すべて展開する