主要内容

使用深度学习的3-D脑肿瘤分割

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

语义分割涉及使用类别在3-D卷的图像或体素中标记每个像素。该实施例说明了使用深度学习方法在磁共振成像(MRI)扫描中进行脑肿瘤的二元语义分割。在该二进制分割中,每个像素标记为肿瘤或背景。

本例使用三维U-Net架构进行脑肿瘤分割[1].U-Net是一种快速、高效、简单的语义分词网络,目前在语义分词领域非常流行。

医学图像分割的一个挑战是存储和处理3-D卷所需的内存量。由于GPU资源约束,培训完整输入卷上的网络是不切实际的。此示例通过培训在图像补丁上培训网络来解决问题。该示例使用重叠块策略将测试补丁拼接到完整的分段测试卷中。该示例通过使用神经网络中的卷积的有效部分来避免边框伪影[5].

医学图像分割的第二个挑战是数据中的类不平衡,当使用传统的交叉熵损失时,会妨碍训练。此示例通过使用加权多类骰子损失函数来解决此问题[4].对类进行加权有助于抵消较大区域对Dice分数的影响,使网络更容易学习如何分割较小的区域。

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

本例使用BraTS数据集[2].BraTS数据集包含脑肿瘤的MRI扫描,即神经胶质瘤,这是最常见的原发性脑恶性肿瘤。数据文件大小为~ 7gb。如果您不想下载BraTS数据集,那么直接到下载预训练网络和样本测试集在这个例子中的部分。

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

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

要下载BraTS数据,请到医学分割十项全能,然后点击“下载资料”链接。下载Task01_BrainTumour.tar文件[3.].将TAR文件解压到指定的目录中我是多变的。解压缩时,我是将包含一个名为的目录Task01_脑瘤它有三个子目录:imagesTr影像学家,Labelstr.

数据集包含750 4-D卷,每个卷表示堆栈的3-D图像。每个4-D体积的尺寸为240×240×155×4,其中前三个尺寸对应于3-D体积图像的高度,宽度和深度。第四尺寸对应于不同的扫描模态。数据集分为484训练卷,具有体素标签和266个测试卷,测试卷没有标签,因此此示例不使用测试数据。相反,该示例将484训练卷拆分为三个独立集,用于培训,验证和测试。

预处理培训和验证数据

为了更有效地训练三维U-Net网络,利用辅助功能对MRI数据进行预处理预处理数据集.此函数附加到示例作为支持文件。金宝app

辅助功能执行这些操作:

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

  • 通过减去切割大脑区域的平均值并除以标准偏差,独立地对每个体积的每个形态进行标准化。

  • 将484个训练卷分解为400个训练、29个验证和55个测试集。

预处理数据大约需要30分钟才能完成。

sourceDataLoc = [imageDir filesep .'task01_braintumour'];preprocessDataLoc = fullfile (tempdir,“小子们”“预处理数据集”);preprocessBraTSdataset (preprocessDataLoc sourceDataLoc);

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

使用随机补丁提取数据存储将训练数据提供给网络,并验证训练进度。该数据存储从地面真实图像和相应的像素标签数据中提取随机补丁。修补是一种常见的技术,用于防止在使用任意大容量进行训练时内存耗尽。

创建一个图像数据存储存储三维图像数据。由于MAT文件格式是非标准图像格式,因此必须使用MAT文件读取器才能读取图像数据。可以使用帮助器MAT文件读取器,matRead.此函数附加到示例作为支持文件。金宝app

volReader = @(x) matRead(x);volLoc = fullfile (preprocessDataLoc,“imagesTr”);volds = imageDatastore (volLoc,......“文件扩展名”“.mat”“ReadFcn”,volreader);

创建一个像素标签数据库(计算机视觉工具箱)存储标签。

lblLoc=fullfile(预处理数据LOC,“labelsTr”);一会= [“背景”“肿瘤”];pixelLabelID = [0 1];pixelLabelID pxds = pixelLabelDatastore (lblLoc,一会,......“文件扩展名”“.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;

创建一个随机抽取数据存储(图像处理工具箱)包含训练图像和像素标签数据的。指定132×132×132体素的面片大小。指定“PatchesPerImage”在培训期间从每对卷和标签中提取16个随机定位的修补程序。指定最小批量大小为8。

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

按照相同的步骤创建随机抽取数据存储包含验证图像和像素标签数据的。您可以使用验证数据评估网络是否随着时间的推移而不断学习、拟合不足或拟合过度。

volLocVal = fullfile (preprocessDataLoc,“imagesVal”); voldsVal=图像数据存储(volLocVal,......“文件扩展名”“.mat”“ReadFcn”,volReader);lblLocVal=fullfile(预处理数据loc,“labelsVal”);pixelLabelID pxdsVal = pixelLabelDatastore (lblLocVal,一会,......“文件扩展名”“.mat”“ReadFcn”,volreader);dsval = RandompatchExtractionDataStore(Voldsval,PXDSVal,PatchSize,......“PatchesPerImage”, patchPerImage);dsVal。MiniBatchSize = MiniBatchSize;

设置三维U形网图层

本例使用3d U-Net网络[1].在U-Net中,最初的卷积层序列被最大池化层点缀,依次降低了输入图像的分辨率。这些层之后是一系列卷积层,点缀上采样算子,依次增加输入图像的分辨率。在每个ReLU层之前引入了批处理规格化层。U- net这个名字来源于这样一个事实:这个网络可以被画成一个像字母U一样的对称形状。

属性创建默认的3-D U-Net网络不平衡(计算机视觉工具箱)函数。指定两个类分段。还指定了有效的卷积填充,以避免使用重叠磁化策略进行边框工件以预测测试卷。

NumChannel=4;inputPatchSize=[patchSize NumChannel];NumClass=2;[lgraph,outPatchSize]=unet3dLayers(inputPatchSize,NumClass,“卷积填充”“有效”);

方法来增加训练和验证数据转变具有由helper函数指定的自定义预处理操作的函数增强和Crop3dPatch.此函数附加到示例作为支持文件。金宝app

增强和Crop3dPatch函数执行这些操作:

  1. 随机旋转和反射训练数据,使训练更具鲁棒性。该函数不旋转或反映验证数据。

  2. 裁剪响应面片到网络的输出大小,44×44×44体素。

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

为了更好地分割较小的肿瘤区域并减少较大背景区域的影响,本例使用dicePixelClassificationLayer(计算机视觉工具箱).用骰子像素分类层替换像素分类层。

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

数据已在中标准化预处理培训和验证数据本例的第节。中的数据规范化image3dInputLayer是不必要的,因此将输入层替换为没有数据规范化的输入层。

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

或者,您也可以使用Deep Learning Toolbox中的Deep network Designer应用程序修改三维U-Net网络™.

绘制更新的3-D U-Net网络的图表。

分析(LGROPH)

指定培训选项

使用亚当优化解算器。使用trainingOptions函数。初始学习率设置为5E-4,并在训练跨度逐渐减少。你可以试验MiniBatchSize属性,该属性基于您的GPU内存。为了最大限度地提高GPU内存利用率,最好选择大输入补丁而不是大批量。请注意,批量规范化层对于较小的MiniBatchSize.根据初始学习速率调整初始学习速率MiniBatchSize

选择= trainingOptions (“亚当”......'maxepochs', 50岁,......“InitialLearnRate”,5e-4,......“LearnRateSchedule”'分段'......'学习ropperiod'5.......“LearnRateDropFactor”, 0.95,......“ValidationData”dsVal,......'验证职业', 400,......“阴谋”'培训 - 进步'......“冗长”,错误的,......“MiniBatchSize”, miniBatchSize);

下载预训练网络和样本测试集

从BraTS数据集中下载预训练版本的3-D U-Net和五个样本测试卷及其相应标签[3.].预先训练的模型和示例数据使您可以在测试数据上执行分段,而无需下载完整数据集或等待网络培训。

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);

列车网络的

默认情况下,该示例加载预训练的3-D U-Net网络。预训练的网络使您可以在不等待训练完成的情况下运行整个示例。

要训练网络,设置doTraining变量为真的.使用trainNetwork函数。

如果GPU可用,在GPU上训练。使用GPU需要并行计算工具箱™ 以及支持CUDA®的NVIDIA®GPU。有关更多信息,请参阅GPU版金宝app本支持(并行计算工具箱).在配备4个NVIDIA的多GPU系统上进行培训大约需要30小时™ Titan Xp GPU,可能需要更长的时间,具体取决于您的GPU硬件。

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

执行测试数据的分割

强烈建议使用GPU对图像进行语义分割(需要并行计算工具箱™)。

选择测试数据的来源,其中包含地面真值卷和测试标签。如果你保留有用的标题以下代码中的变量为,则示例使用五个卷进行测试有用的标题变量来真的,然后示例使用从完整数据集中选择的55个测试图像。

useFullTestSet=false;如果useFullTestSet-volLocTest=fullfile(预处理数据位置,“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=图像数据存储(volLocTest,......“文件扩展名”“.mat”“ReadFcn”,volreader);pxdstest = pixellabeldataStore(lblloctest,classnames,pixellabelid,......“文件扩展名”“.mat”“ReadFcn”,volreader);

使用重叠平铺策略预测每个测试卷的标签。每个测试卷被填充,使输入大小为网络输出大小的倍数,并补偿有效卷积的影响。重叠平铺算法选择重叠补丁,通过使用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)-mod(volSize,outPatchSize(1:3)));volPaddedPre = padarray (padSizePre卷{id},“对称”“以前”); volPadded=padarray(volPaddedPre、padSizePost、,“对称”“职位”); [heightPad,widthPad,depthPad,~]=尺寸(填充);[高度、宽度、深度,~]=大小(vol{id});tempSeg=分类(零([高度、宽度、深度],'uint8'),[0, 1],类名);批量分割的%重叠策略策略。K = 1:分类(3):DepthPad-InneedPatchsize(3)+1j=1:outPatchSize(2):widthPad inputPatchSize(2)+1i = 1:outpatchsize(1):高度Pad-InneedPatchsize(1)+1 Patch = Volpadded(I:i + InputPatchsize(1)-1,......j: + inputPatchSize (2) 1,......k:k+inputPatchSize(3)-1,:);patchSeg=语义seg(patch,net);tempSeg(i:i+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;结束

比较地面真实与网络预测

选择一幅测试图像来评估语义分割的准确性。从4-D体积数据中提取第一个模态,并将这个3-D体积存储在变量中vol3d

volid = 1;Vol3d = Vol {volid}(::::,1);

沿深度方向以蒙太奇方式显示地面真实和预测标签的中心切片。

zID =大小(vol3d, 3) / 2;zSliceGT = labeloverlay (vol3d (:,:, zID) groundTruthLabels {volId} (:,:, zID));zSlicePred = labeloverlay (vol3d (:,:, zID) predictedLabels {volId} (:,:, zID));图蒙太奇({zSliceGT, zSlicePred},“尺寸”,[1 2],“边界大小”,5)头衔(“标记地面真相(左)vs.网络预测(右)”

使用以下命令显示标有“音量”的地面实况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.标签可视性(1)=0;

该图像显示了在一个卷上顺序显示切片的结果。标记的地面真理在左边,网络预测在右边。

量化分割精度

使用掷骰子(图像处理工具箱)函数。该函数计算预测和地面真值分割之间的Dice相似系数。

diceResult=0(长度(voldsTest.Files),2);j = 1:长度(vol)diceresult(j,:)=骰子(proundtruthlabels {j},predigedlabels {j});结束

计算一组测试卷的平均骰子分数。

meanDiceBackground =意味着(diceResult (: 1));disp ([“平均骰子得分的背景”,num2str(j),......‘测试卷’,num2str(meandicebackground)])意思是dicetumor =平均值(diceresult(:,2));disp ([“整个肿瘤的平均骰子分数”,num2str(j),......‘测试卷’num2str (meanDiceTumor)])

该图显示了一个箱线图(统计学和机器学习工具箱)这将可视化五个样本测试卷集合中骰子分数的统计信息。图中的红线显示类的骰子中值。蓝色框的上限和下限分别表示第25个和第75个百分位。黑胡子延伸到最极端的数据点,不考虑异常值。

如果你有统计和机器学习工具箱™, 然后你可以使用箱线图函数可视化关于所有测试卷的Dice分数的统计数据。创建一个箱线图,设置createBoxplot变量为真的

createBoxplot = false;如果createBoxplot图boxplot(结果)标题(“测试骰子精度”) 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和K. H. Maier-Hein。“脑肿瘤分割和辐射瘤生存预测:对2017年挑战的贡献。”在BrainLes会议录:国际MICCAI脑损伤研讨会加拿大魁北克市,2017年9月,第287-297页。

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

BraTS数据集由医学细分十项全能提供4.0使用许可证。拒绝所有保证和声明;详细信息请参见license。属性中链接的数据集已被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。

另请参阅

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

相关话题