最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

unetLayers

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

説明

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

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

lgraph = unetLayers(imageSize,numClasses,Name,Value) は 1 つ以上の名前と値のペアを使用してオプションを指定します。各プロパティ名を引用符で囲みます。たとえば、unetLayer(imageSize,numClasses,'NumOutputChannels',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]

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

plot(lgraph)

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

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]

セマンティック セグメンテーション ネットワークの学習用のデータ ソースを作成します。

ds = pixelLabelImageDatastore(imds,pxds);

学習オプションをセットアップします。

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

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

net = trainNetwork(ds,lgraph,options)
Training on single CPU.
Initializing image normalization.
|========================================================================================|
|  Epoch  |  Iteration  |  Time Elapsed  |  Mini-batch  |  Mini-batch  |  Base Learning  |
|         |             |   (hh:mm:ss)   |   Accuracy   |     Loss     |      Rate       |
|========================================================================================|
|       1 |           1 |       00:00:04 |        5.21% |      15.1044 |          0.0010 |
|      10 |          10 |       00:00:43 |       96.09% |       0.4845 |          0.0010 |
|      20 |          20 |       00:01:25 |       94.38% |       0.7715 |          0.0010 |
|========================================================================================|
net = 
  DAGNetwork with properties:

         Layers: [58×1 nnet.cnn.layer.Layer]
    Connections: [61×2 table]

入力引数

すべて折りたたむ

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

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

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

メモ

各符号器セクションは 2x2 の maxPooling2dLayer を持ち、イメージ サイズは半分になります。入力イメージの高さと幅は、2D の倍数にしなければなりません。ここで、D は EncoderDepth の値です。

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

名前と値のペアの引数

例: 'EncoderDepth',3

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

U-Net 符号器ネットワークの最初のサブセクションの出力チャネル数。正の整数または正の整数のベクトルとして指定します。後続の各符号器サブセクションでは、出力チャネル数は 2 倍になります。unetLayers は、対応する符号器セクションに一致するように復号器セクションの出力チャネル数を設定します。

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

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

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

出力引数

すべて折りたたむ

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

ヒント

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

  • unetLayers の畳み込み層は、'same' のパディングを使用することで、入力から出力へデータ サイズを保持し、幅広い入力イメージ サイズに対応します。Ronneberger[1] によるオリジナル バージョンはパディングを使用しないため、小さい入力イメージ サイズに制限されます。

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

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

  • unetLayers によって生成されたネットワークは、trainNetwork で学習を行った後、深層学習用の 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 で導入