メインコンテンツ

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

unet

セマンティック セグメンテーション用の U-Net 畳み込みニューラル ネットワークの作成

R2024a 以降

説明

unetNetwork = unet(imageSize,numClasses) は U-Net ネットワークを返します。

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

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

___ = unet(imageSize,numClasses,Name=Value) は、1 つ以上の名前と値の引数を使用してオプションを指定します。たとえば、unet(imageSize,numClasses,NumFirstEncoderFilters=64) は、最初の符号化器ステージの出力チャネルの数を 64 として指定します。

すべて折りたたむ

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

imageSize = [480 640 3];
numClasses = 5;
encoderDepth = 3;
unetNetwork = unet(imageSize,numClasses,EncoderDepth=encoderDepth)
unetNetwork = 
  dlnetwork with properties:

         Layers: [48×1 nnet.cnn.layer.Layer]
    Connections: [53×2 table]
     Learnables: [36×3 table]
          State: [0×3 table]
     InputNames: {'encoderImageInputLayer'}
    OutputNames: {'FinalNetworkSoftmax-Layer'}
    Initialized: 1

  View summary with summary.

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

plot(unetNetwork)

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;
unetNetwork = unet(imageSize, numClasses)
unetNetwork = 
  dlnetwork with properties:

         Layers: [61×1 nnet.cnn.layer.Layer]
    Connections: [68×2 table]
     Learnables: [46×3 table]
          State: [0×3 table]
     InputNames: {'encoderImageInputLayer'}
    OutputNames: {'FinalNetworkSoftmax-Layer'}
    Initialized: 1

  View summary with summary.

ネットワークに学習させるためのデータストアを作成します。

ds = combine(imds,pxds);

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

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

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

net = trainnet(ds,unetNetwork,"crossentropy",options)
    Iteration    Epoch    TimeElapsed    LearnRate    TrainingLoss
    _________    _____    ___________    _________    ____________
            1        1       00:00:05        0.001          3.2975
           10       10       00:00:48        0.001          0.6778
           20       20       00:01:36        0.001         0.27066
Training stopped: Max epochs completed
net = 
  dlnetwork with properties:

         Layers: [61×1 nnet.cnn.layer.Layer]
    Connections: [68×2 table]
     Learnables: [46×3 table]
          State: [0×3 table]
     InputNames: {'encoderImageInputLayer'}
    OutputNames: {'FinalNetworkSoftmax-Layer'}
    Initialized: 1

  View summary with summary.

入力引数

すべて折りたたむ

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

  • [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

名前と値の引数

すべて折りたたむ

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

例: EncoderDepth=3 は符号化器の深さを 3 に指定します。

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

メモ

EncoderNetwork も指定する場合は、EncoderNetwork 入力の深さを使用して EncoderDepth の値を指定します。

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

unet が符号化器として使用する符号化器ネットワーク。dlnetwork (Deep Learning Toolbox) オブジェクトとして指定します。事前学習済みの符号化器ネットワークかカスタムの符号化器ネットワークを指定できます。事前学習済みの符号化器ネットワークを使用するには、pretrainedEncoderNetwork 関数を使用してネットワークを作成します。

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

データ型: 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' — 畳み込み層への入力にはゼロ パディングが適用されません。畳み込み層は、ゼロ パディングなしで計算された畳み込みの値のみを返します。出力の特徴マップは入力の特徴マップより小さくなります。

メモ

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

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

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

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

データ型: char | string

出力引数

すべて折りたたむ

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

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

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

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

データ型: double

詳細

すべて折りたたむ

ヒント

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

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

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

  • unet 関数を使用して作成したネットワークは、trainnet (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.

拡張機能

すべて展開する

バージョン履歴

R2024a で導入