Main Content

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

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

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

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

ボリューム イメージ データを ImageDatastore に読み取ります。ボリューム ピクセル ラベル データを PixelLabelDatastore (Computer Vision Toolbox) に読み取ります。データストアを作成する場合、引数 'FileExtensions' をデータのファイル拡張子として指定します。ReadFcn プロパティを、ファイル形式のデータを読み取る関数ハンドルとして指定します。詳細については、深層学習用のデータストアを参照してください。

次の表に、サポートされる各ファイル形式のイメージ データストアまたはピクセル ラベル データストアを作成する方法を示します。引数 filepath は、イメージ データが含まれるファイルまたはフォルダーのパスを指定します。ピクセル ラベル イメージの場合、追加の引数 classNames および pixelLabelID は、ボクセル ラベル値のクラス名へのマッピングを指定します。

イメージ ファイル形式

イメージ データストアの作成

ピクセル ラベル データストアの作成

MAT

volds = imageDatastore(filepath, ...
   'FileExtensions','.mat','ReadFcn',@(x) matRead(x));
matRead は、.MAT ファイルからデータを読み取るために作成するカスタム関数です。実装のサンプルは、MAT ファイルを読み取るカスタム関数の定義を参照してください。

pxds = pixelLabelDatastore(filepath,classNames,pixelLabelID, ...
    'FileExtensions','.mat','ReadFcn',@(x) matRead(x));
matRead は、.MAT ファイルからデータを読み取るために作成するカスタム関数です。実装のサンプルは、MAT ファイルを読み取るカスタム関数の定義を参照してください。

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

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

DICOM ファイルの詳細は、dicomread (Image Processing Toolbox) を参照してください。

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

DICOM ファイルの詳細は、dicomread (Image Processing Toolbox) を参照してください。

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

次の手順に従って DICOM ファイルのコレクションから ImageDatastore を作成します。

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

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

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

  • .MAT ファイルのコレクションから ImageDatastore を作成します。

これらの手順の例は、複数ファイルの DICOM ボリュームの読み取りを参照してください。

次の手順に従って DICOM ファイルのコレクションから PixelLabelDatastore を作成します。

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

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

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

  • .MAT ファイル、クラス名、およびピクセル ラベル ID のコレクションから PixelLabelDatastore を作成します。

これらの手順の例は、複数ファイルの DICOM ボリュームの読み取りを参照してください。

NIfTI

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

NIfTI ファイル形式の詳細は、niftiread (Image Processing Toolbox) を参照してください。

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

NIfTI ファイル形式の詳細は、niftiread (Image Processing Toolbox) を参照してください。

MAT ファイルを読み取るカスタム関数の定義

.MAT ファイルからデータを読み取るには、カスタム読み取り関数を定義しなければなりません。たとえば、次のコードは、.MAT ファイルの最初の変数からボリューム データを読み込む matRead と呼ばれる関数を作成します。関数を matRead.m という名前のファイルに保存します。

function data = matRead(filename)
% data = matRead(filename) reads the image data in the MAT-file filename

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

.MAT ファイルへのイメージ データの格納方法に応じて、カスタム読み取り関数をカスタマイズします。

例:単一ファイルおよび複数ファイルの DICOM ボリュームを含むデータストアの準備

この例では、3 次元ボリュームを構成する一連の DICOM ファイルから imageDatastore または PixelLabelDatastore を作成する方法を説明します。

DICOM ファイルが含まれるディレクトリを指定します。このディレクトリに含めることができるのは、2 次元イメージ、完全な 3 次元ボリュームを含むファイル、3 次元ボリュームの 2 次元スライスを含むファイルです。データストアに含まれるのは、単一ファイルの完全な 3 次元ボリュームまたは 3 次元ボリュームの 2 次元スライスのいずれかの 3 次元データが含まれるファイルのみです。

dicomDir = fullfile(matlabroot,'toolbox','images','imdata');

関数 dicomCollection (Image Processing Toolbox) を使用して、DICOM ファイルの詳細を収集します。この関数は、各行が単一のスタディを表す table として詳細を返します。この関数は複数ファイルの DICOM ボリュームを集計して単一のスタディにします。複数ファイルの DICOM ボリュームのファイル名は、変数 Filenames の string 配列にリストされています。

collection = dicomCollection(dicomDir,'IncludeSubfolders',true)

処理された DICOM ボリュームを格納するディレクトリを作成します。

matFileDir = fullfile(tempdir,'MATFiles');
if ~exist(matFileDir,'dir')
    mkdir(matFileDir)
end

コレクションのすべてのスタディについて、分析を構成するファイル名を取得します。関数 dicomreadVolume (Image Processing Toolbox) を使用して、スタディのデータの読み取りを試します。

  • データが複数のファイルに含まれる場合、dicomreadVolume は正常に実行され、単一の 4 次元配列で完全なボリュームを返します。このボリュームは、データストアに含めることができます。

  • データが単一のファイルに含まれる場合、dicomreadVolume は正常に実行されません。この場合、関数 dicomread (Image Processing Toolbox) を使用してデータを読み取ります。

    • dicomread が 4 次元配列を返す場合、スタディには、データストアに含めることができる完全な 3 次元ボリュームが含まれます。

    • dicomread が 2 次元行列または 3 次元配列を返す場合、スタディには単一の 2 次元イメージが含まれます。この場合、データストアのイメージ データを省略し、コレクションの次のスタディに移ります。

4 次元配列で返された完全なボリュームの場合、データを .MAT ファイルに書き込みます。次の例ではさらに、DICOM ファイルの絶対ファイル名 'dicomFileName' を 2 番目の変数として書き込みます。複数ファイルの DICOM ボリュームの場合、'dicomFileName' は個々の DICOM ファイルすべての string 配列になります。

for idx = 1:numel(collection.Row)
    dicomFileName = collection.Filenames{idx};
    if length(dicomFileName) > 1
        matFileName = fileparts(dicomFileName(1));
        matFileName = split(matFileName,filesep);
        matFileName = replace(strtrim(matFileName(end))," ","_");
    else
        [~,matFileName] = fileparts(dicomFileName);
    end
    matFileName = fullfile(matFileDir,matFileName);
    
    try
        V = dicomreadVolume(collection,collection.Row{idx});
    catch ME
        V = dicomread(dicomFileName);
        if ndims(V)<4
            % Skip files that are not volumes
            continue;
        end
    end
    
    % For multi-file DICOM, dicomFileName is a string array.    
    save(matFileName,'V','dicomFileName');
    
end

ボリュームがイメージ データを表す場合、ボリュームを含む .MAT ファイルから imageDatastore を作成します。ReadFcn プロパティは、MAT ファイルを読み取るカスタム関数の定義に示す関数 matRead として指定できます。

imdsdicom = imageDatastore(matFileDir,'FileExtensions','.mat', ...
    'ReadFcn',@matReader);

ボリュームがピクセル ラベル データを表す場合、ボリュームを含む .MAT ファイルから PixelLabelDatastore を作成します。ReadFcn プロパティは、MAT ファイルを読み取るカスタム関数の定義に示す関数 matRead として指定できます。引数 classNames および pixelLabelID は、ボクセル ラベル値のクラス名へのマッピングを指定するベクトルです。

pxdsdicom = pixelLabelDatastore(matFileDir,classNames,pixelLabelID, ...
    'FileExtensions','.mat','ReadFcn',@(x) matRead(x));

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

セマンティック セグメンテーション用のボリューム イメージとラベル データ、または回帰用の 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)

関連する例

詳細