这个示例展示了如何使用Inception-v3深度神经网络对可能无法放入内存的多分辨率完整幻灯片图像(WSIs)进行分类。
肿瘤分类的深度学习方法依赖于数字病理学,其中整个组织切片被成像和数字化。由此产生的WSI具有高分辨率,约为200000×100000像素。WSI通常以多分辨率格式存储,以促进图像的高效显示、导航和处理。
该示例概述了使用基于块的处理来训练大型WSIs的体系结构。该示例使用迁移学习技术训练了一个基于Inception-v3的网络,将个体块分类为典型的
或肿瘤
.
如果您不想下载训练数据和训练网络,那么继续列车或下载网络这个例子的一部分。
按照手册中的说明准备培训和验证数据多分辨率图像预处理用于训练分类网络(图像处理工具箱).预处理示例将预处理后的培训和验证数据存储保存在一个名为trainingAndValidationDatastores.mat
.
设置数据目录
变量的位置trainingAndValidationDatastores.mat
文件所在的位置。将培训和验证数据存储加载到所调用的变量中dsTrainLabeled
和
dsValLabeled
.
dataDir = fullfile (tempdir,“Camelyon16”);加载(完整文件),“trainingAndValidationDatastores.mat”))
本例使用了一个Inception-v3网络[2],这是一个卷积神经网络,它对来自ImageNet数据库[3]的100多万张图像进行了训练。该网络有48层深度,可以将图像分类为1000个对象类别,如键盘、鼠标、铅笔和许多动物。
的接收v3
函数返回一个预先训练过的初始化v3网络。启盗-v3需要深度学习工具箱™模型用于启盗-v3网络支持包。金宝app如果没有安装此支金宝app持包,则该函数将提供下载链接。
净=接收v3;lgraph=层图(净);
网络的卷积层提取图像特征。最后一个可学习层和最后一个分类层利用图像特征对输入图像进行分类。这两层包含如何将特征组合成类别概率、损失值和预测标签的信息。为了重新训练一个预先训练的网络来分类新的图像,将这两层替换为适应新数据集的新层。有关更多信息,请参见训练深度学习网络对新图像进行分类.
使用helper函数查找要替换的两个层的名称FindlayerStore酒店
.这个函数作为支持文件附加到示例中。金宝app在《盗梦空间》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内存。虽然较大的小批量可以使训练更快,但较大的小批量会降低网络的泛化能力。集重置输入规范化
到假
防止完整读取训练数据以计算规范化统计信息。
checkpointsDir=fullfile(dataDir,“检查点”);如果~exist(checkpointsDir,“dir”)mkdir(sdir);结束选择= trainingOptions (“rmsprop”,...MaxEpochs = 1,...MiniBatchSize = 256,...洗牌=“every-epoch”,...验证频率=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——”+ modelDateTime +“.mat”,“培训网”);其他的trainedCamelyonNet_url =“//www.tatmou.com/金宝appsupportfiles/vision/data/trainedCamelyonNet.mat”;dataDir=fullfile(tempdir,“Camelyon16”);downloadTrainedCamelyonNet (trainedCamelyonNet_url dataDir);负载(fullfile (dataDir“trainedCamelyonNet.mat”));结束
Camelyon16测试数据集由130个WSIs组成。这些图像既有正常组织也有肿瘤组织。每个文件的大小约为2gb。
要下载测试数据,请进入Camelyon17网站,点击第一个“CAMELYON16数据集”链接。打开“testing”目录,然后按照以下步骤操作。
下载“Descose_annotations.zip”文件。将所有文件解压缩到testAnnotationDir
变量
打开“images”目录。将文件下载到指定的目录testImageDir
变量
testDir = fullfile (dataDir,“测试”);testImageDir = fullfile (testDir,“图片”);testAnnotationDir=完整文件(testDir,“lesion_annotations”);如果~exist(testDir,“目录”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
函数设置WorldStart
和世界末日
各自的特性blockedImage
对象,使用来自TIF文件元数据的空间引用信息。
testImages = setSpatialReferencingForCamelyon16 (testImages);
为了有效地处理WSI数据,请为每个测试图像创建一个组织遮罩。此过程与用于预处理正常训练图像的过程相同。有关更多信息,请参阅多分辨率图像预处理用于训练分类网络(图像处理工具箱).
normalMaskLevel = 8;testTissueMaskDir = fullfile (testDir,“测试\u组织\u面罩\u水平”+ num2str (normalMaskLevel));如果~isfolder(testTissueMaskDir) testTissueMasks = apply(testestimages, @(bs)im2gray(bs. data)<150,...BlockSize = (512 512),...级别=正常掩码级别,...UseParallel = canUseGPU,...DisplayWaitbar = false,...OutputLocation = testTissueMaskDir);保存(fullfile (testTissueMaskDir“testTissueMasks.mat”),“测试面具”)其他的%加载先前保存的数据负载(fullfile (testTissueMaskDir“testTissueMasks.mat”),“测试面具”);结束
组织遮罩只有一个级别,并且足够小,可以放入内存中。请在中显示组织遮罩图片浏览器应用程序使用browseBlockedImages
helper函数。该helper函数作为支持文件附加到示例中。金宝app
browseBlockedImages (testTissueMasks, 1);
指定肿瘤遮罩的分辨率级别。
肿瘤标志物水平=8;
使用创建MaskForCamelon16肿瘤问题
helper函数。该helper函数作为支持文件附加到示例中。金宝app该函数对每个图像执行以下操作:
阅读(x,y)注释XML文件中所有roi的边界坐标。
将肿瘤和正常组织roi的边界坐标分离到单独的细胞阵列中。
控件将边界坐标的单元格数组转换为二进制块图像polyToBlockedImage
(图像处理工具箱)函数。在二值图像中,ROI表示肿瘤像素,背景表示正常组织像素。同时在肿瘤和正常组织roi内的像素被分类为背景。
testTumorMaskDir = fullfile (testDir, (“test_tumor_mask_level”num2str (tumorMaskLevel)]);如果~isfolder(testTumorMaskDir)testTumorMasks=createmaskforcamelyon16tumorissue(testImages,testnotationdir,testTumorMaskDir,tumorMaskLevel);save(fullfile(testTumorMaskDir,“testTumorMasks.mat”),“testTumorMasks”)其他的加载(完整文件(testTumorMaskDir,“testTumorMasks.mat”),“testTumorMasks”);结束
使用经过训练的分类网络预测每个测试图像的热图。热图给出了每个块为t的概率分数瘤
类。示例对每个测试图像执行以下操作来创建一个热图:
使用selectBlockLocations
(图像处理工具箱)函数。属性包含至少有一个组织像素的所有块InclusionThreshold
名称-值参数为0
.
使用申请
(图像处理工具箱)函数定义的处理操作预测块
helper函数。helper函数作为支持文件附加到示例中。金宝app的预测块
辅助函数调用预测
函数,并返回该数据块为t的概率分数瘤
.
使用将热图数据写入TIF文件写
(图像处理工具箱)函数。处理完所有块后的最终输出是一个热图,显示了在整个WSI中发现肿瘤的概率。
numTest =元素个数(testImages);outputHeatmapsDir = fullfile (testDir,“热图”);networkBlockSize = (299299 3);抽搐为印第安纳州= 1:numTest%检查TIF文件是否已经存在[~,id]=fileparts(testImages(ind).Source);outFile=fullfile(outputHeatmapsDir,id+“.tif”);如果~exist(outFile,“文件”bls = selectBlockLocations(testestimages (ind),Levels=1,...BlockSize = networkBlockSize,...掩码= testTissueMasks(印第安纳州),InclusionThreshold = 0);%生成的热图是内存中的blockedImage对象bhm=应用(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);
选择要显示的测试图像。在地物的左侧,使用showCamelyon16TumorAnnotations
helper函数。该helper函数作为支持文件附加到示例中。金宝app正常区域(以绿色边界显示)可以出现在肿瘤区域(以红色边界显示)内。
idx = 27个;图tiledlayout(1,2) nexttile hBim1 = showCamelyon16TumorAnnotations(testestimages (idx), testnotationdir);标题(“地面实况”)
在图的右侧,显示测试图像的热图。
nexttile hBim2 = bigimageshow(bheatMapImages(idx),插值=“最近的”);colormap(飞机)
连接坐标轴并放大到感兴趣的区域。
链接轴([hBim1.Parent,hBim2.Parent]) xlim([53982,65269]) ylim([122475,133762]) title(“预言的热图”)
将积木分类为肿瘤
或典型的
,对热图概率值应用一个阈值。
选择一个阈值概率,上面的块被分类为肿瘤
.理想情况下,您可以使用验证数据集上的接收者工作特征(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
.
为bheatMapImages(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(厘米,“肿瘤”,“正常”),归一化=“总标准化”)
将地真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})
标题(“分类模块”)链接轴([hBim1.Parent,hBim2.Parent])xlim([56000 63000])ylim([125000 132600])
注:为了减少肿瘤周边的分类误差,可以使用不均匀的块对网络进行再训练。当预处理肿瘤
块的训练数据集,降低的值InclusionThreshold
名称-值参数。
使用以下公式计算不同阈值下的ROC曲线值:计算机占位符
helper函数。该helper函数作为支持文件附加到示例中。金宝app
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 (“真阳性率”)
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] ImageNet。https://www.image-net.org.
blockedImageDatastore
(图像处理工具箱)|blockedImage
(图像处理工具箱)|blockLocationSet
(图像处理工具箱)|selectBlockLocations
(图像处理工具箱)|bigimageshow
(图像处理工具箱)|trainingOptions
|trainNetwork