Main Content

imageDataAugmenter

イメージ データ拡張の構成

説明

イメージ データ オーグメンターは、サイズ変更、回転、反転など、イメージ拡張の一連の前処理オプションを構成します。

imageDataAugmenter は、augmentedImageDatastore で使用され、拡張イメージをバッチ生成します。詳細については、ランダムな幾何学的変換での学習用のイメージの拡張を参照してください。

作成

説明

aug = imageDataAugmenter は、恒等変換と一致する既定のプロパティ値を使用して、imageDataAugmenter オブジェクトを作成します。

aug = imageDataAugmenter(Name,Value) は、プロパティを設定する名前と値のペアを使用して、一連のイメージ拡張オプションを構成します。複数の名前と値のペアを指定できます。各プロパティ名を引用符で囲みます。

プロパティ

すべて展開する

リサンプリング時に範囲外の点の定義に使用される塗りつぶしの値。数値スカラーまたは数値ベクトルとして指定します。

  • 拡張イメージが単一チャネルの場合、FillValue はスカラーでなければなりません。

  • 拡張イメージがマルチチャネルの場合、FillValue にはスカラー、または入力イメージのチャネル数に等しい長さのベクトルを指定できます。たとえば、入力イメージが RGB イメージの場合、FillValue には長さが 3 のベクトルを指定できます。

グレースケール イメージとカラー イメージの場合、既定の塗りつぶしの値は 0 です。categorical イメージの場合、既定の塗りつぶしの値は '<undefined>' ラベルで、関数 trainnet は学習時に塗りつぶされたピクセルを無視します。

例: 128

左右方向のランダムな反転。logical スカラーとして指定します。RandXReflectiontrue (1) の場合、各イメージは 50% の確率で水平方向に反転します。RandXReflectionfalse (0) の場合、イメージは反転しません。

上下方向のランダムな反転。logical スカラーとして指定します。RandYReflectiontrue (1) の場合、各イメージは 50% の確率で垂直方向に反転します。RandYReflectionfalse (0) の場合、イメージは反転しません。

入力イメージに適用される回転の範囲 (度単位)。次のいずれかに指定します。

  • 2 要素の数値ベクトル。2 番目の要素は最初の要素以上でなければなりません。回転角度は、指定区間内の連続一様分布からランダムに選択されます。

  • 関数ハンドル。関数は入力引数を受け入れず、回転角度を数値スカラーとして返さなければなりません。関数ハンドルを使用して、重なっていない区間から、または一様ではない確率分布を使用して回転角度を選択します。関数ハンドルの詳細については、関数ハンドルの作成を参照してください。

既定では、拡張イメージは回転しません。

例: [-45 45]

入力イメージに適用される一様 (等方性) スケーリングの範囲。次のいずれかに指定します。

  • 2 要素の数値ベクトル。2 番目の要素は最初の要素以上でなければなりません。スケール係数は、指定区間内の連続一様分布からランダムに選択されます。

  • 関数ハンドル。関数は入力引数を受け入れず、スケール係数を数値スカラーとして返さなければなりません。関数ハンドルを使用して、重なっていない区間から、または一様ではない確率分布を使用してスケール係数を選択します。関数ハンドルの詳細については、関数ハンドルの作成を参照してください。

既定では、拡張イメージはスケーリングされません。

例: [0.5 4]

入力イメージに適用される水平方向のスケーリングの範囲。次のいずれかに指定します。

  • 2 要素の数値ベクトル。2 番目の要素は最初の要素以上でなければなりません。水平方向のスケール係数は、指定区間内の連続一様分布からランダムに選択されます。

  • 関数ハンドル。関数は入力引数を受け入れず、水平方向のスケール係数を数値スカラーとして返さなければなりません。関数ハンドルを使用して、重なっていない区間から、または一様ではない確率分布を使用して水平方向のスケール係数を選択します。関数ハンドルの詳細については、関数ハンドルの作成を参照してください。

既定では、拡張イメージは水平方向にスケーリングされません。

メモ

RandScale を指定すると、イメージのスケーリング時に imageDataAugmenterRandXScale の値を無視します。

例: [0.5 4]

入力イメージに適用される垂直方向のスケーリングの範囲。次のいずれかに指定します。

  • 2 要素の数値ベクトル。2 番目の要素は最初の要素以上でなければなりません。垂直方向のスケール係数は、指定区間内の連続一様分布からランダムに選択されます。

  • 関数ハンドル。関数は入力引数を受け入れず、垂直方向のスケール係数を数値スカラーとして返さなければなりません。関数ハンドルを使用して、重なっていない区間から、または一様ではない確率分布を使用して垂直方向のスケール係数を選択します。関数ハンドルの詳細については、関数ハンドルの作成を参照してください。

既定では、拡張イメージは垂直方向にスケーリングされません。

メモ

RandScale を指定すると、イメージのスケーリング時に imageDataAugmenterRandYScale の値を無視します。

例: [0.5 4]

入力イメージに適用される水平方向のせん断の範囲。次のいずれかに指定します。せん断は角度として度単位で測定され、範囲は (–90, 90) になります。

  • 2 要素の数値ベクトル。2 番目の要素は最初の要素以上でなければなりません。水平方向のせん断角度は、指定区間内の連続一様分布からランダムに選択されます。

  • 関数ハンドル。関数は入力引数を受け入れず、水平方向のせん断角度を数値スカラーとして返さなければなりません。関数ハンドルを使用して、重なっていない区間から、または一様ではない確率分布を使用して水平方向のせん断角度を選択します。関数ハンドルの詳細については、関数ハンドルの作成を参照してください。

既定では、拡張イメージは水平方向にせん断されません。

例: [0 45]

入力イメージに適用される垂直方向のせん断の範囲。次のいずれかに指定します。せん断は角度として度単位で測定され、範囲は (–90, 90) になります。

  • 2 要素の数値ベクトル。2 番目の要素は最初の要素以上でなければなりません。垂直方向のせん断角度は、指定区間内の連続一様分布からランダムに選択されます。

  • 関数ハンドル。関数は入力引数を受け入れず、垂直方向のせん断角度を数値スカラーとして返さなければなりません。関数ハンドルを使用して、重なっていない区間から、または一様ではない確率分布を使用して垂直方向のせん断角度を選択します。関数ハンドルの詳細については、関数ハンドルの作成を参照してください。

既定では、拡張イメージは垂直方向にせん断されません。

例: [0 45]

入力イメージに適用される水平方向の平行移動の範囲。次のいずれかに指定します。平行移動距離はピクセル単位で測定します。

  • 2 要素の数値ベクトル。2 番目の要素は最初の要素以上でなければなりません。水平方向の平行移動距離は、指定区間内の連続一様分布からランダムに選択されます。

  • 関数ハンドル。関数は入力引数を受け入れず、水平方向の平行移動距離を数値スカラーとして返さなければなりません。関数ハンドルを使用して、重なっていない区間から、または一様ではない確率分布を使用して水平方向の平行移動距離を選択します。関数ハンドルの詳細については、関数ハンドルの作成を参照してください。

既定では、拡張イメージは水平方向に平行移動しません。

例: [-5 5]

入力イメージに適用される垂直方向の平行移動の範囲。次のいずれかに指定します。平行移動距離はピクセル単位で測定します。

  • 2 要素の数値ベクトル。2 番目の要素は最初の要素以上でなければなりません。垂直方向の平行移動距離は、指定区間内の連続一様分布からランダムに選択されます。

  • 関数ハンドル。関数は入力引数を受け入れず、垂直方向の平行移動距離を数値スカラーとして返さなければなりません。関数ハンドルを使用して、重なっていない区間から、または一様ではない確率分布を使用して垂直方向の平行移動距離を選択します。関数ハンドルの詳細については、関数ハンドルの作成を参照してください。

既定では、拡張イメージは垂直方向に平行移動しません。

例: [-5 5]

オブジェクト関数

augment複数のイメージに対する同一のランダム変換の適用

すべて折りたたむ

学習前にイメージを前処理するイメージ データ オーグメンターを作成します。このオーグメンターは、範囲 [0, 360] 度のランダムな角度でイメージを回転させ、範囲 [0.5, 1] のランダムなスケール係数でイメージのサイズを変更します。

augmenter = imageDataAugmenter( ...
    'RandRotation',[0 360], ...
    'RandScale',[0.5 1])
augmenter = 
  imageDataAugmenter with properties:

           FillValue: 0
     RandXReflection: 0
     RandYReflection: 0
        RandRotation: [0 360]
           RandScale: [0.5000 1]
          RandXScale: [1 1]
          RandYScale: [1 1]
          RandXShear: [0 0]
          RandYShear: [0 0]
    RandXTranslation: [0 0]
    RandYTranslation: [0 0]

イメージ データ オーグメンターを使用して拡張イメージ データストアを作成します。拡張イメージ データストアには、サンプル データ、ラベル、および出力イメージ サイズも必要です。

[XTrain,YTrain] = digitTrain4DArrayData;
imageSize = [56 56 1];
auimds = augmentedImageDatastore(imageSize,XTrain,YTrain,'DataAugmentation',augmenter)
auimds = 
  augmentedImageDatastore with properties:

         NumObservations: 5000
           MiniBatchSize: 128
        DataAugmentation: [1x1 imageDataAugmenter]
      ColorPreprocessing: 'none'
              OutputSize: [56 56]
          OutputSizeMode: 'resize'
    DispatchInBackground: 0

イメージ データストアの最初の 8 個のイメージに適用されたランダム変換をプレビューします。

minibatch = preview(auimds);
imshow(imtile(minibatch.input));

Figure contains an axes object. The hidden axes object contains an object of type image.

同じイメージ セットに適用された別のランダム変換をプレビューします。

minibatch = preview(auimds);
imshow(imtile(minibatch.input));

Figure contains an axes object. The hidden axes object contains an object of type image.

拡張イメージ データを使用して、畳み込みニューラル ネットワークに学習させます。データ拡張は、ネットワークで過適合が発生したり、学習イメージの正確な詳細が記憶されたりすることを防止するのに役立ちます。

サンプル データを読み込みます。サンプル データは、手書き数字の合成イメージで構成されています。XTrain は 28×28×1×5000 の配列です。ここで、以下のようになります。

  • 28 はイメージの高さと幅。

  • 1 はチャネルの数。

  • 5000 は手書き数字の合成イメージの数。

labelsTrain は、各観測値のラベルが含まれる categorical ベクトルです。

load DigitsDataTrain

ネットワークの検証用に 1000 個のイメージを残しておきます。

idx = randperm(size(XTrain,4),1000);
XValidation = XTrain(:,:,:,idx);
XTrain(:,:,:,idx) = [];
TValidation = labelsTrain(idx);
labelsTrain(idx) = [];

サイズ変更、回転、平行移動、反転など、イメージ拡張の前処理オプションを指定する imageDataAugmenter オブジェクトを作成します。イメージを、水平方向および垂直方向に最大 3 ピクセルまでのランダムな平行移動をさせたり、最大 20 度までの回転をさせたりします。

imageAugmenter = imageDataAugmenter( ...
    'RandRotation',[-20,20], ...
    'RandXTranslation',[-3 3], ...
    'RandYTranslation',[-3 3])
imageAugmenter = 
  imageDataAugmenter with properties:

           FillValue: 0
     RandXReflection: 0
     RandYReflection: 0
        RandRotation: [-20 20]
           RandScale: [1 1]
          RandXScale: [1 1]
          RandYScale: [1 1]
          RandXShear: [0 0]
          RandYShear: [0 0]
    RandXTranslation: [-3 3]
    RandYTranslation: [-3 3]

ネットワーク学習に使用する augmentedImageDatastore オブジェクトを作成し、イメージ出力サイズを指定します。学習中、データストアはイメージ拡張の実行とイメージのサイズ変更を行います。データストアは、イメージをメモリに保存せずに拡張します。trainnet は、ネットワーク パラメーターを更新した後、その拡張イメージを破棄します。

imageSize = [28 28 1];
augimds = augmentedImageDatastore(imageSize,XTrain,labelsTrain,'DataAugmentation',imageAugmenter);

畳み込みニューラル ネットワーク アーキテクチャを指定します。

layers = [
    imageInputLayer(imageSize)
    
    convolution2dLayer(3,8,'Padding','same')
    batchNormalizationLayer
    reluLayer   
    
    maxPooling2dLayer(2,'Stride',2)
    
    convolution2dLayer(3,16,'Padding','same')
    batchNormalizationLayer
    reluLayer   
    
    maxPooling2dLayer(2,'Stride',2)
    
    convolution2dLayer(3,32,'Padding','same')
    batchNormalizationLayer
    reluLayer   
    
    fullyConnectedLayer(10)
    softmaxLayer];

学習オプションを指定します。オプションの中から選択するには、経験的解析が必要です。実験を実行してさまざまな学習オプションの構成を調べるには、実験マネージャーアプリを使用できます。

opts = trainingOptions('sgdm', ...
    'MaxEpochs',15, ...
    'Shuffle','every-epoch', ...
    'Plots','training-progress', ...
    'Metrics','accuracy', ...
    'Verbose',false, ...
    'ValidationData',{XValidation,TValidation});

関数trainnetを使用してニューラル ネットワークに学習させます。分類には、クロスエントロピー損失を使用します。既定では、関数 trainnet は利用可能な GPU がある場合にそれを使用します。GPU での学習には、Parallel Computing Toolbox™ ライセンスとサポートされている GPU デバイスが必要です。サポートされているデバイスの詳細については、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。そうでない場合、関数 trainnet は CPU を使用します。実行環境を指定するには、ExecutionEnvironment 学習オプションを使用します。

net = trainnet(augimds,layers,"crossentropy",opts);

ヒント

  • サンプル イメージに適用された変換をプレビューするには、関数 augment を使用します。

  • 学習中にイメージ拡張を実行するには、augmentedImageDatastore を作成し、名前と値のペア 'DataAugmentation'imageDataAugmenter を使用して前処理オプションを指定します。拡張イメージ データストアは学習データにランダム変換を自動的に適用します。

バージョン履歴

R2017b で導入