主要内容

三维大脑肿瘤分割使用深度学习

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

语义分割包括标记图像的每个像素或体素的三维体积与一个类。这个例子演示了使用3 d U-Net深入学习网络执行二进制语义分割脑部肿瘤的磁共振成像(MRI)扫描。U-Net是一个快速、高效和简单的网络已经成为流行的语义分割域(1]。

医学图像分割的一个挑战是所需的内存来存储和处理3 d卷。训练一个网络上执行分割和完整的输入量由于GPU资源约束是不切实际的。这个例子解决了问题,将图像分成更小的补丁,或块,培训和分割。

医学图像分割是类的第二个挑战失衡阻碍了培训的数据在使用传统的交叉熵的损失。这个例子解决问题通过使用加权多级骰子损失函数(4]。加权类有助于对抗骰子点数较大区域的影响,使网络更容易学会段较小的地区。

这个例子展示了如何执行大脑肿瘤分割使用pretrained 3 d U-Net架构,以及如何评估网络性能使用一组测试图像。您可以选择火车的3 d U-Net小鬼数据集(2]。

使用Pretrained 3 d U-Net执行脑瘤分割

下载Pretrained 3 d U-Net

下载一个pretrained 3 d U-Net成一个变量

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

下载的后代示例数据

下载5个样品测试卷和相应的标签从有钱的数据集使用downloadBraTSSampleTestDatahelper函数(3]。辅助函数附加到例子作为支持文件。万博1manbetx样本数据使您能够执行分割测试数据没有下载完整的数据集。

downloadBraTSSampleTestData (dataDir);

负载的一卷样品连同其像素标签地面实况。

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

执行语义分割

示例使用一个overlap-tile策略处理大体积。overlap-tile策略选择重叠块,预测每个块使用的标签semanticseg(计算机视觉工具箱)函数,然后重组成一个完整的块分割测试卷。策略可以有效地处理在GPU,有限的内存资源。战略还减少了边界构件通过使用有效的一部分的卷积神经网络(5]。

实现overlap-tile策略通过存储数据量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(结束)];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));图蒙太奇({zSliceGT, zSlicePred},大小= [1 - 2],BorderSize = 5)标题(“贴上地面真理(左)与网络预测(右)”)

下图显示了结果的顺序显示片的一卷。贴上地面真理是在左边和右边的网络预测。

火车3 d U-Net

这部分的例子展示了如何训练3 d U-Net。如果你不想下载的训练数据集或训练网络,然后你可以跳过评估网络性能这个例子。

下载的后代数据集

下面的例子使用了有钱的数据集(2]。小鬼数据集包含了脑部肿瘤的MRI扫描,即神经胶质瘤,这是最常见的原发性脑恶性肿瘤。数据文件的大小~ 7 GB。

下载的后代数据,去医学分割十项全能网站,点击“下载数据”链接。下载“Task01_BrainTumour。焦油”文件(3]。解压TAR文件到指定的目录imageDir变量。当成功解压缩,imageDir将包含一个目录命名Task01_BrainTumour这有三个子目录:imagesTr,imagesTs,labelsTr

数据集包含750个4 - d卷,每个代表一个堆栈的3 d图像。每个4 d卷大小240 -了- 240 - 155 - 4,在前三个维度对应高度,宽度和深度的三维体积的形象。第四维对应于不同的扫描方式。484数据集分为训练与体元标签和266个测试卷卷。测试卷没有标签,这样这个示例不使用测试数据。相反,这个例子将484训练卷分为三个独立集用于培训、验证和测试。

预处理训练和验证数据

训练3 d U-Net网络更有效率,预处理MRI数据使用helper函数preprocessBraTSDataset。这个函数是附加到例子作为支持文件。万博1manbetxhelper函数执行这些操作:

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

  • 正常化每个独立形态的体积减去均值和除以标准差剪裁的大脑区域。

  • 把484培训卷到400年,29日验证和55测试集。

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

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

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

创建一个imageDatastore存储3 d图像数据。因为垫子文件格式是一个非标准的图像格式,您必须使用一个垫子文件阅读器使读取图像数据。您可以使用辅助垫文件阅读器,matRead。这个函数是附加到例子作为支持文件。万博1manbetx

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从每组随机定位补丁的数量和标签在训练。指定一个mini-batch大小8。

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

创建一个randomPatchExtractionDatastore从验证图像和像素提取补丁标签数据。您可以使用验证数据来评估是否网络不断学习,随着时间的推移underfitting或过度拟合。

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层

下面的例子使用了3 d U-Net网络(1]。U-Net,最初的一系列卷积层点缀着麦克斯池层,先后降低输入图像的分辨率。这些层是紧随其后的是一系列的卷积层点缀着upsampling运营商,先后增加输入图像的分辨率。一批标准化层之前介绍过的每个ReLU层。U-Net名称来自这样一个事实:网络可以用一个对称的形状像字母U。

创建一个默认的3 d U-Net网络使用unetLayers(计算机视觉工具箱)函数。指定两个类分割。也指定有效的卷积填充,以避免边界构件在使用测试的overlap-tile战略预测卷。

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

增加使用的培训和验证数据变换函数与自定义的helper函数指定的预处理操作augmentAndCrop3dPatch。这个函数是附加到例子作为支持文件。万博1manbetx的augmentAndCrop3dPatch函数执行这些操作:

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

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

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

更好的段小肿瘤区域和减少大背景的影响区域,本例中使用dicePixelClassificationLayer(计算机视觉工具箱)。替换像素分类层与骰子像素分类层。

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

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

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

或者,您可以修改3 d U-Net网络使用深层网络设计师应用程序。

deepNetworkDesigner (lgraph)

指定培训选项

列车网络使用亚当优化求解。指定hyperparameter设置使用trainingOptions函数。最初的学习速率设置为5,张成的空间逐渐减少的军医培训。你可以尝试MiniBatchSize财产基于GPU内存。GPU内存利用率最大化,有利于大输入补丁在大型批量大小。注意,批量标准化层更有效更小的值MiniBatchSize。优化初始学习速率的基础上MiniBatchSize

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

列车网络的

默认情况下,这个例子使用了下载pretrained 3 d U-Net网络。pretrained网络使您能够执行语义分割和评价分割结果没有等待培训完成。

训练网络,设置doTraining变量在下面的代码真正的。列车网络使用trainNetwork函数。

火车在GPU如果一个是可用的。使用GPU需要并行计算工具箱™和CUDA NVIDIA GPU®®启用。有关更多信息,请参见GPU计算的需求(并行计算工具箱)。培训大约需要30小时multi-GPU系统4英伟达™泰坦Xp GPU和可以更长时间取决于你的GPU硬件。

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

评估网络性能

选择测试数据的来源包含地面实况卷和标签进行测试。如果你保持useFullTestSet变量在下面的代码,那么示例使用五样卷进行测试。如果你设置useFullTestSet变量来真正的,然后55例使用测试图片选自完整的数据集。

useFullTestSet =;如果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);

为每个测试卷,过程每一块使用应用(图像处理工具箱)函数。的应用函数执行指定的操作,辅助功能calculateBlockMetrics,这是定义在这个例子。的calculateBlockMetrics函数执行每个块的语义分割并计算出预测之间的混淆矩阵和地面真理标签。

imageIdx = 1;datasetConfMat =表;hasdata (voldsTest)%读和标签数据量卷=阅读(voldsTest);volLabels =阅读(pxdsTest);%为体积和创建blockedImage标签数据testVolume = 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,一会,指标=“所有”);
评估语义分割结果- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *选定指标:全球准确性、类准确性,借据,加权借据。* 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

万博1manbetx支持函数

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]Isensee F。,P. Kickingereder, W. Wick, M. Bendszus, and K. H. Maier-Hein. "Brain Tumor Segmentation and Radiomics Survival Prediction: Contribution to the BRATS 2017 Challenge." In学报BrainLes:国际MICCAI Brainlesion车间。加拿大魁北克市,2017年9月,页287 - 297。

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

有钱的数据集是由医学分割下十项全能4.0使用许可证。所有的保证和陈述都否认;有关详细信息,请参阅许可。MathWorks®已经修改数据集联系在一起下载的后代示例数据这个例子。修改后的样本数据集已经被裁剪区域包含主要是大脑和肿瘤和每个通道已经被减去均值和规范化独立除以标准差剪裁的大脑区域。

[4]Sudre, c . H。,W. Li, T. Vercauteren, S. Ourselin, and M. J. Cardoso. "Generalised Dice Overlap as a Deep Learning Loss Function for Highly Unbalanced Segmentations."深度学习在医学图像分析和多通道学习临床决策支持:第三国际研讨会万博1manbetx。加拿大魁北克市,2017年9月,页240 - 248。

[5]Ronneberger, O。,P. Fischer, and T. Brox. "U-Net:Convolutional Networks for Biomedical Image Segmentation." In《医学影像计算和计算机辅助介入的国际会议- MICCAI 2015。德国慕尼黑,2015年10月,页234 - 241。可以在arXiv: 1505.04597。

另请参阅

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

相关的话题