主要内容

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

この例では3次元医用画像から脳腫瘍のセマンティックセグメンテーションを実行する方法を説明します。

セマンティックセグメンテーションでは,イメージの各ピクセルまたは3次元ボリュームのボクセルにクラスでラベル付けします。この例では3次元U-Net深層学習ネットワークを使用して,磁気共鳴法(MRI)スキャンで脳腫瘍のバイナリセマンティックセグメンテーションを実行する方法を説明します。U-Netは,セマンティックセグメンテーションの分野で一般的になった高速かつ高効率でシンプルなネットワークです[1]。

医用画像のセグメンテーションの課題の1つとして,3次元ボリュームの格納と処理に必要なメモリの量があります。GPUリソースの制約があるため,全入力ボリュームでネットワークに学習させてセグメンテーションを実行することは現実的ではありません。この例では,学習用およびセグメンテーション用にイメージを小さなパッチ(ブロック)に分割することで問題を解決します。

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

この例では,事前学習済みの3次元U-Netアーキテクチャを使用して脳腫瘍のセグメンテーションを実行する方法,および一連のテストイメージを使用してネットワーク性能を評価する方法を説明します。オプションとして,小崽子デ,タセット[2]を使用して3次元U-Netに学習させることもできます。

事前学習済みの3次元U-Netを使用した脳腫瘍のセグメンテションの実行

事前学習済みの3次元U-Netのダウンロド

事前学習済みの3次元U-Netをという変数にダウンロ,ドします。

dataDir = fullfile(tempdir,“小鬼”);如果~存在(dataDir“dir”mkdir (dataDir);结束trained3DUnetURL =“//www.tianjin-qmedu.com/万博1manbetxsupportfiles/”+...“视觉/数据/ brainTumor3DUNetValid.mat”;downloadTrainedNetwork (trained3DUnetURL dataDir);负载(dataDir + filesep +“brainTumor3DUNetValid.mat”);

BraTSサンプルデ,タのダウンロ,ド

補助関数downloadBraTSSampleTestDataを使用して5つのサンプルテストボリュームとそれらに対応する小鬼データセットのラベルをダウンロードします[3.]。この補助関数は,この例にサポ,トファ,ルとして添付されています。サンプルデータを使用すると,データセット全体をダウンロードすることなく,テストデータに対してセグメンテーションを実行できます。

downloadBraTSSampleTestData (dataDir);

いずれかのボリュ,ムサンプルをピクセルラベルのグラウンドトゥル,スとともに読み込みます。

testDir = dataDir+filesep+“sampleBraTSTestSetValid”;data = load(fullfile(testDir)“imagesTest”“BraTS446.mat”));标签= load(fullfile(testDir)“labelsTest”“BraTS446.mat”));volTest = data.cropVol;volTestLabels = labels.cropLabel;

セマンティックセグメンテ,ションの実行

この例では,オバラップタル手法を使用して大きなボリュムを処理します。オバラップタル手法では,オバラップしているブロックを選択し,関数semanticseg(计算机视觉工具箱)を使用して各ブロックのラベルを予測してから,ブロックを再度組み合わせてセグメント化された完全なテストボリュームにします。この手法を使用すると,メモリリソースが限られているGPUで効率のよい処理を行うことができます。また,この手法を使用すると,ニュ,ラルネットワ,クの畳み込みの有効な部分[5]を使用して境界ア,ティファクトを減らすことができます。

オバラップタル手法を実装するには,ボリュムデタをblockedImage(图像处理工具箱)オブジェクトとして保存し,関数应用(图像处理工具箱)を使用してブロックを処理します。

前のセクションでダウンロ,ドしたサンプルボリュ,ム用のblockedImageオブジェクトを作成します。

bim = blockedImage(volTest);

関数应用は,blockedImage内の各ブロックに対してカスタム関数を実行します。各ブロックに対して実行する関数として,semanticsegBlockを定義します。

semanticsegBlock = @(bstruct)semanticseg(bstruct. data,net);

ネットワクの出力サズとして,ブロックのサズを指定します。オ、バ、ラップするブロックを作成するには、非ゼロの境界サ、ズを指定します。この例では,ブロックと境界を合わせたサイズがネットワークの入力サイズと等しくなるように境界サイズを指定します。

networkInputSize = net.Layers(1).InputSize;networkOutputSize = net.Layers(end).OutputSize;blockSize = [networkOutputSize(1:3) networkInputSize(end)];(networkInputSize(1:3) - blockSize(1:3))/2;

blockedImage应用を使用し,部分ブロックのパディングを真正的に設定した状態で,セマンティックセグメンテ,ションを実行します。ボリュ,ムデ,タに複数のモダリティが含まれているため,既定のパディング手法である“复制”が適しています。メモリリソースが限られているGPUでメモリ不足エラーが発生するのを防ぐため,バッチサイズを1として指定します。ただし,GPUに十分なメモリがある場合は,ブロックサイズを増やすことで処理速度を上げることができます。

batchSize = 1;结果= apply(bim,...semanticsegBlock,...BlockSize = BlockSize,...BorderSize = BorderSize,...PadPartialBlocks = true,...BatchSize = BatchSize);predictedLabels = results.Source;

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

zID = size(volTest,3)/2;zSliceGT = labeloverlay(volTest(:,:,zID),volTestLabels(:,:,zID));zSlicePred = labeloverlay(volTest(:,:,zID),predictedLabels(:,:,zID));figure montage({zsliceegt,zSlicePred},Size=[1 2],BorderSize=5) title(标签地面真相(左)vs网络预测(右)

图中包含一个轴对象。标题为“地面真相”(左)和“网络预测”(右)的坐标轴对象包含一个图像类型的对象。

次のメジは,いずれかのボリュムの全体にわたってスラスを逐次的に表示した結果を示しています。左側はラベル付きのグラウンドトゥル,ス,右側はネットワ,ク予測です。

3次元U-Netの学習

この例のこの部分では,3次元U-Netに学習させる方法を示します。学習デ,タセットのダウンロ,ドやネットワ,クの学習を行わない場合は,この例のネットワ,ク性能の評価のセクションに進んでください。

BraTSデ,タセットのダウンロ,ド

この例では,小崽子デ,タセット[2]を使用します。小鬼データセットには,脳腫瘍,すなわち最も一般的な原発性悪性脳腫瘍である神経膠腫のMRIスキャンが格納されています。デ:

BraTSデ,タをダウンロ,ドするには,医疗细分十项全能のWebサイトに移動し,[下载数据]リンクをクリックします。“Task01_BrainTumour.tarファイル[3.]をダウンロ,ドします。変数imageDirで指定されたディレクトリにtarファescルを解凍します。正常に解凍されると,imageDirにはimagesTrimagesTs,およびlabelsTrという3Task01_BrainTumourという名前のディレクトリが含まれます。

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

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

より効率的に3次元U-Netネットワクに学習させるには,補助関数preprocessBraTSDatasetを使用してmriデ,タを前処理します。この関数は,この例にサポ,トファ,ルとして添付されています。この補助関数は以下の操作を実行します。

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

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

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

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

sourceDataLoc = dataDir+filesep+“Task01_BrainTumour”;preprocessDataLoc = dataDir+filesep+“preprocessedDataset”;preprocessBraTSDataset (preprocessDataLoc sourceDataLoc);

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

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

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

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

lblLoc = fullfile(preprocessDataLoc,“labelsTr”);classNames = [“背景”“肿瘤”];pixelLabelID = [0 1];pxds = pixelLabelDatastore(lblLoc,classNames,pixelLabelID,...FileExtensions =“.mat”ReadFcn = @matRead);

グラウンドトゥルースイメージおよび対応するピクセルラベルデータからランダムパッチを抽出するrandomPatchExtractionDatastore(图像处理工具箱)を作成します。パッチサ▪▪ズとして132 × 132 × 132ボクセルを指定します。”PatchesPerImage”を指定して,学習中にボリュームとラベルの各ペアからランダムに配置された16個のパッチを抽出します。ミニバッチサesc escズとして8を指定します。

patchSize = [132 132 132];patchPerImage = 16;miniBatchSize = 8;patchds = randompatchextracactiondatastore (volds,pxds,patchSize,...PatchesPerImage = patchPerImage);patchds。MiniBatchSize = MiniBatchSize;

検証メジとピクセルラベルデタからパッチを抽出するrandomPatchExtractionDatastoreを作成します。検証データを使用して,ネットワークが継続的に学習しているか,時間の経過に伴って適合不足や過適合が発生していないかを評価できます。

volLocVal = fullfile(preprocessDataLoc,“imagesVal”);voldsVal = imageDatastore(volLocVal,FileExtensions=“.mat”...ReadFcn = @matRead);lblLocVal = fullfile(preprocessDataLoc,“labelsVal”);pxdsVal = pixelLabelDatastore(lblLocVal,classNames,pixelLabelID,...FileExtensions =“.mat”ReadFcn = @matRead);dsVal = randompatchextracactiondatastore (voldsVal,pxdsVal,patchSize,...PatchesPerImage = patchPerImage);dsVal。MiniBatchSize = MiniBatchSize;

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

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

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

numChannels = 4;inputPatchSize = [patchSize numChannels];numClasses = 2;[lgraph,outPatchSize] = unet3dLayers(inputPatchSize,...numClasses ConvolutionPadding =“有效的”);

関数变换を,補助関数augmentAndCrop3dPatchによって指定されたカスタム前処理演算と共に使用して,学習デ,タと検証デ,タを拡張します。この関数は,この例にサポ,トファ,ルとして添付されています。関数augmentAndCrop3dPatchは以下の操作を実行します。

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

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

dsTrain = transform(补丁,...@ (patchIn) augmentAndCrop3dPatch (patchIn outPatchSize,“培训”));dsVal =变换(dsVal,...@ (patchIn) augmentAndCrop3dPatch (patchIn outPatchSize,“确认”));

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

outputLayer = dicePixelClassificationLayer(Name=“输出”);lgraph =替换层(lgraph,“Segmentation-Layer”, outputLayer);

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

inputLayer = image3dInputLayer(inputPatchSize,...归一化=“没有”、名称=“ImageInputLayer”);lgraph =替换层(lgraph,“ImageInputLayer”, inputLayer);

または,“ディプネットワクデザナ”アプリを使用して3次元U-Netネットワクを変更できます。

deepNetworkDesigner (lgraph)

学習オプションの指定

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

选项= trainingOptions(“亚当”...MaxEpochs = 50,...InitialLearnRate = 5的军医,...LearnRateSchedule =“分段”...LearnRateDropPeriod = 5,...LearnRateDropFactor = 0.95,...ValidationData = dsVal,...ValidationFrequency = 400,...情节=“训练进步”...Verbose = false,...MiniBatchSize = MiniBatchSize);

ネットワ,クの学習

この例では既定で,ダウンロ,ドした事前学習済みの3次元U-Netネットワ,クを使用します。この事前学習済みのネットワークを使用することで,学習の完了を待たずにセマンティックセグメンテーションを実行してセグメンテーションの結果を評価できます。

ネットワ,クに学習させるには,次のコ,ドで変数doTraining真正的に設定します。関数trainNetworkを使用してネットワ,クを学習させます。

Gpuが利用できる場合,Gpuで学習を行います。GPUを使用するには,并行计算工具箱™,およびCUDA®対応のNVIDIA GPU®が必要です。詳細にいては,Gpu計算の要件(并行计算工具箱)を参照してください。学習には4つのNVIDIA™泰坦Xp GPUを使用したマルチGPUシステムで約30時間を要します。ご使用のgpuハ,ドウェアによっては,さらに長い時間がかかる可能性もあります。

doTraining =如果doTraining [net,info] = trainNetwork(dsTrain,lgraph,options);modelDateTime = string(datetime(“现在”格式=“yyyy-MM-dd-HH-mm-ss”));保存(“trained3DUNet——”+ modelDateTime +“.mat”“净”);结束

ネットワ,ク性能の評価

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

useFullTestSet =如果useFullTestSet volLocTest = fullfile(preprocessDataLoc,“imagesTest”);lblLocTest = fullfile(preprocessDataLoc,“labelsTest”);其他的volLocTest = fullfile(testDir,“imagesTest”);lblLocTest = fullfile(testDir,“labelsTest”);结束

変数voldsTestは、グラウンドトゥル、ステスト、メ、ジを格納します。変数pxdsTestは,グラウンドトゥル,スラベルを格納します。

voldsTest = imageDatastore(volLocTest,FileExtensions=“.mat”...ReadFcn = @matRead);pxdsTest = pixelLabelDatastore(lblLocTest,classNames,pixelLabelID,...FileExtensions =“.mat”ReadFcn = @matRead);

各テストボリュムにいて,関数应用(图像处理工具箱)を使用して各ブロックを処理します。関数应用は,この例の終わりで定義されている補助関数calculateBlockMetricsによって指定された演算を実行します。関数calculateBlockMetricsは,各ブロックのセマンティックセグメンテーションを実行し,予測ラベルとグラウンドトゥルースラベルの混同行列を計算します。

imageIdx = 1;datasetConfMat = table;hasdata (voldsTest)读取卷和标签数据vol = read(voldsTest);volLabels = read(pxdsTest);为卷和标签数据创建blockedImagetestVolume = blockedImage(vol);testLabels = blockedImage(volLabels{1});计算块指标blockConfMatOneImage = apply(testVolume,...@(块,labeledBlock)...calculateBlockMetrics(块、labeledBlock网),...ExtraImages = testLabels,...PadPartialBlocks = true,...BlockSize = BlockSize,...BorderSize = BorderSize,...UseParallel = false);读取一个图像的所有块结果,并更新图像号blockConfMatOneImageDS = blockkedimagedatastore (blockConfMatOneImage);blockConfMat = readall(blockConfMatOneImageDS);blockConfMat = struct2table([blockConfMat{:}]);blockConfMat。ImageNumber = imageIdx.*ones(height(blockConfMat),1);datasetConfMat = [datasetConfMat;blockConfMat];imageIdx = imageIdx + 1;结束

関数evaluateSemanticSegmentation(计算机视觉工具箱)を使用して,セグメンテ,ションのデ,タセットメトリクスとブロックメトリクスを評価します。

[metrics,blockMetrics] = evaluateSemanticSegmentation(...datasetConfMat,一会,指标=“所有”);
评估语义分割结果---------------------------------------- *选择的指标:全局精度,类精度,IoU,加权IoU。*处理5张图像。*完成……完成了。*数据集指标:GlobalAccuracy MeanAccuracy MeanIoU WeightedIoU  ______________ ____________ _______ ___________ 0.99902 0.97955 0.95978 0.99808

各メジにいて計算されたジャッカドスコアを表示します。

metrics.ImageMetrics.MeanIoU
ans =5×10.9613 0.9570 0.9551 0.9656 0.9594

サポ,ト関数

補助関数calculateBlockMetricsは,ブロックのセマンティックセグメンテーションを実行し,予測ラベルとグラウンドトゥルースラベルの混同行列を計算します。この関数は,ブロックに関する混同行列とメタデタが格納されたフィルドをも構造体を返します。この構造体と関数evaluateSemanticSegmentationを使用することで,メトリクスを計算してブロック単位で結果を集約できます。

函数blockMetrics = calculateBlockMetrics(bstruct,gtBlockLabels,net)%分段块predBlockLabels = semanticseg(bstruct.Data,net);从gtBlockLabels中删除边界区域blockStart = bstruct。BorderSize + 1;blockEnd = blockStart + block。BlockSize - 1;gtBlockLabels = gtBlockLabels(...blockStart (1): blockEnd (1),...blockStart (2): blockEnd (2),...blockStart (3): blockEnd (3));根据实际情况评估分割结果。confusimat = segmentationconfusimatrix (predBlockLabels,gtBlockLabels);% blockMetrics是一个结构与混淆矩阵,图像数,%和块信息。blockMetrics。ConfusionMatrix = confusionMat;blockMetrics。ImageNumber = bstruct.ImageNumber;blockInfo。Start = bstruct.Start;blockInfo。End = bstruct.End;blockMetrics。BlockInfo = BlockInfo;结束

参考文献

[1] Çiçek, Ö。,A. Abdulkadir, S. S. Lienkamp, T. Brox, and O. Ronneberger. "3D U-Net: Learning Dense Volumetric Segmentation from Sparse Annotation." In医学图像计算和计算机辅助干预国际会议记录- MICCAI 2016.希腊雅典,2016年10月,第424-432页。

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

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

BraTSデ,タセットは,Cc-by-sa 4.0のラaapl .センスに基づき医疗细分十项全能によって提供されます。一切の保証および表明を行いません。詳細はラ@ @センスを参照してください。MathWorks®は,この例のBraTSサンプルデ,タのダウンロ,ドのセクションにリンクが示されているデ,タセットを変更しています。変更されたサンプルデータセットは主に脳と腫瘍を含む領域に合わせてトリミングされており,各チャネルは平均を減算し,トリミングされた脳の領域の標準偏差で除算することにより,個別に正規化されています。

[4]苏德,C. H.,李伟文,T.韦考特伦,S.乌尔瑟林和M. J.卡多佐。“广义骰子重叠作为高度不平衡分割的深度学习损失函数。”医学图像分析中的深度学习和临床决策支持的多模态学习:第三届国际研讨会万博1manbetx.加拿大魁北克市,2017年9月,第240-248页。

[5]罗内伯格,O. P.费舍尔和T.布罗克斯。U-Net:用于生物医学图像分割的卷积网络在医学图像计算与计算机辅助干预国际会议论文集- MICCAI 2015.德国慕尼黑,2015年10月,第234-241页。arXiv:1505.04597。

参考

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

関連するトピック