主要内容

多分辨率闭塞图像中的肿瘤分类

此示例显示了如何使用Inception-V3深神经网络对多分辨率整个幻灯片图像(WSIS)进行分类,这些幻灯片图像(WSIS)可能不适合内存。

肿瘤分类的深度学习方法依赖于数字化病理,将整个组织切片进行成像和数字化。得到的wsi具有高分辨率,约为20万× 10万像素。WSIs通常以多分辨率格式存储,以便于图像的有效显示、导航和处理。

该示例概述了使用基于块的处理来训练大型WSIs的体系结构。该示例使用迁移学习技术训练了一个基于Inception-v3的网络,将个体块分类为正常的肿瘤

如果您不想下载训练数据和训练网络,那么继续列车或下载网络这个例子的一部分。

准备训练数据

按照手册中的说明准备培训和验证数据用于训练分类网络的预处理多分辨率图像.预处理示例将预处理后的培训和验证数据存储保存在一个名为trainingAndValidationDatastores.mat

设置的值dataDir变量作为位置trainingAndValidationDatastores.mat文件所在的位置。将培训和验证数据存储加载到所调用的变量中dsTrainLabeleddsvallabeled.

dataDir = fullfile (tempdir,“Camelyon16”);负载(fullfile (dataDir“trainingAndValidationDatastores.mat”))

为迁移学习设置初始化v3网络层

此示例使用Inception-V3网络[2],卷积神经网络,从ImageNet数据库中培训超过一百万个图像[3]。网络是48层深度,可以将图像分类为1,000个对象类别,例如键盘,鼠标,铅笔和许多动物。

inceptionv3(深度学习工具箱)函数返回预磨损的Inception-V3网络。Inception-V3需要Inception-V3网络支持包的深度学习工具箱™模型。金宝app如果未安装此支持金宝app包,则该函数提供了下载链接。

网= inceptionv3;lgraph = layerGraph(净);

网络提取图像特征的卷积层。最后一次学习层和最终分类层使用图像特征对输入图像进行分类。这两层包含有关如何将功能组合成类概率,丢失值和预测标签的信息。要重新寄出预制网络以对新图像进行分类,请将这两层替换为适合新数据集的新图层。有关更多信息,请参见培训深度学习网络以分类新图像(深度学习工具箱)

查找两层的名称以使用辅助功能替换findLayersToReplace.这个函数作为支持文件附加到示例中。金宝app在《盗梦空间》v3中,这两个层被命名“预测”'classificationlayer_predictions'

[LearnableLayer,ClassLayer] = FindLayerStoreplace(LAPHAGE);

本例的目标是在两个类之间执行二进制分割,肿瘤正常的.为两个类创建一个新的完全连接的层。用新图层替换最终完全连接的图层。

numClasses = 2;newLearnableLayer = fullyConnectedLayer (numClasses Name =“预测”);lgraph = replaceLayer (lgraph learnableLayer.Name newLearnableLayer);

为两个类创建一个新的分类层。用新层替换最终的分类层。

newClassLayer = classificationLayer (Name =“ClassificationLayer_predictions”);lgraph = replaceLayer (lgraph classLayer.Name newClassLayer);

指定培训选项

使用均方根传播(RMSProp)优化训练网络。属性指定RMSProp的超参数设置trainingOptions(深度学习工具箱)函数。

减少maxepochs.由于训练数据量大,使得网络更快地达到收敛。指定一个MiniBatchSize根据你可用的GPU内存。虽然较大的小批量可以使训练更快,但较大的小批量会降低网络的泛化能力。集ResetInputNormalization防止完整读取训练数据以计算规范化统计信息。

checkpointsDir = fullfile (dataDir,“检查点”);如果~存在(checkpointsDir'dir'mkdir (checkpointsDir);结束选择= trainingOptions (“rmsprop”...MaxEpochs = 1,...MiniBatchSize = 256,...洗牌=“每一代”...ValidationFrequency = 250,...InitialLearnRate = 1的军医,...SquaredGradientDecayFactor = 0.99,...resetInputnormalization = false,...ExecutionEnvironment =“汽车”...情节=“训练进步”...CheckpointPath = checkpointsDir);

训练网络或下载预训练网络

默认情况下,本例使用helper函数下载预先训练过的分类网络downloadTrainedCamelyonNet.预先训练的网络可以用来运行整个示例,而无需等待训练完成。

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

如果可用,在一个或多个gpu上进行培训。使用GPU需要并行计算工具箱™和支持CUDA®的NVIDIA®GPU。有关更多信息,请参见GPU通金宝app过发布支持(并行计算工具箱)

doTraining = false;如果doTraining options.ValidationData = dsValLabeled;trainedNet = trainNetwork (dsTrainLabeled、lgraph选项);modelDateTime =字符串(datetime (“现在”格式=“yyyy-MM-dd-HH-mm-ss”));保存(dataDir +“trainedCamelyonNet——”+ modeldateTeTime +“.mat”“trainedNet”);其他的trainedCamelyonNet_url =“//www.tatmou.com/金宝appsupportfiles/vision/data/trainedcamelyonnet.mat”;dataDir = fullfile (tempdir,“Camelyon16”);downloadTrainedCamelyonNet (trainedCamelyonNet_url dataDir);负载(fullfile (dataDir“trousoycamelyonnet.mat”));结束

下载测试数据

Camelyon16测试数据集由130 WSI组成。这些图像具有正常和肿瘤组织。每个文件的大小约为2 GB。

要下载测试数据,请转到Camelyon17.网站,点击第一个“CAMELYON16数据集”链接。打开“testing”目录,然后按照以下步骤操作。

  • 下载“lesion_annotations.zip”文件。将所有文件解压缩到指定的目录testAnnotationDir变量。

  • 打开“images”目录。将文件下载到指定的目录testImageDir变量。

testDir = fullfile (dataDir,“测试”);testImageDir = fullfile (testDir,“图片”);testAnnotationDir = fullfile (testDir,“lesion_annotations”);如果~存在(testDir“dir”)MKDIR(TESTDIR);mkdir (fullfile (testDir,“图片”));mkdir (fullfile (testDir,“lesion_annotations”));结束

预处理测试数据

创建BlockedImage.用于管理测试映像的对象

获取测试映像的文件名。然后,创建一个数组BlockedImage.对象管理测试映像。每一个BlockedImage.对象指向磁盘上相应的映像文件。

testFileSet = matlab.io.datastore.FileSet (testImageDir + filesep +“测试*”);testImages = blockedImage (testFileSet);

方法设置所有训练数据的空间引用setSpatialReferencingForcamelyon16.helper函数。这个函数作为支持文件附加到示例中。金宝app的setSpatialReferencingForcamelyon16.功能设置WorldStartWorldEnd属性的BlockedImage.对象,使用来自TIF文件元数据的空间引用信息。

testimages = setspatialreferencingforcamelyon16(testimages);

创造组织面具

为了有效地处理WSI数据,为每个测试图像创建一个组织掩模。这个过程与对正常训练图像进行预处理的过程相同。有关更多信息,请参见用于训练分类网络的预处理多分辨率图像

普通Masklevel = 8;testtissuemaskdir = fullfile(testdir,“test_tissue_mask_level”+ num2str(普通Masklevel));如果〜ISFolder(testtissuemaskdir)testtissuemasks = apply(testimages,@(bs)im2gray(bs.data)<150,...blocksize = [512 512],...= normalMaskLevel水平,...UseParallel = canUseGPU,...DisplayWaitbar = false,...OutputLocation = testTissueMaskDir);保存(fullfile (testTissueMaskDir“testTissueMasks.mat”),“testTissueMasks”其他的%加载先前保存的数据load(fullfile(testtissuemaskdir,“testTissueMasks.mat”),“testTissueMasks”);结束

这种组织口罩只有一层,而且足够小,可以装入内存。将纸巾面具放在图片浏览器应用程序使用browseBlockedImageshelper函数。这个helper函数作为支持文件附加到示例中。金宝app

browseBlockedImages (testTissueMasks, 1);

预处理肿瘤地面真相图像

指定肿瘤遮罩的分辨率级别。

tumorMaskLevel = 8;

创建一个肿瘤遮罩为每个地面真实肿瘤图像使用createMaskForCamelyon16TumorTissuehelper函数。这个helper函数作为支持文件附加到示例中。金宝app该函数对每个图像执行以下操作:

  • 阅读(xy)注释XML文件中所有roi的边界坐标。

  • 将肿瘤和正常组织roi的边界坐标分离到单独的细胞阵列中。

  • 将边界的单元格阵列转换为使用的二进制阻塞图像polyToBlockedImage函数。在二值图像中,ROI表示肿瘤像素,背景表示正常组织像素。同时在肿瘤和正常组织roi内的像素被分类为背景。

testtumormaskdir = fullfile(testdir,[“test_tumor_mask_level”num2str(tumormasklevel)]);如果~isfolder(testTumorMaskDir) testTumorMasks = createatemaskforcamelyon16tumortissue (testestimages, testnotationdir,testTumorMaskDir,tumorMaskLevel);保存(fullfile (testTumorMaskDir“testtumormask.mat”),“testTumorMasks”其他的负载(fullfile (testTumorMaskDir“testtumormask.mat”),“testTumorMasks”);结束

预测肿瘤概率的热图

使用训练过的分类网络来预测每个测试图像的热图。热图给出了每个区块属于t的概率分数umor班级。该示例对每个测试图像执行这些操作以创建Heatmap:

  • 使用selectBlockLocations函数。属性包含至少有一个组织像素的所有块InclusionThreshold名称-值参数为0

  • 处理批量块使用应用函数定义的处理操作predictBlockhelper函数。helper函数作为支持文件附加到示例中。金宝app的predictBlock辅助函数调用预测(深度学习工具箱)函数,并返回该数据块为t的概率分数umor

  • 将热图数据写入TIF文件函数。处理完所有块后的最终输出是一个热图,显示了在整个WSI中发现肿瘤的概率。

numTest =元素个数(testImages);outputHeatmapsDir = fullfile (testDir,“热图”);networkBlockSize = (299299 3);抽搐印第安纳州= 1:numTest%检查TIF文件是否已经存在[~, id] = fileparts (testImages(印第安纳州).Source);输出文件= fullfile (outputHeatmapsDir id +“.tif”);如果~存在(输出文件,“文件”)bls = selectblocklocations(testimages(ind),级别= 1,...BlockSize = networkBlockSize,...掩码= testTissueMasks(印第安纳州),InclusionThreshold = 0);%生成的热图是内存中的blockedImage对象贝克海姆=应用(testImages(印第安纳州),@ (x) predictBlockForCamelyon16 (x, trainedNet),...水平= 1,BlockLocationSet = bls BatchSize = 128,...PadPartialBlocks = true, DisplayWaitBar = false);%将结果写入TIF文件写(贝克海姆,输出文件,BlockSize = [512 - 512]);结束结束toc

以数组的形式收集所有写好的热图BlockedImage.对象。

heatMapFileSet = matlab.io.datastore.FileSet (outputHeatmapsDir FileExtensions =“.tif”);bheatMapImages = blockedImage (heatMapFileSet);

可视化的热图

选择要显示的测试图像。在图形的左侧,将地面真实边界坐标显示为使用showCamelyon16TumorAnnotationshelper函数。这个helper函数作为支持文件附加到示例中。金宝app正常区域(以绿色边界显示)可以出现在肿瘤区域(以红色边界显示)内。

idx = 27个;图tiledlayout(1,2) nexttile hBim1 = showCamelyon16TumorAnnotations(testestimages (idx), testnotationdir);标题(“地面实况”

在图的右侧,显示测试图像的热图。

nexttile hBim2 = bigimageshow(bheatMapImages(idx),插值=“最近”);colormap(飞机)

连接坐标轴并放大到感兴趣的区域。

Linkaxes([HBIM1.Parent,HBIM2.Partent])XLIM([53982,65269])ylim([122475,133762])标题(“预言的热图”

在特定阈值对测试图像进行分类

将积木分类为肿瘤正常的,对热图概率值应用一个阈值。

选择一个阈值概率,块被归类为肿瘤.理想情况下,您可以使用验证数据集上的接收者工作特征(ROC)或精度召回曲线来计算这个阈值。

打= 0.8;

对每个测试图像中的块进行分类,并使用应用函数定义的处理操作computeblockconfusionmatrixforcamelyon16.helper函数。helper函数作为支持文件附加到示例中。金宝app

computeblockconfusionmatrixforcamelyon16.Helper函数在每个热图上执行以下操作:

  • 调整和改进地面真相掩模,以匹配热图的大小。

  • 在热图上应用阈值。

  • 在最佳分辨率水平上计算所有块的混淆矩阵。混淆矩阵给出了真阳性(TP)、假阳性(FP)、真阴性(TN)和假阴性(FN)分类预测的数量。

  • 将TP、FP、TN和FN块的总数保存为块图像中的一个结构。阻塞图像作为阻塞图像数组中的一个元素返回,Bcmatrix.

  • 将分类预测的数字标记图像保存在阻塞图像中。0、1、2、3分别对应TN、FP、FN、TP结果。阻塞图像作为阻塞图像数组中的一个元素返回,Bcmatriximage.

IND = 1:numtest [bcmatrix(ind),bcmatriximage {ind}] =应用(bheatmapimages(ind),...@(bs,tumormask,tissuemask)computeblockconfusionmatrixforcamelyon16(bs,tumormask,tissuemask,thresh),...ExtraImages = [testTumorMasks(印第安纳州),testTissueMasks(印第安纳州)]);结束

计算所有测试图像的全局混淆矩阵。

cmArray = arrayfun (@ (c)收集(c), bcmatrix);厘米=[和([cmArray.tp])和([cmArray.fp]);和([cmArray.fn])和([cmArray.tn])];

显示归一化全局混淆矩阵的混淆图。WSI图像中的大部分块都是正常组织,这导致了很高比例的真实负预测。

图confusionchart(厘米,“瘤”“正常”),归一化=“total-normalized”

可视化分类结果

将地面真相ROI边界坐标与分类结果进行比较。在图的左侧,将地面真理边界坐标显示为手绘ROI。在图的右侧,基于混淆矩阵显示测试图像并在每个块上叠加颜色。将真正的阳性显示为红色,假阳性为青色,假阴性为黄色,以及无颜色的真实负面。

假阴性和假阳性出现在肿瘤区域的边缘,说明该网络难以用部分类对块进行分类。

idx = 27个;图tiledlayout(1,2) nexttile hBim1 = showCamelyon16TumorAnnotations(testestimages (idx), testnotationdir);标题(“地面实况”) nexttile hBim2 = bigimageshow(testestimages (idx));cmColormap = [0 0 0;0 1 1;1 1 0;1 0 0];showlabels (hBim2 bcmatrixImage {idx},...colormap = cmcolormap,alphadata = bcmatriximage {idx})

标题(“分类块”) linkaxes([hBim1.Parent,hBim2.Parent]) xlim([56000 63000]) ylim([125000 132600])

注:为了减少肿瘤周边的分类误差,可以使用不均匀的块对网络进行再训练。当预处理肿瘤培训数据集的块,降低了值的值InclusionThreshold名称值参数。

用AUC-ROC曲线量化网络预测

使用。计算不同阈值下的ROC曲线值computeROCCurvesForCamelyon16helper函数。这个helper函数作为支持文件附加到示例中。金宝app

阈值= [1 0.99 0.9: - 。1:.1 0.05 0];[TPR,FPR,PPV] = Computeroccurvesforcamelyon16(BheatMapimages,testTumormask,TestTisSuemasks,阈值);

计算曲线下面积(AUC)度量使用trapz函数。该度量返回一个范围为[0,1]的值,其中1表示完美的模型性能。该数据集的AUC接近于1。您可以使用AUC来微调培训过程。

图楼梯(玻璃钢、tpr、“-”);ROCAUC = trapz(玻璃钢,tpr);标题([“曲线下的区域:”num2str (ROCAUC)]);包含(“假阳性”) ylabel (“真阳性率”

参考文献

Ehteshami Bejnordi, Babak, Mitko Veta, Paul Johannes van Diest, Bram van Ginneken, Nico Karssemeijer, Geert Litjens, Jeroen A. W. M. van der Laak, et al.“深度学习算法检测乳腺癌女性淋巴结转移的诊断评估”。《美国医学会杂志》318年,没有。22(2017年12月12日):2199-2210。https://doi.org/10.1001/jama.2017.14585

[2] Szegedy, Christian, Vincent Vanhoucke, Sergey Ioffe, jonathan Shlens, Zbigniew Wojna。“重新思考计算机视觉的Inception架构。”预印本,2015年12月2日提交。https://arxiv.org/abs/1512.00567v3

[3]想象力。https://www.image-net.org

另请参阅

|||||(深度学习工具箱)|(深度学习工具箱)

相关的例子

更多关于