Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

ボリュームの深層学習向け前処理

ボリューム データの読み取り

ボリューム イメージ データでサポートされるファイル形式には、MAT ファイル、Digital Imaging and Communications in Medicine (DICOM) ファイル、および Neuroimaging Informatics Technology Initiative (NIfTI) ファイルがあります。

ボリューム イメージ データを ImageDatastore に読み取ります。ボリューム ピクセル ラベル データを PixelLabelDatastore (Computer Vision Toolbox) に読み取ります。詳細については、深層学習用のデータストア (Deep Learning Toolbox)を参照してください。

この表は、サポートされている各ファイル形式での imageDatastorepixelLabelDatastore の一般的な使用法を示しています。データストアを作成する場合、引数 'FileExtensions' をデータのファイル拡張子として指定します。ReadFcn プロパティを、ファイル形式のデータを読み取る関数ハンドルとして指定します。引数 filepath は、イメージ データが含まれるファイルまたはフォルダーのパスを指定します。ピクセル ラベル イメージの場合、追加の引数 classNames および pixelLabelID は、ボクセル ラベル値のクラス名へのマッピングを指定します。

イメージ ファイル形式

イメージ データストアまたはピクセル ラベル データストアの作成

MAT

volds = imageDatastore(filepath, ...
   'FileExtensions','.mat','ReadFcn',@(x) fcn(x));

pxds = pixelLabelDatastore(filepath,classNames,pixelLabelID, ...
    'FileExtensions','.mat','ReadFcn',@(x) fcn(x));
fcn は、MAT ファイルからデータを読み取るカスタム関数です。たとえば、次のコードは、MAT ファイルの最初の変数からボリューム データを読み込む matRead と呼ばれる関数を定義します。関数を matRead.m という名前のファイルに保存します。

function data = matRead(filename)
    inp = load(filename);
    f = fields(inp);
    data = inp.(f{1});
end

単一のファイルの DICOM ボリューム

volds = imageDatastore(filepath, ...
   'FileExtensions','.dcm','ReadFcn',@(x) dicomread(x));

pxds = pixelLabelDatastore(filepath,classNames,pixelLabelID, ...
   'FileExtensions','.dcm','ReadFcn',@(x) dicomread(x));

DICOM ファイルの読み取りの詳細については、dicomread を参照してください。

複数のファイルの DICOM ボリューム

次の手順に従います。例については、単一ファイルおよび複数ファイルの DICOM ボリュームを含むイメージ データストアの作成を参照してください。

  • 関数 dicomCollection を使用して、ファイルを集計して単一のスタディにします。

  • 関数 dicomreadVolume を使用して、スタディの DICOM データを読み取ります。

  • 各ボリュームを MAT ファイルとして書き込みます。

  • MAT ファイルの手順に従って、MAT ファイルのコレクションから ImageDatastore または PixelLabelDatastore を作成します。

NIfTI

volds = imageDatastore(filepath, ...
   'FileExtensions','.nii','ReadFcn',@(x) niftiread(x));

pxds = pixelLabelDatastore(filepath,classNames,pixelLabelID, ...
   'FileExtensions','.nii','ReadFcn',@(x) niftiread(x));

NIfTI ファイルの読み取りの詳細については、niftiread を参照してください。

イメージとラベル データのペアリング

セマンティック セグメンテーション用のボリューム イメージとラベル データ、または回帰用の 2 つのボリューム イメージ データストアを関連付けるには、randomPatchExtractionDatastore を使用します。ランダム パッチ抽出データストアは、2 つのデータストアから対応するランダムに配置されたパッチを抽出します。パッチは、任意の大きさのボリュームでの学習時にメモリ不足を防ぐための一般的な手法です。ネットワークの入力サイズに一致し、メモリの効率性を考慮して、64 × 64 × 64 ボクセルなどのボリュームのフル サイズより小さいパッチ サイズを指定します。

関数 combine を使用して 2 つのデータストアを関連付けることもできます。ただし、randomPatchExtractionDatastore を使用して 2 つのデータストアを関連付ける方法には、combine を使用する方法と比べていくつかの利点があります。

  • randomPatchExtractionDatastore は、並列学習、マルチ GPU 学習、および事前取得読み取りをサポートします。trainingOptions (Deep Learning Toolbox) の名前と値の引数 'ExecutionEnvironment' を使用して、並列学習またはマルチ GPU 学習を指定します。trainingOptions の名前と値の引数 'DispatchInBackground' を使用して事前取得読み取りを指定します。事前取得読み取りには、Parallel Computing Toolbox™ が必要です。

  • randomPatchExtractionDatastore は、本質的にパッチ抽出をサポートします。一方、CombinedDatastore からパッチを抽出するには、イメージをトリミングしてパッチにする独自の関数を定義し、関数 transform を使用してトリミング操作を適用しなければなりません。

  • randomPatchExtractionDatastore は、1 つのテスト イメージから複数のイメージ パッチを生成できます。一対多のパッチ抽出では、使用可能な学習データの量が実質的に増加します。

ボリューム データの前処理

深層学習では、データの前処理と拡張が必要になることがよくあります。たとえば、イメージの強度の正規化、イメージのコントラストの強調、またはランダムなアフィン変換の追加による過適合の防止が必要な場合があります。

ボリューム データを前処理するには、関数 transform を使用します。transform は、カスタム関数に定義した一連の演算に従って、"基になるデータストア" と呼ばれるデータストアによって読み取られたデータを変換し、基になるデータストアの変更された形式を作成します。Image Processing Toolbox™ には、ボリューム入力を受け入れるいくつかの関数が用意されています。関数の完全なリストについては、3 次元ボリューム イメージの処理を参照してください。多次元配列で機能する MATLAB® の関数を使用して、ボリューム イメージを前処理することもできます。

カスタム変換関数は、基になるデータストアの関数 read によって返される形式のデータを受け入れなければなりません。

基になるデータストア

カスタム変換関数への入力形式

ImageDatastore

カスタム変換関数への入力は、ReadSize プロパティによって異なります。

  • ReadSize が 1 の場合、変換関数は整数配列を受け入れなければなりません。配列のサイズは、ImageDatastore のイメージのタイプと整合性があります。たとえば、グレースケール イメージのサイズは m 行 n 列、トゥルーカラー イメージのサイズは m x n x 3、c 個のチャネルがあるマルチスペクトル イメージのサイズは m x n x c です。

  • ReadSize が 1 より大きい場合、変換関数はバッチの各イメージに対応するイメージ データの cell 配列を受け入れなければなりません。

詳細については、ImageDatastore の関数 read を参照してください。

PixelLabelDatastore

カスタム変換関数への入力は、ReadSize プロパティによって異なります。

  • ReadSize が 1 の場合、変換関数は categorical 行列を受け入れなければなりません。

  • ReadSize が 1 より大きい場合、変換関数は categorical 行列の cell 配列を受け入れなければなりません。

詳細については、PixelLabelDatastore の関数 read (Computer Vision Toolbox) を参照してください。

RandomPatchExtractionDatastore

カスタム変換関数への入力は、2 列の table でなければなりません。

詳細については、RandomPatchExtractionDatastore の関数 read を参照してください。

関数 transform は、ネットワークの入力サイズに一致するデータを返さなければなりません。関数 transform は一対多の観測値マッピングをサポートしていません。

RandomPatchExtractionDatastore のボリューム データにランダムなアフィン変換を適用するには、関数 transform を使用しなければなりません。このデータストアの DataAugmentation プロパティはボリューム データをサポートしていません。

イメージ データストア内のボリューム データのバッチの変換

この例では、サンプル イメージ前処理パイプラインを使用して、イメージ データストア内のボリューム データを変換する方法を示します。

MAT ファイルに保存されたボリューム イメージのセットを指定します。

filepath = fullfile(matlabroot,"toolbox","images","imdata","mristack.mat");
files = [filepath; filepath; filepath];

複数のボリューム イメージを保存するイメージ データストアを作成します。データストアの ReadSize を 1 より大きく指定します。カスタム読み取り関数 matRead を指定します。この関数は、この例のサポート関数の節で定義されています。

volDS = imageDatastore(files,"FileExtensions",".mat", ...
    "ReadSize",3,"ReadFcn",@(x) matRead(x));

ネットワークの入力サイズを指定します。

inputSize = [128 128];

サポート関数 preprocessVolumetricIMDS で定義されたカスタム前処理パイプラインを使用して、volDS のボリューム イメージを前処理します。

dsTrain = transform(volDS,@(x) preprocessVolumetricIMDS(x,inputSize));

データのバッチを読み取ります。

minibatch = read(dsTrain)
minibatch=3×1 cell array
    {128x128x21 uint8}
    {128x128x21 uint8}
    {128x128x21 uint8}

サポート関数

関数 matRead は、MAT ファイルの最初の変数からボリューム データを読み込みます。

function data = matRead(filename)
    inp = load(filename);
    f = fields(inp);
    data = inp.(f{1});
end

関数 preprocessVolumetricIMDS は、基になるイメージ データストアから読み取られたデータに対して目的の変換を実行します。イメージ データストアの読み取りサイズが 1 より大きいため、関数はイメージ データの cell 配列を受け入れなければなりません。この関数は読み取られた各イメージをループ処理し、次の前処理パイプラインに従ってデータを変換します。

  • z 軸を中心としてイメージをランダムに回転させる。

  • ボリュームのサイズをネットワークで期待されるサイズに変更する。

  • ガウス ノイズを加えたノイズを含むバージョンのイメージを作成する。

  • イメージを cell 配列で返す。

function batchOut = preprocessVolumetricIMDS(batchIn,inputSize)
 
numRows = size(batchIn,1);
batchOut = cell(numRows,1);
 
for idx = 1:numRows
    
    % Perform randomized 90 degree rotation about the z-axis
    imRotated = imrotate3(batchIn{idx,1},90*(randi(4)-1),[0 0 1]);

    % Resize the volume to the size expected by the network
    imResized = imresize(imRotated,inputSize);
    
    % Add zero-mean Gaussian noise with a normalized variance of 0.01
    imNoisy = imnoise(imResized,'gaussian',0.01);

    % Return the preprocessed data
    batchOut(idx) = {imNoisy};
    
end
end

ランダム パッチ抽出データストア内のボリューム データの変換

この例では、サンプル イメージ前処理パイプラインを使用して、ランダム パッチ抽出データストア内のボリューム データのペアを変換する方法を示します。

MAT ファイルに保存された 2 セットのボリューム イメージを指定します。各セットには、5 つのボリューム イメージが格納されています。

dir = fullfile(matlabroot,"toolbox","images","imdata","BrainMRILabeled");
filesVol1 = fullfile(dir,"images");
filesVol2 = fullfile(dir,"labels");

ボリューム イメージの各セットをイメージ データストアに保存します。カスタム読み取り関数 matRead を指定します。この関数は、この例のサポート関数の節で定義されています。既定の ReadSize である 1 を使用します。

vol1DS = imageDatastore(filesVol1,"FileExtensions",".mat","ReadFcn",@(x) matRead(x));
vol2DS = imageDatastore(filesVol2,"FileExtensions",".mat","ReadFcn",@(x) matRead(x));

ネットワークの入力サイズを指定します。

inputSize = [128 128];

2 つのデータストアから対応するパッチを抽出するランダム パッチ抽出データストアを作成します。イメージごとに 3 つのパッチを選択します。

patchVolDS = randomPatchExtractionDatastore(vol1DS,vol2DS,inputSize,"PatchesPerImage",3);

サポート関数 preprocessVolumetricPatchDS で定義されたカスタム前処理パイプラインを使用して、patchVolDS のボリューム イメージを前処理します。

dsTrain = transform(patchVolDS,@(x) preprocessVolumetricPatchDS(x));

データのバッチを読み取ります。

minibatch = read(dsTrain)
minibatch=15×2 table
         InputImage            ResponseImage   
    ____________________    ___________________

    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}

サポート関数

関数 matRead は、MAT ファイルの最初の変数からボリューム データを読み込みます。

function data = matRead(filename)
    inp = load(filename);
    f = fields(inp);
    data = inp.(f{1});
end

関数 preprocessVolumetricPatchDS は、基になるランダム パッチ抽出データストアから読み取られたデータに対して目的の変換を実行します。この関数は table を受け入れなければなりません。この関数は次の前処理パイプラインに従ってデータを変換します。

  • 5 つの拡張のいずれかをランダムに選択する。

  • table の両方の列のデータに同じ拡張を適用する。

  • 拡張されたイメージ ペアを table で返す。

function batchOut = preprocessVolumetricPatchDS(batchIn)

numRows = size(batchIn,1); 
batchOut = batchIn;

% 5 augmentations: nil,rot90,fliplr,flipud,rot90(fliplr)
augType = {@(x) x,@rot90,@fliplr,@flipud,@(x) rot90(fliplr(x))};

for idx = 1:numRows

    img = batchIn{idx,1}{1};
    resp = batchIn{idx,2}{1};
    
    rndIdx = randi(5,1);
    imgAug = augType{rndIdx}(img);
    respAug = augType{rndIdx}(resp);
    
    batchOut(idx,:) = {imgAug,respAug};

end
end

参考

(Deep Learning Toolbox) | | (Computer Vision Toolbox) | |

関連する例

詳細