主要内容

在多分辨率阻塞图像中对肿瘤进行分类

这个例子展示了如何使用Inception-v3深度神经网络对可能不适合内存的多分辨率整张幻灯片图像(WSIs)进行分类。

肿瘤分类的深度学习方法依赖于数字病理学,其中整个组织切片被成像和数字化。生成的wsi具有高分辨率,大约为200000 × 100000像素。wsi通常以多分辨率格式存储,以促进有效的显示、导航和图像处理。

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

如果不想下载训练数据并训练网络,则继续训练网络或下载预训练网络部分的示例。

准备培训数据

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

的值dataDir变量的位置trainingAndValidationDatastores.mat文件已定位。将训练和验证数据存储加载到名为dsTrainLabeled而且dsValLabeled

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

设置迁移学习的Inception-v3网络层

这个例子使用了Inception-v3网络[2],这是一个卷积神经网络,它是在ImageNet数据库[3]中的100多万张图像上进行训练的。该网络有48层,可以将图像分类为1000个对象类别,例如键盘、鼠标、铅笔和许多动物。

inceptionv3(深度学习工具箱)函数返回预先训练好的Inception-v3网络。Inception-v3需要深度学习工具箱™模型用于Inception-v3网络支持包。金宝app如果没有安装此支金宝app持包,则该函数将提供下载链接。

Net = inceptionv3;lgraph = layerGraph(net);

网络的卷积层提取图像特征。最后一层学习层和最后一层分类层利用图像特征对输入图像进行分类。这两层包含关于如何将特征组合成类概率、损失值和预测标签的信息。为了重新训练一个预先训练好的网络来分类新图像,用适应新数据集的新层替换这两个层。有关更多信息,请参见训练深度学习网络对新图像进行分类(深度学习工具箱)

使用helper函数查找要替换的两个层的名称findLayersToReplace.该函数作为支持文件附加到示例中。金宝app在Inception-v3中,这两个层被命名为“预测“而且”ClassificationLayer_predictions".

[learnableLayer,classLayer] = findLayersToReplace(lgraph);

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

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为了防止完全读取训练数据来计算归一化统计。

选项= trainingOptions(“rmsprop”MaxEpochs = 1,MiniBatchSize = 256,洗牌=“every-epoch”ValidationFrequency = 250,InitialLearnRate = 1的军医,SquaredGradientDecayFactor = 0.99,ResetInputNormalization = false,情节=“训练进步”);

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

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

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

如果可用,在一个或多个gpu上训练。使用GPU需要并行计算工具箱™和支持CUDA®的NVIDIA®GPU。有关更多信息,请参见GPU计算要求(并行计算工具箱)

doTraining =如果doTraining checkpointtsdir = fullfile(dataDir,“检查点”);如果~存在(checkpointsDir“dir”mkdir (checkpointsDir);结束options.CheckpointPath = checkpointsDir;options.ValidationData = dsValLabeled;trainedNet = trainNetwork(dsTrainLabeled,lgraph,options);modelDateTime = string(datetime(“现在”格式=“yyyy-MM-dd-HH-mm-ss”));保存(dataDir +“trainedCamelyonNet——”+ modelDateTime +“.mat”“trainedNet”);其他的trainedCamelyonNet_url =“//www.tatmou.com/金宝appsupportfiles/vision/data/trainedCamelyonNet.mat”;dataDir = fullfile(tempdir,“Camelyon16”);downloadTrainedNetwork (trainedCamelyonNet_url dataDir);负载(fullfile (dataDir“trainedCamelyonNet.mat”));结束

下载测试数据

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

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

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

  • 打开images目录。方法指定的目录下下载文件testImageDir变量。

testDir = fullfile(dataDir,“测试”);testImageDir = fullfile(testDir,“图片”);teststannotationdir = 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);

属性为所有训练数据设置空间引用setSpatialReferencingForCamelyon16helper函数。该函数作为支持文件附加到示例中。金宝app的setSpatialReferencingForCamelyon16函数设置WorldStart而且WorldEnd每个的属性blockedImage对象使用来自TIF文件元数据的空间引用信息。

testImages = setSpatialReferencingForCamelyon16(testImages);

制作纸巾面膜

为了有效地处理WSI数据,为每个测试图像创建一个组织掩膜。该过程与普通训练图像的预处理过程相同。有关更多信息,请参见训练分类网络的多分辨率图像预处理

normalMaskLevel = 8;testDir = fullfile(dataDir,“测试”);testTissueMaskDir = fullfile(testDir,“test_tissue_mask_level”+ num2str (normalMaskLevel));如果~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”其他的加载以前保存的数据负载(fullfile (testTissueMaskDir“testTissueMasks.mat”),“testTissueMasks”);结束

组织掩膜只有一层,并且足够小以适应内存。中显示组织掩模图片浏览器应用程序使用browseBlockedImageshelper函数。这个helper函数作为支持文件附加到示例中。金宝app

browseBlockedImages (testTissueMasks, 1);

ImageBrowser_testing_tissue.png

预处理肿瘤地面真实图像

指定肿瘤掩膜的分辨率级别。

tumorMaskLevel = 8;

属性为每个ground truth肿瘤图像创建一个肿瘤掩膜createMaskForCamelyon16TumorTissuehelper函数。这个helper函数作为支持文件附加到示例中。金宝app该函数对每个图像执行以下操作:

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

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

  • 方法将边界坐标的单元格数组转换为二进制块图像polyToBlockedImage函数。二值图像中,ROI为肿瘤像素点,背景为正常组织像素点。同时位于肿瘤和正常组织roi内的像素点被归类为背景。

testTumorMaskDir = fullfile(testDir,[“test_tumor_mask_level”num2str (tumorMaskLevel)]);如果~isfolder(testTumorMaskDir) testTumorMasks = createMaskForCamelyon16TumorTissue(testImages,testAnnotationDir,testTumorMaskDir,tumorMaskLevel);保存(fullfile (testTumorMaskDir“testTumorMasks.mat”),“testTumorMasks”其他的负载(fullfile (testTumorMaskDir“testTumorMasks.mat”),“testTumorMasks”);结束

预测肿瘤概率热图

使用训练过的分类网络预测每个测试图像的热图。热图给出了每个块的概率分数肿瘤类。示例为每个测试图像执行以下操作来创建热图:

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

  • 方法处理批量块应用方法定义的处理操作predictBlockhelper函数。helper函数作为支持文件附加到示例中。金宝app的predictBlockHelper函数调用预测(深度学习工具箱)函数对数据块进行处理,并返回该块所在的概率分数肿瘤

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

numTest = numel(testImages);outputHeatmapsDir = fullfile(testDir,“热图”);networkBlockSize = [299,299,3];抽搐ind = 1:numTest检查TIF文件是否已经存在[~,id] = fileparts(testImages(ind).Source);outFile = fullfile(outputHeatmapsDir,id+“.tif”);如果~存在(输出文件,“文件”) bls = selectBlockLocations(testImages(ind),级别=1,BlockSize = networkBlockSize,掩码= testTissueMasks(印第安纳州),InclusionThreshold = 0);生成的热图是内存中的blockedImage对象bhm = apply(testImages(ind),@(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);

可视化的热图

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

Idx = 27;figure tiledlayout(1,2) nexttile hBim1 = showCamelyon16TumorAnnotations(testImages(idx),testAnnotationDir);标题(“地面实况”

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

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

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

linkaxes([hbb1 . parent, hbb2 . parent]) xlim([53982, 65269]) ylim([122475, 133762]) title(“预言的热图”

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

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

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

脱粒= 0.8;

分类每个测试图像中的块,并计算混淆矩阵使用应用方法定义的处理操作computeBlockConfusionMatrixForCamelyon16helper函数。helper函数作为支持文件附加到示例中。金宝app

computeBlockConfusionMatrixForCamelyon16Helper函数对每个热图进行如下操作:

  • 调整和细化地面真相蒙版,以匹配热图的大小。

  • 在热图上应用该阈值。

  • 在最好的分辨率水平上计算所有块的混淆矩阵。混淆矩阵给出了真阳性(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}] = apply(bheatMapImages(ind),@ (bs tumorMask tissueMask) computeBlockConfusionMatrixForCamelyon16(废话,tumorMask, tissueMask打),ExtraImages = [testTumorMasks(印第安纳州),testTissueMasks(印第安纳州)]);结束

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

cmArray = arrayfun(@(c)gather(c),bcmatrix);cm = [sum([cmArray.tp]),sum([cmArray.fp]);和([cmArray.fn])和([cmArray.tn])];

显示归一化全局混淆矩阵的混淆图。WSI图像中的大多数块是正常组织,导致真实阴性预测的比例很高。

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

可视化分类结果

将地面真实感兴趣区边界坐标与分类结果进行比较。在图的左侧,将地面真实值边界坐标显示为徒手roi。在图的右侧,显示测试图像,并根据混淆矩阵在每个块上叠加一种颜色。将真阳性显示为红色,假阳性显示为青色,假阴性显示为黄色,真阴性显示为无颜色。

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

Idx = 27;figure tiledlayout(1,2) nexttile hBim1 = showCamelyon16TumorAnnotations(testImages(idx),testAnnotationDir);标题(“地面实况”) nexttile hBim2 = bigimageshow(testImages(idx));cmColormap = [0 0 0;0 1 1;11 10;10 0 0];showlabels (hBim2 bcmatrixImage {idx},Colormap = cmColormap AlphaData = bcmatrixImage {idx})标题(“分类模块”) linkaxes([hbbm . parent, hbbm . 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] = computeroccurs forcamelyon16 (bheatMapImages,testTumorMasks,testTissueMasks, thresholds);

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

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

参考文献

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

塞格迪、克里斯蒂安、文森特·范豪克、谢尔盖·约菲、乔纳森·史伦斯和兹比格涅夫·沃伊纳。“重新思考计算机视觉的初始架构。”预印本,2015年12月2日提交。https://arxiv.org/abs/1512.00567v3

[3] ImageNet。https://www.image-net.org

另请参阅

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

相关的例子

更多关于