← Back to Blog

Case Study - Predicting Lung Cancer with 3D CNNs

Nov 1, 2017 · WeifanD

1. Problem Definition: The Cancer Moonshot Challenge (问题定义:癌症登月计划)

1.1 严峻的全球健康挑战

肺癌是全球范围内发病率和死亡率增长最快的恶性肿瘤之一,对人类健康和生命构成巨大威胁。近 50 年来,各国数据显示肺癌的发病率与死亡率均呈显著上升趋势。据统计,男性肺癌发病率和死亡率均居所有恶性肿瘤之首;女性发病率位居第二,死亡率同样高居第二位。

Lung Cancer Statistics

在美国,每年有超过 220,000 人死于肺癌,由此产生的国家医疗健康成本投入巨大。早期发现是提高生存率的关键,但传统的放射科医生阅片方式存在效率瓶颈:一名医生每天需查看数百张 CT 切片,疲劳和主观差异可能导致微小结节的漏诊或误判。

1.2 竞赛背景:2017 Data Science Bowl

为了响应奥巴马政府发起的 “Cancer Moonshot 2020” 国家级创新项目(旨在加速癌症研究,十年内将癌症死亡率降低一半),Kaggle 于 2017 年举办了 Data Science Bowl

核心任务: 开发一个人工智能算法,输入患者的低剂量胸部 CT 扫描数据,输出该患者在一年内被诊断为肺癌的概率。这不仅是一个二分类问题,更是一个关乎生命拯救的工程挑战。成功的模型可以作为放射科医生的“第二双眼睛”,提高筛查效率,减少漏诊。

2. Data Ecosystem (数据生态)

解决此类医疗影像问题,单一的数据源往往不足以训练出鲁棒的深度学习模型。我们构建了一个包含内部竞赛数据和外部公开数据集的混合数据生态。

2.1 核心数据:DSB 2017 Dataset

  • 数据来源:提供了 1,000 名 高风险患者的低剂量胸部 CT 扫描数据。
  • 数据格式DICOM (Digital Imaging and Communications in Medicine)。这是医学影像存储和交换的国际标准格式。
    • 每个患者拥有一个唯一的 PatientID
    • 每个 PatientID 对应一个文件夹,内含数十至数百个二维轴向切片(Axial Slices)。
    • 这些切片共同构成了一个三维的胸腔体积数据。
  • 特点:低剂量 CT(LDCT)意味着辐射量较小,但也带来了更高的图像噪声,增加了特征提取的难度。

DICOM Structure

工具链支持: 处理 DICOM 数据需要专门的库:

  • Python: pydicom (读取元数据和像素数组), SimpleITK (图像处理), nibabel
  • R: oro.dicom
  • 可视化: Mango (Windows 下的专业 DICOM 查看器), 3D Slicer

2.2 外部增强数据:LUNA16 Dataset

仅靠 1000 个带标签的样本训练深层 3D CNN 极易导致过拟合。这就好比让一名学生只通过做几道真题来备战数学竞赛,效果必然有限。我们需要大量的“习题”来学习结节的形态特征。

因此,我们引入了 LUNA16 挑战赛的数据集作为外部补充。

  • 数据价值:LUNA16 提供了数千个已标注的肺结节(Nodule)数据,包含精确的坐标、直径、形态特征等。
  • 关键标签
    • 位置 (Coordinates):结节在三维空间中的 $(x, y, z)$ 坐标。
    • 尺寸 (Diameter):结节的大小,微小结节(<5mm)最难检测。
    • 形态 (Shape):如毛刺征 (Spiculation)、分叶征 (Lobulation),这些是恶性的重要指征。
    • 性质 (Malignancy):良性 vs 恶性的金标准标签。

策略意义:利用 LUNA16 预训练模型的特征提取器,或者将其作为负样本(非结节区域)的补充,可以显著提升模型对“什么是结节”的理解能力,从而在 DSB 2017 的测试集上获得更高的分数。可以说,高质量的结节标签数据决定了模型性能的上限

更多外部数据资源可参考:Kaggle Discussion

3. Preprocessing Pipeline (预处理流水线)

医学图像不能直接“喂”给神经网络。由于不同医院、不同设备的扫描参数差异巨大,必须建立标准化的预处理流水线:

Load DICOM -> HU Conversion -> Resampling -> Lung Segmentation -> Normalization -> 3D Numpy Arrays

3.1 Hounsfield Unit (HU) 转换

CT 图像的原始像素值并非直接的密度值,而是需要进行线性转换得到 Hounsfield Units (HU)

  • 定义:HU 是表示 CT 图像上组织结构相对密度的标准单位。
    • 水 = 0 HU
    • 空气 = -1000 HU
    • 致密骨 = +1000 HU 以上
  • 作用:不同 CT 机器的原始灰度值范围不同(动态范围可达 2000+),通过公式 $HU = m \times RawPixel + b$(其中 $m, b$ 来自 DICOM 头文件的 RescaleSlopeRescaleIntercept)将其统一标准化。这使得模型能够理解“黑色是空气,白色是骨头,灰色是软组织”。

HU Scale

3.2 重采样 (Resampling)

这是 3D CNN 最关键的一步。

  • 问题:原始 CT 切片的像素间距(Pixel Spacing)各不相同(例如有的为 0.7mm x 0.7mm,层厚为 2.5mm)。如果直接输入网络,同一个结节在不同患者图像中的物理尺寸会完全不同,导致卷积核无法学习到稳定的空间特征。
  • 解决方案:将所有患者的 3D 体积重采样到统一的分辨率,通常为 1mm x 1mm x 1mm
  • 方法:使用三次样条插值(Order 3 interpolation)进行空间变换,确保每个体素(Voxel)代表真实的 1 立方毫米物理空间。

3.3 肺部分割 (Lung Segmentation)

CT 扫描包含了胸腔外的许多无关信息(如床板、手臂、心脏、脊柱)。

  • 目标:聚焦于肺部区域,去除背景噪声。
  • 方法
    1. 利用阈值法(Thresholding,通常 < -400 HU)提取空气区域。
    2. 使用形态学操作(开闭运算)填充肺内的血管和结节空洞。
    3. 提取最大的连通分量作为左右肺掩膜(Mask)。
    4. 将原始图像与 Mask 相乘,仅保留肺实质区域。

3.4 归一化与裁剪 (Normalization & Clipping)

  • 裁剪:肺部的 HU 值通常在 -1000 到 400 之间。我们将超出此范围的极值截断(Clip),以消除骨骼等高密度组织的干扰。
  • 归一化:将 HU 值线性映射到 [0, 1] 区间,便于神经网络梯度下降收敛。
  • 输出:最终生成形状统一的 3D NumPy 数组(例如 $64 \times 64 \times 64$ 或 $128 \times 128 \times 128$),作为模型的输入。

4. Model Architecture: 3D Convolutional Neural Networks (模型架构)

本项目采用 3D CNN 作为核心算法。与处理自然图像的 2D CNN 不同,3D CNN 的卷积核在 $x, y, z$ 三个维度上同时滑动,能够捕捉结节在三维空间中的立体形态特征(如球形度、边缘毛刺的空间延伸)。

4.1 为什么选择 3D CNN?

肺癌结节的恶性特征往往体现在其三维结构中。2D 切片可能会切断结节的连续性,丢失关键的上下文信息。3D 卷积能够:

  1. 提取空间特征:识别结节的体积、形状复杂性。
  2. 减少伪影干扰:通过多维上下文区分血管截面与真实结节。

4.2 网络层级详解

模型的基本数据流如下:

3D CNN Architecture

  1. 输入层 (Input):接收预处理后的 3D 肺块(Patch)。

  2. 卷积层 (Convolutional Layer)

    • 使用 $3 \times 3 \times 3$ 或 $5 \times 5 \times 5$ 的 3D 卷积核。
    • 操作:卷积核在三维空间滑动,与局部体素进行点积求和,生成新的特征图(Feature Map)。这一步自动提取边缘、纹理、角点等低级特征,并在深层网络中组合成“结节”、“毛刺”等高级语义特征。
    • 卷积动态演示
  3. 激活层 (Activation Layer - ReLU)

    • 应用修正线性单元 $f(x) = \max(0, x)$。
    • 作用:引入非线性因素,使网络能够拟合复杂的决策边界,同时将负值置零,增加稀疏性。
  4. 池化层 (Pooling Layer)

    • 使用 Max Pooling 或 Average Pooling(步长通常为 2)。
    • 作用:在 $x, y, z$ 三个方向上进行下采样,缩减特征图的空间尺寸,降低计算量,同时扩大感受野(Receptive Field),使模型对结节的位置微小偏移具有不变性。
  5. 批量归一化 (Batch Normalization)

    • 在激活函数前后对数据进行标准化,加速训练收敛,减少对初始化的敏感。
  6. 全连接层与输出 (Fully Connected & Softmax)

    • 将高阶特征展平,输入全连接层。
    • 最后通过 SoftmaxSigmoid 函数输出一个概率值 $P \in [0, 1]$,表示该患者患有肺癌的可能性。

Network Flow Detailed Layers

4.3 两阶段检测策略 (Two-Stage Pipeline)

在实际竞赛解决方案中(如第二名方案),通常不直接端到端分类,而是采用两阶段策略:

  1. 候选区域生成 (Candidate Generation):使用一个轻量级的 3D U-Net 或 Faster R-CNN 变体,在全肺范围内检测出所有可能的结节位置(Recall 优先,允许少量假阳性)。
  2. 假阳性削减 (False Positive Reduction):将第一阶段检测出的候选区块(Patch)裁剪出来,输入到上述的深度 3D CNN 分类器中,精细判断其是否为恶性结节。

5. Visualization & Conclusion (可视化与结论)

5.1 模型可解释性:热力图可视化

深度学习常被称为“黑盒”,但在医疗领域,医生需要知道模型“看”到了什么。我们利用 Grad-CAMOcclusion Sensitivity 技术生成了重要性热力图。

Prediction Visualization

  • 解读:在上述动态图中,红色区域代表模型认为对“恶性”预测贡献最大的区域。可以看到,高亮区域精准地覆盖了结节的边缘毛刺部分,这与放射科医生的诊断依据高度一致。这证明了模型确实学习到了病理特征,而非背景噪声。

5.2 总结与展望

本案例展示了如何利用 3D 卷积神经网络 解决复杂的医疗影像分类问题。

  1. 数据为王:结合 DSB 2017 竞赛数据与 LUNA16 外部标注数据,解决了医疗数据标签稀缺的痛点。
  2. 预处理标准化:通过 HU 转换、重采样和肺部分割,消除了设备差异,为 3D 深度学习奠定了坚实基础。
  3. 空间特征提取:3D CNN 成功捕捉了结节的立体形态特征,实现了优于传统机器学习的预测精度。

虽然模型达到了较高的 AUC 分数,但距离临床部署仍有距离。未来的工作将集中在:

  • 多模态融合:结合患者的电子病历(年龄、吸烟史、基因数据)进行联合建模。
  • 小样本学习:利用迁移学习和元学习进一步降低对标注数据的依赖。
  • 不确定性量化:不仅输出概率,还要输出模型的置信度区间,辅助医生决策。

通过人工智能辅助诊断,我们有望实现肺癌的早发现、早治疗,真正践行“癌症登月计划”的愿景。

Reference

  1. 2017 Data Science Bowl: 2nd Place Solution Write-up
  2. 百度百科:肺癌
  3. GitHub Repository: kaggle_ndsb2017
  4. LUNA16 Challenge Dataset
  5. InfoQ: ResNet on Azure GPU
  6. Hounsfield Scale Wikipedia
#Medical Imaging #Deep Learning #CNN #Cancer Detection #Kaggle #Data Science Bowl