主要内容

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

深層学習を使用した脳腫瘍の 3.次元セグメンテーション

この例では3次元U-Netニューラルネットワークに学習させて,3次元医用画像から脳腫瘍のセマンティックセグメンテーションを実行する方法を説明します。この例では3次元U-Netネットワークに学習させる方法を示し,さらに事前学習済みのネットワークも示します。3.次元セマンティック セグメンテーションには、Compute Capability 3.0 以上の CUDA 対応 NVIDIA™ GPU を使用することを強く推奨します (Parallel Computing Toolbox™ が必要)。

はじめに

セマンティック セグメンテーションでは、イメージの各ピクセルまたは 3.次元ボリュームのボクセルにクラスでラベル付けします。この例では、深層学習の各種方法を使用して、磁共振成像スキャンで脳腫瘍のバイナリ セマンティック セグメンテーションを実行する方法を説明します。このバイナリ セグメンテーションでは、各ピクセルを腫瘍または背景としてラベル付けします。

この例では、3.次元 U网アーキテクチャ [1.]を使用して,脳腫瘍のセグメンテーションを実行します。U-Netは,セマンティックセグメンテーションの分野で一般的になった高速かつ高効率でシンプルなネットワークです。

医用画像のセグメンテーションの課題の 1.つとして、3.次元ボリュームの格納と処理に必要なメモリの量があります。GPUリソースの制約があるため、全入力ボリュームでネットワークに学習させることは現実的ではありません。この例では、イメージ パッチでネットワークに学習させることによって問題を解決します。この例で使用するオーバーラップタイル手法では、テスト パッチをつなぎ合わせてセグメント化された完全なテスト ボリュームにします。この例では、ニューラル ネットワークでの畳み込みの有効な部分を使用して、境界アーティファクトを回避します [5.]。

医用画像のセグメンテーションのもう 1.つの課題として、データにクラスの不均衡があり、従来の交差エントロピー損失の使用時に学習の妨げになることがあります。この例では、重み付きマルチクラス 掷骰子損失関数 [4.] を使用して、問題を解決します。クラスへの重み付けは、掷骰子スコアに対する大きな領域の影響を無効にするのに役立ち、ネットワークがより小さい領域をセグメント化する方法を学習するのを容易にします。

学習データ,検証データ,テストデータのダウンロード

この例では、小鬼データセット [2.] を使用します。小鬼データセットには、脳腫瘍、すなわち最も一般的な原発性悪性脳腫瘍である神経膠腫の 磁共振成像スキャンが格納されています。データ ファイルのサイズは~ 7 GBです。小鬼データセットをダウンロードしない場合、この例の事前学習済みのネットワークとサンプルテストセットのダウンロードの節に進みます。

小鬼データセットを格納するディレクトリを作成します。

imageDir=fullfile(tempdir,“小子们”);如果~exist(imageDir,“dir”mkdir (imageDir);结束

小鬼データをダウンロードするには、医学分割十项全能のWebサイトに移動し,[下载数据]リンクをクリックします。“Task01_BrainTumour.tarファイル[3.] をダウンロードします。変数imageDirで指定されたディレクトリに焦油ファイルを解凍します。正常に解凍されると,imageDirにはimagesTrimagesTs,およびlabelsTrという3つのサブカテゴリがあるTask01_脑瘤という名前のディレクトリが含まれます。

データセットには 750個の 4.次元ボリュームが格納されており、それぞれが 3.次元イメージのスタックを表します。各 4.次元ボリュームのサイズは 240 x 240 x 155 x 4であり、最初の 3.つの次元は 3.次元ボリューム イメージの高さ、幅、奥行に対応します。4.番目の次元は異なるスキャン モダリティに対応します。データセットはボクセル ラベルを含む 484個の学習ボリュームおよび 266個のテスト ボリュームに分割されています。テスト ボリュームにはラベルがないため、この例ではテスト データを使用しません。代わりに、この例では 484個の学習ボリュームを、学習、検証、およびテストに使用される 3.つの個別のセットに分割します。

学習データと検証データの前処理

より効率的に 3.次元 U网ネットワークに学習させるには、補助関数preprocessBraTSdatasetを使用して 磁共振成像データを前処理します。この関数は、この例にサポート ファイルとして添付されています。

この補助関数は以下の操作を実行します。

  • 主に脳と腫瘍を含む領域に合わせてデータをトリミングします。データをトリミングすると,各MRIボリュームの最も重要な部分とそれに対応するラベルを維持しながら,データのサイズが小さくなります。

  • 平均を減算し、トリミングされた脳の領域の標準偏差で除算することにより、各ボリュームの各モダリティを個別に正規化します。

  • 484年個の学習ボリュームを400個の学習セット,29日個の検証セット,および55個のテストセットに分割します。

データの前処理は,完了するのに約30分かかることがあります。

sourceDataLoc=[imageDir filesep“任务01_脑瘤”];preprocessDataLoc=fullfile(tempdir,“小子们”,“preprocessedDataset”);预校准数据集(预校准数据LOC,源数据LOC);

学習および検証用のランダム パッチ抽出データストアの作成

ランダムパッチ抽出データストアを使用して,ネットワークに学習データを供給し,学習の進行状況を検証します。このデータストアは,グラウンドトゥルースイメージと対応するピクセルラベルデータからランダムパッチを抽出します。パッチは,任意の大きさのボリュームでの学習時にメモリ不足を防ぐための一般的な手法です。

imageDatastoreを作成して 3.次元イメージ データを格納します。垫子ファイル形式は非標準イメージ形式であるため、イメージ データを読み取るために 垫子ファイル リーダーを使用しなければなりません。補助 垫子ファイル リーダー马特雷德を使用できます。この関数は,この例にサポートファイルとして添付されています。

volReader=@(x)matRead(x);volLoc=fullfile(preprocessDataLoc,“imagesTr”);volds = imageDatastore (volLoc,...“FileExtensions”,“.mat”,“ReadFcn”, volReader);

ラベルを保存するpixelLabelDatastore(计算机视觉工具箱)を作成します。

lblLoc = fullfile (preprocessDataLoc,“labelsTr”);一会= [“背景”,“肿瘤”];pixelLabelID=[0 1];pxds=pixelLabelDatastore(lblLoc,类名,pixelLabelID,...“FileExtensions”,“.mat”,“ReadFcn”, volReader);

1.つのイメージ ボリュームとラベルをプレビューします。関数labelvolshow(图像处理工具箱)を使用して,ラベル付きボリュームを表示します。背景ラベルの可視性(1.) を0に設定して,背景を完全に透明にします。

体积=预览(volds);标签=预览(pxds);viewPnl = uipanel(图,“标题”,“标记训练卷”);hPred = labelvolshow(标签、体积(:,:,:1),“父”,viewPnl,...“LabelColor”,[0 0 0;1 0 0]);hPred.LabelVisibility (1) = 0;

学習イメージとピクセルラベルデータを格納する随机抽取数据存储(图像处理工具箱)を作成します。パッチ サイズとして 132 x 132 x 132ボクセルを指定します。“PatchesPerImage”を指定して、学習中にボリュームとラベルの各ペアからランダムに配置された 16個のパッチを抽出します。ミニバッチ サイズとして 8.を指定します。

patchSize=[132];patchPerImage=16;miniBatchSize=8;patchds=randomPatchExtractionDatastore(volds、pxds、patchSize、,...“PatchesPerImage”,patchPerImage);patchds.MiniBatchSize=MiniBatchSize;

同じ手順に従って、検証イメージとピクセル ラベル データを格納する随机抽取数据存储を作成します。検証データを使用して、ネットワークが継続的に学習しているか、時間の経過に伴って適合不足や過適合が発生していないかを評価できます。

volLocVal = fullfile (preprocessDataLoc,“imagesVal”);voldsVal=图像数据存储(volLocVal,...“FileExtensions”,“.mat”,“ReadFcn”, volReader);lblLocVal = fullfile (preprocessDataLoc,“labelsVal”);pixelLabelID pxdsVal = pixelLabelDatastore (lblLocVal,一会,...“FileExtensions”,“.mat”,“ReadFcn”, volReader);dsVal = randomPatchExtractionDatastore (voldsVal pxdsVal patchSize,...“PatchesPerImage”,patchPerImage);dsVal.MiniBatchSize=MiniBatchSize;

関数变换を,補助関数增强和Crop3dPatchによって指定されたカスタム前処理演算と共に使用して、学習データと検証データを拡張します。この関数は、この例にサポート ファイルとして添付されています。

関数增强和Crop3dPatchは以下の操作を実行します。

  1. 学習データをランダムに回転および反転させて、学習をさらにロバストにする。この関数では検証データの回転または反転は行われません。

  2. 応答パッチをトリミングし、ネットワークの出力サイズを 44 x 44 x 44ボクセルにする。

数据源=“培训”;dsTrain =变换(patchds @ (patchIn) augmentAndCrop3dPatch (patchIn数据源));数据源=“验证”;dsVal=transform(dsVal,@(patchIn)augmentAndCrop3dPatch(patchIn,dataSource));

3次元U-Net層のセットアップ

この例では3次元U-Netネットワーク[1.]を使用します。U-Netでは,最初の一連の畳み込み層に最大プーリング層が点在し,入力イメージの解像度を逐次下げていきます。これらの層に,一連の畳み込み層が続き,その中にアップサンプリング演算処理が点在し,入力イメージの解像度を逐次上げていきます。バッチ正規化層は各ReLU層の前に作成されます。U-Netの名前は,このネットワークが文字“U”のように対称の形状で描けることに由来しています。

関数unetLayers(计算机视觉工具箱)を使用して,既定の3次元U-Netネットワークを作成します。2クラスセグメンテーションを指定します。また,有効な畳み込みパディングを指定して,テストボリュームの予測にオーバーラップタイル手法を使用する際に境界アーティファクトを回避します。

inputPatchSize=[132 4];NumClass=2;[lgraph,outPatchSize]=unet3dLayers(inputPatchSize,NumClass,“ConvolutionPadding”,“有效”);

小さい腫瘍領域をより適切にセグメント化して大きい背景領域の影響を軽減するため、この例ではdicePixelClassificationLayer(计算机视觉工具箱)を使用します。ピクセル分類層を 掷骰子ピクセル分類層に置き換えます。

outputLayer=dicePixelClassificationLayer(“姓名”,“输出”);lgraph=替换层(lgraph,“分割层”, outputLayer);

この例の学習データと検証データの前処理の節で既にデータが正規化されています。image3dInputLayerでのデータ正規化は不要なため,入力層をデータ正規化が行われない入力層に置き換えます。

inputLayer = image3dInputLayer (inputPatchSize,“正常化”,“没有”,“姓名”,“ImageInputLayer”);lgraph=替换层(lgraph,“ImageInputLayer”, inputLayer);

または,深度学习工具箱™のディープネットワークデザイナーアプリを使用して3次元U-Netネットワークを変更できます。

更新された3次元U-Netネットワークのグラフをプロットします。

分析网络(lgraph)

学習オプションの指定

亚当最適化ソルバーを使用してネットワークに学習させます。関数trainingOptionsを使用してハイパーパラメーター設定を指定します。学習率の初期値は 5e-4に設定されており、学習が進むにつれて徐々に減少します。GPUメモリに基づいてMiniBatchSizeプロパティを試すことができます。GPUメモリを最大限に活用するには,バッチサイズを大きくすることより入力パッチを大きくすることを優先します。MiniBatchSizeの値が小さい場合、バッチ正規化層の効果が小さくなることに注意してください。MiniBatchSizeに基づいて初期学習率を微調整します。

选择= trainingOptions (“亚当”,...“MaxEpochs”, 50岁,...“InitialLearnRate”5的军医,...“LearnRateSchedule”,“分段”,...“LearnRateDropPeriod”5,...“LearnRateDropFactor”,0.95,...“ValidationData”dsVal,...“ValidationFrequency”, 400,...“情节”,“培训进度”,...“冗长”假的,...“MiniBatchSize”,小批量);

事前学習済みのネットワークとサンプルテストセットのダウンロード

オプションで,事前学習済みバージョンの3次元U-Netと5つのサンプルテストボリューム,さらにこれらに対応する小鬼データセットのラベル[3.] をダウンロードします。事前学習済みのモデルとサンプル データを使用すると、データセット全体をダウンロードしたりネットワークが学習するのを待機したりすることなく、テスト データに対してセグメンテーションを実行できます。

培训3调谐url='//www.tatmou.com/金宝appsupportfiles/vision/data/brainTumor3DUNetValid.mat';sampleData_url ='//www.tatmou.com/金宝appsupportfiles/vision/data/sampleBraTSTestSetValid.tar.gz';imageDir=fullfile(tempdir,“小子们”);如果~exist(imageDir,“dir”mkdir (imageDir);结束downloadTrained3DUnetSampleData (trained3DUnet_url sampleData_url imageDir);
正在下载BraTS数据集的预训练三维U-Net。这将需要几分钟时间下载…完成。正在下载BraTS测试数据集示例。这将需要几分钟时间下载并解压缩…完成。

ネットワークの学習

学習オプションとデータソースを構成した後,関数trainNetworkを使用して3次元U-Netネットワークに学習させます。ネットワークに学習させるには,次のコードで変数溺爱真正的に設定します。学習には、计算能力3.0以上の 库达対応 英伟达™ GPUを使用することを強く推奨します。

次のコードで変数溺爱假的のままにしておくと、この例は事前学習済みの 3.次元 U网ネットワークを返します。

メモ:4つのNVIDIA™泰坦Xp GPUを使用したマルチGPUシステムでの学習には約30時間を要します。ご使用のGPUハードウェアによっては,さらに長い時間がかかる可能性もあります。

doTraining = false;如果doTraining model datetime=datestr(现在,“dd-mmm-yyy-HH-MM-SS”);(网络,信息)= trainNetwork (dsTrain、lgraph选项);保存([“trained3DUNetValid -”模型日期时间“-时代-”num2str(options.MaxEpochs)“.mat”],“净”);其他的inputPatchSize=[132 132 4];outPatchSize=[44 44 2];加载(完整文件(imageDir,“trained3DUNet”,“brainTumor3DUNetValid.mat”));结束

これで、U网を使用して、脳腫瘍を意味ごとにセグメント化できます。

テスト データのセグメンテーションの実行

イメージ ボリュームのセマンティック セグメンテーションを実行するには、GPUを使用することを強く推奨します (并行计算工具箱)™ が必要)。

テスト用のグラウンドトゥルースボリュームおよびラベルを含むテストデータのソースを選択します。次のコードで変数useFullTestSet假的のままにしておくと、この例ではテスト用のボリュームが 5.つ使用されます。変数useFullTestSet真正的に設定すると,この例ではデータセット全体から選択された55個のテストイメージが使用されます。

useFullTestSet = false;如果useFullTestSet-volLocTest=fullfile(预处理数据位置,“imagesTest”); lblLocTest=fullfile(预处理数据位置,“标签测试”);其他的volLocTest = fullfile (imageDir,“sampleBraTSTestSetValid”,“imagesTest”);lblLocTest = fullfile (imageDir,“sampleBraTSTestSetValid”,“标签测试”);一会= [“背景”,“肿瘤”];pixelLabelID = [0 1];结束

変数voldsTestは,グラウンドトゥルーステストイメージを格納します。変数PXD测试は,グラウンドトゥルースラベルを格納します。

volReader = @(x) matRead(x);voldsTest = imageDatastore (volLocTest,...“FileExtensions”,“.mat”,“ReadFcn”,volReader);pXDTest=像素标签数据存储(lblLocTest、类名、像素标签ID、,...“FileExtensions”,“.mat”,“ReadFcn”, volReader);

オーバーラップタイル手法を使用して,各テストボリュームのラベルを予測します。入力サイズがネットワークの出力サイズの倍数になるように各テストボリュームがパディングされて,有効な畳み込みの影響を補正します。オーバーラップタイルアルゴリズムでは,オーバーラップパッチを選択し,関数语义词组(计算机视觉工具箱)を使用して各パッチのラベルを予測して、パッチを再度組み合わせます。

id=1;hasdata(卷测试)显示([“正在处理测试卷”num2str (id)]);tempGroundTruth =阅读(pxdsTest);groundTruthLabels {id} = tempGroundTruth {1};{id} =阅读卷(voldsTest);%对测试图像使用反射填充。%避免填充不同的模式。volSize=size(vol{id},(1:3));padSizePre=(inputPatchSize(1:3)-outPatchSize(1:3))/2;padSizePost=(inputPatchSize(1:3)-outPatchSize(1:3))/2+(outPatchSize(1:3)-mod(volSize,outPatchSize(1:3));volPaddedPre=padarray(vol{id},padSizePre,“对称”,“pre”);volPadded = padarray (volPaddedPre padSizePost,“对称”,“职位”);[heightPad,widthPad,depthPad,~]=大小(volPadded);[height,width,depth,~]=大小(vol{id});tempSeg=分类(零([height,width,depth]),“uint8”),[0, 1],类名);%卷分割的重叠平铺策略。对于k=1:outPatchSize(3):depthPad inputPatchSize(3)+1对于j=1:outPatchSize(2):widthPad inputPatchSize(2)+1对于i = 1:outPatchSize(1):heightPad-inputPatchSize(1)+1 patch = volpads (i:i+inputPatchSize(1)-1,...j: + inputPatchSize (2) 1,...凯西:k + inputPatchSize (3) 1:);patchSeg = semanticseg(补丁,净);tempSeg(我+ outPatchSize (1) 1...j:j+outPatchSize(2)-1,...k:k+outPatchSize(3)-1)=patchSeg;结束结束结束裁掉额外的填充区域。tempSeg = tempSeg(1:身高、1:宽度、1:深度);%保存预测的体积结果。predictedLabels {id} = tempSeg;id = id + 1;结束
处理测试卷1处理测试卷2处理测试卷3处理测试卷4处理测试卷5

グラウンドトゥルースとネットワークの予測の比較

いずれかのテストイメージを選択して,セマンティックセグメンテーションの精度を評価します。4.次元ボリューム データから最初のモダリティを抽出し、この 3 次元ボリューム データを変数vol3dに格納します。

volId = 1;vol3d = {volId}卷(::,:,1);

モンタージュに,グラウンドトゥルースラベルおよび予測されたラベルの中心スライスを奥行方向に沿って表示します。

zID=尺寸(vol3d,3)/2;zSliceGT=labeloverlay(vol3d(:,:,zID),GroundtruthletLabels{volId}(:,:,zID));zSlicePred=labeloverlay(vol3d(:,:,zID),预测标签{volId}(,:,zID));图形蒙太奇({zSliceGT,zSlicePred},“尺寸”(1 - 2),“BorderSize”5)标题(“标记的地面真相(左)与网络预测(右)”对比)

関数labelvolshow(图像处理工具箱)を使用して、グラウンド トゥルース ラベル付きボリュームを表示します。背景ラベルの可視性 (1.) を0に設定して,背景を完全に透明にします。腫瘍は脳組織の内部にあるため,腫瘍を見られるように脳のボクセルを一部透明にします。脳のボクセルを一部透明にするには,ボリュームのしきい値を[0,1]の範囲の数値として指定します。このしきい値を下回るすべての正規化ボリューム強度は,完全に透明になります。この例では,脳の内部にある腫瘍の空間的な位置を確認できるように脳のピクセルの一部を表示されたままにするために,ボリュームのしきい値を1未満に設定します。

viewPnlTruth=uipanel(图,“标题”,“地面真相标记卷”);hTruth=labelvolshow(groundTruthLabels{volId},vol3d,“父”,viewPnlTruth,...“LabelColor”,[0 0 0;1 0 0],“VolumeThreshold”hTruth.LabelVisibility(1)=0;

同じボリュームについて、予測ラベルを表示します。

viewPnlPred=uipanel(图,“标题”,“预测标记体积”);hPred=labelvolshow(predictedLabels{volId},vol3d,“父”viewPnlPred,...“LabelColor”,[0 0 0;1 0 0],“VolumeThreshold”, 0.68);

hPred.LabelVisibility (1) = 0;

このイメージは、一方のボリューム全体のスライスを逐次的に表示した結果を示します。左側はラベル付きのグラウンド トゥルース、右側はネットワーク予測です。

セグメンテーションの精度の定量化

関数骰子(图像处理工具箱)を使用してセグメンテーション精度を測定します。この関数は、予測セグメンテーションとグラウンド トゥルース セグメンテーションの 掷骰子類似度係数を計算します。

diceResult = 0(长度(voldsTest.Files), 2);对于j=1:length(vol)diceResult(j,:)=dice(groundTruthLabels{j},predictedLabels{j});结束

テスト ボリュームのセットの平均 掷骰子スコアを計算します。

meansdicebackground=平均值(diceResult(:,1));disp([“背景的平均骰子分数”num2str (j),...' test volumes = 'num2str (meanDiceBackground)])
5个测试卷的平均骰子得分= 0.9993
平均值=平均值(结果(:,2));显示([“整个肿瘤的平均骰子分数”num2str (j),...' test volumes = ',num2str(平均肿瘤)])
5个测试体积中肿瘤的平均骰子分数=0.9585

次の図は、5.つのサンプル テスト ボリュームのセットの 掷骰子スコアに関する統計量を可視化する箱线图(统计和机器学习工具箱)を示します。プロットの赤い線は、クラスの 掷骰子値の中央値を示します。青いボックスの上下の境界はそれぞれ、25番目の百分位数と 75番目の百分位数を示します。黒いひげは、外れ値とは見なされない最も極端なデータ点まで延びます。

统计和机器学习工具箱™ がある場合、関数箱线图を使用してすべてのテスト ボリュームの 掷骰子スコアに関する統計量を可視化できます。箱线图を作成するには,次のコードで変数createBoxplot真正的に設定します。

createBoxplot = false;如果createBoxplot图形boxplot(dicerresult) title(“测试集骰子精度”)Xticklabel(类名)ylabel(“骰子系数”)结束

参考文献

[1] çiçek,Ö,A.Abdulkadir,S.S.Lienkamp,T.Brox和O.Ronneberger.“3D U-Net:从稀疏注释学习密集体积分割”,摘自国际医学图像计算和计算机辅助干预会议论文集- MICCAI 2016希腊雅典,2016年10月,第424-432页。

Isensee, F., P. Kickingereder, W. Wick, M. Bendszus, K. H. Maier-Hein。脑肿瘤分割和放射组学生存预测:对BRATS 2017挑战的贡献在BrainLes会议录:国际MICCAI脑损伤研讨会.加拿大魁北克市,2017年9月,第287-297页。

[3] “脑瘤”。十项全能。http://medicaldecathlon.com/

小鬼データセットは、CC-BY-SA 4.0のライセンスに基づき 医学十项全能によって提供されます。一切の保証および表明を行いません。詳細はライセンスを参照してください。MathWorks®は、この例の事前学習済みのネットワークとサンプルテストセットのダウンロードの節にリンクのあるデータセットに変更を加えています。変更されたサンプル データセットは主に脳と腫瘍を含む領域に合わせてトリミングされており、各チャネルは平均を減算し、トリミングされた脳の領域の標準偏差で除算することにより、個別に正規化されています。

苏德雷,c.h., W. Li, T. Vercauteren, S. Ourselin, M. J. Cardoso。“广义骰子重叠作为高度不平衡分割的深度学习损失函数。”医学图像分析深度学习和临床决策支持的多模式学习:第三届国际研讨会金宝app加拿大魁北克市,2017年9月,第240-248页。

[5] U-Net:生物医学图像分割的卷积网络〉,载于国际医学图像计算与计算机辅助干预会议论文集- MICCAI 2015德国慕尼黑,2015年10月,第234-241页。可从arXiv获得:1505.04597。

参考

||||(计算机视觉工具箱)|(计算机视觉工具箱)|(计算机视觉工具箱)|(图像处理工具箱)

関連するトピック