尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

3D CNN肺结节检测器如何设计:kaggle_ndsb2017双任务网络(检测+恶性度回归)完整拆解

3D CNN肺结节检测器如何设计:kaggle_ndsb2017双任务网络(检测+恶性度回归)完整拆解 3D CNN肺结节检测器如何设计kaggle_ndsb2017双任务网络检测恶性度回归完整拆解【免费下载链接】kaggle_ndsb2017Kaggle datascience bowl 2017项目地址: https://gitcode.com/gh_mirrors/ka/kaggle_ndsb2017本文带你完整拆解kaggle_ndsb2017项目的核心一个用于肺部 CT 的3D CNN 结节检测器以及它如何用检测 恶性度回归的双任务网络冲上 Kaggle National Data Science Bowl 2017 第二名。即使你没做过医学影像也能看懂这套完整流水线的设计思路。项目背景一个拿过第二名的肺结节 AI 方案 Kaggle 2017 年的 National Data Science BowlNDSB要求两件事先判断 CT 里有没有结节再预测患者是否患癌。本仓库就是该项目亚军方案中负责3D 卷积网络部分的全部源码包含从 DICOM 预处理、3D 立方体切块、双任务网络训练、滑窗推理到 XGBoost 融合提交的完整工程代码。整条流水线按脚本编号组织阶段文件作用预处理step1_preprocess_ndsb.py/step1_preprocess_luna16.py提取 DICOM统一缩放到 1×1×1 mm生成 PNG 切片与肺分割掩膜造样本step1b_preprocess_make_train_cubes.py按标注从 CT 中切出正/负 3D 立方体训练step2_train_nodule_detector.py训练 3D CNN 双任务网络本文主角推理step3_predict_nodules.py滑窗扫描每个病人输出结节位置与恶性度融合step4_train_submissions.py特征工程 XGBoost 多级平均提交所有目录路径集中在settings.py中配置helpers.py则封装了图像加载、重采样、肺分割等工具函数。双任务网络结构一个卷积塔两个输出头 整个网络定义在step2_train_nodule_detector.py的get_net函数中约第 309-352 行结构非常精炼输入一个 32×32×32、单通道的 3D 立方体CUBE_SIZE 32。像素值先减去均值 41settings.py中的MEAN_PIXEL_VALUE_NODULE再除以 255 归一化。骨干网络4 组 3D 卷积先在 z 轴做一次AveragePooling3D(2,1,1)压缩层数、省算力第 1 组Conv3D 64 通道 → 2×2 MaxPool第 2 组Conv3D 128 通道 → 2×2 MaxPool第 3 组Conv3D 256 通道 ×2 → 2×2 MaxPool第 4 组Conv3D 512 通道 ×2 → 2×2 MaxPool。双任务输出头关键设计out_class1×1×1 卷积 sigmoid → 二分类回答这里是不是结节out_malignancy1×1×1 卷积 线性激活 → 回归回答恶性度有多高取值 1-5 分来自 LIDC 数据集的四位医生评分。两个任务共享同一个卷积特征塔只在末端分叉——这就是典型的多任务学习分类损失用binary_crossentropy回归损失用mean_absolute_error一个网络同时完成找结节和评恶性度两件事让特征表达同时受两类监督信号约束。训练策略20:1 负采样 翻转增强 学习率衰减 数据准备和训练细节是这套方案能稳定出结果的第二个关键全部在step2_train_nodule_detector.py中正负样本比例NEGS_PER_POS 20每个正样本配 20 个负样本缓解结节这类稀有目标导致的类别不平衡负样本还额外用 LIDC 自动挖掘的假阳性样本加重复 3 次专门打压模型爱犯的错误。数据增强data_generator约第 200-306 行对每个立方体做 4 个轴方向的随机翻转fliplr/flipud/反向负样本还先切成 48³ 再随机偏移裁剪到 32³正样本则在 64³ 内随机抖动裁剪让网络对结节位置不敏感。标签设计正样本立方体文件名里直接编码了malscore²作为回归标签见step1b_preprocess_make_train_cubes.pyNDSB 训练集上的人工标注按等效 4 位医生重复 4 次计入与 LIDC 数据对齐。优化器与调度SGDlr0.001、momentum 0.9、Nesterovstep_decay在 5 个 epoch 后把学习率降到 0.0001batch size 16共训练 12 个 epoch按验证集 loss 用ModelCheckpoint保存最优权重。多版本模型__main__中训练了 3 类模型——纯 LUNA16 全量版luna16_full、加上 NDSB 人工正负标注的 v1/v2 版各 2 折为后续模型融合储备多样性。推理流程滑窗 3D 网格 肺掩膜过滤 训练好的模型在step3_predict_nodules.py中执行全身扫描滑窗遍历以PREDICT_STEP 12体素为步长、32³ 为窗口在整个 CT 体积上滚动取样约第 259-309 行每个窗口得到一个结节概率多尺度预测分别在 1 倍、1.5 倍、2 倍放大率下跑一遍同一模型在不同分辨率下看结节捕捉不同大小的目标阈值初筛P_TH 0.6以上才记为候选结节并把位置换算成百分比坐标肺掩膜过滤filter_patient_nodules_predictions检查结节中心是否落在肺分割掩膜*_m.png内不在肺内、或位于肺顶部边缘z30的可疑点会被标记为负值专门留作下游 XGBoost 的假阳性特征——不直接删而是把不确定性变成特征是很聪明的工程取舍。每个病人最终得到一份 CSV坐标、结节概率、恶性度直径估计等字段全部相对定位方便后续融合。从检测到提交XGBoost 特征融合与两级平均 单看结节预测还不够step4_train_submissions.py完成了最后一步化整为零特征聚合combine_nodule_predictions把每个病人的结节列表压缩成统计特征——最大恶性度、最大概率、结节数量、中位数、加权最大值以及最大结节的 z/y/x 位置按 3 种放大率各存一组叠加全局信号再拼上 U-Net 分割网络step2_train_mass_segmenter.py输出的肿块mass预测XGBoost 回归只用 7 个核心列mass 3 种放大率的最大恶性度与 z 坐标训练 1000 轮随机切分的 XGBRegressor取平均概率两级融合Level 1 的多个单模型提交LUNA16 全量版、posneg v1/v2、队友 Daniel 的模型两两平均成 Level 2Level 2 再简单平均为final_submission.csv代码见combine_submissions。提交产物就存放在submission/level1/与submission/level2/目录workdir/用于放训练过程中的临时权重。快速上手按顺序复现整条流水线 如果你有 LUNA16 和 NDSB 原始数据按以下顺序执行即可复现python step1_preprocess_ndsb.py和python step1_preprocess_luna16.pyDICOM 提取 1mm 重采样 肺分割python step1b_preprocess_make_train_cubes.py切出正负 3D 立方体训练集python step2_train_nodule_detector.py训练双任务 3D CNN每个模型约 10 小时README 说明python step2_train_mass_segmenter.py训练 3 折 mass U-Net 分割器python step3_predict_nodules.py对训练/测试集逐病人滑窗预测python step4_train_submissions.pyXGBoost 融合 两级平均产出最终提交。依赖方面Keras TensorFlow 后端辅以 scikit-learn、pydicom、SimpleITK、OpenCV、XGBoost。想直接下载已训练好的模型可以留意 README 中提供的压缩包地址省去十几个小时的训练。总结这套方案最值得借鉴的 3 个设计 ⭐双任务共享塔结节分类与恶性度回归共用 4 组 3D 卷积一次前向得到位置 性质双重信息比训练两个独立模型更省资源、特征也更强不确定性变特征推理阶段不粗暴丢弃可疑预测而是把肺外结节位置怪异等信号编码成负值特征交给 XGBoost让上层模型做二次裁决多层平均融合从多放大率、多模型、多折到 Level 2 的两级简单平均用最低的成本换取最稳的线上分数。这套代码是 2017 年医学影像 3D CNN 方案的经典样本代码量不大、注释直接非常适合初学者逐文件阅读理解从数据工程到模型融合的一条完整竞赛链路。【免费下载链接】kaggle_ndsb2017Kaggle datascience bowl 2017项目地址: https://gitcode.com/gh_mirrors/ka/kaggle_ndsb2017创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表