Evaluate the Malignancy of Pulmonary Nodules Using the 3D Deep Leaky Noisy-or Network 论文阅读
该论文提出了一种基于3D卷积神经网络(3D CNN)的肺结节检测方法,用于Kaggle上的2017年肺结节检测比赛。背景中提到,肺结节在CT图像中的表现具有与正常组织相似的HU值,但形状和位置差异较大,检测难度较高。解决方案中,作者通过预处理步骤(如肺部提取、凸包膨胀和灰度标准化)减少神经网络的处理量,同时采用改进的U-Net结构作为检测网络,并结合leaky noisy-or模型进行分类。实验使用了LUNA16和DSB两个数据集,特别是对DSB中的结节进行了人工标记以提高训练效果。摘要总结了该方法在三维检测问题中的创新性和有效性。
Kaggle数据科学碗2017比赛的github链接中,最佳算法的代码托管在GitHub上,具体链接为github.com/lfz/DSB2017。
背景
肺结节比赛采用的图像是CT,其中肺结节的影像学表现如下:
和正常组织具有相同的HU值,但是具有不同的形状。
2. 支气管和血管是连续管腔,在根源较厚,在分支处较细;而肺结节一般呈球形。
3. 肺结节有很多类别,具有不同大小和形状,与癌症的相关性也不同。
医生对一位病人的正常阅片时间是10分钟。自动化检测算法的难点如下:
- 肺结节是3D检测问题。目前主流GPU显存不足以支持整幅图像的输入。之前有文章使用2D的RPN在2D slice上提取proposal,然后整合不同层的结果,形成3D proposal。此外,3D的标注困难也较大(个人觉得label上3D的获取应该是从2D拼接起来的,应该不会太难),模型容易过拟合。
- 不同肺结节形状差异大,与正常组织难以区分,如下图。有时候医生也难以确定。
- 肺结节和肺癌之间的关系复杂。存在肺结节并不一定是肺癌,发生肺癌也不一定能找到可见肺结节 。因此,判断发生肺癌的概率和找到的多个肺结节有关,这就成为了多实例学习问题(Multiple Insatnce Learning)。

为了解决上述问题,文章提出了解决方案:第一,基于3D RPN的Patch-wise检测网络用于预测肺结节的边界框(bbox)。该方案通过数据增强技术来防止模型过拟合,通过设定较低的阈值来检测所有可能的结节,并通过top-5结节进行癌症可能性预测。第二,采用带有泄漏的noisy-or模型来整合top-5结节的分数,通过计算癌症可能性。该模型通过noisy-or表示一个事件可能由多个因素共同作用,即使单个因素未发生也可能导致事件发生。此外,该模型还考虑了泄漏可能性,即即使所有因素均未发生,事件仍有可能发生。此外,该分类网络与检测网络共享特征提取器,并采用交替训练方式以优化性能。
数据集
模型训练基于以下两个数据集:
- LUNA16:该数据集包含888名病人,其中1186例肺结节经过人工标注。
- DSB:在该数据集中共有1397名病人参与训练,198名用于验证,506名用于测试。人工标注了训练集中754例结节和验证集的78例。
人工标注的原因:尽管两者都是肺结节检测,但LUNA16数据集包含大量小结节,其平均直径为8.31毫米,而临床实践认为直径在6毫米以下的肺结节通常无害。相比之下,DSB数据集包含较多的大结节,平均直径为13.68毫米,并且其中许多结节与主支气管相连,这是LUNA16数据中罕见的特征。因此,直接使用LUNA16数据集进行训练会导致效果不佳。为此,研究团队移除了所有直径小于6毫米的未标注结节。
本文算法
预处理
CT成像系统对整个胸腔区域进行扫描,其覆盖范围包括了除肺部以外的其他组织和器官。为了解除其他组织的干扰,作者首先提取了肺部区域。

1. Mask extraction:作者首先在2D slice上通过阈值 得到了肺部以及周围较暗部分的mask,如图中(b)所示,然后通过连通性分析 ,去除30mm以下的(肺部是中间一大块,不会这么小)以及离心率大于0.99的(个人感觉一般线状伪影可能是这样)。然后在3D中保留不在边际的(去除周围较暗部分)以及容积在0.68-7.5L之间的。经过这样处理后,一般就能够保留肺部区域,还有一些异常的话,可以利用肺部处于图像中间的特性进行排除。结果如图(c)所示。
2. Convex hull & dilation: 一些结节如果与肺的外壁相连,则不会出现在上述步骤提取的mask中,这种情况是需要避免的。如果想要把他们包含进来,直接的方式是对整个mask进行凸包,不过这样就会引入骨骼那一块,影响比较大。所以根据肺的结构,将其分成两块,如图(d)所示。然后分别对两块进行凸包,并且向外10pixels的膨胀。得到图(f)。不过作者还提了一句,对于肺部底部,由于其形状接近U型,凸包后如果面积大于原始的1.5倍,则放弃凸包,避免引入过多其他组织。
3. 灰度标准化:首先把HU值线性变换到0-255。mask以外的像素灰度都设成170(正常组织的灰度)。膨胀10像素区域中如果灰度高于210,也设成170(为了防止骨头被当成结节)。
- 到这里感触良多,以上经验值参数的设置确实涉及较多,自己在项目中每次设置的时候都得仔细权衡是否是最优选择,会不会在异常情况下可能出现效果不佳的情况。是否可以采取更加大胆的策略?
- 还有目前的常见做法是将图像直接输入,从这篇文章的分析来看,如果预处理能够降低神经网络的计算量,去除可能的误导因素,提升效果应该是有目共睹的。
3D CNN for Nodule Detection
该检测网络基于U-Net改进型架构,由于其为二分类问题,因此在提出区域建议框后无需进行后续分类工作,从而实现了一步式解决方案。为了解决GPU资源有限的问题,该网络采用了128×128×128×1的输入尺寸,并随机选取两类patches进行训练。其中,70%的样本包含至少一个结节,而30%的样本不含结节(目的是确保负样本的收敛性)。结界的边界间距设定为至少12像素,以避免越界填充值的干扰。数据增强策略采用随机翻转和缩放操作,其中随机翻转和缩放的参数设置为0.8至1.15倍。
网络结构:

U-net结构能够很好解决结节不同大小的问题。接下来逐步看网络的流程:
1. 输入:1281281281
2. K:两个卷积层,每个卷积层有24个333的卷积核,padding=1。因此输出为12812812824的feature maps。
3. R:残差块,如图(b)所示。由三个残差单元组成。每个残差单元由卷积,BN,Relu,卷积,BN构成,其中卷积核的大小都是333。这里面需要注意的是残差前后channels由24变成了32。因此不是y = F(x)+x,而是y=F(x)+Wx,其中W是卷积运算用于改变channels。此处还省略了一个222 with stride=2 MaxPooling。
4. D:转置卷积,原始U-net中设置成不可学习,注意一下文章此处在实现时的设置。
5. C:融合层。除了和U-net一样,此处作者还添加了hlw3的location information。(个人觉得医学图像中绝对位置对于诊断还是很重要的,之前也尝试过加入位置信息,不过是在输入层中加,作者的这个加法更加合理,因为这种显式的信息应当靠近网络的后端,能够对分割结果起到更大的影响。)具体方法作者说的不是很清楚,我觉得应该是patchs在原始图像中的相对坐标,然后resize到 3232323的大小。所以融合层的输入的channels是131(64+64+3),然后通过111的卷积将channels变换到15进行输出。
6. 输出:32323235(此处维度变化是由resize得到的,但是这显然和128维的不对应,倒是和15对应,所以我觉得上一层最后提到的111卷积是在输出前做的,而不是每个融合层做)。然后3代表每个像素点3个anchor,5代表(o,dx,dy,dz,dr),也就是概率,三维坐标和bbox的直径大小。
损失函数
将真值的label定义为(Gx,Gy,Gz,Gr),每个Anchor的值定义为(Ax,Ay,Az,Ar)。与Faster RCNN类似,IoU大于0.5的归类为P,小于0.02的归类为F,其余情况不考虑。
其分类损失计算为:
Bbox回归的标签生成:
总的回归损失为:
其中S是smoothes L1-norm function。
最后网络的训练loss是:
正负样本
1. 正样本
对于数量较多的P anchors,随机选取一个进行处理。
在采样过程中,对于30mm以上的结节,采样频率增加至原来的两倍;而对于40mm以上的结节,采样频率则提升至五倍,以强化对较大结节的关注。
2. 负样本
相对于正样本而言,负样本的数量显著多于正样本。这是RPN中的一个典型问题。通过实施hard negative mining策略来解决这一问题。核心思想是控制负样本的数量,以提高模型的区分能力。
测试阶段
输入: 208208208*1 overlap=32 pixels。
输出采用非极大值抑制。
这种overlap crop容易理解,但是一直以来都没有编写代码,特别是训练阶段。
之前一直不知道如何处理不同大小图片的问题,阅读了相关文章后,终于明白该如何编码了。
Cancer Classification

在获取结节的region proposal后,基于scores值,选取前5个具有最高置信度的区域。在数据增强的需要下,训练阶段可以随机选取。对每个结节的输入,采用肺癌可能性评价网络,该网络基于之前的U-net结构,如图(a)所示,具体流程如下:1. 输入:提取96×96×96×1的三维切片区域。我对此提出疑问:既然该方法仅依赖中心点信息,为何还需训练dr参数?这可能与提升模型的特征提取能力有关。2. 取最后一个卷积层的输出(24×24×24×128),将中心2×2×2的值提取出来(2×2×2×128=1024),经过max-pooling得到128维的特征向量。该处的特征主要由该结节8个采样点的位置信息和对应的scores值决定。
在此阶段,我们成功提取了5个128维特征,如何获取最终的癌症分类得分?研究者考察了四种不同的方法,其中最优的方案是具有微分分层的noisy-or模型。
此时,loss function可以认为是计算p和label之间的交叉熵。这样的话,每个pi代表的是各自为癌症的概率吗?
训练策略
文章提到结节的bounding box事先生成好,这是什么意思不是很明白。是指RPN网络已经训练好了?那后面的联合训练只是Refine?
文章说为了避免过拟合,有两个方式:一个是数据增强,另一个是正则化。
数据增强包括:1)随机翻转 2)resize 3)旋转 4)平移。
正则化:RPN和分类互相正则化。在每一次训练阶段,有一个detector的eopch和一个classifer的epoch。
由于batch size = 2,所以训练不稳定,采用l2 norm的gradient clipping。
由于迭代训练,所以BN的参数需要特别处理。
