多分辨率闭塞图像中肿瘤的分类
这个例子展示了如何使用Inception-v3深度神经网络对内存中可能不适合的多分辨率完整幻灯片图像(WSIs)进行分类。
肿瘤分类的深度学习方法依赖于数字病理学,该方法对整个组织切片进行成像和数字化。由此产生的wsi具有高分辨率,大约为20万乘10万像素。wsi通常以多分辨率格式存储,以促进图像的高效显示、导航和处理。
该示例概述了一个使用基于块的处理来训练大型WSIs的体系结构。该示例训练一个基于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网络支持包的深度学习工具箱™模型。如果没有安装此支持包,则该功能提供下载链接。
网= inceptionv3;lgraph = layerGraph(净);
卷积层网络提取图像特征。最后一个可学习层和最后一个分类层利用图像特征对输入图像进行分类。这两层包含了如何将特征组合成类概率、损失值和预测标签的信息。为了重新训练预训练的网络来分类新图像,用适应新数据集的新层替换这两层。有关更多信息,请参见训练深度学习网络对新图像进行分类(深度学习工具箱).
使用helper函数找到要替换的两个层的名称findLayersToReplace
.该函数作为支持文件附加到示例中。在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 checkpointdir = fullfile(dataDir,“检查点”);如果~存在(checkpointsDir“dir”mkdir (checkpointsDir);结束options.CheckpointPath = checkpointsDir;options.ValidationData = dsValLabeled;trainedNet = trainNetwork (dsTrainLabeled、lgraph选项);modelDateTime =字符串(datetime (“现在”格式=“yyyy-MM-dd-HH-mm-ss”));保存(dataDir +“trainedCamelyonNet——”+ modelDateTime +“.mat”,“trainedNet”);其他的trainedCamelyonNet_url =“//www.ru-cchi.com/supportfiles/vision/data/trainedCamelyonNet.mat”;dataDir = fullfile (tempdir,“Camelyon16”);downloadTrainedNetwork (trainedCamelyonNet_url dataDir);负载(fullfile (dataDir“trainedCamelyonNet.mat”));结束
下载测试数据
Camelyon16测试数据集由130个WSIs组成。这些图像既有正常组织也有肿瘤组织。每个文件的大小大约为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函数。该函数作为支持文件附加到示例中。的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”);结束
组织面具只有一层,足够小,可以装进记忆。显示组织掩模图片浏览器应用程序使用browseBlockedImages
helper函数。这个助手函数作为支持文件附加到示例中。
browseBlockedImages (testTissueMasks, 1);
预处理肿瘤地面真实图像
指定肿瘤遮罩的分辨率级别。
tumorMaskLevel = 8;
为每个地面真实肿瘤图像创建肿瘤蒙版createMaskForCamelyon16TumorTissue
helper函数。这个助手函数作为支持文件附加到示例中。函数对每个图像执行以下操作:
阅读(x,y)注释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
.方法处理批量块
应用
类定义的处理操作predictBlock
helper函数。helper函数作为支持文件附加到示例中。的predictBlock
助手函数调用预测
(深度学习工具箱)函数对数据块进行处理,并返回该数据块所在的概率分数肿瘤
.方法将热图数据写入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);
可视化的热图
选择要显示的测试图像。在图的左侧,将地面真相边界坐标显示为写意roishowCamelyon16TumorAnnotations
helper函数。这个助手函数作为支持文件附加到示例中。正常区域(绿色边界所示)可以发生在肿瘤区域(红色边界所示)内。
idx = 27个;图tiledlayout(1,2) nexttile hBim1 = showCamelyon16TumorAnnotations(testImages(idx),testAnnotationDir);标题(“地面实况”)
在图的右侧,显示测试图像的热图。
nexttile hBim2 = bigimageshow(bheatMapImages(idx),插值=“最近的”);colormap(飞机)
连接坐标轴,放大你感兴趣的区域。
linkaxes([hbmb . parent, hbmb . parent]) xlim([53982, 65269]) ylim([122475, 133762]) title(“预言的热图”)
根据特定阈值对测试图像进行分类
将块分类为肿瘤
或正常的
,对热图概率值应用阈值。
选择一个阈值概率,高于这个概率的块被分类为肿瘤
.理想情况下,您可以使用验证数据集上的受试者工作特征(ROC)或精度-召回曲线计算该阈值。
打= 0.8;
对每个测试图像中的块进行分类,并使用应用
类定义的处理操作computeBlockConfusionMatrixForCamelyon16
helper函数。helper函数作为支持文件附加到示例中。
的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}] = apply(bheatMapImages(ind),...@ (bs tumorMask tissueMask) computeBlockConfusionMatrixForCamelyon16(废话,tumorMask, tissueMask打),...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(testImages(idx),testAnnotationDir);标题(“地面实况”nexttile hBim2 = bigimageshow(testImages(idx));cmColormap = [0 0 0;0 1 1;1 1 0;1 0 0];showlabels (hBim2 bcmatrixImage {idx},...Colormap = cmColormap AlphaData = bcmatrixImage {idx})标题(“分类模块”) linkaxes([hbmb . parent, hbmb . parent]) xlim([56000 63000]) ylim([125000 132600])
注意:为了减少肿瘤周围的分类错误,可以用同质性较小的块重新训练网络。当预处理肿瘤
块的训练数据集,减少的值InclusionThreshold
名称-值参数。
用AUC-ROC曲线量化网络预测
计算不同阈值处的ROC曲线值computeROCCurvesForCamelyon16
helper函数。这个助手函数作为支持文件附加到示例中。
Threshs = [1 0.99 0.9:-.1:.]1 0.05 0];(tpr,玻璃钢,ppv) = computeROCCurvesForCamelyon16 (bheatMapImages、testTumorMasks testTissueMasks,打);
方法计算曲线下面积(AUC)度量trapz
函数。该度量返回一个范围为[0,1]的值,其中1表示完美的模型性能。该数据集的AUC接近于1。您可以使用AUC来微调训练过程。
图楼梯(玻璃钢、tpr、“-”);ROCAUC = trapz(玻璃钢,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.
Szegedy, Christian, Vincent Vanhoucke, Sergey Ioffe, Jonathon Shlens, Zbigniew Wojna。“重新思考计算机视觉的初始架构。”预印本,2015年12月2日提交。https://arxiv.org/abs/1512.00567v3.
[3] ImageNet。https://www.image-net.org.
另请参阅
blockedImageDatastore
|blockedImage
|blockLocationSet
|selectBlockLocations
|bigimageshow
|trainingOptions
(深度学习工具箱)|trainNetwork
(深度学习工具箱)
相关的例子
更多关于
- 为阻塞图像设置空间引用
- 使用部分图像或较低分辨率有效处理阻塞图像
- 使用掩码有效处理阻塞图像
- 从roi和掩码创建标记的阻塞图像
- 用于深度学习的数据存储(深度学习工具箱)
- 深度学习层列表(深度学习工具箱)