主要内容

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

这个例子展示了如何训练一个三维U网络神经网络,并从三维医学图像中对脑肿瘤进行语义分割。

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

此示例使用3-D U-Net架构执行脑肿瘤分割[1.]. U-Net是一种快速、高效、简单的网络,在语义分割领域得到了广泛的应用。

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

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

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

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

创建一个用于存储BRATS数据集的目录。

imageDir=fullfile(tempdir,'兄弟');如果~exist(imageDir,'dir')mkdir(Imagedir);结束

要下载BraTS数据,请转到医学分割十项全能并点击“下载数据”链接。下载“Task01_braintumor.tar”文件[3.].将TAR文件解压到指定的目录中我是多变的。解压缩时,我是将包含一个名为的目录task01_braintumour.有三个子目录:想象的,想象力,Labelstr..

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

预处理培训和验证数据

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

辅助功能执行这些操作:

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

  • 通过减去裁剪脑区域的标准偏差,独立地正常化每个体积的每个模态。

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

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

sourceDataLoc=[imageDir filesep'task01_braintumour']; 预处理数据loc=fullfile(tempdir,'兄弟','preprocesseddataset'); 预校准数据集(预校准数据LOC、源数据LOC);

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

使用随机补丁提取数据存储来将培训数据送到网络并验证培训进度。此数据存储区从地面真实图像和相应的像素标签数据中提取随机补丁。修补程序是一种常用的技术,以防止在具有任意大卷的训练时防止内存不足。

创建一个imageageAtastore.存储3-D图像数据。由于Mat文件格式是非标准图像格式,因此必须使用Mat文件读取器来启用读取图像数据。您可以使用助手垫文件阅读器,matRead.此函数附加到示例作为支持文件。金宝app

volReader=@(x)matRead(x);volLoc=fullfile(预处理数据loc,“imagesTr”);volds = imageDatastore (volLoc,......'fileextensions',“.mat”,“ReadFcn”,volreader);

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

lblloc = fullfile(preprocessdataloc,'labelstr');一会= [“背景”,“肿瘤”]; pixelLabelID=[01];pxds=像素标签数据存储(lblLoc、类名、像素标签ID、,......'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-by-132体素。指定'patchesperimage'在训练期间从每对卷和标签中提取16个随机定位的贴片。指定迷你批量大小为8。

补丁大小=[132];patchPerImage=16;miniBatchSize=8;patchds=随机PatchExtractionDatastore(卷、pxds、补丁大小、,......'patchesperimage', patchPerImage);patchds。MiniBatchSize = MiniBatchSize;

按照相同的步骤创建一个RandompatchExtractionDatastore.包含验证图像和像素标签数据。您可以使用验证数据来评估网络是否连续地学习,磨损或过度装箱。

volLocVal = fullfile (preprocessDataLoc,'appleval');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;

方法来增加训练和验证数据转变使用辅助功能指定的自定义预处理操作Augmentandcrop3dpatch..此函数附加到示例作为支持文件。金宝app

这个Augmentandcrop3dpatch.函数执行这些操作:

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

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

数据源='训练';dsTrain =变换(patchds @ (patchIn) augmentAndCrop3dPatch (patchIn数据源));数据源='验证';dsval = transform(dsval,@(patchin)augmentandcrop3dpatch(patchin,dataSource));

设置3-D U-Net层

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

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

InputPatchSize = [132 132 132 4];numclasses = 2;[LAPHE,OUTPATCHSIZE] = UNET3DLAYERS(InputPatchsize,NumClasses,'卷积浮雕','有效的');

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

OutputLayer = DicePixelClassificationLayer(“姓名”,“输出”);Lgraph =替换剂(LGROPE,“分割层”,输出层);

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

InputLayer = Image3DinputLayer(InputPatchSize,'正常化',“没有”,“姓名”,“ImageInputLayer”);Lgraph =替换剂(LGROPE,“ImageInputLayer”,InputLayer);

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

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

分析(LGROPH)

指定培训选项

使用培训网络亚当优化求解器。使用upperAmeter设置使用培训选项功能。初始学习率设置为5E-4,并在训练跨度逐渐减少。你可以试验MiniBatchSize基于您的GPU内存的财产。为了最大限度地提高GPU内存利用率,有利于大量批量大小的大输入贴片。请注意,批量归一化层对较小值效果较小MiniBatchSize.基于的初始学习率MiniBatchSize.

选择= trainingOptions ('亚当',......'maxepochs', 50岁,......“InitialLearnRate”,5e-4,......'shownrateschedule','分段',......'学习ropperiod',5,......“LearnRateDropFactor”, 0.95,......“ValidationData”dsVal,......'验证职业', 400,......“情节”,'培训 - 进步',......'verbose',错误的,......'minibatchsize',小批量);

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

从BR​​ATS数据集下载3-D U-NET和五个样本测试卷及其相应标签的预磨损版本[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);

列车网络

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

要训练网络,设置溺爱变量为真的.使用培训模型trainNetwork功能。

在GPU上培训如果有一个可用的。使用GPU需要并行计算工具箱™和CUDA®的NVIDIA®GPU。有关更多信息,请参阅GPU通金宝app过发布支持(并行计算工具箱).培训大约需要30个小时的多GPU系统,具有4个NVIDIA™Titan XP GPU,可以取决于您的GPU硬件。

dotraining = false;如果doTraining modelDateTime = string(datetime('现在','格式',“yyyy-mm-dd-hh-mm-ss”)); [net,info]=列车网络(数据列车,图形,选项);保存(strcat)(“受训3调谐—,modeldateTime,“-时代-”,num2str(options.MaxEpochs),“。垫”),“净”);其他的inputPatchSize=[132 4];outPatchSize=[44 2];加载(完整文件)(imageDir,“trained3DUNet”,“brainTumor3DUNetValid.mat”));结束

执行测试数据的分割

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

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

ideryltestset = false;如果有用的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)relead(x);voldstest = imagedatastore(volloctest,......'fileextensions',“.mat”,“ReadFcn”,volreader);pxdstest = pixellabeldataStore(lblloctest,classnames,pixellabelid,......'fileextensions',“.mat”,“ReadFcn”,volreader);

使用重叠块策略来预测每个测试卷的标签。每个测试卷都填充,以使输入大小为网络的输出大小的倍数,并补偿有效卷积的影响。重叠块算法选择重叠的修补程序,通过使用备份来预测每个补丁的标签语义词组(计算机视觉工具箱)功能,然后重新组合修补程序。

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},'对称',“pre”);volpadded = padarray(volpaddedpre,padsizepost,'对称','邮政');[高度Pad,WidthPad,Depostpad,〜] =大小(Volpadded);[高度,宽度,深度,〜] =大小(vol {id});tempseg =分类(零([高度,宽度,深度],'uint8'),[0, 1],类名);批量分割的%重叠策略策略。对于K = 1:分类(3):DepthPad-InneedPatchsize(3)+1对于j = 1:onpatchsize(2):widthpad-inputpatchsize(2)+1对于i = 1:outpatchsize(1):高度Pad-InneedPatchsize(1)+1 Patch = Volpadded(I:i + InputPatchsize(1)-1,......j: + inputPatchSize (2) 1,......K:K + InputPatchsize(3)-1,:);patchseg = semanticseg(补丁,网);Tempseg(I:i +分类(1)-1,......J:J +分类(2)-1,......k:k +分类(3)-1)= patchseg;结束结束结束%裁剪额外的填充区域。tempseg = tempseg(1:高度,1:宽度,1:深度);%保存预测的体积结果。predictedLabels {id} = tempSeg;id = id + 1;结束
加工试验卷1处理测试第2卷处理测试第3卷处理测试第4卷处理测试第5卷

比较地面真实与网络预测

选择一个测试图像来评估语义分割的准确性。从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)标题(“标记的地面真相(左)与网络预测(右)”对比)

使用展示标记的卷的地面真理LabelVolshow.(图像处理工具箱)功能。通过设置背景标签的可见性,使背景完全透明(1.) 到0. 因为肿瘤位于脑组织内部,所以要使一些脑体素透明,以便肿瘤可见。要使某些大脑体素透明,请将体积阈值指定为范围[0,1]内的数字。低于此阈值的所有标准化体积强度都是完全透明的。本例将体积阈值设置为小于1,以便某些大脑像素保持可见,从而为肿瘤在大脑中的空间位置提供上下文。

viewPnlTruth=uipanel(图,'标题',“地面真相标记卷”);htruth = labelvolshow(地面ruthlabels {volid},vol3d,“父”,viewPnlTruth,......“LabelColor”,[0 0 0;1 0 0],“VolumeThreshold”, 0.68);htruth.labelvisibility(1)= 0;

对于相同的卷,显示预测的标签。

viewPnlPred=uipanel(图,'标题','预计标记的卷');hpred = labelvolshow(predgedlabels {volid},vol3d,“父”,viewPnled,......“LabelColor”,[0 0 0;1 0 0],“VolumeThreshold”, 0.68);

hPred.LabelVisibility (1) = 0;

此图显示在其中一个卷上按顺序显示切片的结果。标记的地面真相在左侧,网络预测在右侧。

量化分割精度

使用该测量分割精度骰子(图像处理工具箱)功能。此函数用于计算预测和地面真实分割之间的骰子相似系数。

diceresult = zeros(长度(voldstest.files),2);对于j = 1:长度(vol)diceresult(j,:)=骰子(proundtruthlabels {j},predigedlabels {j});结束

计算测试卷集合中的平均骰子分数。

meanDiceBackground=平均值(diceResult(:,1));disp([“背景的平均骰子分数”,num2str(j),......'test volumes =',num2str(meandicebackground)])
5个测试卷的平均骰子得分= 0.9993
MeanDicetumor =平均值(DicEresult(:,2));DISP(['肿瘤的平均骰子得分',num2str(j),......'test volumes =',num2str(平均肿瘤)])
肿瘤的平均骰子分数5试验卷= 0.9585

该图显示了一个箱线图(统计和机器学习工具箱)可视化关于骰子分数的统计数据,跨整个五个样本测试卷。绘图中的红线显示了类的中值骰子值。蓝框的上限和下限分别表示第25和第75百分位数。黑色晶须扩展到最极端的数据点不被视为异常值。

如果您有统计和机器学习工具箱™,那么您可以使用箱线图函数用于可视化所有测试卷中骰子分数的统计信息。创建箱线图,设置createBoxplot.变量为真的.

createBoxplot = false;如果CreateBoxplot图Boxplot(DicEresult)标题(“测试集骰子精度”)Xticklabel(类名)ylabel(“骰子系数”)结束

参考

[1] çiçek,Ö,A。阿卜杜勒卡迪尔,S。S林坎普,T。布罗克斯和O。罗内贝格。”3D U-Net:从稀疏注释学习密集体积分割国际医学图像计算和计算机辅助干预会议的诉讼程序 - Miccai 2016.雅典,希腊,2016年10月,第424-432页。

[2] Isensee,F.,P. Kickingereder,W. Wick,M. Bendszus和K. H. Maier-Hein。“脑肿瘤分割和辐射瘤生存预测:对2017年挑战的贡献。”在猜测诉讼程序:国际米奇脑子型车间.魁北克市加拿大,2017年9月,第287-297页。

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

BraTS数据集由医学细分十项全能提供CC-BY-SA 4.0许可证。拒绝所有保证和声明;详细信息请参见license。属性中链接的数据集已被MathWorks®修改下载预训练网络和样本测试集此示例的第节。修改后的样本数据集被裁剪到主要包含大脑和肿瘤的区域,每个通道通过减去裁剪后的大脑区域的平均值并除以标准偏差进行独立标准化。

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

[5] Ronneberger,O.,P.Fischer和T.Brox。“U-Net:用于生物医学图像分割的卷积网络。”在国际医学图像计算和计算机辅助干预会议的诉讼程序 - Miccai 2015. 德国慕尼黑,2015年10月,第234-241页。可从arXiv获得:1505.04597。

另见

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

相关话题