社会焦点

Kaggle百万美元大赛优胜者:如何用CNN识别CT图像检测肺癌?

字号+ 作者: 来源: 2017-05-07

Kaggle百万美元大赛优胜者:如何用CNN识别CT图像检测肺癌?,肺癌与肺炎ct症状区别,增强ct能确诊肺癌吗,派特ct检查肺癌准确,ct肺部有阴影肺癌概率,看ct片如何确诊是肺癌

Kaggle百万美元大赛优胜者:如何用CNN识别CT图像检测肺癌?

  王小新 编译自GitHub

  量子位 出品 | 公众号 QbitAI

  今年,Kaggle网站举办了一场用肺部CT图像进行肺癌检测的比赛Data Science Bowl 2017,提供百万美元奖金池。美国国家癌症研究所为比赛提供了高分辨率的肺部CT图像,在比赛中,参赛者根据给定的一组病人肺部CT三维图像,预测癌症风险。

  Julian de Wit和Daniel Hammack合作完成的解决方案获得了比赛的第二名。Wit最近写了一篇博客来介绍他们的方案。他们通过3D卷积神经网络,来构建结节探测器,预测患癌可能性。Wit在64位的Windows10系统下,结合TensorFlow 0.12.0和Keras库实现该网络模型。

  BTW,第2名的奖金是20万美元。

  以下内容编译自Wit的文章:

  初步了解和制定计划

  在决定参赛之前,我观看了一个Bram van Ginneken关于肺部CT图像的介绍视频,有了基本的了解。我试图直接观察一些CT扫描样本,发现这是一个很难的问题,难度与大海捞针相当。视频中提到,图像的信噪比大约为1:1000。论坛中的一些讨论也提到,神经网络不能直接从这些原始图像中学习到有用信息。目前只有1300个训练样本及对应的癌症标签,这与网络提取出的图像实际特征相差甚远。

  我们希望获得更高信噪比的训练集,或是找到标签和图像特征之间更直接的关系,来训练神经网络。幸运的是,比赛组织者指出,可以借鉴一个先前举办的比赛LUNA16。在LUNA16数据集中,医生为800多个病人CT图像中精心标记了1000多个肺结节。当然,LUNA16比赛也提供没有标记结节的数据集。

  因此,你可以从整体CT图像中的标记周围裁剪出小型3D图像块,最终可以用更小的3D图像块与结节标记直接对应。结节大小是癌症的一个影响因素,数据集也说明了结节的大小,所以我认为这是一个有用的信息。

  Kaggle百万美元大赛优胜者:如何用CNN识别CT图像检测肺癌?

  图1:方法网络示意图

  我还注意到LUNA16数据集是由另一个公开数据集LIDC-IDRI转化过来的。在原始数据集中,医生不仅要检测结节,而且还评估了结节的恶性程度和其他指标。我们发现,恶性程度是评估患癌风险的最佳指标,也是神经网络可以学习的。

  最终的计划方案是训练一个神经网络来检测结节,并评估结节的恶性程度。在预测时,网络通过滑动窗口来遍历整体CT图像,分别判断每个滑动窗口的区域包含恶性信息的可能性。最后基于这种信息和其他特征,估计该患者发展成癌症的可能性。

  数据预处理和创建训练集

  在预处理中,要使扫描图像的尺度尽可能一致。我首先重新缩放了CT图像,使每个像素点只表示1x1x1毫米的体积。我们也尝试了一些其他尺度的实验,最终确定了采用1毫米的尺度,这能很好地平衡计算精度和计算负荷。对于CT图像,像素强度可以用Hounsfield来表示,一般叫做亨氏单位。论坛里提到,要尽量降低像素强度,即最大化hounsfield值,然后归一化处理。同时还要确保所有CT扫描都具有相同的方向,因为CT图像旋转超过45度,意味着在图像采集过程中出现错误。

  极大部分关于结节检测的文献都是先从CT扫描图像中分离出肺组织。然而目前没有合适的分割方法,能够很好地处理隐藏在肺组织边缘周围的结节和肿块。在CT图像中,这些区域会直接被删除,更不用说使用结节探测器进行类型判定。我想要训练一个U-net网络,来更好地分割肺部。与传统的分割方法相比,U-net网络能够更有效地解决实际的图像分割问题,在同为Kaggle举办的卫星图像分割比赛中被广泛地使用。当我观察这些CT图像时,我认为可以通过肺组织的边缘,构建框架来找到肺结节。这么做可能是有用的,最后我决定对原始图像进行训练和预测。在调整训练数据后,该网络效果不错,似乎没有负面影响。

  在这个竞赛中,给定了训练数据,可能没有很大的发挥空间。然而处理训练集是必须的,但不是最重要的那部分工作。我使用样本中的标签,自动生成训练集的标签,也采用主动学习方法,添加部分人工标记。以下是带有标记的不同数据集。

  Kaggle百万美元大赛优胜者:如何用CNN识别CT图像检测肺癌?

  表1:标记后的训练集

  LIDC数据集中被正面标记的数量是LUNA16数据集样本数的五倍。因为这些标记是4名医生的综合注释,所以一个结节可能被标记了4次。但LUNA16也忽略了不到3名医生标注的结节。我决定在训练集中保留这些被忽视的结节,因为他们也提供了宝贵的结节恶性信息。

  LUNA16 v2数据集的标签是直接从LUNA16传来,一般是多个结节检测系统错误标出的假阳性结节。要注意的是,部分结节是上面提到的不到3名医生标记的结节。我保留了这些结节标记,是为了平衡那些可疑的假阳性结节。

  为了得到肺部轮廓,我需要得到非肺组织的底片。我使用了论坛中提到的简单肺分割算法,在分割掩码边缘周围进行采样标注,从而分割得到肺部组织。

  在进行第一轮训练之后,我在LUNA16数据集上进行结节预测,得到了所有假阳性结节,也并入LUNA16 v2数据集中。

  随着比赛的进行,我想建立第二个模型。对于这个模型,我做了放射科医生的工作,在NDSB数据集上训练网络。我手动地从癌症样本中选择明显的阳性结节,并从非癌症样本中选择假阳性结节,用这些数据训练了第二个模型。我希望效果不错,但我是一个不合格的放射科医生,实际上第二个模型比无手动标注的模型要糟糕得多。但是结合这两个模型,这个得到的融合模型比单独的模型效果更好,所以我保留了第二个模型。

  我简单地建立了一个结节观察器,来调试所有的标记。在观察时,我注意到医生忽略了一些大于3cm的大结节。在LIDC数据集的说明文档中,我发现医生被要求忽略掉大于3cm的结节。我担心这些被忽视的结节区域会迷惑分类器,故删除了相重叠的底片。下面是肺部CT图像的一些截图。

  Kaggle百万美元大赛优胜者:如何用CNN识别CT图像检测肺癌?

  图2:图像中的标记。

  左上:LUNA16 v2数据,右上:非肺组织的边缘,

  左下:假阳性的区域,右下:被移除的无标注区域。

  3D卷积神经网络的训练方法和网络结构

  在一个高质量的训练集下,我们仍需要多次调整来有效地训练神经网络。数据集的两类样本量严重不平衡,正反两类样本量的比为5000:500000,且正面例子的大小和形状有很大差异。我曾考虑使用U-net网络,但2D U-net不能完全利用结节本身的三维结构信息,3D U-net网络的训练过程非常缓慢而且不灵活。我不使用U-net的主要原因是不需要建立细粒度的概率图,而只是一个粗略的检测器。在CT图像的滑动窗口中,建立小型的3D Convnet,这更加轻便和灵活。

转载请注明出处。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章