主要内容

基于深度学习的三维脑肿瘤分割

该示例显示如何训练3-D U-Net神经网络,并从三维医学图像执行脑肿瘤的语义分割。

语义分割包括用类标记图像中的每个像素或三维体素。这个例子说明了如何使用深度学习方法在磁共振成像(MRI)扫描中对脑肿瘤进行二元语义分割。在这种二值分割中,每个像素都被标记为肿瘤或背景。

该示例使用3-D U-Net架构进行脑肿瘤分割[1].U-Net是一种快速,高效,简单的网络,它在语义分段域中流行。

医学图像分割的一个挑战是存储和处理3d体积所需的内存量。由于GPU资源的限制,在全输入量上训练网络是不切实际的。这个例子通过在图像补丁上训练网络来解决这个问题。该示例使用重叠策略将测试补丁缝合到一个完整的分段测试卷中。该示例通过使用神经网络中卷积的有效部分来避免边界伪影[5.].

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

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

此示例使用BRATS数据集[2].Brats数据集包含脑肿瘤的MRI扫描,即胶质瘤,这是最常见的主要脑恶性肿瘤。数据文件的大小为约7 GB。如果您不想下载BRATS数据集,则直接转到下载佩带的网络和样本测试集节。

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

imagedir = fullfile(tempdir,“小鬼”);如果〜存在(Imageager,'dir')mkdir(Imagedir);结尾

要下载Brats数据,请转到医疗细分迪卡侬网站并单击“下载数据”链接。下载“task01_braintumour.tar”文件[3.].将tar文件解压缩到由此指定的目录中imageDir变量。当成功解压缩,imageDir将包含一个名为Task01_BrainTumour它有三个子目录:想象的想象力, 和labelsTr

该数据集包含750个4-D卷,每个卷代表一堆3-D图像。每个4-D卷的尺寸为240 × 240 × 155 × 4,其中前三个维度对应于一个3-D体积图像的高度、宽度和深度。第四维对应不同的扫描方式。该数据集被分为484个带有体素标签的训练卷和266个测试卷,测试卷没有标签,所以本例没有使用测试数据。相反,该示例将484个训练卷分成三个独立的集,用于训练、验证和测试。

预处理培训和验证数据

要更有效地培训3-D U-Net网络,请使用辅助功能预处理MRI数据Preprocessbratsdataset.这个函数作为支持文件附加到示例中。金宝app

helper函数执行以下操作:

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

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

  • 将484次训练卷分成400次培训,29份验证和55个测试集。

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

sourcedataloc = [imageageR filesep“Task01_BrainTumour”];preprocessdataloc = fullfile(tempdir,“小鬼”'preprocesseddataset');Preprocessbratsdataset(PreprocessDataloc,SourceDataloc);

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

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

创建一个imageageAtastore.来存储3d图像数据。因为mat文件格式是非标准的图像格式,所以必须使用mat文件阅读器来读取图像数据。你可以使用辅助的mat文件读取器,基质.这个函数作为支持文件附加到示例中。金宝app

volreader = @(x)relead(x);volloc = fullfile(preprocessdataloc,'想象的');volds = imagedataStore(volloc,...'fileextensions''。垫''readfcn', volReader);

创建一个PixellabeldAtastore.(电脑视觉工具箱)存储标签。

lblLoc = fullfile (preprocessDataLoc,'labelstr');ClassNames = [“背景”“瘤”];Pixellabelid = [0 1];pxds = pixellabeldataStore(LBLLOC,ClassNames,Pixellabelid,...'fileextensions''。垫''readfcn', volReader);

预览一个图像卷和标签。使用该标记的卷labelvolshow(图像处理工具箱)函数。通过设置背景标签的可见性来使后台完全透明(1)0.

卷=预览(volds);标签=预览(PXD);ViewPnl = Uipanel(图,'标题''标记培训卷');hpred = labelvolshow(标签,卷(:,:::,1),'父母'viewPnl,...'lablecolor',[0 0 0; 1 0 0]);hpred.Labelvisibility(1)= 0;

创建一个randomPatchExtractionDatastore(图像处理工具箱)它包含训练图像和像素标签数据。指定一个补丁大小为132 × 132 × 132体素。指定“PatchesPerImage”在训练期间从每对卷和标签中提取16个随机定位的贴片。指定迷你批量大小为8。

patchsize = [132 132 132];patchperimage = 16;minibatchsize = 8;patchds = RandOMPatchExtractionDataStore(VOLDS,PXD,PatchSize,...“PatchesPerImage”,patchperimage);patchds.minibatchsize = minibatchsize;

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

vollocval = fullfile(preprocessdataloc,“imagesVal”);voldsVal = imageDatastore (volLocVal,...'fileextensions''。垫''readfcn', volReader);lbllocval = fullfile(preprocessdataloc,'labelsval');pxdsval = pixellabeldataStore(lbllocval,classnames,pixellabelid,...'fileextensions''。垫''readfcn', volReader);dsVal = randomPatchExtractionDatastore (voldsVal pxdsVal patchSize,...“PatchesPerImage”,patchperimage);dsval.minibatchsize =小匹匹匹匹配;

通过使用使用的培训和验证数据来增加培训和验证数据变换使用辅助功能指定的自定义预处理操作augmentAndCrop3dPatch.这个函数作为支持文件附加到示例中。金宝app

augmentAndCrop3dPatchFunction执行以下操作:

  1. 随机旋转并反映培训数据,使培训更加强大。该功能不旋转或反映验证数据。

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

datasource =“培训”;dstrain =变换(patchds,@(patchin)augmentandcrop3dpatch(patchin,dataSource));datasource =“验证”;dsVal =变换(dsVal @ (patchIn) augmentAndCrop3dPatch (patchIn数据源));

设置3-D U-Net层

此示例使用3-D U-Net网络[1].在U-NET中,初始卷积层系列耦合到MAX池层,连续降低输入图像的分辨率。这些层之后是一系列卷积层,其遍历上采样操作员,连续增加输入图像的分辨率。在每个Relu层之前引入批量归一化层。U-Net的名称来自于网络可以用与字母U类似的对称形状绘制。

通过使用使用默认的3-D U-Net网络unetLayers(电脑视觉工具箱)函数。指定两个类分割。当使用重叠策略预测测试量时,还指定有效的卷积填充以避免边界伪影。

inputPatchSize = [132 132 132 4];numClasses = 2;[lgraph, outPatchSize] = unet3dLayers (inputPatchSize numClasses,'卷积浮雕'“有效”);

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

outputLayer = dicePixelClassificationLayer ('名称''输出');lgraph = replaceLayer (lgraph,'分段层',输出层);

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

inputLayer = image3dInputLayer (inputPatchSize,“归一化”'没有任何''名称''imageinputlayer');lgraph = replaceLayer (lgraph,'imageinputlayer',InputLayer);

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

绘制更新后的三维U-Net网络图。

analyzeNetwork (lgraph)

指定培训选项

使用培训网络亚当优化求解。属性指定超参数设置培训选项函数。初始学习率设置为5e-4,并随着训练的持续而逐渐降低。你可以用小匹匹匹匹配属性基于您的GPU内存。为了最大限度地利用GPU内存,最好使用大的输入补丁而不是大的批量大小。注意,批处理规格化层对于较小的值效果较差小匹匹匹匹配.基于的初始学习率小匹匹匹匹配

选项=培训选项(“亚当”...“MaxEpochs”,50,...'italllearnrate',5e-4,...“LearnRateSchedule”“分段”...“LearnRateDropPeriod”,5,...'学习ropfactor',0.95,...'vightationdata',dsval,...“ValidationFrequency”,400,...'plots'“训练进步”...“详细”假的,...“MiniBatchSize”,小匹匹匹匹配);

下载佩带的网络和样本测试集

从BR​​ATS数据集下载3-D U-NET和五个样本测试卷及其相应标签的预磨损版本[3.].预先训练的模型和样本数据使您能够对测试数据进行分割,而无需下载完整的数据集或等待网络训练。

训练3dunet_url =.“//www.tatmou.com/金宝appsupportfiles/vision/data/brainTumor3DUNetValid.mat”;sampleData_url =“//www.tatmou.com/金宝appsupportfiles/vision/data/sampleBraTSTestSetValid.tar.gz”;imagedir = fullfile(tempdir,“小鬼”);如果〜存在(Imageager,'dir')mkdir(Imagedir);结尾下载3dunetsampledata(trouth3dunet_url,sampledata_url,imagedir);

火车网络

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

要训​​练网络,请设置用圆形以下代码中的变量真正的.训练模型使用Trainnetwork.函数。

在可用的GPU上进行训练。使用GPU需要并行计算工具箱™和支持CUDA®的NVIDIA®GPU。有关更多信息,请参见GPU支金宝app持情况(并行计算工具箱).在4个NVIDIA™Titan Xp GPU的多GPU系统上,培训大约需要30个小时,根据您的GPU硬件,可能需要更长时间。

doTraining = false;如果dotrained modeldateTem = string(DateTime(“现在”“格式”“yyyy-MM-dd-HH-mm-ss”));[NET,INFO] = Trainnetwork(Dstrain,Largrain,选项);保存(strcat(“训练3dunet-”,modeldateTime,“时代——”,num2str(options.maxepochs),“.mat”),'网');别的inputPatchSize = [132 132 132 4];outpatchsize = [44 44 44 2];加载(FullFile(Imagedir,'训练3dunet''braintumor3dunetvalid.mat'));结尾

对测试数据进行分割

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

选择测试数据的源,其中包含接地真理卷和标签进行测试。如果你保留useFullTestSet以下代码中的变量为错误的,则示例使用5卷进行测试。如果你设置useFullTestSet变量到真正的,则示例使用从完整数据集中选择的55张测试图像。

ideryltestset = false;如果usfulltestset volLocTest = fullfile(preprocessDataLoc,“变化节”);lblLocTest = fullfile (preprocessDataLoc,“labelsTest”);别的volloctest = fullfile(imagedir,'samplebratstestsetvalid'“变化节”);lblLocTest = fullfile (imageDir,'samplebratstestsetvalid'“labelsTest”);ClassNames = [“背景”“瘤”];Pixellabelid = [0 1];结尾

voldstest变量存储地面真理测试图像。这pxdsTestVariable存储ground真值标签。

volreader = @(x)relead(x);voldstest = imagedatastore(volloctest,...'fileextensions''。垫''readfcn', volReader);pixelLabelID pxdsTest = pixelLabelDatastore (lblLocTest,一会,...'fileextensions''。垫''readfcn', volReader);

使用重叠策略来预测每个测试量的标签。每个测试体积被填充,使输入大小为网络输出大小的倍数,并补偿有效卷积的影响。重叠算法选择重叠的patch,利用该算法预测每个patch的标签SemanticSeg.(电脑视觉工具箱)功能,然后重新组合补丁。

id = 1;尽管hasdata (voldsTest) disp ([“处理测试量”num2str(ID)]);tempgroundtruth =读(pxdstest);TroundTruthlabels {id} = tempgroundtruth {1};Vol {id} =读取(VoldStest);%对测试图像使用反射填充。%避免填充不同的模态。volsize = size(vol {id},(1:3));Padsizepre =(InputPatchsize(1:3)--outpatchsize(1:3))/ 2;padsizepost =(InputPatchsize(1:3)--outpatchsize(1:3))/ 2 +(分开(1:3)-mod(剧集,分类(1:3));volpaddedpre = padarray(vol {id},padsizepre,“对称”'pre');volPadded = padarray (volPaddedPre padSizePost,“对称”“职位”);[heightPad, widthPad depthPad ~] =大小(volPadded);(高度、宽度、深度、~)=大小(卷{id});tempSeg =分类(0(高度、宽度、深度,“uint8”),[0; 1],ClassNames);%重叠的策略分割的体积。为了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:J + InputPatchSize(2)-1,...K:K + InputPatchsize(3)-1,:);patchseg = semanticseg(补丁,网);Tempseg(I:i +分类(1)-1,...j: + outPatchSize (2) 1,...凯西:k + outPatchSize (3) 1) = patchSeg;结尾结尾结尾%裁剪额外的填充区域。tempSeg = tempSeg(1:身高、1:宽度、1:深度);%保存预测的卷结果。predigedlabels {id} = tempseg;ID = ID + 1;结尾
处理测试卷1处理测试卷2处理测试卷3处理测试卷4处理测试卷5

与网络预测进行比较

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

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

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

ZID =尺寸(Vol3d,3)/ 2;zslicegt = labeloverlay(Vol3d(:,:,zid),地面标签{volid}(:,:,zid));zslicepred = labeloverlay(Vol3d(:,:,zid),predgedlabels {volid}(:,:,zid));图蒙太奇({zslicegt,zslicepred},“大小”,[1 2],'毗邻',5)标题('标记为基本真理(左)与网络预测(右)'

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

ViewPnltruth = Uipanel(图,'标题''地面真理标有卷');hTruth = labelvolshow (groundTruthLabels {volId}, vol3d,'父母',查看pnltruth,...'lablecolor',[0 0 0; 1 0 0],'volumethreshold', 0.68);hTruth.LabelVisibility (1) = 0;

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

ViewPnlpred = Uipanel(图,'标题'“预测标签卷”);hPred = labelvolshow (predictedLabels {volId}, vol3d,'父母',viewPnled,...'lablecolor',[0 0 0; 1 0 0],'volumethreshold', 0.68);

hpred.Labelvisibility(1)= 0;

此图像显示在卷之一上顺序显示切片的结果。标记的地面真相位于左侧,网络预测位于右侧。

量化细分精度

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

diceResult = 0(长度(voldsTest.Files), 2);为了j = 1:length(vol) dicerresult (j,:) = dice(groundTruthLabels{j},predictedLabels{j});结尾

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

MeanDicebackground =卑鄙(DicEresult(:,1));DISP(['跨越背景的平均骰子分数'num2str (j),...' test volumes = 'num2str (meanDiceBackground)])
平均骰子横跨5个测试卷= 0.9993
meanDiceTumor =意味着(diceResult (:, 2));DISP([“肿瘤的平均骰子得分”num2str (j),...' test volumes = ',num2str(meandicetumor)])
5个试验体积肿瘤的平均骰子得分= 0.9585

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

如果您有统计和机器学习工具箱™,那么您可以使用箱形图在所有测试卷上可视化DICE分数的统计功能。创建一个箱形图,设置createBoxplot以下代码中的变量真正的

createBoxplot = false;如果CreateBoxplot图Boxplot(DicEresult)标题('测试设置骰子准确度')XTicklabels(ClassNames)Ylabel('骰子系数'结尾

参考

[1]Çiçek,Ö。,A. Abdulkadir,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挑战的贡献在国际MICCAI脑病研讨会论文集.加拿大魁北克市,2017年9月,第287-297页。

[3]“脑肿瘤”。医疗细分迪卡侬。http://medicaldecathlon.com/

BRATS数据集由医疗细分牌号提供CC-BY-SA 4.0许可证。所有保证和陈述都被忽视;有关详细信息,请参阅许可证。MathWorks®已修改链接的数据集下载佩带的网络和样本测试集这个例子的一部分。修改的样品数据集已经裁剪到主要是大脑和肿瘤的区域,并且通过减去裁剪脑区域的标准偏差来独立地归一化。

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

Ronneberger, O., P. Fischer和T. Brox。U-Net:用于生物医学图像分割的卷积网络。在国际医学图像计算与计算机辅助干预会议论文集- MICCAI 2015.慕尼黑,德国,2015年10月,第234-241页。可在Arxiv提供:1505.04597。

也可以看看

||||(电脑视觉工具箱)|(电脑视觉工具箱)|(电脑视觉工具箱)|(图像处理工具箱)

相关的话题