主要内容

三维大脑肿瘤分割使用深度学习

这个例子展示了如何训练3 d U-Net神经网络和执行语义分割三维医学图像的脑瘤。

语义分割包括标记图像的每个像素或体素的三维体积与一个类。这个例子演示了使用深度学习的方法来执行二进制语义分割脑部肿瘤的磁共振成像(MRI)扫描。在这个二元分割,每个像素标记为肿瘤或背景。

这个例子执行大脑肿瘤分割使用3 d U-Net架构(1]。U-Net是一个快速、高效和简单的网络,在语义细分领域中已变得很流行。

医学图像分割的一个挑战是所需的内存来存储和处理3 d卷。训练一个网络完整的输入量由于GPU资源约束是不切实际的。这个例子解决问题通过训练网络的图像补丁。示例使用一个overlap-tile策略针测试补丁成一个完整的分割测试卷。示例部分通过使用有效的避免了边界构件的卷积神经网络(5]。

医学图像分割是类的第二个挑战失衡阻碍了培训的数据在使用传统的交叉熵的损失。这个例子解决问题通过使用加权多级骰子损失函数(4]。加权类有助于对抗骰子点数较大区域的影响,使网络更容易学会段较小的地区。

下载培训、验证和测试数据

下面的例子使用了有钱的数据集(2]。小鬼数据集包含了脑部肿瘤的MRI扫描,即神经胶质瘤,这是最常见的原发性脑恶性肿瘤。数据文件的大小~ 7 GB。如果你不想下载的后代的数据集,然后直接下载Pretrained网络和测试集样本在这个例子中部分。

创建一个目录来存储小鬼数据集。

imageDir = fullfile (tempdir,“小鬼”);如果~存在(imageDir“dir”mkdir (imageDir);结束

下载的后代数据,去医学分割十项全能网站,点击“下载数据”链接。下载“Task01_BrainTumour。焦油”文件(3]。解压TAR文件到指定的目录imageDir变量。当成功解压缩,imageDir将包含一个目录命名Task01_BrainTumour这有三个子目录:imagesTr,imagesTs,labelsTr

数据集包含750个4 - d卷,每个代表一个堆栈的3 d图像。每个4 d卷大小240 -了- 240 - 155 - 4,在前三个维度对应高度,宽度和深度的三维体积的形象。第四维对应于不同的扫描方式。484数据集分为训练与体元标签和266个测试卷,卷测试卷没有标签,这样这个示例不使用测试数据。相反,这个例子将484训练卷分为三个独立集用于培训、验证和测试。

预处理训练和验证数据

训练3 d U-Net网络更有效率,预处理MRI数据使用helper函数preprocessBraTSdataset。这个函数是附加到例子作为支持文件。金宝app

helper函数执行这些操作:

  • 农作物数据包含一个区域主要是大脑和肿瘤。裁剪数据减少了数据的大小,同时保留最关键的部分每个MRI体积及其相应的标签。

  • 正常化每个独立形态的体积减去均值和除以标准差剪裁的大脑区域。

  • 把484培训卷到400年,29日验证和55测试集。

预处理的数据可能需要30分钟才能完成。

sourceDataLoc = [imageDir filesep“Task01_BrainTumour”];preprocessDataLoc = fullfile (tempdir,“小鬼”,“preprocessedDataset”);preprocessBraTSdataset (preprocessDataLoc sourceDataLoc);

创建随机补丁提取数据存储的培训和验证

使用一块随机抽取数据存储提要训练数据网络和验证培训的进展。这个数据存储从地面实况图像和相应的像素提取随机补丁标签数据。修补是一种常见的技术来防止内存耗尽时训练和任意大卷。

创建一个imageDatastore存储3 d图像数据。因为MAT-file格式是一个非标准的图像格式,您必须使用一个MAT-file读者使读取图像数据。您可以使用辅助MAT-file读者,matRead。这个函数是附加到例子作为支持文件。金宝app

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

创建一个pixelLabelDatastore(计算机视觉工具箱)存储标签。

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

预览一个图像体积和标签。显示标签卷使用labelvolshow(图像处理工具箱)函数。把背景设置可见性完全透明的背景标签(1)0

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

创建一个randomPatchExtractionDatastore(图像处理工具箱)包含训练图像和像素标签数据。指定一个补丁的大小132 - - 132 - 132像素点。指定“PatchesPerImage”提取16从每组随机定位补丁的数量和标签在训练。指定一个mini-batch大小8。

patchSize = (132 132 132);patchPerImage = 16;miniBatchSize = 8;patchds = randomPatchExtractionDatastore (volds pxds patchSize,“PatchesPerImage”,patchPerImage);patchds。MiniBatchSize = MiniBatchSize;

按照相同的步骤创建一个randomPatchExtractionDatastore包含验证图像和像素标签数据。您可以使用验证数据来评估是否网络不断学习,随着时间的推移underfitting或过度拟合。

volLocVal = fullfile (preprocessDataLoc,“imagesVal”);voldsVal = imageDatastore (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;

建立三维U-Net层

下面的例子使用了3 d U-Net网络(1]。U-Net,最初的一系列卷积层点缀着麦克斯池层,先后降低输入图像的分辨率。这些层是紧随其后的是一系列的卷积层点缀着upsampling运营商,先后增加输入图像的分辨率。一批标准化层之前介绍过的每个ReLU层。U-Net名称来自这样一个事实:网络可以用一个对称的形状像字母U。

创建一个默认的3 d U-Net网络使用unetLayers(计算机视觉工具箱)函数。指定两个类分割。也指定有效的卷积填充,以避免边界构件在使用测试的overlap-tile战略预测卷。

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

增加使用的培训和验证数据变换函数与自定义的helper函数指定的预处理操作augmentAndCrop3dPatch。这个函数是附加到例子作为支持文件。金宝app

augmentAndCrop3dPatch函数执行这些操作:

  1. 随机旋转和反映训练数据训练更健壮。这个函数不旋转或反映验证数据。

  2. 作物响应补丁的输出大小网络,44-by-44-by-44体素。

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

更好的段小肿瘤区域和减少大背景的影响区域,本例中使用dicePixelClassificationLayer(计算机视觉工具箱)。替换像素分类层与骰子像素分类层。

outputLayer = dicePixelClassificationLayer (“名字”,“输出”);lgraph = replaceLayer (lgraph,“Segmentation-Layer”,outputLayer);

数据已经规范化预处理训练和验证数据这个例子。数据归一化image3dInputLayer是不必要的,所以输入层替换为一个输入层,没有规范化的数据。

inputLayer = image3dInputLayer (inputPatchSize,“归一化”,“没有”,“名字”,“ImageInputLayer”);lgraph = replaceLayer (lgraph,“ImageInputLayer”,inputLayer);

或者,您可以修改3 d U-Net网络通过使用深度网络设计师从深度学习工具箱™应用程序。

情节的图像更新的3 d U-Net网络。

analyzeNetwork (lgraph)

指定培训选项

列车网络使用亚当优化求解。指定hyperparameter设置使用trainingOptions函数。最初的学习速率设置为5,张成的空间逐渐减少的军医培训。你可以尝试MiniBatchSize财产基于GPU内存。GPU内存利用率最大化,有利于大输入补丁在大型批量大小。注意,批量标准化层更有效更小的值MiniBatchSize。优化初始学习速率的基础上MiniBatchSize

选择= trainingOptions (“亚当”,“MaxEpochs”,50岁,“InitialLearnRate”5的军医,“LearnRateSchedule”,“分段”,“LearnRateDropPeriod”5,“LearnRateDropFactor”,0.95,“ValidationData”dsVal,“ValidationFrequency”,400,“阴谋”,“训练进步”,“详细”假的,“MiniBatchSize”,miniBatchSize);

下载Pretrained网络和测试集样本

下载一个pretrained版本的3 d U-Net和五个样本测试卷和相应的标签从有钱的数据集3]。pretrained模型和样本数据使您能够执行分割测试数据没有下载完整的数据集或等待网络培训。

trained3DUnet_url =“//www.tatmou.com/金宝appsupportfiles/vision/data/brainTumor3DUNetValid.mat”;sampleData_url =“//www.tatmou.com/金宝appsupportfiles/vision/data/sampleBraTSTestSetValid.tar.gz”;imageDir = fullfile (tempdir,“小鬼”);如果~存在(imageDir“dir”mkdir (imageDir);结束downloadTrained3DUnetSampleData (trained3DUnet_url sampleData_url imageDir);

列车网络的

默认情况下,这个示例加载pretrained 3 d U-Net网络。pretrained网络使您能够运行整个示例没有等待培训完成。

训练网络,设置doTraining变量在下面的代码真正的。火车模型使用trainNetwork函数。

火车在GPU如果一个是可用的。使用GPU需要并行计算工具箱™和CUDA NVIDIA GPU®®启用。有关更多信息,请参见GPU的金宝app支持版本(并行计算工具箱)。培训大约需要30小时multi-GPU系统4英伟达™泰坦Xp GPU和可以更长时间取决于你的GPU硬件。

doTraining = false;如果doTraining modelDateTime =字符串(datetime (“现在”,“格式”,“yyyy-MM-dd-HH-mm-ss”));(网络,信息)= trainNetwork (dsTrain、lgraph选项);保存(strcat (“trained3DUNet——”modelDateTime,“时代——”num2str (options.MaxEpochs),“.mat”),“净”);其他的inputPatchSize = (132 132 132 4);outPatchSize = [44 44 44 2];负载(fullfile (imageDir“trained3DUNet”,“brainTumor3DUNetValid.mat”));结束

执行分割测试数据

GPU强烈建议执行语义分割图像的卷(需要并行计算工具箱™)。

选择测试数据的来源包含地面实况卷和标签进行测试。如果你保持useFullTestSet变量在下面的代码,那么示例使用五卷进行测试。如果你设置useFullTestSet变量来真正的,然后55例使用测试图片选自完整的数据集。

useFullTestSet = false;如果useFullTestSet volLocTest = fullfile (preprocessDataLoc,“imagesTest”);lblLocTest = fullfile (preprocessDataLoc,“labelsTest”);其他的volLocTest = fullfile (imageDir,“sampleBraTSTestSetValid”,“imagesTest”);lblLocTest = fullfile (imageDir,“sampleBraTSTestSetValid”,“labelsTest”);一会= [“背景”,“肿瘤”];pixelLabelID = [0 1];结束

voldsTest变量存储地面实况测试图像。的pxdsTest变量存储地面真理标签。

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

使用overlap-tile策略来预测每个测试卷的标签。每个测试卷垫使输入大小的输出大小的倍数网络和补偿的影响有效的卷积。overlap-tile算法选择重叠的补丁,预测每个补丁使用的标签semanticseg(计算机视觉工具箱)函数,然后重组补丁。

id = 1;hasdata (voldsTest) disp ([处理测试卷的num2str (id)]);tempGroundTruth =阅读(pxdsTest);groundTruthLabels {id} = tempGroundTruth {1};{id} =阅读卷(voldsTest);%使用反射测试图像填充。%避免填充不同的模式。volSize =大小({id}卷,(1:3));padSizePre = (inputPatchSize (1:3) -outPatchSize (1:3)) / 2;padSizePost = (inputPatchSize (1:3) -outPatchSize (1:3)) / 2 + (outPatchSize(1:3)国防部(volSize, outPatchSize (1:3)));volPaddedPre = padarray (padSizePre卷{id},“对称”,“以前”);volPadded = padarray (volPaddedPre padSizePost,“对称”,“职位”);[heightPad, widthPad depthPad ~] =大小(volPadded);(高度、宽度、深度、~)=大小(卷{id});tempSeg =分类(0(高度、宽度、深度,“uint8”),[0,1],类名);% Overlap-tile战略细分的卷。k = 1: outPatchSize (3): depthPad-inputPatchSize (3) + 1j = 1: outPatchSize (2): widthPad-inputPatchSize (2) + 1i = 1: outPatchSize (1): heightPad-inputPatchSize(1) + 1块= volPadded(我+ inputPatchSize (1) 1j: + inputPatchSize (2) 1,凯西:k + inputPatchSize (3) 1:);patchSeg = semanticseg(补丁,净);tempSeg(我+ outPatchSize (1) 1j: + outPatchSize (2) 1,凯西:k + outPatchSize (3) 1) = patchSeg;结束结束结束%出现额外的填充区域。tempSeg = tempSeg(1:身高、1:宽度、1:深度);%保存结果预测卷。predictedLabels {id} = tempSeg;id = id + 1;结束

比较对网络预测地面实况

选择一个测试图像的语义分割评价的准确性。从4 - d体积数据中提取第一形态和存储这个3 d体积的变量vol3d

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

显示在蒙太奇中心片地面真理和预测沿深度方向标签。

zID =大小(vol3d, 3) / 2;zSliceGT = labeloverlay (vol3d (:,:, zID) groundTruthLabels {volId} (:,:, zID));zSlicePred = labeloverlay (vol3d (:,:, zID) predictedLabels {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”,0.68);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:长度(卷)diceResult (j:) =骰子(groundTruthLabels {j}, predictedLabels {j});结束

计算平均骰子点数组测试卷。

meanDiceBackground =意味着(diceResult (: 1));disp ([的平均骰子点数的背景的num2str (j),“测试卷= 'num2str (meanDiceBackground)]) meanDiceTumor =意味着(diceResult (:, 2));disp ([“肿瘤在骰子平均分数”num2str (j),“测试卷= 'num2str (meanDiceTumor)])

图显示了箱线图(统计和机器学习的工具箱)可视化数据的骰子跨组五个样本测试卷成绩。图中的红线显示骰子值中值类。蓝盒子的上、下界表明第25和第75百分位数,分别。黑色胡须扩展到最极端的数据点不被认为是离群值。

如果你有统计和机器学习的工具箱™,然后您可以使用箱线图函数可视化骰子分数的统计信息在所有您的测试卷。创建一个箱线图,设置createBoxplot变量在下面的代码真正的

createBoxplot = false;如果箱线图createBoxplot图(diceResult)标题(“测试集骰子准确性”)xticklabels(类名)ylabel (“骰子系数”)结束

引用

[1]Cicek O。,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。

[2]Isensee F。,P. Kickingereder, W. Wick, M. Bendszus, and K. H. Maier-Hein. "Brain Tumor Segmentation and Radiomics Survival Prediction: Contribution to the BRATS 2017 Challenge." In学报BrainLes:国际MICCAI Brainlesion车间。加拿大魁北克市,2017年9月,页287 - 297。

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

有钱的数据集是由医学分割下十项全能4.0使用许可证。所有的保证和陈述都否认;有关详细信息,请参阅许可。MathWorks®已经修改数据集联系在一起下载Pretrained网络和测试集样本这个例子。修改后的样本数据集已经被裁剪区域包含主要是大脑和肿瘤和每个通道已经被减去均值和规范化独立除以标准差剪裁的大脑区域。

[4]Sudre, c . H。,W. Li, T. Vercauteren, S. Ourselin, and M. J. Cardoso. "Generalised Dice Overlap as a Deep Learning Loss Function for Highly Unbalanced Segmentations."深度学习在医学图像分析和多通道学习临床决策支持:第三国际研讨会金宝app。加拿大魁北克市,2017年9月,页240 - 248。

[5]Ronneberger, O。,P. Fischer, and T. Brox. "U-Net:Convolutional Networks for Biomedical Image Segmentation." In《医学影像计算和计算机辅助介入的国际会议- MICCAI 2015。德国慕尼黑,2015年10月,页234 - 241。可以在arXiv: 1505.04597。

另请参阅

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

相关的话题