Main Content

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

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

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

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

ボリューム イメージ データを ImageDatastore に読み取ります。ボリューム ピクセル ラベル データを PixelLabelDatastore (Computer Vision 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 (Image Processing Toolbox) を参照してください。

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

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

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

  • 関数 dicomreadVolume (Image Processing Toolbox) を使用して、スタディの 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 (Image Processing Toolbox) を参照してください。

イメージとラベル データの関連付け

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

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

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

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

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

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

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

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

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

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

例:イメージ データストア内のボリューム データの変換

次のサンプル コードでは、関数 preprocessVolumetricIMDS に定義されている任意の前処理パイプラインを使用して、イメージ データストア volds 内のボリューム データを変換する方法を説明します。この例では voldsReadSize が 1 より大きいと仮定しています。

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

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

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

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

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

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

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

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

    % Return the preprocessed data
    dataOut(idx) = dataNoisy;
    
end
end

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

次のサンプル コードでは、関数 preprocessVolumetricPatchDS に定義されている任意の前処理パイプラインを使用して、ランダム パッチ抽出データストア volds 内のボリューム データを変換する方法を説明します。この例では voldsReadSize が 1 であると仮定しています。

dsTrain = transform(volds,@preprocessVolumetricPatchDS);

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

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

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

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

function dataOut = preprocessVolumetricPatchDS(data)

img = data(1);
resp = data(2);

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

rndIdx = randi(5,1);
imgOut = augType{rndIdx}(img);
respOut = augType{rndIdx}(resp);

% Return the preprocessed data
dataOut = table(imgOut,respOut};

end

参考

| | (Computer Vision Toolbox) | (Image Processing Toolbox) |

関連する例

詳細