luna16-预处理至FROC曲线完整过程(医学图像检测/分割3D通用方法)

前言感慨

毕业在即,入坑肺结节检测/分割至今,算是对结节检测每一个细节步骤了解清楚了吧,想起初入门时候的迷茫和无头绪,大量的时间花在了数据格式解析、预处理上,并且看了各大博客网站、论坛,并未对luna16 结节检测/分割主流的3D方法有完整叙述,所以萌生了自写一贴的想法,这篇文章可以让读者对预处理至FROC曲线生成有完整认识。

下文需要的数据、资料、代码均可私我,保姆级讲解

基础知识与工具

ITK-sanp:一个观察CT图像的软件,傻瓜式操作,只要用来后面由坐标定位观察咱们检测、找到的结节位置

用软件打开nii或者mhd文件,三幅图即对应一张CT图像的三个方向切片,其中最重要、也是我们用来构建模型需要的就是左上方那一张(也叫横断位),好比就是把你腰斩了,再从上到下看你。左边的工具栏中有X、Y、Z三个坐标,其中Z坐标就是横断位的切片坐标。

预处理

这里对小白有一个说明,预处理,是对所有数据划分成训练集、测试集前的预处理。预处理,没有训练集、测试集之分

直入正题,luna16由官网下载后可以得到subset0-subset9这十个文件夹,里面是mhd与raw格式的文件,一个病人的CT即对应一个mhd与raw格式俩文件,像这样:

 预处理说白了就是将这些文件经过一系列转换,生成模型所需要的格式,也就是npy格式(我刚开始的时候纠结3D方法到底以什么形式输入模型,其实就是简单的npy数据即可)

接下来开始预处理,在这里我对luna16做了很到位的预处理,也是参考了一篇冠军文章

Evaluate the Malignancy of Pulmonary Nodules Using the 3-D Deep Leaky Noisy-OR Network,过程差不多是下图

(a):RAW数据转化HU值  (b):-600为阈值二值化切片 (c):保留肺部区域

(d):分出左右肺 (e):计算肺的凸包 (f):膨胀 、合并左右肺 (g):原图X掩膜 (h):裁剪

 这个过程大概700行代码,就不贴代码了。之后我生成原图像的nii文件(一个函数getarrayfrom就可以从nii转为npy、结节的npy文件,之所以转换成npy,是因为三维数组与二维数组相比只不过多了一个维度,直观、方便。

这样我们的预处理就结束了,得到预处理后的CT图像nii文件和记录了每幅CT中结节的坐标的npy文件(官网下载的annotation文件记录了结节的世界坐标与直径),如果是作为训练集,侧储存在以下的灰色文件夹中

3D方法结节检测介绍

在这里介绍的由一篇文章

A 3D Probabilistic Deep Learning System for Detection and Diagnosis of Lung Cancer Using Low-Dose CT Scans

引发而采取的方法,之所以介绍并代码实现这样的方式,是因为其实际上囊括了3D结节检测与分割、分割,这样对不同任务需求的小伙伴都可以有入门意义

基本思想是这样的:

1、对整幅CT图像进行结节分割,结节部分分割为像素1,其他部分为像素0

2、取结节部分的连通域质心,构建32x32x32的立方体块,送入真/假阳性分类网络降低假阳性并给结节打分并方便测试

3、测试评估时,只需要根据自己的模型得到所检测到的结节坐标,如果检测到的结节中心坐标位于真实结节的半径范围内,那么就是TP、就意味着检测到了

细节过程

1、对整幅CT图像进行结节分割

在预处理后我们得到了CT图像和其结节坐标。对于2D的图像分割,我们只需将原图片与分割的GT label送入网络进行测试,而在3D方法中,因为显存问题,我i们无法对动辄几百张切片的CT图像进行直接分割,需要切块

由我们之前得到的CT图像和其结节坐标,可以以坐标为中心,取结节半径生成一个球形label(也可以根据LIDC数据集获得精准像素级结节标注),分别对应切成96x96x96或128x128x128的立方体块,其中每一个立方体均含有结节(也可以根据自己想法,取不含阶级的块)去训练一个对‘块’进行分割的网络,在测试与最终需要实际应用时,会将我们的CT输入网络,进行一个切块后再缝合起来的过程,这里,看似复杂,其实不然,切块策略与缝合策略都可以由代码天衣无缝地完成,这一部分完成后,我们将得到CT图像的96x96x96的nii块文件与对应的‘块’分割label文件,分别存在下图灰色文件夹中

这样,我们就得到了2-3万个‘块’(这里取多少块自己定)

于是,我们使用getarrayfrom函数将nii也转换为npy(之所以不一开始就转换为npy是因为nii可以永itk-snap软件直观观察结节和CT图像)

这样,我们就可以进行训练了,实际上对于3D分割模型,输入的是CT的三维npy与标注文件的npy,与2D相对应。这样我们就可以得到一个对‘块’具有结节分割的3D模型,如果是进行肺结节分割,那么到这一步,就完成了整个分割任务,使用/测试时,只需将模型输入,进行‘块’分割后‘缝合,保存在上图seg_result中就可以与GT去计算其DSC系数

2、取分割连通域中心作为检测到的结节中心坐标

由第一步分得到整幅图像的结节分割结果后,CT图像中会有许多‘白色’小区域,这一部分即对应了我们的结节位置,根据连通域取质心后,得到结节的坐标,再根据这一坐标获得32x32x32的结节块,去训练一个降假阳的3D分类网络。

训练一个3D分类网络,所需要的数据即从我们第一部分分割后得到的白色小区域中来,我们所得到的白色小区域(训练集),这一些白色小区域,有些是真的结节,有的是假的结节,根据我们分割最后的阈值选定,可以得到不同数量的白色小区域,即构成了我们3D分类网络的训练集,这样,根据32x32x32的‘块’,得到了一个训练的分类网络

3、结节检测测试过程

测试时,需要三步

1、将测试的nii文件输入到第一步的分割网络中,进行分割与缝合,结果保留在

 灰色文件夹中,接下来,一样地,取出我们由分割得到地白色小区域

 生成了32x32x32的结节区域,送入到结节的分类/降假阳网络中得到,输出结节,其文件名包含了其对应的CT索引与结节坐标,如下

0.0blong1in1belong1.3.6.1.4.1.14519.5.2.1.6279.6001.193964947698259739624715468431location220.0Z142.0Y151.5X.nii

这样,根据结节名字就可以生成一个csv文件,记录了我们所检测到的结节CT名、三维空间坐标,送入评估文件,就可以得到FROC曲线了

 这里没有对模型进行优化、参数调整,训练的epch也不够,但可以看到,是一个有效的检测网络

差不多完整过程就是这样,篇幅问题,需要预处理部分、分割、分类模型的小伙伴可私我,你想要的一切都有,轻松入门

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值