主要内容

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

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

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

本例使用3d U-Net架构进行脑肿瘤分割[1].U-Net是一种快速、高效、简单的网络,已成为语义分割领域的热点。

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

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

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

本例使用了BraTS数据集[2].BraTS数据集包含脑肿瘤的MRI扫描,即胶质瘤,这是最常见的原发性脑恶性肿瘤。数据文件的大小为~7 GB。如果您不想下载BraTS数据集,请直接转到下载测试样本集节。

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

imageDir = fullfile(tempdir,“小鬼”);

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

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

预处理训练和验证数据

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

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

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

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

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

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

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

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

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

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

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

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

预览一个图像卷和标签。控件显示已标记的卷labelvolshow函数。通过设置背景标签的可见性使背景完全透明(1)0

Volume =预览(volds);标签=预览(pxds);viewPnl = uipanel(图,标题=“标注培训量”);hPred = labelvolshow(label,volume(:,:,:,1),Parent=viewPnl,LabelColor=[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 = randompatchextracactiondatastore (volds,pxds,patchSize,...PatchesPerImage = patchPerImage);patchds。MiniBatchSize = MiniBatchSize;

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

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

设置3-D U-Net图层

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

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

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

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

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

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

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

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

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

数据已经在预处理训练和验证数据部分的示例。中的数据规范化image3dInputLayer(深度学习工具箱)是不必要的,因此将输入层替换为没有数据规范化的输入层。

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

或者,您可以使用Deep Learning Toolbox™中的Deep network Designer App修改3d U-Net网络。

绘制更新后的3d U-Net网络图。

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

下载测试样本集

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

imageDir = fullfile(tempdir,“小鬼”);downloadBraTSSampleTestData (imageDir);

为测试数据集指定补丁大小和类信息。

inputPatchSize = [132 132 132 4];outPatchSize = [44 44 44 2];classNames = [“背景”“肿瘤”];pixelLabelID = [0 1];

列车网络的

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

为了训练网络,设置doTraining变量转换为真正的.训练模型使用trainNetwork(深度学习工具箱)函数。

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

doTraining =如果doTraining [net,info] = trainNetwork(dsTrain,lgraph,options);modelDateTime = string(datetime(“现在”格式=“yyyy-MM-dd-HH-mm-ss”));保存(“trained3DUNet——”+ modelDateTime +“.mat”“净”);其他的trained3DUnet_url =“//www.tatmou.com/金宝appsupportfiles/vision/data/brainTumor3DUNetValid.mat”;downloadTrainedNetwork (trained3DUnet_url imageDir);负载(imageDir + filesep +“brainTumor3DUNetValid.mat”);结束

对测试数据进行分割

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

选择包含实际数据量和标签的测试数据源。如果你留着useFullTestSet变量在以下代码中的值为,则该示例使用5个卷进行测试。如果你设置useFullTestSet变量来真正的,则该示例使用从完整数据集中选择的55个测试图像。

useFullTestSet =如果useFullTestSet volLocTest = preprocessDataLoc+filesep+“imagesTest”;lblLocTest = preprocessDataLoc+filesep+“labelsTest”其他的volLocTest = imageDir+filesep+“sampleBraTSTestSetValid”+ filesep +“imagesTest”;lblLocTest = imageDir+filesep+“sampleBraTSTestSetValid”+ filesep +“labelsTest”结束

voldsTest变量存储地面真值测试图像。的pxdsTest变量存储基本真值标签。

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

使用重叠贴图策略来预测每个测试卷的标签。每个测试体积都被填充,使输入大小成为网络输出大小的倍数,并补偿有效卷积的影响。叠片算法选取重叠的贴片,并利用矩阵对每个贴片的标签进行预测semanticseg(计算机视觉工具箱)函数,然后重新组合补丁。

Id = 1;hasdata voldsTest disp (“加工测试量”+ num2str (id));tempGroundTruth = read(pxdsTest);groundTruthLabels{id} = tempGroundTruth{1};vol{id} = read(voldsTest);为测试图像使用反射填充。避免不同形式的填充。volSize = size(vol{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(vol{id},padSizePre,“对称”“以前”);volpadding = padarray(volPaddedPre,padSizePost,“对称”“职位”);[hightpad,widthPad,depthPad,~] = size(volpadding);[height,width,depth,~] = size(vol{id});tempSeg = categorical(0([高度,宽度,深度],“uint8”),[0, 1],类名);用于分割卷的重叠策略。k = 1:outPatchSize(3):depthPad-inputPatchSize(3)+1j = 1:outPatchSize(2):widthPad-inputPatchSize(2)+1i = 1:outPatchSize(1): hightpad -inputPatchSize(1)+1 patch = volpadding (i:i+inputPatchSize(1)-1,...j: + inputPatchSize (2) 1,...凯西:k + inputPatchSize (3) 1:);patchSeg = semanticseg(补丁,网络);tempSeg(我+ outPatchSize (1) 1...j: + outPatchSize (2) 1,...k:k+outPatchSize(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 = size(vol3d,3)/2;zSliceGT = labeloverlay(vol3d(:,:,zID),groundTruthLabels{volId}(:,:,zID));zSlicePred = labeloverlay(vol3d(:,:,zID),predictedLabels{volId}(:,:,zID));figure montage({zsliceegt,zSlicePred},Size=[1 2],BorderSize=5) title(标签地面真相(左)vs网络预测(右)

控件显示地面真值标记的音量labelvolshow函数。通过设置背景标签的可见性使背景完全透明(1)0.因为肿瘤在脑组织内,所以要使部分大脑体素透明,这样肿瘤就可见了。要使某些大脑体素透明,请将容量阈值指定为范围[0,1]中的数字。所有低于此阈值的标准化体积强度都是完全透明的。本例将容量阈值设置为小于1,以便一些大脑像素仍然可见,从而为大脑内肿瘤的空间位置提供上下文。

viewPnlTruth = uipanel(图,标题=“地面真理标签卷”);hTruth = labelvolshow(groundTruthLabels{volId},vol3d,Parent=viewPnlTruth,...LabelColor=[0 0 0;1 0 0],VolumeThreshold=0.68);hTruth.LabelVisibility(1) = 0;

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

viewPnlPred = uipanel(图,标题=“预测标记量”);hPred = labelvolshow(predictedLabels{volId},vol3d,Parent=viewPnlPred,...LabelColor=[0 0 0;1 0 0],VolumeThreshold=0.68);hPred.LabelVisibility(1) = 0;

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

量化分割精度

测量分割精度使用骰子函数。该函数计算预测和实际真相分割之间的Dice相似系数。

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

计算整个测试卷集的平均Dice分数。

meanDiceBackground = mean(diceResult(:,1));disp (“背景的平均骰子分数”+ num2str (j) +..."测试量= "+ num2str (meanDiceBackground))
5个测试卷的背景平均Dice分数= 0.9993
meandictumor = mean(diceResult(:,2));disp (“肿瘤的平均Dice分数”+ num2str (j) +..."测试量= "+ num2str (meanDiceTumor))
5个试验体积肿瘤的平均Dice评分= 0.9585

该图显示了箱线图(统计和机器学习工具箱)它可以在五个样本测试卷的集合中可视化骰子分数的统计数据。图中的红线显示了类的中位数Dice值。蓝色框的上界和下界分别表示第25百分位和第75百分位。黑须延伸到不被认为是异常值的最极端数据点。

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

createBoxplot =如果createBoxplot figure boxplot(diceResult)“测试集骰子精度”xticklabels(classNames)“骰子系数”结束

参考文献

[1] Çiçek, Ö。,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页。

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许可证。所有保证和陈述均被放弃;详细信息请参见license。中链接的数据集下载测试样本集部分的示例。将修改后的样本数据集裁剪为主要包含大脑和肿瘤的区域,并通过减去裁剪后的大脑区域的平均值并除以标准差,将每个通道独立归一化。

[4]苏德,C. H.,李伟文,T.韦考特伦,S.乌尔瑟林和M. J.卡多佐。“广义骰子重叠作为高度不平衡分割的深度学习损失函数。”医学图像分析中的深度学习和临床决策支持的多模态学习:第三届国际研讨会金宝app.加拿大魁北克市,2017年9月,第240-248页。

[5]罗内伯格,O. P.费舍尔和T.布罗克斯。U-Net:用于生物医学图像分割的卷积网络在医学图像计算与计算机辅助干预国际会议论文集- MICCAI 2015.德国慕尼黑,2015年10月,第234-241页。arXiv:1505.04597。

另请参阅

|(深度学习工具箱)|(深度学习工具箱)||(计算机视觉工具箱)||(计算机视觉工具箱)|(计算机视觉工具箱)

相关的话题

外部网站