最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。
ボリューム イメージ データでサポートされるファイル形式には、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 ファイルの詳細は、 |
pxds = pixelLabelDatastore(filepath,classNames,pixelLabelID, ... 'FileExtensions','.dcm','ReadFcn',@(x) dicomread(x)); DICOM ファイルの詳細は、 |
複数のファイルの DICOM ボリューム | 次の手順に従って DICOM ファイルのコレクションから
これらの手順の例は、複数ファイルの DICOM ボリュームの読み取りを参照してください。 | 次の手順に従って DICOM ファイルのコレクションから
これらの手順の例は、複数ファイルの DICOM ボリュームの読み取りを参照してください。 |
NIfTI | volds = imageDatastore(filepath, ... 'FileExtensions','.nii','ReadFcn',@(x) niftiread(x)); NIfTI ファイル形式の詳細は、 | pxds = pixelLabelDatastore(filepath,classNames,pixelLabelID, ... 'FileExtensions','.nii','ReadFcn',@(x) niftiread(x)); NIfTI ファイル形式の詳細は、 |
.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 ファイルへのイメージ データの格納方法に応じて、カスタム読み取り関数をカスタマイズします。
この例では、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
の名前と値のペアの引数 '
を使用して、並列学習またはマルチ GPU 学習を指定します。ExecutionEnvironment
'trainingOptions
の名前と値のペアの引数 '
を使用して事前取得読み取りを指定します。事前取得読み取りには、Parallel Computing Toolbox™ が必要です。DispatchInBackground
'
randomPatchExtractionDatastore
は、本質的にパッチ抽出をサポートします。一方、CombinedDatastore
からパッチを抽出するには、イメージをトリミングしてパッチにする独自の関数を定義し、関数 transform
を使用してトリミング操作を適用しなければなりません。
randomPatchExtractionDatastore
は、1 つのテスト イメージから複数のイメージ パッチを生成できます。一対多のパッチ抽出では、使用可能な学習データの量が実質的に増加します。
深層学習では、データの前処理と拡張が必要になることがよくあります。たとえば、イメージの強度の正規化、イメージのコントラストの強調、またはランダムなアフィン変換の追加による過適合の防止が必要な場合があります。
ボリューム データを前処理するには、関数 transform
を使用します。transform
は、カスタム関数に定義した一連の演算に従って、"基になるデータストア" と呼ばれるデータストアによって読み取られたデータを変換し、基になるデータストアの変更された形式を作成します。Image Processing Toolbox™ には、ボリューム入力を受け入れるいくつかの関数が用意されています。関数の完全なリストについては、3 次元ボリューム イメージの処理 (Image Processing Toolbox)を参照してください。多次元配列で機能する MATLAB® の関数を使用して、ボリューム イメージを前処理することもできます。
カスタム変換関数は、基になるデータストアの関数 read
によって返される形式のデータを受け入れなければなりません。
基になるデータストア | カスタム変換関数への入力形式 |
---|---|
ImageDatastore | カスタム変換関数への入力は、
詳細は、 |
PixelLabelDatastore | カスタム変換関数への入力は、
詳細は、 |
randomPatchExtractionDatastore | カスタム変換関数への入力は、2 列の table でなければなりません。 詳細は、 |
RandomPatchExtractionDatastore
はボリューム データの DataAugmentation
プロパティをサポートしていません。ボリューム データにランダムなアフィン変換を適用するには、transform
を使用しなければなりません。
関数 transform
は、ネットワークの入力サイズに一致するデータを返さなければなりません。関数 transform
は一対多の観測値マッピングをサポートしていません。
次のサンプル コードでは、関数 preprocessVolumetricIMDS
に定義されている任意の前処理パイプラインを使用して、イメージ データストア volds
内のボリューム データを変換する方法を説明します。この例では volds
の ReadSize
が 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
内のボリューム データを変換する方法を説明します。この例では volds
の ReadSize
が 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
imageDatastore
| trainNetwork
| transform
| pixelLabelDatastore
(Computer Vision Toolbox) | randomPatchExtractionDatastore
(Image Processing Toolbox)