メインコンテンツ

augmentedImageDatastore

バッチの変換によるイメージ データの拡張

説明

拡張イメージ データストアは、サイズ変更、回転、反転などのオプションの前処理を使用して、学習データ、検証データ、テスト データ、および予測データのバッチを変換します。イメージのサイズを変更して、深層学習ネットワークの入力サイズに適合させます。ネットワークで過適合が発生したり、学習イメージの正確な詳細が記憶されたりすることを防止するには、ランダムな前処理演算を使用して学習イメージ データを拡張します。

拡張イメージを使用してネットワークに学習させるには、augmentedImageDatastoretrainnet 関数に指定します。詳細については、イメージの深層学習向け前処理を参照してください。

  • 拡張イメージ データストアを学習イメージのソースとして使用する場合、データストアによって各エポックの学習データにランダムに摂動が与えられるため、エポックごとにわずかに異なるデータセットが使用されます。各エポックの学習イメージの実際の数は変化しません。変換後のイメージはメモリに格納されません。

  • imageInputLayer は、元のデータセットの平均ではなく拡張イメージの平均を使用してイメージの正規化を行います。この平均は、最初の拡張エポックで 1 回計算されます。他のすべてのエポックで同じ平均が使用されるため、学習中には平均イメージが変化しません。

  • イメージのサイズ変更を含む深層学習用のイメージの前処理を効率的に行うには、拡張イメージ データストアを使用します。ImageDatastore オブジェクトの ReadFcn オプションを使用しないでください。ImageDatastore を使用すると、事前取得を使用して JPG または PNG のイメージ ファイルのバッチ読み取りを行うことができます。ReadFcn オプションをカスタム関数に設定した場合、ImageDatastore は事前取得を行わないため、通常、速度が大幅に低下します。

既定では、augmentedImageDatastore はイメージのサイズを出力サイズに合わせて変更するだけです。imageDataAugmenter を使用して、追加のイメージ変換のオプションを設定できます。

作成

説明

auimds = augmentedImageDatastore(outputSize,imds) は、イメージ データストア imds のイメージを使用して、分類問題用の拡張イメージ データストアを作成します。データストアは、outputSize で指定された高さと幅に合わせてイメージのサイズを変更します。

auimds = augmentedImageDatastore(outputSize,X,Y) は、分類および回帰問題用の拡張イメージ データストアを作成します。配列 X には予測子変数が含まれ、配列 Y にはカテゴリカル ラベルまたは数値応答が含まれます。

auimds = augmentedImageDatastore(outputSize,X) は、配列 X のイメージ データの応答を予測するための拡張イメージ データストアを作成します。

auimds = augmentedImageDatastore(outputSize,tbl) は、分類および回帰問題用の拡張イメージ データストアを作成します。テーブル tbl には、予測子と応答が含まれます。

auimds = augmentedImageDatastore(outputSize,tbl,responseNames) は、分類および回帰問題用の拡張イメージ データストアを作成します。テーブル tbl には、予測子と応答が含まれます。引数 responseNames は、tbl の応答変数を指定します。

auimds = augmentedImageDatastore(___,Name=Value) は、名前と値の引数を使用して、書き込み可能なプロパティも設定します。たとえば、augmentedImageDatastore([28,28],imds,OutputSizeMode="centercrop") は中心からイメージをトリミングする拡張イメージ データストアを作成します。

入力引数

すべて展開する

出力イメージのサイズ。2 つの正の整数のベクトルとして指定します。最初の要素は出力イメージの高さ (行数) を指定し、2 番目の要素は幅 (列数) を指定します。

出力イメージには、カラー チャネルを表す 3 番目の次元が含まれる場合があります。ただし、outputSize を 3 要素ベクトルとして指定した場合、データストアは 3 番目の要素を無視します。代わりに、データストアは次のいずれかの方法で 3 次元のイメージ サイズを決定します。

  • 1 つまたは 3 つのカラー チャネルをもつ入力グレースケールおよび RGB イメージの場合、出力カラー チャネルの数は ColorPreprocessing の値によって異なります。たとえば、outputSize[28 28 1] に設定しても、ColorPreprocessing"gray2rgb" に設定した場合、出力イメージのサイズは 28×28×3 になります。

  • マルチスペクトル イメージやハイパースペクトル イメージなど、入力イメージが 1 つまたは 3 つのカラー チャネルをもたない場合、出力イメージには入力イメージと同じ数のカラー チャネルが含まれます。

この引数は OutputSize プロパティを設定します。

イメージ データストア。ImageDatastore オブジェクトとして指定します。

イメージ。4 次元数値配列として指定します。最初の 3 つの次元は高さ、幅、およびチャネルであり、最後の次元は個々のイメージにインデックスを付けます。

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

分類または回帰の応答。次のいずれかに指定します。

  • 分類問題で、Y がイメージ ラベルを含む categorical ベクトル。

  • 回帰問題では、Y は次のいずれかになる。

    • nr 列の数値行列。n は観測値の数、r は応答の数です。

    • h x w x c x n の数値配列。h x w x c は 1 つの応答のサイズ、n は観測値の数です。

応答に NaN が含まれていてはなりません。

データ型: categorical | double

入力データ。テーブルとして指定します。tbl は、最初の列に予測子を、絶対イメージ パス、相対イメージ パス、あるいはイメージとして含まなければなりません。応答の型と場所は、問題によって異なります。

  • 分類問題では、応答はイメージのラベルを含むカテゴリカル変数でなければなりません。augmentedImageDatastore を呼び出すときに応答変数の名前が指定されていない場合、応答は 2 列目に含まれていなければなりません。tbl の異なる列に応答が含まれている場合、引数 responseNames を使用して応答変数名を指定しなければなりません。

  • 回帰問題では、応答は数値であり、最初の列より後の列に含まれなければなりません。応答は、スカラーとして複数の列に、あるいは数値ベクトルまたは 3 次元数値配列が含まれる cell 配列として 1 つの列に含めることができます。応答変数の名前を指定しない場合、augmentedImageDatastoretbl の残りの列を応答変数として受け入れます。引数 responseNames を使用して応答変数名を指定できます。

応答に NaN の値が含まれていてはなりません。予測子データに NaN が含まれる場合、学習全体に伝播されますが、ほとんどの場合に学習が収束しなくなります。

データ型: table

入力テーブルの応答変数の名前。次のいずれかとして指定します。

  • 1 つの応答をもつ分類または回帰タスクの場合、responseNames は、入力テーブルに応答変数が格納された文字ベクトルまたは string スカラーでなければなりません。

  • 複数の応答をもつ回帰タスクの場合、responseNames は、入力テーブルに応答変数が格納された string 配列または文字ベクトルの cell 配列でなければなりません。

データ型: char | cell | string

名前と値の引数

すべて展開する

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

例: auimds = augmentedImageDatastore([28,28],imds,OutputSizeMode="centercrop") は中心からイメージをトリミングする拡張イメージ データストアを作成します。

入力グレースケールまたは RGB イメージに対して実行される色の前処理演算。"none""gray2rgb"、または "rgb2gray" として指定します。イメージ データストアにグレースケール イメージと RGB イメージが混在している場合、ColorPreprocessing を使用して、必ずすべての出力イメージが imageInputLayer に必要な数のチャネルを持つようにします。

メモ

augmentedImageDatastore オブジェクトは、rgb2gray 関数を使用して RGB イメージをグレースケールに変換します。イメージに赤、緑、青のチャネルに対応しない 3 つのチャネルがある場合 (L*a*b* 色空間のイメージなど)、ColorPreprocessing を使用すると良い結果が得られないことがあります。

データストアは、次の場合には色の前処理を実行しません。

  • 入力イメージに既に必要な数のカラー チャネルがある。たとえば、値 "gray2rgb" を指定しており、入力イメージに既に 3 つのチャネルがある場合、色の前処理は行われません。

  • マルチスペクトル イメージやハイパースペクトル イメージなど、入力イメージが 1 つまたは 3 つのチャネルを持たない。この場合、すべての入力イメージが同数のチャネルを持たなければなりません。

この引数は ColorPreprocessing プロパティを設定します。

データ型: char | string

入力イメージに適用される前処理。imageDataAugmenter オブジェクトまたは "none" として指定します。DataAugmentation"none" の場合、データストアは出力サイズに合わせてイメージのサイズを変更するだけで、追加の前処理は実行しません。

この引数は DataAugmentation プロパティを設定します。

学習、予測、または分類中のバックグラウンドにおける観測値の送信。false または true として指定します。バックグラウンド ディスパッチを使用するには、Parallel Computing Toolbox™ が必要です。

拡張イメージ データストアは、関数 trainnet、および predictminibatchpredict などの推論関数と共に使用した場合、バックグラウンド ディスパッチのみを実行します。データストアの関数 read を直接呼び出すと、バックグラウンド ディスパッチが行われません。

この引数は DispatchInBackground プロパティを設定します。

出力イメージのサイズ変更に使用するメソッド。次のいずれかに指定します。

  • "resize" — 双一次内挿を使用して、出力サイズに合わせてイメージをスケーリングします。

    メモ

    augmentedImageDatastore は、imresize の双一次内挿法をアンチエイリアシングと共に使用します。双一次内挿を使用すると、最近傍内挿などによって発生する歪みを回避しながら、イメージ処理を高速化できます。対照的に、imresize は既定で、双三次内挿をアンチエイリアシングと共に使用して、サイズ変更された高品質のイメージを生成しますが、処理時間は長くなります。

  • "centercrop" — 学習イメージの中心からトリミングします。トリミングのサイズは、出力サイズと同じです。

  • "randcrop" — 学習イメージからランダムにトリミングします。ランダムなトリミングのサイズは、出力サイズと同じです。

この引数は OutputSizeMode プロパティを設定します。

データ型: char | string

プロパティ

すべて展開する

入力グレースケールまたは RGB イメージに対して実行される色の前処理演算。"none""gray2rgb"、または "rgb2gray" として指定します。イメージ データストアにグレースケール イメージと RGB イメージが混在している場合、ColorPreprocessing を使用して、すべての出力イメージが imageInputLayer に必要な数のチャネルを持つようにします。

メモ

augmentedImageDatastore オブジェクトは、rgb2gray 関数を使用して RGB イメージをグレースケールに変換します。イメージに赤、緑、青のチャネルに対応しない 3 つのチャネルがある場合 (L*a*b* 色空間のイメージなど)、ColorPreprocessing を使用すると良い結果が得られないことがあります。

データストアは、次の場合には色の前処理を実行しません。

  • 入力イメージに既に必要な数のカラー チャネルがある。たとえば、値 "gray2rgb" を指定しており、入力イメージに既に 3 つのチャネルがある場合、色の前処理は行われません。

  • マルチスペクトル イメージやハイパースペクトル イメージなど、入力イメージが 1 つまたは 3 つのチャネルを持たない。この場合、すべての入力イメージが同数のチャネルを持たなければなりません。

データ型: char | string

入力イメージに適用される前処理。imageDataAugmenter オブジェクトまたは "none" として指定します。DataAugmentation"none" の場合、データストアは出力サイズに合わせてイメージのサイズを変更するだけで、追加の前処理は実行しません。

学習、予測、または分類中のバックグラウンドにおける観測値の送信。false または true として指定します。バックグラウンド ディスパッチを使用するには、Parallel Computing Toolbox が必要です。

拡張イメージ データストアは、関数 trainnet、および predictminibatchpredict などの推論関数と共に使用した場合、バックグラウンド ディスパッチのみを実行します。データストアの関数 read を直接呼び出すと、バックグラウンド ディスパッチが行われません。

各バッチで返される観測値の数。データストアの作成後にのみ MiniBatchSize の値を変更できます。

trainingOptionsminibatchpredict、および testnet など、ミニバッチ サイズを指定する学習関数および予測関数では、MiniBatchSize プロパティは設定されません。最高のパフォーマンスを得るには、学習関数および予測関数と同じミニバッチ サイズをデータストアに使用します。

この プロパティ は読み取り専用です。

拡張イメージ データストアに含まれている観測値の合計数。正の整数として返されます。観測値の数は 1 つの学習エポックの長さです。

出力イメージのサイズ。2 つの正の整数のベクトルとして指定します。最初の要素は出力イメージの高さ (行数) を指定し、2 番目の要素は幅 (列数) を指定します。

OutputSize プロパティは、出力イメージのカラー チャネルの数を示すものではありません。データストアから読み取る場合、出力イメージにはカラー チャネルを表す 3 番目の次元が含まれる場合があります。

  • 1 つまたは 3 つのカラー チャネルをもつ入力グレースケールおよび RGB イメージの場合、出力チャネルの数は ColorPreprocessing の値によって異なります。たとえば、ColorPreprocessing"gray2rgb" の場合、3 次元の出力サイズは 3 になります。ColorPreprocessing"rgb2gray" の場合、出力イメージは 3 番目の次元をもちません。

  • マルチスペクトル イメージやハイパースペクトル イメージなど、入力イメージが 1 つまたは 3 つのカラー チャネルをもたない場合、3 次元の出力サイズは入力イメージのカラー チャネルの数と等しくなります。

出力イメージのサイズ変更に使用するメソッド。次のいずれかに指定します。

  • "resize" — 双一次内挿を使用して、出力サイズに合わせてイメージをスケーリングします。

    メモ

    augmentedImageDatastore は、imresize の双一次内挿法をアンチエイリアシングと共に使用します。双一次内挿を使用すると、最近傍内挿などによって発生する歪みを回避しながら、イメージ処理を高速化できます。対照的に、imresize は既定で、双三次内挿をアンチエイリアシングと共に使用して、サイズ変更された高品質のイメージを生成しますが、処理時間は長くなります。

  • "centercrop" — 学習イメージの中心からトリミングします。トリミングのサイズは、出力サイズと同じです。

  • "randcrop" — 学習イメージからランダムにトリミングします。ランダムなトリミングのサイズは、出力サイズと同じです。

データ型: char | string

オブジェクト関数

combine複数のデータストアのデータを統合
hasdataデータが読み取り可能かどうかを判別
numpartitionsデータストアの区画数
partitionデータストアを分割する
partitionByIndexインデックスに応じた augmentedImageDatastore の分割
previewデータストア内のデータのサブセットをプレビュー
readaugmentedImageDatastore からデータを読み取る
readallデータストアのすべてのデータの読み取り
readByIndexインデックスで指定されたデータを augmentedImageDatastore から読み取る
resetデータストアの初期状態へのリセット
shuffleaugmentedImageDatastore でデータをシャッフルする
subsetデータストアまたは FileSet のサブセットの作成
transformデータストアの変換
isPartitionableデータストアが分割可能かどうかを判別
isShuffleableデータストアがシャッフル可能かどうかを判別

すべて折りたたむ

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

サンプル データを読み込みます。サンプル データは、手書き数字の合成イメージで構成されています。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);

ヒント

  • 関数 imtile を使用して、変換された多くのイメージを同じ Figure で可視化できます。たとえば、次のコードは、auimds という拡張イメージ データストアから、変換されたイメージのミニバッチの 1 つを表示します。

    minibatch = read(auimds);
    imshow(imtile(minibatch.input))
  • 既定では、イメージに対して実行されるイメージ前処理演算はサイズの変更のみです。imageDataAugmenter オブジェクトで名前と値の引数 DataAugmentation を使用して、追加の前処理演算を有効にします。拡張イメージ データストアからイメージが読み取られるたびに、前処理演算がランダムな異なる組み合わせで各イメージに適用されます。

バージョン履歴

R2018a で導入