主要内容

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

这个例子展示了如何从三维医学图像中进行脑肿瘤的语义分割。

语义分割涉及用类标记三维体素或图像中的每个像素。本例说明了利用三维U-Net深度学习网络对磁共振成像(MRI)扫描中的脑肿瘤进行二元语义分割。U-Net是一种快速、高效、简单的网络,在语义分割领域已成为热门[1].

医学图像分割的一个挑战是存储和处理3-D体所需的内存量。由于GPU资源的限制,训练一个网络并对完整的输入量进行分割是不切实际的。这个例子通过将图像分割成更小的块来解决这个问题,以便进行训练和分割。

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

这个例子展示了如何使用预训练的3d U-Net架构进行脑肿瘤分割,以及如何使用一组测试图像评估网络性能。你可以选择在BraTS数据集上训练一个3d U-Net [2].

使用预训练的三维U-Net进行脑肿瘤分割

下载预先训练的3d U-Net

下载一个预先训练的3d U-Net到一个名为

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

下载BraTS样本数据

从BraTS数据集中下载五个样例测试卷及其对应的标签downloadBraTSSampleTestDatahelper函数(3.].helper函数作为支持文件附加到示例中。示例数据使您能够在不下载完整数据集的情况下对测试数据执行分段。

downloadBraTSSampleTestData (dataDir);

加载其中一个体积样本及其像素标签基本事实值。

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

执行语义分割

该示例使用重叠平铺策略来处理大的卷。重叠块策略选择重叠块,通过使用semanticseg(计算机视觉工具箱)函数,然后将这些块重新组合成一个完整的分段测试卷。该策略可以在GPU上实现高效的处理,而GPU的内存资源有限。该策略还通过使用神经网络中卷积的有效部分来减少边界伪迹[5].

通过将卷数据存储为blockedImage(图像处理工具箱)对象和处理块应用(图像处理工具箱)函数。

创建一个blockedImage对象获取在上一节中下载的样例卷。

bim = blockedImage (volt);

应用对象中的每个块执行自定义函数blockedImage.定义semanticsegBlock作为每个块执行的函数。

semanticsegBlock = @ (bstruct) semanticseg (bstruct.Data,净);

指定块大小作为网络输出大小。若要创建重叠块,请指定非零边界大小。本例使用的边框大小使块和边框匹配网络输入大小。

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

使用以下方法执行语义分割blockedImage应用部分块填充设置为真正的.默认填充方法,“复制”,是合适的,因为体数据包含多种形式。批量大小指定为1,以防止内存资源受限的gpu出现内存不足的错误。然而,如果你的GPU有足够的内存,那么你可以通过增加块大小来提高处理速度。

batchSize = 1;结果=应用(荡妇,...semanticsegBlock,...BlockSize = BlockSize,...BorderSize = BorderSize,...PadPartialBlocks = true,...BatchSize = BatchSize);predictedLabels = results.Source;

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

zID =大小(伏,3)/ 2;zSliceGT = labeloverlay(伏特(:,:,zID) volTestLabels (:,:, zID));zSlicePred = labeloverlay(伏特(:,:,zID) predictedLabels (:,:, zID));figure montage({zsliceegt,zSlicePred},Size=[1 2],BorderSize=5) title(“标记的地面真相(左)vs.网络预测(右)”

图中包含一个axes对象。标题为tagged Ground Truth(左)vs. Network Prediction(右)的axis对象包含一个类型为image的对象。

下图显示了在一个卷上按顺序显示片的结果。标记的基本事实在左边,网络预测在右边。

火车3 d U-Net

本部分演示如何训练一个3d U-Net。如果您不想下载训练数据集或训练网络,则可以跳到评估网络性能部分。

下载BraTS数据集

本例使用BraTS数据集[2].BraTS数据集包含脑瘤的MRI扫描,即胶质瘤,这是最常见的脑部原发性恶性肿瘤。数据文件的大小为~7 GB。

要下载brat数据,请转到医学分割十项全能浏览网页,并按“下载资料”连结。下载" task01_braintumor .tar"文件[3.].方法指定的目录中解压缩TAR文件imageDir变量。当成功解压缩,imageDir将包含一个名为Task01_BrainTumour它有三个子目录:imagesTrimagesTs,labelsTr

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

预处理培训和验证数据

为了更有效地训练三维U-Net网络,利用辅助函数对MRI数据进行预处理preprocessBraTSDataset.该函数作为支持文件附加到示例中。helper函数执行以下操作:

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

  • 通过减去裁剪的大脑区域的平均值和除以标准差,独立归一化每个体积的每个模态。

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

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

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

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

创建一个imageDatastore来存储3d图像数据。因为MAT文件格式是非标准图像格式,所以必须使用MAT文件读取器才能读取图像数据。你可以使用辅助MAT文件阅读器,matRead.该函数作为支持文件附加到示例中。

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

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

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

创建一个randomPatchExtractionDatastore(图像处理工具箱)它从地面真实图像和相应的像素标签数据中提取随机补丁。指定一个132 × 132 × 132体素的补丁大小。指定“PatchesPerImage”在训练过程中,从每对卷和标签中抽取16个随机定位的补丁。指定最小批处理大小为8。

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

创建一个randomPatchExtractionDatastore它从验证图像和像素标签数据中提取补丁。您可以使用验证数据来评估网络是否随着时间的推移在持续学习、欠拟合或过拟合。

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

建立三维U-Net层

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

创建默认的3-D U-Net网络unetLayers(计算机视觉工具箱)函数。指定两个类分割。在使用重叠贴图策略预测测试量时,还要指定有效的卷积填充以避免边界工件。

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

扩展训练和验证数据变换函数使用helper函数指定的自定义预处理操作augmentAndCrop3dPatch.该函数作为支持文件附加到示例中。的augmentAndCrop3dPatch函数执行以下操作:

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

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

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

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

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

的数据已经规范化预处理培训和验证数据部分。的数据归一化image3dInputLayer是不必要的,所以用一个没有数据规范化的输入层替换输入层。

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

您也可以使用深层网络设计师应用程序。

deepNetworkDesigner (lgraph)

指定培训选项

训练网络使用亚当优化求解。参数指定超参数设置trainingOptions函数。初始学习率设置为5e-4,随着训练时间的延长,学习率逐渐降低。你可以用MiniBatchSize属性的基础上,您的GPU内存。为了最大化GPU内存利用率,最好使用大的输入补丁,而不是大的批处理大小。注意,批处理归一化层对于较小的值的效果较差MiniBatchSize.参数调优初始学习率MiniBatchSize

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

列车网络的

默认情况下,示例使用下载的预训练的3d U-Net网络。预先训练的网络使您能够执行语义分割并评估分割结果,而无需等待训练完成。

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

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

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

评估网络性能

选择测试数据的来源,其中包含用于测试的基本事实量和标签。如果你留着useFullTestSet变量,则该示例使用五个样本卷进行测试。如果你设置useFullTestSet变量来真正的,则该示例使用从完整数据集中选择的55个测试图像。

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);pixelLabelID pxdsTest = pixelLabelDatastore (lblLocTest,一会,...FileExtensions =“.mat”ReadFcn = @matRead);

对于每个测试卷,使用应用(图像处理工具箱)函数。的应用函数执行由helper函数指定的操作calculateBlockMetrics,在本例的最后定义。的calculateBlockMetrics函数对每个块进行语义分割,计算预测真值标签与事实真值标签之间的混淆矩阵。

imageIdx = 1;datasetConfMat =表;hasdata (voldsTest)读取卷和标签数据卷=阅读(voldsTest);volLabels =阅读(pxdsTest);为卷和标签数据创建blockeimagetestVolume = blockedImage(卷);testLabels = blockedImage (volLabels {1});%计算块度量blockConfMatOneImage =应用(testVolume,...@(块,labeledBlock)...calculateBlockMetrics(块、labeledBlock网),...ExtraImages = testLabels,...PadPartialBlocks = true,...BlockSize = BlockSize,...BorderSize = BorderSize,...UseParallel = false);读取一个图像的所有块结果并更新图像号blockConfMatOneImageDS = blockedImageDatastore (blockConfMatOneImage);blockConfMat = readall (blockConfMatOneImageDS);(blockConfMat blockConfMat = struct2table ({}):);blockConfMat。ImageNumber = imageIdx。*的(高度(blockConfMat), 1);datasetConfMat = [datasetConfMat; blockConfMat];imageIdx = imageIdx + 1;结束

评估数据集指标和块指标的分割使用evaluateSemanticSegmentation(计算机视觉工具箱)函数。

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

显示为每个图像计算的Jaccard分数。

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

支持函数

calculateBlockMetricsHelper函数对块进行语义分割,计算预测真值标签和事实真值标签之间的混淆矩阵。函数返回一个结构,其中包含关于块的混淆矩阵和元数据的字段。的结构可以使用evaluateSemanticSegmentation函数计算指标和聚合基于块的结果。

函数blockMetrics = calculateBlockMetrics (bstruct gtBlockLabels净)%段块predBlockLabels = semanticseg (bstruct.Data,净);修剪掉gtBlockLabels的边界区域blockStart = bstruct。BorderSize + 1;blockEnd = blockStart + bstruct。BlockSize - 1;gtBlockLabels = gtBlockLabels (...blockStart (1): blockEnd (1),...blockStart (2): blockEnd (2),...blockStart (3): blockEnd (3));根据地面真相评估分割结果confusionMat = segmentationConfusionMatrix (predBlockLabels gtBlockLabels);% blockMetrics是一个结构,包含混淆矩阵,图像编号,%和阻塞信息。blockMetrics。ConfusionMatrix = confusionMat;blockMetrics。ImageNumber = bstruct.ImageNumber;blockInfo。开始= bstruct.Start;blockInfo。结束= bstruct.End;blockMetrics。BlockInfo = BlockInfo;结束

参考文献

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

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

BraTS数据集由Medical Segmentation Decathlon提供4.0使用许可证。免责所有保证和声明;详细信息请参见license。中链接的数据集下载BraTS样本数据部分。修改后的样本数据集被裁剪到一个主要包含大脑和肿瘤的区域,每个通道通过减去裁剪后的大脑区域的平均值和除以标准差独立归一化。

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

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

另请参阅

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

相关的话题

Baidu
map