主要内容

分类大的多分辨率图像使用blockedImage深度学习

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

诊断乳腺癌的唯一明确方法是检查从活检或手术中收集的组织样本。样品通常用苏木精和伊红(H&E)染色制备,以增加组织结构的对比度。传统上,病理学家在显微镜下检查玻片上的组织以检测肿瘤组织。诊断需要时间,因为病理学家必须在近距离放大下彻底检查整个玻片。此外,病理学家可能不会注意到小肿瘤。深度学习方法旨在自动化检测肿瘤组织,节省时间,提高小肿瘤的检出率。

肿瘤分类的深度学习方法依赖于数字病理学,其中整个组织切片被成像和数字化。产生的wsi具有极高的分辨率。wsi通常存储在一个多分辨率文件中,以方便图像的显示、导航和处理。

读取wsi是一个挑战,因为图像不能作为一个整体加载到内存中,因此需要核外图像处理技术。您可以通过使用存储和处理这种类型的大型多分辨率图像blockedImage对象。您可以从blockedImage对象的使用blockedImageDatastore对象。

这个例子展示了如何训练深度学习网络来对非常大的多分辨率图像中的肿瘤进行分类blockedImage而且blockedImageDatastore.本例将分类结果显示为热图,描绘局部组织为肿瘤的概率。肿瘤区域的定位使医学病理学家能够研究特定区域,并快速识别图像中任何大小的肿瘤。

下载培训资料

这个例子使用了Camelyon16挑战的WSIs [1].来自该挑战的数据包含来自两个独立来源的400个淋巴结WSIs,分为270个训练图像和130个测试图像。wsi以11级金字塔结构的剥离格式存储为TIF文件。

训练数据集包括159个正常淋巴结WSIs和111个肿瘤和健康组织淋巴结WSIs。通常,肿瘤组织是健康组织的一小部分。病灶边界的Ground truth坐标伴随肿瘤图像。

每个训练文件的大小大约为2 GB。如果您不想下载训练数据集或训练网络,请直接转到训练或下载网络节。

创建一个目录来存储训练数据集。

trainingImageDir = fullfile(tempdir,“Camelyon16”“培训”);如果~存在(trainingImageDir“dir”mkdir (trainingImageDir);mkdir (fullfile (trainingImageDir,“正常”));mkdir (fullfile (trainingImageDir,“肿瘤”));mkdir (fullfile (trainingImageDir,“lesion_annotations”));结束trainNormalDataDir = fullfile(trainingImageDir,“正常”);trainTumorDataDir = fullfile(trainingImageDir,“肿瘤”);trainTumorAnnotationDir = fullfile(trainingImageDir,“lesion_annotations”);

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

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

  • 打开“normal”目录。方法指定的目录下下载映像trainNormalDataDir变量。

  • 打开“肿瘤”目录。方法指定的目录下下载映像trainTumorDataDir变量。

指定训练图像的数量。请注意,正常组织的训练图像之一“normal_144.tif”的元数据不能被读取blockedImage对象。这个例子使用了剩下的158个训练文件。

numNormalFiles = 158;numTumorFiles = 111;

可视化培训数据

为了更好地理解训练数据,可以展示一张训练图像。由于无法以最佳分辨率将整个图像加载到内存中,因此不能使用传统的图像显示功能,例如imshow.要显示和处理图像数据,使用blockedImage对象。

创建一个blockedImage来自肿瘤训练图像的对象。

tumorFileName = fullfile(trainTumorDataDir,“tumor_001.tif”);tumorImage = blockedImage(tumorFileName);

检查尺寸blockedImage在每个分辨率级别。级别1具有最多的像素,是最好的分辨率级别。10级像素最少,分辨率最高。纵横比并不一致,这表明关卡并不都跨越相同的世界区域。

levelSizeInfo = table((1:length(tumorImage.Size))',...tumorImage.Size (: 1),...tumorImage.Size (:, 2),...tumorImage.Size(: 1)。/ tumorImage.Size (:, 2),...“VariableNames”,[“分辨率水平”“图像宽度”“图像高度”“比例”])
levelSizeInfo =11×4表分辨率级别图像宽度图像高度纵横比________________ ___________ ____________ ____________ 1 2.2118e+05 97792 2.2618 2 1.1059e+05 49152 2.25 3 55296 24576 2.25 4 27648 12288 2.25 5 13824 6144 2.25 6 7168 3072 2.3333 7 1577 3629 0.43455 8 3584 1536 2.3333 9 2048 1024 2 10 1024 512 211 512 512 1

显示blockedImage在粗分辨率级别上使用bigimageshow函数。类的句柄bigimageshow对象。你可以用手柄调节显示。图像中有很多空白。组织只占图像的一小部分。

h = bigimageshow(tumorImage,“ResolutionLevel”8);

通过设置水平和垂直空间范围来放大图像的一部分,以达到最佳分辨率水平。图像看起来很模糊,因为这个分辨率非常粗糙。

xlim((29471、29763));ylim((117450、118110));

若要查看更多详细信息,请将分辨率级别更改为更精细的级别。

h.ResolutionLevel = 1;

创建面具

您可以通过只处理感兴趣的区域(roi)来减少计算量。使用掩码来定义roi。掩码是一个逻辑映像,其中真正的像素表示ROI。

为了进一步减少计算量,可以在完全可以在内存中处理的粗分辨率级别上创建掩码,而不是逐个块地处理。如果粗分辨率级别的空间引用与细分辨率级别的空间引用匹配,则粗分辨率级别的位置对应于细分辨率级别的位置。在这种情况下,您可以使用粗掩码来选择在更细的级别上处理哪些块。有关更多信息,请参见为阻塞的图像设置空间引用而且使用掩码有效地处理阻塞的图像

指定用于创建掩码的分辨率级别。本例使用分辨率级别7,这个级别比较粗糙,适合内存。注意blockedImage对象根据每个级别中的像素数自动对多分辨率图像中的级别从最细到最粗进行排序。一些Camelyon16图像文件包含一个中等分辨率的掩码。本例在确定和读取第七层图像数据时忽略掩码。

resolutionLevel = 7;

为普通图像创建掩码

在正常图像中,ROI由健康组织组成。健康组织的颜色与背景颜色不同,因此使用颜色阈值分割图像并创建ROI。L*a*b*颜色空间为分割提供了最好的颜色分离。将图像转换为L*a*b*颜色空间,然后阈值a*通道以创建组织掩膜。

可以使用helper函数createMaskForNormalTissue使用颜色阈值创建掩码。这个helper函数作为支持文件附加到示例中。万博1manbetx

helper函数对每个正常组织的训练图像执行以下操作:

  • 创建一个blockedImage对象从TIF图像文件。

  • 从图像元数据中设置所有分辨率级别的空间引用。

  • 获取粗分辨率级别的图像。

  • 将粗图像转换为L*a*b*颜色空间,然后提取a*通道。

  • 通过使用Otsu的方法对图像进行阈值处理来创建一个二值图像,该方法最小化了黑白像素之间的类内方差。

  • 创建单一分辨率blockedImage对象,并将掩码的空间引用设置为与输入图像的空间引用匹配。

  • 写掩码blockedImage到内存中。只有blockedImage对象在内存中。与逻辑掩码映像对应的各个映像块位于临时目录中。写入目录将保留自定义空间引用,这将确保正常图像及其对应的掩码图像具有相同的空间引用。

trainNormalMaskDir = fullfile(trainNormalDataDir,[“normal_mask_level”num2str (resolutionLevel)]);createMaskForNormalTissue (trainNormalDataDir trainNormalMaskDir resolutionLevel)

现在正常的映像和掩码都在磁盘上,开始创建blockedImage对象来使用helper函数管理数据createBlockedImageAndMaskArrays.的数组blockedImage对象的正常图像和对应的数组blockedImage普通掩码图像中的对象。helper函数作为支持文件附加到示例中。万博1manbetx

[normalImages,normalMasks] = createBlockedImageAndMaskArrays(trainNormalDataDir,trainNormalMaskDir);

选择一个样本正常图像和掩码。确认蒙版的空间世界范围与图像在最佳分辨率级别上的范围相匹配。对象指定空间世界范围WorldStart而且WorldEnd属性。

Idx = 2;[normalImages (idx)。WorldStartnormalImages(idx).WorldEnd]
ans =11×6105× 00 0.0000 2.2118 0.9779 0.0000 00 0.0000 2.2118 0.9830 0.0000 00 0.0000 2.2118 0.9830 0.0000 00 0.0000 2.2118 0.9830 0.0000 00 0.0000 2.2938 0.9830 0.0000 00 0.0000 2.2938 0.9830 0.0000 00 0.0000 2.6214 1.3107 0.0000 00 0.0000 2.6214 1.3107 0.0000 00 0.0000 2.6214 1.3107 0.0000
[normalMasks (idx)。WorldStartnormalMasks(idx).WorldEnd]
ans =1×40 0 221184 97792

验证掩码包含正确的roi和空间引用。控件显示示例图像bigimageshow函数。获取包含显示的轴。

figure normal = bigimageshow(normalImages(idx));hNormalAxes = normal . parent;

在显示的顶部创建一个新轴blockedImage.在新的轴上,显示相应的部分透明掩码图像。口罩突出了正常组织所在的区域。

hMaskAxes =坐标轴;hMask = bigimageshow(normalMasks(idx),“父”hMaskAxes,...“插值”“最近的”“AlphaData”, 0.5);hMaskAxes。可见=“关闭”

链接图像的轴与蒙版的轴。当您缩放和平移时,两个轴的更新是相同的。

linkaxes ([hNormalAxes hMaskAxes]);

通过设置水平和垂直空间范围,放大图像的一部分。口罩与正常组织正确重叠。

xlim(80000年[45000]);ylim(165000年[130000]);

为肿瘤图像创建遮罩

在肿瘤图像中,ROI由肿瘤组织组成。肿瘤组织的颜色与健康组织的颜色相似,因此不能使用颜色分割技术。相反,通过使用伴随肿瘤图像的病变边界的真实坐标来创建roi。

可以使用helper函数createMaskForTumorTissue使用roi创建掩码。这个helper函数作为支持文件附加到示例中。万博1manbetx

helper函数对肿瘤组织的每张训练图像执行以下操作:

  • 创建一个blockedImage对象从TIF图像文件。

  • 从图像元数据设置空间引用。

  • 读取XML文件中对应的病变标注,并将标注转换为多边形(多边形对象)。

  • 对于每个图像块,使用多边形数据为相应的块创建掩码。有肿瘤区域的图像可以包含一些正常区域。使用正常组织的注释来排除这些区域。

  • 创建输出逻辑掩码blockedImage对象的较粗分辨率级别。方法逐块写入掩码映像setBlock函数。

  • 写掩码blockedImage对象指向内存中的目录。只有blockedImage对象在内存中。与逻辑掩码映像对应的各个映像块位于临时目录中。写入目录将保留自定义的空间引用,这将确保肿瘤图像及其对应的掩码图像具有相同的空间引用。

trainTumorMaskDir = fullfile(trainTumorDataDir,[“tumor_mask_level”num2str (resolutionLevel)]);createMaskForTumorTissue (trainTumorDataDir trainTumorAnnotationDir,...trainTumorMaskDir resolutionLevel);

现在肿瘤图像和掩码都在磁盘上,开始创建blockedImage对象来使用helper函数管理数据createBlockedImageAndMaskArrays.的数组blockedImage对象从肿瘤图像和相应的数组blockedImage肿瘤掩膜图像中的对象。helper函数作为支持文件附加到示例中。万博1manbetx

[tumorImages,tumorMasks] = createBlockedImageAndMaskArrays(trainTumorDataDir,trainTumorMaskDir);

选择一个样本肿瘤图像和掩膜。确认蒙版的空间世界范围与图像在最佳分辨率级别上的范围相匹配。对象指定空间世界范围XWorldLimits而且YWorldLimits属性。

Idx = 5;[tumorImages (idx)。WorldStarttumorImages(idx).WorldEnd]
ans =11×6105× 00 0.0000 2.1965 0.9779 0.0000 00 0.0000 2.2016 0.9830 0.0000 00 0.0000 2.2118 0.9830 0.0000 00 0.0000 2.2118 0.9830 0.0000 00 0.0000 2.2938 0.9879 0.0000 00 0.0000 2.2938 0.9830 0.0000 00 0.0000 2.6214 1.3107 0.0000 00 0.0000 2.6214 1.3107 0.0000 00 0.0000 2.6214 1.3107 0.0000 00 0.0000 2.6214 1.3107 0.0000
[tumorMasks (idx)。WorldStarttumorMasks(idx).WorldEnd]
ans =1×40 0 219648 97792

验证掩码包含正确的roi和空间引用。控件显示示例图像bigimageshow函数。获取包含显示的轴。

figure hTumor = bigimageshow(tumorImages(idx));hTumorAxes = hTumor.Parent;

在显示的顶部创建一个新轴blockedImage.在新的轴上,显示相应的部分透明掩码图像。口罩突出了正常组织所在的区域。

hMaskAxes =坐标轴;hMask = bigimageshow(tumorMasks(idx),“父”hMaskAxes,...“插值”“最近的”“AlphaData”, 0.5);hMaskAxes。可见=“关闭”

链接图像的轴与蒙版的轴。当您缩放和平移时,两个轴的更新是相同的。

linkaxes ([hTumorAxes hMaskAxes]);

通过设置水平和垂直空间范围,放大图像的一部分。面罩正确地与肿瘤组织重叠。

xlim(65000年[45000]);ylim(150000年[130000]);

为训练和验证创建阻塞图像数据存储

提取训练数据的补丁blockedImage对象,使用blockedImageDatastore.该数据存储读取补丁blockedImage单个分辨率级别的数据。

原始训练补丁中的颜色不平衡和类别不平衡可能会使网络产生偏差。颜色不平衡是由于组织着色不均匀造成的。分类不平衡的原因是数据中肿瘤和正常组织的数量不相等。要纠正这些不平衡,可以预处理和增加数据存储。

此示例显示如何创建blockedImageDatastore它提取肿瘤和正常的斑块来训练网络。该示例还展示了如何预处理和增加数据存储以避免网络偏置。

选择要读取的正常组织补丁的位置

将正常图像和相应的掩码随机分成两组。验证集包含两个随机选择的图像和相应的掩码。训练集包含剩余的图像和掩码。

normalValnIdx = randi(numNormalFiles,[1 2]);normalTrainIdx = setdiff(1:numNormalFiles,normalValnIdx);

与图像中特征的大小相比,补丁的大小较小。缺省情况下,blockedImageDatastore提取无重叠无间隙的补丁,生成大量的训练补丁。您可以通过指定补丁的子集来减少训练数据的数量。属性指定补丁的坐标selectBlockLocations函数。方法在采样的训练补丁之间添加一个间隙BlockOffsets名称-值参数。指定大于补丁大小的偏移量。在默认值0.5的基础上增加包含阈值,使网络在相对同质的补丁上训练。

patchSize = [299,299,3];normalStrideFactor = 10;blsNormalData = selectBlockLocations(normalImages(normalTrainIdx),...“BlockSize”patchSize (1:2),“BlockOffsets”patchSize (1:2) * normalStrideFactor,...“面具”normalMasks (normalTrainIdx),“InclusionThreshold”, 0.75,“ExcludeIncompleteBlocks”,真正的);

选择要读取的验证补丁的位置。由于验证图像较少,因此不需要在补丁之间添加间隙。

blsNormalDataVal = selectBlockLocations(normalImages(normalValnIdx),...“BlockSize”patchSize (1:2),...“面具”normalMasks (normalValnIdx),“InclusionThreshold”, 0.75,“ExcludeIncompleteBlocks”,真正的);

为普通镜像创建数据存储

创建数据存储dsNormalData而且dsNormalDataVal分别以最佳分辨率从正常图像中读取图像补丁用于训练和验证。属性指定补丁的坐标BlockLocationSet名称-值对参数。

dsNormalData = blockedImageDatastore(normalImages(normalTrainIdx),...“BlockLocationSet”, blsNormalData);dsNormalDataVal = blockedImageDatastore(normalImages(normalValnIdx),...“BlockLocationSet”, blsNormalDataVal);

从包含正常训练图像的数据存储中预览补丁。

imagesToPreview = 0 ([patchSize 10],“uint8”);n = 1:10 im = read(dsNormalData);imagesToPreview(:,:,:,n) = im{1};结束图蒙太奇(imagesToPreview,“大小”(2 - 5),“BorderSize”10“写成BackgroundColor”“k”);

标题(“正常组织的训练补丁”

选择要读取的肿瘤组织斑块位置

将肿瘤图像和相应的面具随机分成两组。验证集包含两个随机选择的图像和相应的掩码。训练集包含剩余的图像和掩码。

tumorValIdx = randi(numTumorFiles,[1 2]);tumorTrainIdx = setdiff(1:numTumorFiles,tumorValIdx);

属性指定要读取的补丁的坐标selectBlockLocations函数。肿瘤组织比正常组织更稀疏,因此通过指定比正常组织更小的块偏移量来增加采样密度。请注意,如果你想使用更少的训练图像进行训练,那么你可能需要通过进一步减少块偏移来增加训练集的大小。

tumorStrideFactor = 3;blsTumorData = selectBlockLocations(tumorImages(tumorTrainIdx),...“BlockSize”patchSize (1:2),“BlockOffsets”patchSize (1:2) * tumorStrideFactor,...“面具”tumorMasks (tumorTrainIdx),“InclusionThreshold”, 0.75,“ExcludeIncompleteBlocks”,真正的);

选择要读取的验证补丁的位置。由于验证图像较少,因此不需要在补丁之间添加间隙。

blsTumorDataVal = selectBlockLocations(tumorImages(tumorValIdx),...“BlockSize”patchSize (1:2),...“面具”tumorMasks (tumorValIdx),“InclusionThreshold”, 0.75,“ExcludeIncompleteBlocks”,真正的);

为肿瘤图像创建数据存储

创建一个blockedImageDatastore从训练的肿瘤图像和面具。的数据存储dsTumorData而且dsTumorDataVal分别以最佳分辨率从肿瘤图像中读取图像补丁进行训练和验证。

dsTumorData = blockedImageDatastore(tumorImages(tumorTrainIdx),...“BlockLocationSet”, blsTumorData);dsTumorDataVal = blockedImageDatastore(tumorImages(tumorValIdx),...“BlockLocationSet”, blsTumorDataVal);

从包含肿瘤训练图像的数据存储中预览补丁。

imagesToPreview = 0 ([patchSize 10],“uint8”);n = 1:10 im = read(dsTumorData);imagesToPreview(:,:,:,n) = im{1};结束蒙太奇(imagesToPreview“大小”(2 - 5),“BorderSize”10“写成BackgroundColor”“k”);标题(“肿瘤组织斑块训练”

标准化颜色和增强训练数据

训练图像具有不同的颜色分布,因为数据集来自不同的来源,对组织进行颜色染色并不会产生相同的染色图像。额外的预处理是必要的,以避免网络偏向。

为了防止颜色变化,本例使用标准染色归一化技术对数据进行预处理。应用染色归一化和增强,使用变换函数使用helper函数指定的自定义预处理操作augmentAndLabelCamelyon16.该函数作为支持文件附加到示例中。万博1manbetx

augmentAndLabelCamelyon16函数执行以下操作:

  • 使染色正常化,使用normalizeStaining.m函数[4].染色归一化使用Macenko的方法进行,该方法使用固定矩阵通过颜色反褶积分离H&E颜色通道,然后使用单独的校正混合重新创建归一化图像。该函数返回归一化图像以及H&E图像。

  • 添加颜色抖动使用jitterColorHSV函数。颜色抖动通过扰动图像对比度、色相、饱和度和亮度来改变每个补丁的颜色。颜色抖动在HSV颜色空间中执行,以避免RGB图像中不必要的颜色伪影。

  • 应用90度旋转和垂直和水平反射的随机组合。随机仿射变换使得网络对输入图像数据的方向不可知。

  • 将补丁标记为“正常”“肿瘤”

每个图像斑块生成5个增强标记斑块:染色归一化斑块、带颜色抖动的染色归一化斑块、带颜色抖动和随机仿射变换的染色归一化斑块、带随机仿射变换的苏木精图像、带随机仿射变换的伊红图像。

创建转换正常训练和验证图像的数据存储,并将生成的补丁标记为“正常”

dsLabeledNormalData =转换(dsNormalData,...@ (x,信息)augmentAndLabelCamelyon16 (x,信息,“正常”),“IncludeInfo”,真正的);dsLabeledNormalDataVal =转换(dsNormalDataVal,...@ (x,信息)augmentAndLabelCamelyon16 (x,信息,“正常”),“IncludeInfo”,真正的);

创建转换肿瘤训练和验证图像的数据存储,并将生成的补丁标记为“肿瘤”

dsLabeledTumorData =转换(dsTumorData,...@ (x,信息)augmentAndLabelCamelyon16 (x,信息,“肿瘤”),“IncludeInfo”,真正的);dsLabeledTumorDataVal =转换(dsTumorDataVal,...@ (x,信息)augmentAndLabelCamelyon16 (x,信息,“肿瘤”),“IncludeInfo”,真正的);

平衡肿瘤和正常分类

肿瘤图像中肿瘤组织的数量与正常组织的数量相比非常少。额外的预处理是必要的,以避免在包含大量正常组织和非常少量肿瘤组织的类不平衡数据上训练网络。

为了防止类不平衡,本示例定义了一个名为a的自定义数据存储randomSamplingDatastore它以平衡的方式随机选择正常和肿瘤训练补丁。定义此自定义数据存储的脚本作为支持文件附加到示例中。万博1manbetx有关更多信息,请参见开发自定义数据存储

创建自定义randomSamplingDatastore从正常和肿瘤训练数据存储。随机抽样数据存储dsTrain在epoch的每个迭代中向网络提供小批量的训练数据。

dsTrain = randomSamplingDatastore(dsLabeledTumorData,dsLabeledNormalData);

为了限制验证期间使用的补丁数量,本示例定义了一个名为a的自定义数据存储validationDatastore从每个类中返回五个验证补丁。定义此自定义数据存储的脚本作为支持文件附加到示例中。万博1manbetx

创建自定义validationDatastore从正常和肿瘤验证数据存储。

numValidationPatchesPerClass = 5;dsVal = validationDatastore(dsLabeledTumorDataVal,...dsLabeledNormalDataVal numValidationPatchesPerClass);

设置Inception-v3网络层

这个例子使用了Inception-v3网络,这是一种卷积神经网络,它经过了来自ImageNet数据库的100多万张图像的训练[3.].该网络有48层,可以将图像分类为1000个对象类别,例如键盘、鼠标、铅笔和许多动物。该网络预计图像输入大小为299 * 299,有3个通道。

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

Net = inceptionv3;

更换最终图层

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

从训练好的网络中提取层图。

lgraph = layerGraph(net);

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

[learnableLayer,classLayer] = findLayersToReplace(lgraph)
learnableLayer = FullyConnectedLayer with properties: Name: 'predictions'超参数InputSize: 2048 OutputSize: 1000 Learnable Parameters权重:[1000×2048 single]偏置:[1000×1 single]显示所有属性
classLayer = ClassificationOutputLayer与属性:名称:'ClassificationLayer_predictions'类:[1000×1 categorical] ClassWeights: 'none' OutputSize: 1000超参数LossFunction: 'crossentropyex'

本例的目标是在肿瘤和非肿瘤区域这两个类别之间执行二进制分割。为两个类创建一个新的全连接层。用新层替换原来的最终全连接层。

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

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

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

指定培训项目

训练网络使用rmsprop优化求解。该求解器自动调整学习速度和动量,以实现更快的收敛。属性指定其他超参数设置trainingOptions(深度学习工具箱)函数。减少MaxEpochs因为大量的训练数据可以使网络更快地达到收敛。

checkpointsDir = fullfile(trainingImageDir,“检查点”);如果~存在(checkpointsDir“dir”mkdir (checkpointsDir);结束选项= trainingOptions(“rmsprop”...“InitialLearnRate”1 e-5...“SquaredGradientDecayFactor”, 0.99,...“MaxEpochs”3,...“MiniBatchSize”32岁的...“阴谋”“训练进步”...“CheckpointPath”checkpointsDir,...“ValidationData”dsVal,...“ExecutionEnvironment”“汽车”...“洗牌”“every-epoch”);

训练或下载网络

默认情况下,该示例使用helper函数下载经过训练的Inception-v3网络的预训练版本downloadTrainedCamelyonNet.helper函数作为支持文件附加到示例中。万博1manbetx预训练的网络使您可以运行整个示例,而无需等待训练完成。

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

如果有GPU,可以在GPU上进行训练。使用GPU需要并行计算工具箱™和支持CUDA®的NVIDIA®GPU。有关更多信息,请参见GPU支万博1manbetx持版本(并行计算工具箱).在NVIDIA Titan X上训练大约需要20个小时。

doTraining = false;如果doTraining trainedNet = trainNetwork(dsTrain,lgraph,options);modelDateTime = string(datetime(“现在”“格式”“yyyy-MM-dd-HH-mm-ss”));保存(strcat (“trainedCamelyonNet——”modelDateTime,“.mat”),“trainedNet”);其他的trainedCamelyonNet_url =“//www.tianjin-qmedu.com/万博1manbetxsupportfiles/vision/data/trainedCamelyonNet.mat”;netDir = fullfile(tempdir,“Camelyon16”);downloadTrainedCamelyonNet (trainedCamelyonNet_url netDir);负载(fullfile (netDir“trainedCamelyonNet.mat”));结束
Cameylon16数据集预训练的Inception-v3网络已经存在。

下载并预处理测试数据

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

创建一个目录来存储测试数据。

testingImageDir = fullfile(tempdir,“Camelyon16”“测试”);如果~存在(testingImageDir“dir”mkdir (testingImageDir);mkdir (fullfile (testingImageDir,“图片”));mkdir (fullfile (testingImageDir,“lesion_annotations”));结束testDataDir = fullfile(testingImageDir,“图片”);testTumorAnnotationDir = fullfile(testingImageDir,“lesion_annotations”);

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

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

  • 打开images目录。下载前两个文件“test_001.tif”和“test_002.tif”。将文件移动到指定的目录testDataDir变量。

指定测试映像的数量。

numTestFiles = 2;

为测试图像创建蒙版

测试图像包含正常和肿瘤图像的混合。为了减少分类过程中的计算量,可以通过创建掩码来定义roi。

指定用于创建掩码的分辨率级别。本例使用分辨率级别7,这个级别比较粗糙,适合内存。

resolutionLevel = 7;

为含有组织的区域创建遮罩。可以使用helper函数createMaskForNormalTissue使用颜色阈值创建掩码。这个helper函数作为支持文件附加到示例中。万博1manbetx有关此helper函数的详细信息,请参见为普通图像创建掩码

testTissueMaskDir = fullfile(testDataDir,[“test_tissuemask_level”num2str (resolutionLevel)]);createMaskForNormalTissue (testDataDir testTissueMaskDir resolutionLevel);

为包含肿瘤组织的图像创建掩码。跳过不包含肿瘤组织的图像。可以使用helper函数createMaskForTumorTissue使用ROI对象创建掩码。这个helper函数作为支持文件附加到示例中。万博1manbetx有关此helper函数的详细信息,请参见为肿瘤图像创建遮罩

testTumorMaskDir = fullfile(testDataDir,[“test_tumormask_level”num2str (resolutionLevel)]);createMaskForTumorTissue (testDataDir testTumorAnnotationDir、testTumorMaskDir resolutionLevel);

分类测试数据并创建热图

每个测试图像都有两个掩模,一个表示正常组织,一个表示肿瘤组织。创建blockedImage对象来使用helper函数管理测试数据和掩码createBlockedImageAndMaskArrays.helper函数作为支持文件附加到示例中。万博1manbetx

[testImages,testTissueMasks] = createBlockedImageAndMaskArrays(testDataDir,testTissueMaskDir);[~,testTumorMasks] = createBlockedImageAndMaskArrays(testDataDir,testTumorMaskDir);

使用训练好的Inception-v3网络识别测试图像中的肿瘤斑块,testImages.方法对测试图像进行逐块分类应用函数使用helper函数指定的自定义处理管道tumorProbabilityHeatMap.这个helper函数作为支持文件附加到示例中。万博1manbetx若要减少所需的计算量,请指定组织掩码testTissueMask所以应用功能只处理含有组织的斑块。指定“UseParallel”参数返回的布尔值canUseGPU.如果支持的万博1manbetxGPU可用于计算,则应用函数并行计算块。

tumorProbabilityHeatMap函数对每个组织块执行以下操作:

  • 计算肿瘤概率评分使用预测(深度学习工具箱)函数。

  • 创建一个像素值等于肿瘤概率分数的热图图像补丁。

应用函数将每个块的热图拼接成测试图像的单个热图。热图显示了该网络检测到含有肿瘤的区域。

要可视化热图,请将热图覆盖在原始图像上并设置透明度“AlphaData”性质如组织掩膜。覆盖层显示了肿瘤在图像中的定位情况。肿瘤概率高的区域以红色像素显示。肿瘤概率低的区域显示为蓝色像素。

outputHeatmapsDir = fullfile(testingImageDir,“热图”);如果~存在(outputHeatmapsDir“dir”mkdir (outputHeatmapsDir);结束patchSize = [299,299,3];idx = 1:numTestFiles bls = selectBlockLocations(testImages(idx),“BlockSize”patchSize (1:2),“面具”testTissueMasks (idx),...“InclusionThreshold”0,“水平”1);testHeatMaps(idx) = apply(testImages(idx),@(x)tumorProbabilityHeatMap(x,trainedNet),...“水平”, 1“BlockLocationSet”美国劳工统计局,“UseParallel”canUseGPU,“OutputLocation”, outputHeatmapsDir);figure hTest = bigimageshow(testImages(idx));hTestAxes = hTest.Parent;hTestAxes。可见=“关闭”;hMaskAxes =坐标轴;hMask = bigimageshow(testHeatMaps(idx),“父”hMaskAxes,...“插值”“最近的”“AlphaData”testTissueMasks (idx));colormap(飞机(255));hMaskAxes。可见=“关闭”;linkaxes ([hTestAxes hMaskAxes]);标题([“检测图像肿瘤热图”num2str (idx)]);结束

参考文献

[1] Ehteshami b.b.,等。“深度学习算法用于检测乳腺癌女性淋巴结转移的诊断评估。”美国医学协会杂志.卷318,2017年第22期,第2199-2210页。doi: 10.1001 / jama.2017.14585

塞格迪,C., V. Vanhoucke, S. Ioffe, J. Shlens和Z. Wojna。“重新思考计算机视觉的初始架构。”在IEEE计算机视觉与模式识别会议论文集, 2818 - 2826。拉斯维加斯,内华达州:IEEE, 2016。

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

[4]马申科,M.,等。用于定量分析的组织学切片规范化方法。在2009 IEEE生物医学成像国际研讨会:从纳米到宏观, 1107 - 1110。波士顿,马萨诸塞州:IEEE, 2009。

[5] xml2struct//www.tianjin-qmedu.com/matlabcentral/fileexchange/28518-xml2struct

另请参阅

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

相关的话题