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:

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

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

plot(lgraph)

Figure contains an axes. The axes 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)を参照してください。

互換性の考慮事項

すべて展開する

R2019b 以降は非推奨

参照

[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 で導入