主要内容

预训练神经网络在CT扫描中的肺分割

此示例演示如何导入预先训练的ONNX™(开放神经网络交换)3d U-Net [1],并使用它从三维胸部CT扫描中对左右肺进行语义分割。语义分割将三维图像中的每个体素与类标签关联起来。在本例中,您将测试数据集中的每个体素分类为属于左肺或右肺。有关语义分割的更多信息,请参见语义分割(计算机视觉工具箱)

应用预训练网络的一个挑战是,新数据集的强度和空间细节与用于训练网络的数据集之间可能存在差异。预处理通常需要格式化数据,以匹配预期的网络输入,并实现精确的分割结果。在本例中,在应用预训练的网络之前,您将标准化空间方向并规范化测试数据集的强度范围。

下载Pretrained网络

指定预训练网络的所需位置。

dataDir = fullfile (tempdir,“lungmask”);如果~存在(dataDir“dir”mkdir (dataDir);结束

从MathWorks®网站下载预先训练的网络downloadTrainedNetworkhelper函数。helper函数作为支持文件附加到这个示例中。MathWorks网站上的网络等价于R231模型,可在LungMask GitHub存储库中获得[2,转换为ONNX格式。预训练网络的大小约为11 MB。

lungmask_url =“//www.ru-cchi.com/supportfiles/medical/pretrainedLungmaskR231Net.onnx”;downloadTrainedNetwork (lungmask_url dataDir);

进口Pretrained网络

将ONNX网络作为函数导入importONNXFunction(深度学习工具箱)函数。您可以使用此函数导入具有多个层的网络importONNXNetwork(深度学习工具箱)函数不支持。的importONNXFunction功能需要ONNX模型格式的深度学习工具箱™转换器支持包。如果没有安装此支持包,则importONNXFunction提供下载链接。

importONNXFunction函数导入网络并返回一个ONNXParameters对象,该对象包含网络参数。当您导入预先训练的肺分割网络时,该函数显示一个警告LogSoftmax不支持操作符。

modelfileONNX = fullfile (dataDir,“pretrainedLungmaskR231Net.onnx”);modelfileM =“importedLungmaskFcn_R231.m”;params = importONNXFunction (modelfileONNX modelfileM);
导入ONNX网络架构的函数保存到文件importlunmaskfcn_r231 .m中。要学习如何使用这个函数,输入:help importedLungmaskFcn_R231。
警告:无法导入某些ONNX操作符或属性。它们可能已经被导入模型函数中的'PLACEHOLDER'函数所取代。1个操作符:当前设置或在此上下文中不支持LogSoftmax操作符。

打开生成的函数,以M文件的形式保存在当前目录中。函数包含这些代码行,指示不支持LogSoftmax操作符被替换为占位符:

不支持的操作符的%占位符函数:(var。x460 NumDims。x460] =占位符(Vars.x459);

在函数定义中,用以下代码替换占位符代码。将更新的函数保存为lungmaskFcn_R231.的一个副本lungmaskFcn_R231附带的正确代码也作为支持文件附加到此示例中。

%替换不支持操作符的占位符函数(LogSoftmax):var。日志(softmax x460 = (Vars.x459,“DataFormat”“CSSB”));NumDims。x460 = NumDims.x459;

将网络参数保存在ONNXParameters对象参数个数.将参数保存在一个新的MAT文件中。

保存(“lungmaskParams_R231”“参数”);

加载数据

在测试数据集上测试预训练的肺分割网络。测试数据是来自Medical Segmentation十项全能数据集的CT胸部体积[3.].下载MedicalVolumNIfTIData从MathWorks网站下载ZIP文件,然后解压缩该文件。ZIP文件包含两个CT胸部卷和相应的标签图像,以NIfTI文件格式存储。数据集的总大小大约为76 MB。

zipFile = matlab.internal.examples.downloadSupportFile (“医疗”“MedicalVolumeNIfTIData.zip”);filePath = fileparts (zipFile);unzip(zipFile,filePath) dataFolder = fullfile(filePath,“MedicalVolumeNIfTIData”);

指定第一个CT卷的文件名。

文件名= fullfile (dataFolder,“lung_027.nii.gz”);

创建一个medicalVolume对象为CT卷。

medVol = medicalVolume(文件名);

提取并显示体素数据medicalVolume对象。

V = medVol.Voxels;volshow (V, RenderingStyle =“GradientOpacity”);

测试数据进行预处理

对测试数据进行预处理,以匹配预训练网络的预期方向和强度范围。

旋转横平面上的测试图像体积,以匹配预训练网络的预期输入方向。网络训练使用面向数据的病床在图像的底部,因此测试数据必须面向相同的方向。如果更改测试数据,则需要应用适当的空间转换来匹配网络的预期方向。

rotationAxis = [0 0 1];volAligned = imrotate3 (90 V, rotationAxis);

显示旋转卷的切片以检查更新的方向。

imshow (volAligned (:,:, 150), [])

使用强度归一化将感兴趣区域的体素强度范围重新缩放到范围[0,1],这是预训练网络期望的范围。强度归一化的第一步是确定感兴趣区域内的强度值的范围。这些值的单位是Hounsfield。要确定强度范围的阈值,绘制体素强度值的直方图。设置x -而且y-基于最小值和最大值的直方图图的极限。直方图有两个大峰。第一个峰值对应于病人体外的背景像素和肺部的空气。第二个峰值对应于心脏和胃等软组织。

图直方图(V) xlim ([min (V, [],“所有”)马克斯(V, [],“所有”ylim([0 2e6]) xlabel(“强度(Hounsfield单位)”) ylabel (“压”)参照线((-1024 500),“红色”线宽= 1)

为了将强度限制在包含感兴趣区域的大部分组织的区域,选择强度范围的阈值为- - - - - -1024年和500年。

Th = [-1024 500];

应用preprocessLungCT辅助函数进一步预处理测试图像卷。helper函数作为支持文件附加到这个示例中。的preprocessLungCT函数执行以下步骤:

  1. 将每个二维切片的横向尺寸调整为目标尺寸,imSize.减少体素的数量可以提高预测速度。将目标大小设置为256 × 256体素。

  2. 中的阈值指定的范围内裁剪体素强度th

  3. 将更新的体素强度归一化到范围[0,1]。

imSize = [256 256];volInp = preprocessLungCT (volAligned、imSize th);

分段测试数据和后处理预测标签

对测试CT体积进行分段lungSeghelper函数。helper函数作为支持文件附加到这个示例中。的lungSeg函数通过对预训练的网络进行推理来预测分割掩码,并对网络输出进行后处理,得到分割掩码。

为了减少所需的计算时间,可以使用lungSeg函数对卷的切片进行批量推理。使用b指定批大小为8片atchSize名称-值参数lungSeg.增加批处理大小可以提高推断的速度,但是需要更多的内存。如果内存不足,请尝试减小批处理大小。

在后处理过程中,lungSeg助手函数对网络输出应用模式过滤器,以平滑分割标签使用modefilt函数。方法可以设置模式筛选器的大小modeFilt名称-值参数lungSeg.默认的过滤器大小为(9 9 9)

labelOut = lungSeg (volInp batchSize = 8);

显示预测分词标签

来显示分割结果volshow函数。使用OverlayData参数绘制预测的分段标签。要关注标签数据,请使用Alphamap设置图像卷的不透明度为0OverlayAlphamap参数将标签的不透明度设置为0.9。

volshow (volInp OverlayData = labelOut,...Alphamap = 0,...OverlayAlphamap = 0.9,...RenderingStyle =“GradientOpacity”);

还可以将预处理的测试卷显示为切片平面,并将预测的分割标签显示为覆盖层RenderingStyle名称-值参数“SlicePlanes”.属性指定肺分割标签OverlayData名称-值参数。

volshow (volInp OverlayData = labelOut,...OverlayAlphamap = 0.9,...RenderingStyle =“SlicePlanes”);

单击、拖动鼠标可旋转卷。若要在平面中滚动,请在要研究的切片上暂停,直到它突出显示,然后单击并拖动。左肺和右肺分割掩模在为其定义的切片中可见。

参考文献

[1] Hofmanninger, Johannes, Forian Prayer, Jeanny Pan, Sebastian Röhrich, Helmut Prosch,和Georg Langs。常规成像中的自动肺分割主要是一个数据多样性问题,而不是一个方法论问题。欧洲放射学实验4,没有。1(2020年12月):50。https://doi.org/10.1186/s41747 - 020 - 00173 - 2。

[2] GitHub。严重病理下的CT肺自动分割已于2022年7月21日访问。https://github.com/JoHof/lungmask

[3]医疗细分十项全能。“肺”。任务。已于2018年5月10日登陆。http://medicaldecathlon.com.Medical Segmentation Decathlon数据集是在CC-BY-SA 4.0许可下提供的。所有的保证和声明是不承认的。详细信息请参见license。

另请参阅

(深度学习工具箱)||

相关的话题

Baidu
map