预处理多分辨率图像进行训练分类网络
这个例子展示了如何准备数据存储,读取和预处理多分辨率整个幻灯片图片(WSIs)可能不适合在内存中。
深度学习肿瘤分类方法依赖于数字病理,整个组织幻灯片是成像和数字化。结果WSIs高分辨率,200000 -,- 100000的像素。WSIs通常存储在一个多分辨率格式方便高效的显示,导航和处理的图像。
读取和处理WSI数据使用blockedImage
和blockedImageDatastore
对象。这些对象方便使用多个分辨率水平和不需要加载到核心的形象记忆。这个例子展示了如何使用低分辨率图像数据有效地准备的数据更好的水平。您可以使用处理过的数据训练分类深度学习网络。例如,看到的分类肿瘤图像多分辨率阻塞。
下载Camelyon16数据集
这个示例使用WSIs从Camelyon16挑战1]。这一挑战的数据包含400 WSIs淋巴结从两个独立的来源,分为270 130训练图像和测试图像。气管无名动脉瘘管的WSIs被存储为文件剥夺格式11-level金字塔结构。
训练数据集包含159 WSIs的正常淋巴结和111 WSIs淋巴结的肿瘤组织和健康组织。地面实况病变边界伴随肿瘤图像的坐标。
指定dataDir
作为目标的位置数据。数据集的大小大约是451 GB。
dataDir = fullfile (tempdir,“Camelyon16”);
下载的训练数据,去Camelyon17网站,点击第一个“CAMELYON16数据集”链接。
打开“培训”目录中,然后按照以下步骤:
下载“lesion_annotations。邮政”文件。提取文件到指定的目录
trainAnnotationDir
变量。打开“正常”的目录。图片下载到指定的目录
trainNormalDir
变量。打开“肿瘤”目录。图片下载到指定的目录
trainTumorDir
变量。
trainingDir = fullfile (dataDir,“培训”);trainNormalDir = fullfile (trainingDir,“正常”);trainTumorDir = fullfile (trainingDir,“肿瘤”);trainAnnotationDir = fullfile (trainingDir,“lesion_annotations”);如果~存在(dataDir“dir”mkdir (trainingDir) mkdir (trainNormalDir) mkdir (trainTumorDir) mkdir (trainAnnotationDir)结束
创建blockedImage
对象管理WSI图像
得到正常和肿瘤训练图像的文件名。
normalFileSet = matlab.io.datastore.FileSet (fullfile (trainNormalDir“正常的”*));normalFilenames = normalFileSet.FileInfo.Filename;tumorFileSet = matlab.io.datastore.FileSet (fullfile (trainTumorDir“肿瘤*”));tumorFilenames = tumorFileSet.FileInfo.Filename;
正常组织的训练图像之一,”normal_144。tif,“缺少重要的元数据需要演绎的物理区段的形象。排除这个文件。
normalFilenames(包含(normalFilenames,“normal_144”))= [];
创建两个数组blockedImage
对象,一个用于正常的图像和一个用于肿瘤图像。每一个blockedImage
对象指向相应的图像文件在磁盘上。
normalImages = blockedImage (normalFilenames);tumorImages = blockedImage (tumorFilenames);
显示WSI图像
得到一个更好的理解的训练数据,显示了正常组织的图像。图像在粗分辨率级别足够小,适合在内存中,所以你可以视觉检查blockedImage
中的数据图片浏览器应用程序使用browseBlockedImages
helper函数。这个helper函数附加到的例子作为支持文件。金宝app注意图像含有大量的空白部分,组织中只占一小部分的图像。这些特征是WSIs的典型。
browseBlockedImages (normalImages, 8)
探索一个blockedImage
更多的深度。选择一个肿瘤样本图像可视化,然后使用的显示图像bigimageshow
函数。函数自动选择根据屏幕大小和分辨率水平当前缩放级别。
idxSampleTumorImage = 10;tumorImage = tumorImages (idxSampleTumorImage);h = bigimageshow (tumorImage);标题(“分辨率水平:“+ h.ResolutionLevel)
放大到一个感兴趣的领域。分辨率级别自动增加显示更多的细节。
xlim ylim((33600、35000))((104600、106000))标题(“分辨率水平:“+ h.ResolutionLevel)
使空间区段
当你使用多分辨率层次的多分辨率的图像,每一层的空间区段必须匹配。如果空间范围是一致的,那么信息,如口罩可以提取粗分辨率水平更好的分辨率和正确应用于匹配位置的水平。有关更多信息,请参见建立空间引用了图像。
检查肿瘤样本图像的尺寸在每个分辨率水平。1级最像素和分辨率是最好的水平。10级的像素,最少是粗分辨率级别。比例不一致的,这通常表明水平并不跨度同一个世界区域。
levelSizeInfo =表((1:长度(tumorImage.Size))”,…tumorImage.Size (: 1),…tumorImage.Size (:, 2),…tumorImage.Size (: 1)。/ tumorImage.Size (:, 2),…VariableNames = [“分辨率水平”“图像宽度”“图像高度”“比例”]);disp (levelSizeInfo)
图像宽度图像分辨率水平高纵横比___________ ___________ _______ _______ 1 2.1555 e + 05 97792 2.2042 49152 2.1979 1.0803 e + 05年3 54272 24576 2.2083 27136 12288 13824 6144 2.25 7168 2.2083 3072 2.3333 1577 2.3333 3629 0.43455 8 3584 1536 9 2048 1024 2 1024 512 2 11 512 512 1
设置所有训练数据的空间参考使用setSpatialReferencingForCamelyon16
helper函数。这个函数是附加到例子作为支持文件。金宝app的setSpatialReferencingForCamelyon16
函数设置WorldStart
和WorldEnd
属性的blockedImage
使用空间对象引用来自TIF文件元数据的信息。
normalImages = setSpatialReferencingForCamelyon16 (normalImages);tumorImages = setSpatialReferencingForCamelyon16 (tumorImages);
创建组织面具
大多数典型WSI由背景像素。有效处理WSI公司数据,您可以创建一个感兴趣的区域(ROI)面具从粗分辨率级别,然后在更精细的分辨率极限计算ROI内区域的水平。有关更多信息,请参见处理阻塞图像有效地使用面具。
考虑这两个因素时选择一个面具水平:
选择的图像大小面具的水平。更快地处理面具,使用一个低分辨率的水平。
富达选择ROI边界的水平。捕捉准确的边界,使用高分辨率的水平。
这个示例使用粗分辨率级别创建面具训练图像的正常组织。
normalMaskLevel = 8;
背景是均匀的光。你可以细分出组织通过一个简单的阈值操作。阈值基于块的方式适用于所有使用正常训练图像应用
函数。将结果保存到磁盘指定OutputLocation
名称-值参数。
trainNormalMaskDir = fullfile (trainingDir,“normal_mask_level”+ num2str (normalMaskLevel));如果~ isfolder (trainNormalMaskDir) normalMasks =应用(normalImages, @ (bs) imclose (im2gray (bs.Data) < 150, (5)),…BlockSize = (512 512),…= normalMaskLevel水平,…UseParallel = canUseGPU,…OutputLocation = trainNormalMaskDir);保存(fullfile (trainNormalMaskDir“normalMasks.mat”),“normalMasks”)其他的负载(fullfile (trainNormalMaskDir“normalMasks.mat”),“normalMasks”);结束
显示组织的面具
组织的面具只有一个级别,小到可以装进记忆。显示组织面具图片浏览器应用程序使用browseBlockedImages
helper函数。这个helper函数附加到的例子作为支持文件。金宝app
browseBlockedImages (normalMasks, 1)
在概述的基础上,选择一个blockedImage
进一步评估组织面具的准确性。显示blockedImage
使用bigimageshow
函数。显示作为一个覆盖的面具blockedImage
使用showlabels
函数。设置每个像素使用的透明度AlphaData
名称-值参数。像素内的ROI,标签是完全透明的。像素以外的ROI,标签是部分透明,出现绿色色调。
idxSampleNormalImage = 42;normalImage = normalImages (idxSampleNormalImage);normalMask = normalMasks (idxSampleNormalImage);hNormal = bigimageshow (normalImage);showlabels (hNormal、normalMask AlphaData = normalMask Alphamap = 0.3[0])标题(“组织;绿色背景色”)
放大检查一个感兴趣的领域。
xlim(62563年[47540])ylim (155581 [140557])
建立肿瘤面具
在肿瘤图像ROI由肿瘤组织。肿瘤组织的颜色类似于健康组织的颜色,所以你不能使用颜色分割技术。相反,使用地面真理创建roi伴随肿瘤的病变边界图像的坐标。这些区域是手绘在最好的水平。
显示肿瘤边界
为了更好地了解肿瘤训练数据,读取地面实况边界坐标和坐标显示为徒手使用的roishowCamelyon16TumorAnnotations
helper函数。这个helper函数附加到的例子作为支持文件。金宝app注意,正常区域(如图所示绿色边界)可能发生在肿瘤区域。
idxSampleTumorImage = 64;tumorImage = tumorImages (idxSampleTumorImage);showCamelyon16TumorAnnotations (tumorImage trainAnnotationDir);xlim(83602年[77810])ylim (145763 [139971])
多边形坐标转换为二进制阻塞图像
指定的分辨率级别肿瘤面具。
tumorMaskLevel = 8;
创建一个肿瘤为每个图像使用面具createMaskForCamelyon16TumorTissue
helper函数。这个helper函数附加到的例子作为支持文件。金宝app对于每一个图像,函数执行这些操作。
阅读(x,y)边界坐标roi带注释的XML文件中。
单独的肿瘤和正常组织的边界坐标roi到单独的细胞阵列。
细胞边界坐标数组转换成一个二进制屏蔽图片使用
polyToBlockedImage
函数。在二进制图像ROI表明肿瘤像素和背景像素显示正常组织。像素内肿瘤和正常组织roi都归类为背景。
trainTumorMaskDir = fullfile (trainingDir,“tumor_mask_level”+ num2str (tumorMaskLevel));如果~ isfolder (trainTumorMaskDir) mkdir (trainTumorMaskDir) tumorMasks = createMaskForCamelyon16TumorTissue (…tumorImages、trainAnnotationDir trainTumorMaskDir tumorMaskLevel);保存(fullfile (trainTumorMaskDir“tumorMasks.mat”),“tumorMasks”)其他的负载(fullfile (trainTumorMaskDir“tumorMasks.mat”),“tumorMasks”);结束
肿瘤的面具只有一个分辨率水平和足够小,适合在内存中。显示肿瘤的面具图片浏览器应用程序使用browseBlockedImages
helper函数。这个helper函数附加到的例子作为支持文件。金宝app
browseBlockedImages (tumorMasks, 1)
确认富达的面具ROI边界
选择一个肿瘤样本图像,错综复杂的地区,并显示blockedImage
使用bigimageshow
函数。显示作为一个覆盖的面具blockedImage
使用showlabels
函数。设置每个像素使用的透明度AlphaData
名称-值参数。像素内的ROI,标签是完全透明的。像素以外的ROI,标签是部分透明,出现绿色色调。
idxSampleTumorImage = 64;tumorImage = tumorImages (idxSampleTumorImage);tumorMask = tumorMasks (idxSampleTumorImage);hTumor = bigimageshow (tumorImage);showlabels (hTumor、tumorMask AlphaData = tumorMask Alphamap = 0.3 [0]);标题(“肿瘤;绿色背景色”)xlim(83602年[77810])ylim (145763 [139971])
选择模块培训
你可以训练一个网络使用数据从任何分辨率的水平。更精细的分辨率水平提供更多同质块类。粗糙的水平,涵盖更大空间区域相同的块大小,周围有更多的上下文。对于这个示例,选择块最好的分辨率水平。
trainingLevel = 1;
指定的块大小来匹配输入规模网络。这个例子使用一个块大小适合Inception-v3网络。
networkBlockSize = (299 299 3);
创建组正常和肿瘤块使用selectBlockLocations
函数。这个函数指定的掩码区域内选择模块。你可以完善选定的块的数量为每个类指定BlockOffsets
和InclusionThreshold
名称-值参数。调用时考虑这两个因素selectBlockLocations
函数。
训练数据的数量。使用尽可能多的训练数据有助于推广网络在训练,确保一个好的类表示的平衡所选块集。增加选定的块的数量减少
BlockOffsets
和InclusionThreshold
名称-值参数。硬件和时间可用来训练。使用更多的块需要更多的训练时间和更强大的硬件。减少选择的块的数量增加
BlockOffsets
和InclusionThreshold
名称-值参数。
选择块正常图像使用组织内的面具。本例中指定的值BlockOffsets
和InclusionThreshold
这个结果在一个相对较小的块的数量。
normalOffsetFactor = 3.5;normalInclusionThreshold = 0.97;blsNormalData = selectBlockLocations (normalImages,…BlockSize = networkBlockSize (1:2),…BlockOffsets =圆(networkBlockSize (1:2) * normalOffsetFactor),…= trainingLevel水平,…面具= normalMasks,…InclusionThreshold = normalInclusionThreshold,…ExcludeIncompleteBlocks = true,…UseParallel = canUseGPU);disp (blsNormalData)
blockLocationSet属性:ImageNumber:[190577×1双]BlockOrigin:[190577×3双]BlockSize:(299 299 3)水平:[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1…)
选择肿瘤图像使用肿瘤内块面具。本例中指定的值BlockOffsets
和InclusionThreshold
这个结果在一个相对较小的块的数量。
tumorOffsetFactor = 1;tumorInclusionThreshold = 0.90;blsTumorData = selectBlockLocations (tumorImages,…BlockSize = networkBlockSize (1:2),…BlockOffsets =圆(networkBlockSize (1:2) * tumorOffsetFactor),…= trainingLevel水平,…面具= tumorMasks,…InclusionThreshold = tumorInclusionThreshold,…ExcludeIncompleteBlocks = true,…UseParallel = canUseGPU);disp (blsTumorData)
blockLocationSet属性:ImageNumber:[181679×1双]BlockOrigin:[181679×3双]BlockSize:(299 299 3)水平:[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1…)
创建了图像数据存储的培训和验证
创建一个单一的blockedImageDatastore
对象通过结合正常和肿瘤块的集合。
[blsAll, allImages] = mergeBlockLocationSets (blsNormalData、normalImages blsTumorData, tumorImages);dsAllBlocks = blockedImageDatastore (allImages BlockLocationSet = blsAll);
洗牌块减少过度拟合的机会并提高泛化训练过程中。
dsAllBlocks = shuffle (dsAllBlocks);
分区块训练和验证数据集。块分配99%的培训和使用剩下的1%进行验证。
numericBlockLabels =[0(大小(blsNormalData.ImageNumber));(大小(blsTumorData.ImageNumber)));blockLabels =分类(numericBlockLabels [0, 1], [“正常”,“肿瘤”]);idx = splitlabels (blockLabels, 0.99,“随机”);dsTrain =子集(dsAllBlocks idx {1});dsVal =子集(dsAllBlocks idx {2});
训练一个分类网络需要标记的训练数据。标签每一块正常的
或肿瘤
基于包含块的图像。指定块的标签正常的
和肿瘤
。
numericImageLabels =[0(大小(normalImages)), 1(大小(tumorImages))];imageLabels =分类(numericImageLabels [0, 1], [“正常”,“肿瘤”]);
转换blockedImageDatastore
这些数据存储返回模块和相应的标签使用变换
函数和labelCamelyon16Blocks
helper函数。辅助函数附加到例子作为支持文件。金宝app
的labelCamelyon16Blocks
helper函数块标签来自图像索引,存储在ImageNumber
块的元数据。helper函数返回数据块双元素单元阵列和标签,适用于网络训练一个分类。
dsTrainLabeled =变换(dsTrain,…@(块,blockInfo) labelCamelyon16Blocks(块,blockInfo imageLabels) IncludeInfo = true);dsValLabeled =变换(dsVal,…@(块,blockInfo) labelCamelyon16Blocks(块,blockInfo imageLabels) IncludeInfo = true);
增加训练数据
增加训练数据使用变换
函数和augmentBlocksReflectionRotation
helper函数。辅助函数附加到例子作为支持文件。金宝app
的augmentBlocksReflectionRotation
helper函数增加训练数据的大小通过创建三个版本的每个输入块反射和90度旋转。
dsTrainLabeled =变换(dsTrainLabeled @augmentBlocksReflectionRotation);
预览一批训练数据。
批=预览(dsTrainLabeled);蒙太奇(批处理(:1)BorderSize = 5,大小= (1 - 4))
可以提高网络的泛化能力执行额外的随机增加操作的其他数据。例如,污渍正常化是一种常见的WSI图像增强技术。染色标准化降低了变异性的颜色和强度在彩色图像从不同来源4]。
保存培训和验证数据存储到磁盘。
保存(fullfile (dataDir“trainingAndValidationDatastores.mat”),“dsTrainLabeled”,“dsValLabeled”);
您现在可以使用数据存储训练和验证分类网络。例如,看到的分类肿瘤图像多分辨率阻塞。
引用
[1]Ehteshami Bejnordi、Babak Mitko高山病,保罗•约翰内斯·范·迪斯特布拉姆·范·Ginneken尼科Karssemeijer, Geert Litjens,珀斯a·w·m·范德Laak et al。”诊断评估深度学习算法的检测在乳腺癌患者淋巴结转移。”《美国医学会杂志》318年,没有。22岁(2017年12月12日):2199 - 2210。https://doi.org/10.1001/jama.2017.14585。
[2]Szegedy,基督徒,文森特•Vanhoucke谢尔盖•约飞Jonathon Shlens,兹比格涅夫•Wojna。“重新考虑初始架构计算机视觉”,12月2日2015年。https://arxiv.org/abs/1512.00567v3。
[3]ImageNet。https://www.image-net.org。
[4]Macenko,马克,马克•Niethammer j . s .栗色的大卫•宝蓝,约翰·t·伍斯利小关,查尔斯·施密特和南希·e·托马斯。“正常化组织学幻灯片的方法进行定量分析。“在2009年IEEE国际研讨会上生物医学成像:从纳米到宏,1107年10月,2009年。https://doi.org/10.1109/ISBI.2009.5193250。
另请参阅
blockedImageDatastore
|blockedImage
|selectBlockLocations
|mergeBlockLocationSets
|blockLocationSet
|bigimageshow
|变换