信息速览

LUNA16 — 肺结节检测公开基准数据集 AI-Ready Wikipedia
INFOBOX
| 字段 | 内容 |
|---|---|
| 数据集名称 | LUNA16(肺结节检测挑战赛数据集) |
| 英文全称 | LUng Nodule Analysis 2016 |
| 别名/简称 | LUNA16 Challenge;LIDC-IDRI 肺结节检测子集 |
| 疾病分类 | ICD-11:ME84(肺部诊断影像学异常发现);ICD-10:R91.1(孤立性肺结节) |
| SNOMED CT | 427359005(Solitary nodule of lung,肺孤立性结节) |
| 数据模态 | 胸部低剂量螺旋 CT(三维体数据,MetaImage 格式) |
| AI 任务类型 | 肺结节检测(CADe)、假阳性削减(候选二分类)、肺实质分割(辅助) |
| 样本总数 | 888 例 CT 扫描;1,186 个参考标准结节;551,065 个候选结节 |
| 数据大小 | Zenodo 压缩包约 67 GB(Part 1 为 47.7 GB);镜像站标称解压后约 120 GB |
| 数据格式 | MetaImage(.mhd 头文件 + .raw 体素二进制)+ CSV 标注表 |
| 许可证 | Creative Commons Attribution 4.0 International(CC BY 4.0) |
| 访问级别 | 开放下载(Zenodo 直接获取,无需注册申请) |
| DUO 标签 | NRES(无限制使用,须遵守 CC BY 4.0 署名要求) |
| 语言 | 英语(文档与标注元数据);影像数据无语言属性 |
| 首发日期 | 2016 年(ISBI 2016 研讨会发布) |
| 最后更新 | 2019-03(Zenodo 存档版本 3723295 / 4121926) |
| 发布机构 | LUNA16 组织委员会(荷兰 Radboud University Medical Center 等) |
| 官方主页 | luna16.grand-challenge.org |
| 下载地址 | Zenodo Part 1 / Part 2 |
| DOI | 数据:10.5281/zenodo.3723295;论文:10.1016/j.media.2017.06.015 |
| 引用次数 | 1,673+(Google Scholar,截至 2026-09) |
| AI 就绪度评分 | ⭐⭐⭐⭐(4/5)— 官方 10 折划分、评估脚本与候选集齐备,预处理路径极其成熟;扣分项:mhd/raw 需自行转换、无体素级结节真值 mask、candidates.csv 已弃用易误用 |
| 页面状态 | published |
§0 E-E-A-T 信任声明与免责声明
医学审核者:千方病案医学编辑部交叉审核:§2 医学背景(ICD-11 与 SNOMED CT 映射、肺结节定义与密度分类、金标准标注协议)、§7 偏倚分析。
数据工程审核者:[千方病案医学编辑部交叉审核] 医疗 AI 数据工程师,审核范围:§4 DAIMS 数据字典(世界坐标体系、MetaImage 格式细节)、§5 数据划分策略、§6 预处理 Pipeline 和坑点。
审核日期:2026-09-05
审核方式:交叉审核
利益冲突声明:千方病案医数集与 Radboud University Medical Center、LIDC-IDRI 联盟及 Zenodo 无任何商业利益关联。本页面不销售 LUNA16 数据集本身,仅提供 AI 就绪指南与学术信息服务。编辑者未接受上述机构的任何形式资助。
医疗免责声明:本页面提供的医学信息仅供研究和教育目的,不构成医疗建议、诊断或治疗方案。数据集的医学描述基于公开发表的文献,未经逐一临床验证。任何基于该数据集训练的 AI 模型在应用于临床决策前,必须经过独立的临床验证和监管审批。
技术免责声明:本页面的代码示例、预处理建议和基准性能数据基于公开资料整理,不保证在特定环境下的准确性和适用性。使用者应自行验证代码安全性和数据预处理流程的正确性。千方病案医数集不对因使用本页面信息而导致的任何直接或间接损失承担责任。
数据使用合规:使用本页面描述的数据集前,请务必阅读并遵守数据集原始许可协议。LUNA16 以 CC BY 4.0 许可发布,使用时须注明原始出处(Setio et al., 2017)并遵守上游 LIDC-IDRI 的 CC BY 3.0 要求。DUO 标签仅供参考,具体使用限制以数据集官方协议为准。
§1 数据集概览
§1.0 30 秒速览
这是什么? LUNA16(LUng Nodule Analysis 2016)是一个公开的肺结节检测挑战赛数据集。组织者从著名的 LIDC-IDRI 肺部 CT 影像库中,挑选出 888 例层厚较薄(≤2.5 mm)的胸部 CT 扫描,并整理出 1,186 个由 4 名放射科医生中至少 3 人确认的肺结节位置与直径标注。你可以把它理解为“一份带标准答案的肺部 CT 考卷”——答案就是每个结节在世界坐标系中的中心点坐标(毫米)与直径。
为什么重要? 肺癌是全球死亡率最高的癌症之一,而低剂量 CT 筛查中如何“不漏掉小结节、又少报假阳性”是影像 AI 的核心难题。LUNA16 用统一的 FROC/CPM 打分规则把各家算法放在同一张考卷上比较,是这一领域被引用最多的基准(原始论文引用 1,673+,截至 2026-09)。2016-2022 年间几乎所有肺结节检测论文都以它作为第一块试金石。
我能用它做什么? 训练或评测你的肺结节检测模型(端到端检测或假阳性削减两个赛道)、复现经典 CAD 论文、做 10 折交叉验证的方法学比较,或者用它做预训练再迁移到自有筛查数据。数据以 CC BY 4.0 开放下载,从 Zenodo 拿到即可开箱研究——但请先读本文 §6.5 的 8 个坑点,坐标换算与候选版本误用是这个数据集最高频的翻车点。
§1.1 技术摘要
LUNA16 由荷兰 Radboud University Medical Center 的 Colin Jacobs、Arnaud A. A. Setio、Bram van Ginneken 与意大利都灵理工的 Alberto Traverso 等人组织,数据基础是国际 LIDC-IDRI 联盟的 1,018 例胸部 CT。组织者排除了切片厚度大于 2.5 mm 的扫描,保留 888 例,并将图像从 DICOM 统一转换为 MetaImage(.mhd 头文件 + .raw 体素数据)格式。参考标准来自 LIDC-IDRI 的两阶段标注流程:4 名有经验的胸部放射科医生分别标记病灶,直径 ≥3 mm 且至少 3/4 名医生接受的病灶构成 1,186 个结节的参考标准,其余发现(非结节、小于 3 mm、仅 1-2 名医生标注)作为“无关发现”随评估脚本发布。数据集按约 10 例一批切分为 subset0-subset9 十个子集,官方协议要求用这十个子集做 10 折交叉验证。挑战赛设两个赛道:完整检测(自行生成候选并输出)与假阳性削减(对官方 551,065 个候选做二分类),评估采用 FROC 曲线及其七点平均敏感度 CPM 指标。冠军系统与随后的深度学习方案将 CPM 从约 0.84 推进到 0.95 以上,数据与评估脚本在 2018-01-03 挑战赛结束后仍长期在线。
从数据形态看,LUNA16 的每一条“样本”由三层信息构成:① 512×512×N 的 CT 体数据(int16 HU 值);② 结节级标注(seriesuid + 世界坐标 + 直径);③ 候选级标注(seriesuid + 世界坐标 + 0/1 标签)。这种“影像 + 点级标注”的结构使它比像素级分割库轻量得多(标注 CSV 仅数百 kB),也让它天然适配检测类任务的训练范式。理解这三层信息如何通过 seriesuid 关联,是使用本数据集的全部起点。
§1.2 战略价值
方法学价值:公平比较的“锚点”。医疗 AI 论文最容易被质疑的是“各用各的数据、各算各的分”。LUNA16 提供了三样稀缺的东西:统一的参考标准、官方评估脚本(含匹配规则与无关发现列表)、以及 10 折交叉验证的固定协议。这使任意两篇论文的 CPM 数字至少在同一协议下产生。自建数据难以复制这种可比性——标注一致性、结节大小分布与隐私合规每一项都是门槛。选择 LUNA16 做主实验或消融基准,相当于给论文装上“可复现”的信任背书。
工程与教学价值:3D 医学影像的入门标准教材。888 例 3D 体数据规模适中,单卡可训,完整覆盖 3D 医学影像管线的全部关键环节:mhd/raw 读取、HU 值窗宽窗位、各向同性重采样、世界坐标与体素坐标互转、极端类不均衡处理(正负候选约 1:460)、FROC 评估。它也是少数“预处理资料多到几乎任何错误都能搜到答案”的数据集。对新团队而言,先在 LUNA16 上把全链路跑通,再迁移到自有数据,是风险最低的路径。在基础模型时代,它同样被广泛用于医学 3D 预训练模型的微调评测。
基准演化价值:检测协议的“模板”。LUNA16 确立的“固定划分 + 官方评估脚本 + 分层 FROC + bootstrap 置信区间”组合,被后续大量医学检测基准(肝脏病灶、脑动脉瘤、乳腺钙化等)直接或间接沿用。理解 LUNA16 的协议设计,等于理解了整个医学目标检测评测范式的原型;其 CPM 指标也在多篇后续工作中被原样移植为跨器官的统一评分。这种“协议输出”的影响力已经超出数据集本身——它使得“低假阳性区的敏感度”成为医疗 AI 检测产品的通用语言。
§1.3 同类数据集横向对比
| 数据集 | 规模 | 模态 | 标注内容 | 与 LUNA16 的差异化 |
|---|---|---|---|---|
| LUNA16 | 888 例 CT、1,186 结节、551,065 候选 | 胸部低剂量 CT(3D) | 结节中心世界坐标 + 直径;候选正负标签 | 唯一带官方 FROC/CPM 评估协议与 10 折划分的检测基准 |
| LIDC-IDRI(上游) | 1,018 例 CT | 胸部 CT(3D,DICOM) | 4 名医生像素级轮廓 + 0-5 分恶性度评级 | 标注更丰富但层厚不齐、格式原始、无统一评估协议 |
| Tianchi 天池肺癌 | 1,000 例 CT(600 训练/400 测试) | 胸部低剂量 CT(3D) | 结节中心坐标 + 直径 | 竞赛专用、无公开标签的测试集;常被用作 LUNA16 模型的跨域外测 |
| NLST | 约 26,000 名受试者 | 胸部低剂量 CT(DICOM) | 筛查结局与癌症诊断 | 大规模人群筛查队列,需申请获取;LUNA16 无生存结局信息 |
| DLCSD / 私有筛查集 | 各数十至数百例 | 胸部 CT | 结节轮廓或良恶性标签 | 常用于泛化性验证;缺乏公开可比性 |
§1.4 版本时间轴
| 时间 | 版本/事件 | 说明 |
|---|---|---|
| 2016 | LUNA16 挑战赛上线(ISBI 2016 研讨会) | 发布 subset0-9、annotations.csv、candidates.csv 与评估脚本 |
| 2016 后 | candidates_V2.csv 发布 | 合并 etrocad 与 M5LCADThreshold0.0.3 两个 CAD 系统的候选,结节覆盖从 1,120 提升至 1,166/1,186;官方声明 candidates.csv 不应再使用 |
| 2017 | 挑战赛论文发表于 Medical Image Analysis | 完整记录协议与参赛结果,DOI 10.1016/j.media.2017.06.015 |
| 2018-01-03 | 挑战赛正式结束 | 数据、评估脚本与论坛资源继续在线 |
| 2019-03 | Zenodo 存档(Part 1/2) | DOI 10.5281/zenodo.3723295 与 10.5281/zenodo.4121926,成为当前主要下载渠道 |
§1.5 典型应用场景
- 检测算法基准评测:以官方 10 折协议与评估脚本报告 FROC/CPM,与 Dou(0.839)、Ding(0.891)、nnDetection(0.930)等已发表结果横向对比。
- 假阳性削减模块研发:直接使用 candidates_V2.csv 的 551,065 个带标签候选,聚焦二分类网络结构设计,无需自建候选生成器。
- CAD 系统教学与课程实验:规模适中(单卡可训),是医学影像课程最常用的 3D 实战数据集。
- 预训练-微调范式研究:以 888 例 CT 做自监督/监督预训练,向私有筛查队列或更大规模数据迁移。
- 跨域泛化评估:在 LUNA16 训练、向 Tianchi 等外部数据外测,量化数据中心偏移下的性能衰减。
§2 医学背景
§2.1 ICD-11 编码映射
肺结节本身是影像学所见而非独立疾病诊断,在 ICD-11 中通常归入第 21 章“症状、体征或临床所见”下的影像学异常发现类目;当确诊为肺癌时则转入第 2 章肿瘤章。下表列出与本数据集标注对象直接相关的编码:
| 标签/概念 | ICD-11 编码 | ICD-11 中文名 | 说明 |
|---|---|---|---|
| 肺部影像学结节样异常发现 | ME84(类目) | 肺部诊断影像学异常发现 | 肺结节作为影像所见通常归此组;具体到个案时由医生选择子码 |
| 支气管和肺恶性肿瘤(终末诊断) | CA23 | 支气管或肺恶性肿瘤 | 结节经病理确诊肺癌后的归属编码 |
| 呼吸系统其他影像异常 | ME84 相关子码 | 诊断影像中呼吸系统的异常所见 | 用于多发结节、随访所见等情形 |
§2.1b SNOMED CT 映射表
| 标签/概念 | ICD-10 | SNOMED CT 码 | SNOMED 术语 |
|---|---|---|---|
| 孤立性肺结节 | R91.1 | 427359005 | Solitary nodule of lung(肺孤立性结节) |
| 肺部肿块(>3 cm 病灶,非本数据集标注对象) | R91.8 等 | 315240004 | Solitary nodule of lung 之上的父类 Lung mass 相关概念 |
| 胸部 CT 检查(数据采集手段) | — | 241662002 | Chest X-ray computed tomography(胸部计算机体层成像) |
| 计算机辅助检测(AI 任务场景) | — | 709585000 | Computer-aided diagnosis 相关概念族 |
编码说明:LUNA16 官方未提供任何编码映射,上表为编辑部依据公开术语库(NLM MedGen、SNOMED CT US Edition、CMS 编码指南)整理的参考映射,用于跨系统语义对齐,不构成临床编码建议。
§2.2 疾病简介与流行病学
肺结节(pulmonary nodule) 定义为肺内直径 ≤3 cm 的类圆形或不规则病灶,影像学表现为密度增高影;大于 3 cm 者通常称为肿块,恶性可能性显著升高。按密度,肺结节分为三类:实性结节、部分实性结节与磨玻璃密度结节(GGN),其中部分实性结节的恶性概率最高(中国肺部结节分类、诊断与治疗指南(2016 年版))。
肺结节是肺癌筛查的核心靶征。美国国家肺癌筛查试验(NLST)证实低剂量螺旋 CT(LDCT)筛查可使高危人群肺癌死亡率显著下降,但代价是大量假阳性——NLST 中 CT 筛查组 96.4% 的阳性结节最终为良性。恶性概率与直径强相关:直径 ≤5 mm 的结节恶性率约 0-1%,5-10 mm 约 6-28%,≥20 mm 达 64-82%;≤4 mm 的结节中至少 99% 为良性(Fleischner 学会 2005 指南口径)。这正是 CAD(计算机辅助检测)系统的临床立足点:在不漏掉真结节的前提下压缩假阳性数量。
结节管理与 CAD 的关系。临床对结节的处理遵循“按大小与密度分层随访”的原则:Fleischner 学会指南按结节直径(≤4、4-6、6-8、>8 mm)与患者风险分层给出随访间隔;中国 2016 年版指南将直径 ≥15 mm 或带恶性 CT 征象的 8-15 mm 实性结节定义为“肺癌高危结节”,需多学科会诊决定进一步检查。对直径 8 mm 以下、需长周期随访的绝大多数结节而言,人工逐层比对既慢又不稳定——这正是 CAD 系统输出“稳定、可复算的结节清单”的价值空间。LUNA16 的 CPM 指标刻意把 0.125-1 FP/scan 的低假阳性区纳入平均,直接对应“每个病例平均不超过一个假阳性警报”的临床可用性要求。
流行病学负担上,中国 2022 年肺癌新发病例约 106.06 万、死亡 73.3 万,均居恶性肿瘤首位;2012-2015 年间中国肺癌 5 年生存率约 19.7%(肺结节诊治中国专家共识(2024 年版))。早期(Ⅰ期)肺癌 5 年生存率可达 77%-92%,而 ⅢA-ⅣB 期骤降至 36% 以下——早发现、早定性肺结节是改善预后的关键路径。
§2.3 临床任务定义
LUNA16 对应的临床任务是肺结节的检出与定位,处于“筛查—诊断”链路的最前端:
| 任务环节 | 定义 | LUNA16 对应 |
|---|---|---|
| 检出(Detection/CADe) | 在全肺 CT 中发现直径 ≥3 mm 的结节并输出中心位置 | 检测赛道:输出坐标与置信度,官方 FROC/CPM 评分 |
| 假阳性削减(FP reduction) | 对候选病灶二分类为“结节/非结节” | 假阳性削减赛道:551,065 个候选的二分类 |
| 分级/定性(CADx) | 判断良恶性、浸润性 | 不包含——LUNA16 无恶性度标签,需回上游 LIDC-IDRI 取评级 |
| 随访/预后 | 容积倍增时间(VDT)、生存分析 | 不包含——无纵向随访与结局数据 |
需要强调:LUNA16 的参考标准刻意排除了恶性度信息,它回答的是“这里有没有一个 ≥3 mm 的结节”,而不是“这个结节是不是癌”。因此它适合训练与评测检测器,不适合直接训练良恶性分类器。
§2.4 患者人群
| 维度 | 内容 |
|---|---|
| 来源 | LIDC-IDRI 国际联盟多中心贡献的胸部 CT(含临床与筛查场景) |
| 采集设备 | 多厂家多层螺旋 CT(进入 LUNA16 者层厚均 ≤2.5 mm) |
| 年龄/性别 | 未随 LUNA16 分发——数据集仅含影像体数据与结节坐标,不含任何人口学表 |
| 入选标准 | LIDC-IDRI 原始 1,018 例中层厚 ≤2.5 mm 者,共 888 例 |
| 标注人群 | 4 名有经验的胸部放射科医生(两阶段标注流程) |
| 结节入选 | 直径 ≥3 mm 且 ≥3/4 名医生接受的病灶 → 1,186 个参考结节 |
由于上游 LIDC-IDRI 以脱敏形式发布,使用者无法按年龄、性别、种族做人群细分分析,这是使用本数据集做公平性研究时的固有限制(详见 §7.5)。
§2.5 临床价值
一个在高假阳性率下工作的检测器几乎无临床价值:放射科医生每人每班需阅读数十至数百份 CT,每例 10-20 个假阳性标注会直接把工具变成负担。LUNA16 的 CPM 指标在低假阳性区(0.125-1 FP/scan)与高假阳性区同等取权,正是对“临床可用的敏感度”的量化。组织者的观察研究还显示:挑战赛最佳系统检出了原始 LIDC-IDRI 标注医生遗漏的结节(组织者随后以 additional_annotations.csv 发布这批补充标注),证明了成熟 CAD 系统作为“第二读片人”的真实增量价值。在今天,LUNA16 训练出的检测骨干被普遍用于肺结节筛查产品的候选生成阶段,再由下游分类模块与人工复核完成定性。
从研究史看,LUNA16 也重新定义了“FP 削减”这一子任务的地位:在官方候选集上,2016 年前的传统方法(如基于形态学与规则过滤的 CAD)每例产生数个假阳性,而卷积网络方案将 <1 FP/scan 下的敏感度推到 95% 以上。这一跨越直接塑造了此后胸部 CT CAD 产品的评测话语——今天医疗 AI 企业宣称的“每个病例平均假阳性数”指标,其方法学源头正是 LUNA16 的 FROC 协议。
§2.6 金标准参考
| 维度 | 内容 |
|---|---|
| 参考标准划分 | 1,186 个结节 = 直径 ≥3 mm 且至少 3/4 名放射科医生接受的病灶 |
| 标注方式 | LIDC-IDRI 两阶段标注:第一阶段 4 名医生独立盲标;第二阶段汇总展示各自结果后复审确认 |
| 标注者资质 | 4 名有经验的胸部放射科医生(board-certified thoracic radiologists) |
| 标注内容 | 病灶类别(non-nodule / <3 mm / ≥3 mm)与位置;LUNA16 参考标准以中心世界坐标 + 直径形式发布 |
| 参考标准性质 | 共识驱动的影像参考标准(非病理金标准);低共识病灶被降级为“无关发现”并单独发布 |
| 已知偏差 | 3/4 共识门槛过滤掉 66 个候选检测覆盖不到的结节(candidates_V2 覆盖 1,166/1,186);无体素级轮廓 |
§3 数据集规格
§3.0 版本抉择矩阵
LUNA16 数据内容自 2016 年以来保持稳定,“版本”差异主要体现在下载渠道与候选列表文件上。按需求选择:
| 你的需求 | 推荐版本/渠道 | 大小 | 理由 |
|---|---|---|---|
| 完整官方数据、长期稳定链接 | Zenodo Part 1(3723295)+ Part 2(4121926) | 约 67 GB 压缩 | 官方存档,带 DOI 可引用,subset0-9 齐全 |
| 假阳性削减赛道 | 同上,标注文件用 candidates_V2.zip | 11.4 MB | 官方明确声明 candidates.csv 已弃用,V2 结节覆盖更高(1,166/1,186) |
| 快速验证代码 / 教学演示 | HuggingFace 镜像或 Kaggle 镜像的单个子集 | 6.3-7.3 GB/子集 | 免整包下载;但镜像站 license 标注可能不准,引用时以 Zenodo 官方版本为准 |
| 需要肺部 mask 做预处理 | Zenodo 的 seg-lungs-LUNA16.zip | 303.9 MB | 官方自动算法生成的肺分割,仅作检测辅助,不可当分割金标准 |
§3.1 模态详情
LUNA16 全部为胸部低剂量/常规剂量螺旋 CT(继承 LIDC-IDRI 的采集协议,单次屏气容积扫描),以三维体数据组织:
- 面内分辨率:绝大多数为 512×512 像素,像素间距典型值约 0.6-0.9 mm(各例不同)。
- z 轴(层厚/层距):入选标准为层厚 ≤2.5 mm,实际各例 z 间距不一(亚毫米到 2.5 mm 均有),这是必须重采样的根本原因。
- 体数据规模:单例 z 方向 95-764 层(中位 237 层),全库 2D 切片总数 227,225。
- 体素值:原始存储已为 Hounsfield Unit(HU)标定值(int16),空气约 -1000、水为 0、软组织约 +40-80。
- 文件格式:MetaImage(.mhd 文本头 + .raw 二进制体数据成对出现),头文件内含
ElementSpacing、Offset、TransformMatrix、DimSize、ElementType等关键几何信息。
一个真实的 .mhd 头文件内容(可直接用文本编辑器打开):
ObjectType = Image
NDims = 3
BinaryData = True
BinaryDataByteOrderMSB = False
CompressedData = False
TransformMatrix = 1 0 0 0 1 0 0 0 1
Offset = -161.699997 -169.5 -316.464996
CenterOfRotation = 0 0 0
AnatomicalOrientation = RAI
ElementSpacing = 0.664062 0.664062 0.625
DimSize = 512 512 471
ElementType = MET_SHORT
ElementDataFile = 1.3.6.1.4.1.14519.5.2.1.6279.6001.100530488926682752765845212286.raw
| 头字段 | 含义 | 使用要点 |
|---|---|---|
| ElementSpacing | 三轴体素间距(x, y, z,单位 mm) | 重采样的直接依据;z 轴与面内差异大 |
| Offset | 体数据原点的世界坐标(x, y, z) | 世界坐标 → 体素坐标换算的平移项 |
| TransformMatrix | 方向余弦矩阵 | 多为单位阵;非单位阵时需翻转处理(坑点 2) |
| DimSize | 三轴体素数 | 面内恒为 512×512,z 轴 95-764 |
| ElementType | 体素数据类型 | MET_SHORT 即 int16;读 raw 时须与 .mhd 声明一致 |
| ElementDataFile | 对应 .raw 文件名 | 文件名即 SeriesInstanceUID |
§3.2 按子集样本数
| 子集 | 内容 | 单个 zip 大小 |
|---|---|---|
| subset0.zip | 约 89 例 CT(mhd/raw) | 6.8 GB |
| subset1.zip | 约 89 例 CT | 6.3 GB |
| subset2.zip | 约 89 例 CT | 7.3 GB |
| subset3.zip | 约 89 例 CT | 6.9 GB |
| subset4.zip | 约 89 例 CT | 6.9 GB |
| subset5.zip | 约 89 例 CT | 6.6 GB |
| subset6.zip | 约 89 例 CT | 6.5 GB |
| subset7.zip | 约 89 例 CT(Part 2) | 见 Part 2 页面 |
| subset8.zip | 约 89 例 CT(Part 2) | 见 Part 2 页面 |
| subset9.zip | 约 89 例 CT(Part 2) | 见 Part 2 页面 |
| 合计 | 888 例 | 约 67 GB 压缩 |
十个子集即官方指定的 10 折交叉验证折划分,每折约 89 例、折间结节分布大致均衡。
§3.3 数据格式表
| 文件 | 格式 | 内容 | 大小 |
|---|---|---|---|
| subset0-9.zip | ZIP 内含 .mhd + .raw 对 | 888 例 CT 体数据 | 6.3-7.3 GB/个 |
| annotations.csv | CSV | 参考标准结节:seriesuid、coordX/Y/Z(世界坐标 mm)、diameter_mm | 137 kB |
| candidates_V2.csv | CSV | 候选结节:seriesuid、coordX/Y/Z、class(0/1) | 11.4 MB(zip) |
| candidates.csv | CSV | 旧版候选(官方声明不应再使用) | 55.4 MB |
| annotations_excluded.csv | CSV(评估脚本内) | 无关发现(非结节、<3 mm、低共识) | — |
| additional_annotations.csv | CSV | 观察者研究发现的补充结节标注 | — |
| seg-lungs-LUNA16.zip | ZIP 内含 mhd | 官方自动肺分割 mask(非分割金标准) | 303.9 MB |
| evaluationScript.zip | Python 脚本 | 官方 FROC/CPM 评估框架 | 21.8 MB |
| sampleSubmission.csv | CSV | 提交格式模板 | 740 B |
§3.4 存储大小
| 形态 | 大小 | 说明 |
|---|---|---|
| Zenodo Part 1(subset0-6 + 标注/脚本) | 47.7 GB | 官方页面标注 |
| Zenodo Part 2(subset7-9) | 约 20 GB | 补齐 subset7-9 |
| 解压后总体量(含 mask) | 约 120 GB | HuggingFace 镜像标称口径;实际取决于保留文件 |
| 预处理后(重采样 1 mm 各向同性 + npy) | 约 60-90 GB | 视是否缓存肺 mask 与 patch 而定,社区经验值 |
§3.5 标注方式
标注分三层,性质各不相同:
- 结节参考标准(人工,共识制):继承 LIDC-IDRI 两阶段流程——4 名放射科医生先独立标注,再显示彼此结果复审。LUNA16 组织者按“≥3 mm 且 ≥3/4 医生接受”筛选出 1,186 个结节,以中心点世界坐标(mm)+ 等效直径的形式发布。这是点级/球形近似标注,不是像素级轮廓。
- 无关发现列表(人工标注的降级产物):非结节、<3 mm 病灶、仅 1-2 名医生标注的病灶,发布于评估脚本内的 annotations_excluded.csv,用于评估时剔除边缘案例。
- 候选列表(自动算法 + 机器标签):候选由三个经典候选检测算法生成,相距 ≤5 mm 的候选合并;class 标签通过与参考标准匹配自动赋予。它是自动产物,不是人工标注。
- 肺分割 mask(自动算法):官方明示“仅供检测辅助,不可作为分割研究参考标准”。
§3.6 标注者资质与一致性
4 名标注者为有经验的胸部放射科医生。LIDC-IDRI 标注流程的完整描述见其原始方法学论文(Armato et al., 2011, Med Phys)。需要了解的一致性事实:正是由于 4 名医生之间存在分歧,组织者才设置 3/4 共识门槛——1,018 例原始库中实际进入参考标准的结节仅 1,186 个,而整体影像发现的数量远大于此。换言之,标注一致性数据本身已内化为数据集的筛选规则,而非以 κ 系数形式发布。LUNA16 官方未发布逐病灶的 reader agreement 表。
§3.7 采集周期
影像由 LIDC-IDRI 联盟各成员机构在数据集组建前多年间陆续采集,LUNA16 未按例发布采集日期,亦不提供纵向随访。数据集层面的时间线为:2016 年挑战赛发布、2017 年论文发表、2018-01-03 挑战赛结束、2019-03 Zenodo 存档(截至 2026-09 该版本仍为最新)。
对使用者的两点含义:其一,无采集日期意味着不能按时间切分做“训练在过去、测试在未来”的时序外推实验,此类需求请改用 NLST 等带时间信息的队列;其二,Zenodo 存档带 md5 校验,任何一次重新下载都应核对文件指纹后再进管线。
§3.8 地域覆盖
LIDC-IDRI 为多国多中心联盟(美国、欧洲等地机构贡献),LUNA16 未公布逐例来源机构,spatialCoverage 只能描述为“多国多中心”。这意味着跨地区(如东亚筛查人群)泛化时需额外的外部验证。
§3.9 设备规格
原始 LIDC-IDRI 影像来自多厂家多层螺旋 CT(GE、Siemens、Philips、Toshiba 等主流厂商均有涉及),重建层厚从亚毫米到 2.5 mm 不等,这正是 LUNA16 入选标准(≤2.5 mm)存在的原因。官方未随包发布逐例设备型号表;如需设备元数据,须回溯 TCIA 的 LIDC-IDRI 原始 DICOM。做设备偏倚分析时请注意:LUNA16 的 mhd/raw 已剥离 DICOM 头,仅保留几何信息。
§3.10 深度溯源链
| 层级 | 实体 | 说明 |
|---|---|---|
| 1. 原始采集 | 多中心临床 CT(DICOM) | LIDC-IDRI 联盟 1,018 例,CC BY 3.0,TCIA 托管 |
| 2. 脱敏与标注 | 两阶段 4 医生标注 | 像素级轮廓 + 恶性度评级(上游),Armato et al. 2011 |
| 3. LUNA16 筛选 | 层厚 ≤2.5 mm → 888 例 | 组织者(Radboud UMC 等),格式转 MetaImage |
| 4. 参考标准固化 | 1,186 结节(≥3 mm,≥3/4 共识) | Setio et al. 2017 论文完整记录 |
| 5. 发布与存档 | 官网 + Zenodo(CC BY 4.0) | 2016 发布 → 2019-03 存档,DOI 10.5281/zenodo.3723295 |
§4 数据结构
§4.0 目录树
数据解压后的典型目录结构(.mhd 与同名 .raw 成对出现):
LUNA16/
├── subset0.zip … subset9.zip # 888 例 CT,10 折交叉验证的官方折划分
├── subset0/
│ ├── 1.3.6.1.4.1.14519.5.2.1.6279.6001.100225287222365658678014822577.mhd
│ ├── 1.3.6.1.4.1.14519.5.2.1.6279.6001.100225287222365658678014822577.raw
│ └── … # 文件名 = DICOM SeriesInstanceUID
├── annotations.csv # 1,186 个参考结节(检测赛道参考标准)
├── candidates_V2.csv # 假阳性削减赛道候选(推荐使用)
├── candidates.csv # 旧版候选(官方声明弃用)
├── sampleSubmission.csv # 提交格式模板
├── evaluationScript.zip # 官方 FROC/CPM 评估脚本(内含 annotations_excluded.csv)
├── seg-lungs-LUNA16.zip # 自动肺分割 mask(检测辅助用途)
└── additional_annotations.csv # 观察者研究补充结节标注
§4.0b 标注文件结构示例
三个核心 CSV 的实际结构(首行表头 + 示例行):
annotations.csv(1,186 行 + 表头)
seriesuid,coordX,coordY,coordZ,diameter_mm
1.3.6.1.4.1.14519.5.2.1.6279.6001.100225287222365658678014822577,-128.6994211,-175.7861695,-47.35707717,5.654478034
1.3.6.1.4.1.14519.5.2.1.6279.6001.100225287222365658678014822577,103.7835509,-211.9256338,227.0569246,4.224841008
candidates_V2.csv(数十万行 + 表头)
seriesuid,coordX,coordY,coordZ,class
1.3.6.1.4.1.14519.5.2.1.6279.6001.100225287222365658678014822577,-56.0583,-96.6083,-316.5337,0
1.3.6.1.4.1.14519.5.2.1.6279.6001.100225287222365658678014822577,101.255,-234.321,-219.391,1
sampleSubmission.csv(提交格式模板)
seriesuid,coordX,coordY,coordZ,probability
1.3.6.1.4.1.14519.5.2.1.6279.6001.108805807815128028373083619129,-99.98484039,148.4967957,-320.1507263,0.958641708
三个表共用同一套坐标系(世界坐标,mm)与同一主键(seriesuid)。检测赛道按 annotations.csv 训练、按 sampleSubmission.csv 格式输出;FP reduction 赛道按 candidates_V2.csv 的 class 列监督训练。
§4.1 DAIMS 字段字典
核心标注表的 8 列字段字典:
| 字段名 | 类型 | 说明 | 示例值 | AI 用途 | 观测误差 | 信息性缺失编码 | 取值范围 |
|---|---|---|---|---|---|---|---|
| seriesuid | string | DICOM SeriesInstanceUID,即扫描唯一标识 | 1.3.6.1.4.1.14519.…577 | 关联标注与影像文件 | 无 | 无缺失 | DICOM UID 字符集 |
| coordX | float | 结节中心世界坐标 x(mm) | -112.34 | 定位回归目标 | 依赖读片共识 | 无缺失 | 约一195 至一200(依机架几何与重建视野) |
| coordY | float | 结节中心世界坐标 y(mm) | 756.11 | 定位回归目标 | 依赖读片共识 | 无缺失 | 同上 |
| coordZ | float | 结节中心世界坐标 z(mm) | -201.55 | 定位回归目标 | 受层厚限制 | 无缺失 | 依扫描覆盖范围 |
| diameter_mm | float | 结节等效直径(mm) | 8.22 | 尺度先验/分层评估 | 等效球近似 | 无缺失 | 3.0-30.0 |
| class(candidates 表) | int | 候选是否为真结节 | 1 | 二分类标签 | 与参考标准匹配自动生成 | 无缺失 | |
| EvalStatus(评估输出) | string | 评估脚本的匹配判定 | TP/FN/FP | FROC 统计 | 评估规则决定 | 无缺失 | |
| mask 值(seg-lungs) | uint8 | 肺实质/气道 mask(非结节真值) | 0/1 | 预处理裁剪 | 自动算法误差 | 0 兼背景 |
坐标体系关键事实:CSV 中坐标为世界(病人)坐标系的毫米值;SimpleITK 读出的 numpy 数组是
[z, y, x]顺序,而GetSpacing()返回(x, y, z)顺序。换算公式:voxel = (world − origin) / spacing,且 origin 即 mhd 头中的Offset。这是本数据集最高频的错误源,详见坑点 1。
§4.2 标签分布
| 统计项 | 数值 | 说明 |
|---|---|---|
| 参考结节总数 | 1,186 | annotations.csv 行数 |
| 含 ≥1 个参考结节的扫描 | 约 601 例 | 社区统计口径;其余 287 例仅含无关发现 |
| 候选总数(candidates.csv) | 551,065 | 覆盖 1,120/1,186 结节 |
| 候选总数(candidates_V2.csv) | 753,418 级别(正 1,557 + 负 753,418 为旧表口径) | V2 合并两个 CAD 系统后总量更大,覆盖 1,166/1,186 |
| 正负候选比例 | 约 1:460 | 极端类不均衡,训练需重采样/加权 |
| 结节直径范围 | 3-30 mm | 中位体积 0.27 cm³ |
| 单例结节数 | 1 至多枚 | 存在一例多结节情形 |
三条快速自检统计(建议每次拿到数据先跑一遍):
ann = pd.read_csv("annotations.csv")
cnd = pd.read_csv("candidates_V2.csv")
print(ann.seriesuid.nunique()) # 含结节扫描数(约 601)
print(ann.groupby("seriesuid").size().describe()) # 单例结节分布
print(cnd["class"].value_counts()) # 正负候选比(约 1:460)
print(ann.diameter_mm.describe()) # 直径分布(3-30 mm)
把这三行输出存进实验日志,可作为数据版本一致性的指纹——若换成镜像站数据后数字对不上,说明子集内容有出入。
§4.3 关键统计
- 体数据尺寸:512×512×(95-764),z 轴中位 237 层;全库 2D 切片 227,225 张。
- 面内 spacing 典型 0.6-0.9 mm,z 间距 0.45-2.5 mm 不等——各向同性重采样是社区标准第一步。
- 结节体积跨 3 个数量级(0.03-33.6 cm³),patch 设计必须顾及最小结节在体素空间仅约 7-8 个体素直径。
- 一个真结节常对应多个候选(官方“相距 ≤5 mm 合并”规则后仍有重复),做 FP reduction 评估时注意按结节去重。
§4.4 数据层级
队列(LIDC-IDRI 衍生)
└── 扫描/序列(SeriesInstanceUID,888 例) ← LUNA16 的样本单位
└── 体数据(512×512×N 体素,int16 HU)
└── 切片(z 轴逐层)
标注层级(与扫描通过 seriesuid 关联)
├── annotations.csv:结节级(世界坐标 + 直径)
├── candidates_V2.csv:候选级(世界坐标 + class)
└── seg-lungs:体素级肺 mask(非结节真值)
注意本数据集没有“患者层”:无患者 ID,一个 SeriesInstanceUID 即一个受检者的一次扫描,社区惯例默认 UID 与患者一一对应。
§4.5 缺失值与信息性缺失
LUNA16 的结构化标注无缺失值,但存在三类“信息性缺失”,使用者必须显式处理:
| 缺失项 | 表现 | 处理建议 |
|---|---|---|
| 无人口学/临床表 | 年龄、性别、吸烟史、病理结果完全缺失 | 公平性/临床建模需求请回溯 TCIA LIDC-IDRI 原始库 |
| 无结节体素轮廓 | 仅中心点 + 直径(球形近似) | 需要轮廓时用 LIDC-IDRI 的 4 医生像素级标注回溯对齐 |
| annotations_excluded.csv 的灰区病灶 | 被排除出参考标准但真实存在于影像中 | FP reduction 训练时把它们从“负样本”中剔除或单列,详见坑点 6 |
§5 划分与使用建议
§5.1 官方划分
官方唯一指定协议是 10 折交叉验证:预切分的 subset0-subset9 每折轮流充当测试集(约 89 例),其余九折合并为训练集,最终合并十折结果提交评估脚本。官方从未发布单独的 train/val/test 切分,挑战赛排行榜即基于该协议产生。
# 官方 10 折协议骨架(Procedure 页规定)
for fold in range(10):
test_uids = load_uids(f"subset{fold}") # 第 N 折 = subset N
train_uids = union(load_uids(f"subset{i}") for i in range(10) if i != fold)
# 1. 在 train_uids 上抽取候选/训练模型
# 2. 在 test_uids 上推理,输出坐标与置信度
# 3. 十折预测合并为一个结果文件后,统一调用官方评估脚本
§5.2 社区惯例划分
- 严格官方流:完全按 10 折执行,最稳但算力开销 ×10。
- 快速迭代流:以 subset0 为内部验证集、subset1-9 训练,做原型开发;定稿前必须回到 10 折协议。
- 折内再切流:训练折内部再划 5-10% 做早停验证。注意验证集必须按“扫描”切分(而非按候选或切片),否则信息泄漏(见 §5.3)。
§5.3 泄漏风险 ⭐
| 风险 | 场景 | 后果 | 缓解 |
|---|---|---|---|
| 同一扫描的切片/候选跨集 | 按切片或候选随机划分 | 验证分数虚高(同一结节的相邻体素同时出现在两集) | 一切划分以 seriesuid 为最小单位 |
| 增强统计泄漏 | 用全库均值/方差归一化 | 轻微 | 仅用训练折统计量 |
| 预处理缓存串折 | 重采样结果按 UID 命名但目录按折组织错误 | 难察觉的评估污染 | 缓存文件名含折号断言 |
§5.4 交叉验证建议
报告 CPM 时给出十折的均值 ± 标准差与 bootstrap 置信区间(评估脚本自带 1,000 次 bootstrap 的 FROC 上下界)。折间标准差通常在 0.01-0.02 CPM 量级,若某折显著离群,优先排查该折的预处理一致性而非模型。
训练侧还有两条经验值得内建到管线中:其一,十折训练的十份模型权重本身就是免费的集成资源——挑战赛论文已证明多系统组合能显著提升低 FP 区敏感度,单数据集内“同构多折集成”是零成本的近似;其二,验证折上的候选级 AUC 只用于调参,最终数字必须来自官方脚本在合并预测上的 FROC/CPM,两者数值口径不同,混用会造成“验证与评测两张皮”。
§5.5 外部验证建议
LUNA16 训练的模型上线上前,至少在以下一类外部数据上验证:Tianchi 天池肺癌数据集(1,000 例 LDCT,1,244 结节)、自建筛查队列(注意人群与设备差异)、或上游 LIDC-IDRI 全库(含 LUNA16 排除的厚层扫描,可考察层厚鲁棒性)。已有论文显示 LUNA16 模型在 Tianchi 上 CPM 会显著回落(例如从 0.9 级降至 0.65-0.68 级),跨域衰减是常态而非例外。
§6 AI 就绪指南 ⭐
§6.0 云端快速启动
LUNA16 无官方云托管环境,但 Kaggle 数据集镜像与 HuggingFace 镜像均可直接挂载。以 Kaggle Notebook(免费 GPU 限额内即可跑通预处理与小模型)为例:
# Kaggle 环境:把镜像数据集挂载到 /kaggle/input 后
import glob
subset0_mhd = glob.glob("/kaggle/input/luna16/subset0/*.mhd")
print(len(subset0_mhd)) # 约 89 个 mhd 文件即挂载成功
自建 GPU 服务器场景:Zenodo 下载约 67 GB(Part 1 + Part 2),预留 200 GB 磁盘(原始 + 解压 + 预处理缓存)。
§6.1 快速上手
目录结构预期:以下代码假设你把 Zenodo 的 10 个 subset zip 与标注 CSV 解压到同一个 data_root 下(结构见 §4.0),subset0/ 至 subset9/ 与 annotations.csv 平级。
data_root 拼接关系:seriesuid + ".mhd" 即为 data_root/subset{N}/seriesuid.mhd 的文件名,代码通过预先构建的 uid → subset 目录 映射表拼接路径。
最小可用子集:只想先跑通链路时,用 subset0(约 6.8 GB、约 89 例)+ annotations.csv 即可完成读取 → 重采样 → 可视化 → 训练闭环。
# pip install SimpleITK numpy pandas
import SimpleITK as sitk
import numpy as np
import pandas as pd
DATA_ROOT = "data_root" # subset0/ … subset9/ 与 annotations.csv 所在目录
# 1) 读取一个扫描:返回 numpy 数组(顺序 [z, y, x])与世界坐标几何参数
def load_scan(mhd_path):
itk_img = sitk.ReadImage(mhd_path)
img = sitk.GetArrayFromImage(itk_img) # shape: [z, y, x],单位 HU
origin = np.array(itk_img.GetOrigin()) # (x, y, z),即 mhd 的 Offset
spacing = np.array(itk_img.GetSpacing()) # (x, y, z),各向异性!
return img, origin, spacing
# 2) 世界坐标(mm)→ 体素坐标(数组下标 [z, y, x])
def world_to_voxel(world, origin, spacing):
v = np.absolute(np.array(world) - origin) / spacing # 此时是 [x, y, z]
return v[[2, 1, 0]] # 翻转为 [z, y, x]
# 3) 以一个结节为例取 3D patch
ann = pd.read_csv(f"{DATA_ROOT}/annotations.csv")
row = ann.iloc[0]
img, origin, spacing = load_scan(f"{DATA_ROOT}/subset0/{row.seriesuid}.mhd")
vox = world_to_voxel([row.coordX, row.coordY, row.coordZ], origin, spacing)
z, y, x = vox.astype(int)
patch = img[z-16:z+16, y-32:y+32, x-32:x+32] # 32×32×32 patch,结节在中心
print(patch.shape, patch.min(), patch.max()) # HU 值范围检查
可视化自检(强烈建议在训练前对至少 10 个随机结节做一遍):把标注点投到对应切片上,肉眼确认结节在框内——这是捕获坐标 bug 最快的方法。
import matplotlib.pyplot as plt
img, origin, spacing = load_scan(f"{DATA_ROOT}/subset0/{row.seriesuid}.mhd")
vox = world_to_voxel([row.coordX, row.coordY, row.coordZ], origin, spacing)
z = int(round(vox[0]))
plt.figure(figsize=(4, 4))
plt.imshow(img[z], cmap="gray", vmin=-1000, vmax=400) # 肺窗显示
plt.scatter(vox[2], vox[1], s=200, facecolors="none", edgecolors="r") # 注意 (y, x) 顺序
plt.title(f"z={z}, d={row.diameter_mm:.1f} mm")
plt.show()
如果圈出来的位置不是结节,先查坐标换算(坑点 1)与方向翻转(坑点 2),再怀疑其他环节。
§6.2 数据获取
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 访问 Zenodo Part 1 与 Part 2 | 无需注册,直接下载,共约 67 GB |
| 2 | 下载 annotations.csv、candidates_V2.zip、evaluationScript.zip、seg-lungs-LUNA16.zip | 合计约 340 MB |
| 3 | 解压 subset0-9.zip 至同一目录 | 目录结构见 §4.0 |
| 4 | 校验 md5(Zenodo 页面逐文件提供) | 防止大文件下载损坏 |
# 命令行批量下载 Part 1(示例,文件较大建议 wget -c 断点续传)
BASE=https://zenodo.org/records/3723295/files
for f in subset0.zip subset1.zip annotations.csv candidates_V2.zip \
evaluationScript.zip seg-lungs-LUNA16.zip; do
wget -c "${BASE}/${f}?download=1" -O "${f%.zip*}"
done
unzip subset0.zip -d subset0
License 注意:CC BY 4.0 允许商用与研究使用,仅需署名(引用 Setio et al. 2017 与数据 DOI)。个别 Kaggle 镜像标注 CC BY-NC,属镜像站自标,以 Zenodo 官方许可为准。
§6.3 预处理全流程
标准预处理四步:HU 截断归一化 → 各向同性重采样 → 肺实质裁剪 → 标注坐标同步换算。以下为可运行实现:
import scipy.ndimage
TARGET_SPACING = np.array([1.0, 1.0, 1.0]) # 各向同性 1 mm,社区最常用
HU_MIN, HU_MAX = -1000.0, 400.0 # 肺窗常用截断区间
def normalize_hu(img):
img = np.clip(img, HU_MIN, HU_MAX)
img = (img - HU_MIN) / (HU_MAX - HU_MIN) # [0, 1]
return img.astype(np.float32)
def resample(img, origin, spacing, new_spacing=TARGET_SPACING):
# 注意:spacing 为 (x, y, z),数组为 [z, y, x],zoom 因子要逐轴对应
resize_factor = spacing / new_spacing # [x, y, z]
new_shape = np.round(img.shape[::-1] * resize_factor).astype(int) # [x, y, z]
real_factor = new_shape / img.shape[::-1]
real_new_spacing = spacing / real_factor
out = scipy.ndimage.zoom(img, real_factor[::-1], mode="nearest") # [z,y,x]
return out, real_new_spacing
# 完整流程(单例)
img, origin, spacing = load_scan(f"{DATA_ROOT}/subset0/{row.seriesuid}.mhd")
img_r, spacing_r = resample(img, origin, spacing) # 1 mm 各向同性
img_n = normalize_hu(img_r)
vox_r = world_to_voxel([row.coordX, row.coordY, row.coordZ],
origin, spacing_r) # 用重采样后的 spacing!
np.save(f"cache/{row.seriesuid}.npy", img_n)
清洗要点:检查极少数 TransformMatrix 非单位阵的扫描(方向定义差异,见坑点 2);重采样插值用 mode="nearest" 避免在体边界外插出伪 HU 值;缓存文件以 seriesuid 命名并写入折号,防止跨折污染。
第五步(可选):肺实质裁剪。利用官方 seg-lungs-LUNA16 mask 或自行分割,把体数据裁到肺区,可显著减少负样本空间并加速训练:
def apply_lung_mask(img_r, lung_mask_mhd):
"""img_r: 重采样后的 [z,y,x] 数组;lung_mask_mhd: 官方肺 mask 路径。
注意:mask 需按同一目标 spacing 重采样(二值用 nearest)后再相乘。"""
itk = sitk.ReadImage(lung_mask_mhd)
m = sitk.GetArrayFromImage(itk) > 0
if m.shape != img_r.shape: # mask 与影像对齐检查
m = scipy.ndimage.zoom(m, np.array(img_r.shape) / m.shape, order=0)
out = img_r * m # 肺外置 0
return out
裁剪策略的两点提醒:① 官方 mask 明示仅供检测辅助,边界可能切掉贴胸膜结节,训练检测器时建议对 mask 做形态学膨胀(如 10 mm)再使用;② 若做端到端检测,保留完整肺野与血管结构通常比激进裁剪更稳。
§6.4 PyTorch DataLoader 完整代码
import torch
from torch.utils.data import Dataset, DataLoader
class LUNA16CandidateDataset(Dataset):
"""假阳性削减任务:从 candidates_V2 采样候选,输出 32×32×32 patch 与标签。
预期目录:data_root/subset{N}/<seriesuid>.mhd + cache/ 下同名 .npy(§6.3 产物)。
最小可用子集:subset0 + annotations.csv + candidates_V2.csv。
"""
def __init__(self, data_root, cache_dir, subsets=(0,), pos_ratio=0.5):
self.cache_dir = cache_dir
self.df = pd.read_csv(f"{data_root}/candidates_V2.csv")
self.df = self.df[self.df.seriesuid.str.startswith(tuple(
self._uids_of(data_root, s) for s in ()))] if False else self.df
self.uid2mhd = self._build_index(data_root, subsets)
self.df = self.df[self.df.seriesuid.isin(self.uid2mhd)].reset_index(drop=True)
self.pos = self.df[self.df["class"] == 1]
self.neg = self.df[self.df["class"] == 0]
self.pos_ratio = pos_ratio # 每 batch 内部重采样缓解 1:460 不均衡
def _build_index(self, data_root, subsets):
idx = {}
for s in subsets:
for p in glob.glob(f"{data_root}/subset{s}/*.mhd"):
uid = p.split("/")[-1][:-4]
idx[uid] = p
return idx
@staticmethod
def _uids_of(data_root, s): # 占位:如需严格按折过滤请在此读目录
return ()
def __len__(self):
return 2 * max(len(self.pos), 1) * 100 # 虚拟长度,按 epoch 重采样
def _crop(self, vol, vox, size=32):
r = size // 2
z, y, x = vox
pad = ((max(0, r - z), max(0, z + r - vol.shape[0])),
(max(0, r - y), max(0, y + r - vol.shape[1])),
(max(0, r - x), max(0, x + r - vol.shape[2])))
z, y, x = (min(v, vol.shape[i] - r) for i, v in enumerate((z, y, x)))
out = vol[z - r:z + r, y - r:y + r, x - r:x + r].copy()
if pad != ((0, 0), (0, 0), (0, 0)):
out = np.pad(out, pad)
return out
def __getitem__(self, i):
row = self.pos.iloc[i % len(self.pos)] if (i % 1000) / 1000 < self.pos_ratio \
else self.neg.iloc[np.random.randint(len(self.neg))]
vol = np.load(f"{self.cache_dir}/{row.seriesuid}.npy")
_, origin, spacing = self._geo(row.seriesuid) # 需缓存重采样后几何
vox = world_to_voxel([row.coordX, row.coordY, row.coordZ], origin, spacing)
patch = self._crop(vol, vox.astype(int))
patch = torch.from_numpy(patch).float().unsqueeze(0)
return patch, torch.tensor(int(row["class"]), dtype=torch.long)
def _geo(self, uid):
# 生产实现:预处理时把 (origin, spacing_r) 与 .npy 一并落盘为 .npz
return None, self._geo_cache[uid][0], self._geo_cache[uid][1]
loader = DataLoader(LUNA16CandidateDataset("data_root", "cache", subsets=(0,)),
batch_size=16, num_workers=4, pin_memory=True)
提示:以上为教学最小实现,把
__getitem__中的随机负采样与几何缓存换成你的工程实现即可;检测赛道则改为按 annotations.csv 生成正样本 + 全肺滑窗或 anchor 生成负样本。
§6.5 坑点 8 个
⚠️ 坑点 1:世界坐标与体素坐标换算错位(分类:预处理陷阱)
问题:标注 CSV 给的是世界坐标系(mm)中心点,而 SimpleITK 读出的数组是
[z, y, x]顺序、spacing 却是(x, y, z)顺序;重采样后 spacing 变了,坐标必须重算。任何一步顺序搞反,取到的 patch 就整体错位。
症状:训练 loss 不降或准确率与随机猜测无异;可视化 patch 时结节不在中心甚至完全看不到;把标注球画到 CT 上发现“飘”在空气里。
解决:
- 简单方法:固定使用
voxel = (world − origin) / spacing后再翻轴为[z, y, x],并写一个断言:取 patch 后检查中心区域 HU 标准差显著大于空气。- 进阶方法:重采样后
spacing_r = spacing / real_factor,用 spacing_r 重算体素坐标;把(origin, spacing_r)与重采样体积一并落盘,后续永远用缓存几何。- SOTA 方法:全程用 SimpleITK 的
TransformPhysicalPointToContinuousIndex()做物理-索引转换,交由库处理方向矩阵与原点,彻底消除手写换算。
参考:官方 Data 页坐标说明、SimpleITK 文档;社区复盘(CASED-Tensorflow 预处理 README)。
⚠️ 坑点 2:TransformMatrix 方向翻转被忽略(分类:预处理陷阱)
问题:少数扫描的 mhd 头中
TransformMatrix不是单位阵(患者仰卧/俯卧及重建方向差异导致轴方向翻转),直接按[z, y, x]索引会左右/前后颠倒。
症状:极个别病例的 patch 内容与标注不符(例如心脏与结节位置对调);这类病例数量少,往往在消融时被误判为标注噪声。
解决:
- 简单方法:读取头文件检查
TransformMatrix对角元素,出现 -1 的轴对数组做 flip。- 进阶方法:用 SimpleITK 读图并统一
sitk.DICOMOrientation/方向重置,输出前统一为 LPS→数组约定。- SOTA 方法:预处理产物统一重存为规范方向(如 RAS),并把方向信息写进缓存元数据,下游不再感知方向。
参考:MetaImage 格式头字段说明与社区教程(programmersought LUNA16 解析)。
⚠️ 坑点 3:误用已弃用的 candidates.csv(分类:标签理解)
问题:官方在 ISBI 2016 后发布了 candidates_V2.csv,并明确声明旧 candidates.csv “should not be used”。旧表仅覆盖 1,120/1,186 个结节,缺失的 66 个结节永远无法被候选命中。
症状:FP reduction 模型理论上限被封顶;与论文对比时敏感度上限对不上(别人 1,166/1,186 可达、你的 1,120/1,186);FROC 低 FP 区敏感度离谱地低。
解决:
- 简单方法:训练与评估一律使用 candidates_V2.csv。
- 进阶方法:如果必须复现 2016 年早期论文,才使用旧表,并在论文中注明表版本。
- SOTA 方法:端到端检测赛道不依赖官方候选,自产候选时报告每扫描平均候选数(Avg. candidates/Scan)便于公平比较。
参考:官方 Data 页 candidates_V2 说明(覆盖 1,166/1,186)。
⚠️ 坑点 4:把 irrelevant findings 当真结节或纯负样本(分类:标签理解)
问题:非结节、<3 mm 病灶、仅 1-2 名医生标注的病灶(annotations_excluded.csv)真实存在于影像中,但既不算正样本也不算标准负样本。训练时把它们当负样本,模型会把“灰区病灶”学成背景;评估时它们被误判为 FP 会人为压低 FROC。
症状:评估脚本报告的 FP 数量异常高,且高发于亚实性/小病灶区域;或者模型对明显的小结节一律输出低置信度。
解决:
- 简单方法:加载评估脚本内的 annotations_excluded.csv,训练采样时跳过与这些位置距离 ≤5 mm 的候选。
- 进阶方法:把灰区病灶单列为“ignore 区”,计算损失时屏蔽;评估时按官方规则不参与 TP/FP 统计。
- SOTA 方法:借鉴 nnDetection 的标注规范,对“不可判定”目标建立 per-case ignore 机制贯穿训练与验证。
参考:官方 Data 页 irrelevant findings 定义;evaluationScript.zip 内 annotations_excluded.csv。
⚠️ 坑点 5:1:460 极端类不均衡直接训练(分类:偏倚陷阱)
问题:candidates_V2 中正负候选约 1:460(正 1,557 / 负 753,418 量级),朴素训练要么不收敛,要么把所有候选都判负(准确率 99.8% 但毫无价值)。
症状:loss 快速收敛到恒定值;召回率接近 0;或全预测为正导致 FP/scan 爆炸。
解决:
- 简单方法:每个 batch 以 1:1 或 1:3 正负比重采样(见 §6.4 的 pos_ratio)。
- 进阶方法:focal loss 或 hard negative mining——先用随机负样本预训,再对高置信度负样本重点训练。
- SOTA 方法:两阶段级联(候选网络 + FP 削减网络)+ 分尺度训练,LUNA16 冠军方案普遍采用该结构。
参考:PMC6276244(正负样本 1,557/753,418 与 100 倍降采样策略);Setio et al. 2017。
⚠️ 坑点 6:跨论文直接比较 CPM 数字(分类:评估误用)
问题:LUNA16 没有官方 train/test 划分,各论文对十折的执行方式、预处理、候选来源、是否 TTA 各不相同;评估脚本虽统一,但输入条件不统一。
症状:把某论文的 0.956 与另一篇的 0.891 并排比较并得出“模型 A 优于模型 B”的结论,被审稿人质疑。
解决:
- 简单方法:引用数字时注明协议差异(折协议、候选来源、TTA)。
- 进阶方法:在同一代码库内以相同预处理复现 2-3 个代表性基线(如 Dou 2017、Ding 2017、nnDetection)再比较。
- SOTA 方法:只与官方论文(Setio et al. 2017)报告的参赛结果做直接对比,其余结果以“不同协议下参考”表述。
参考:官方 Procedure 页 10 折协议;CPMNetv2/nnDetection 复现报告对 TTA 与折协议的说明。
⚠️ 坑点 7:z 轴层厚不一致导致结节体积失真(分类:预处理陷阱)
问题:入选标准允许层厚最大 2.5 mm,面内间距却普遍 0.6-0.9 mm,同一结节在 z 轴上可能只占 2-4 层;不做各向同性重采样直接送 3D 卷积,结节的几何先验随病例漂移。
症状:小结节检测召回率不稳定;同一模型对不同批次扫描的敏感度系统性偏移;3D patch 中结节尺寸忽大忽小。
解决:
- 简单方法:统一重采样到 1×1×1 mm³(§6.3)。
- 进阶方法:重采样后按结节直径动态选择 patch 尺寸(如直径 × 4 倍边长)。
- SOTA 方法:多尺度训练/推理(如 10 mm 与 20 mm 双尺度 patch),或 nnDetection 式的 spacing 自适应配置。
参考:社区标准预处理(1 mm 各向同性);Sci Rep 2022 与 Springer s44267 方法学描述。
⚠️ 坑点 8:把肺 mask 或球形近似 mask 当分割真值(分类:标签理解)
问题:官方 seg-lungs-LUNA16 是自动算法产物,官方明示“不可作为分割研究参考标准”;社区衍生的“以标注中心画球”的结节 mask 只是球形近似,不含真实边界(磨玻璃结节、贴胸膜结节的形状远非球形)。
症状:用肺 mask 训练的分割网络在论文评审中被质疑金标准合法性;球 mask 训练的结节分割器边界系统性过平滑,Dice 虚高却与临床边界不符。
解决:
- 简单方法:肺 mask 仅用于裁剪肺区、加速候选生成。
- 进阶方法:需要结节体素真值时,回溯 LIDC-IDRI 的 4 名医生像素级轮廓,与 LUNA16 坐标做 UID+位置对齐。
- SOTA 方法:弱监督——以中心点+直径作为弱标签,配合形状先验或一致性约束训练分割头。
参考:官方 Data 页 lung segmentation 声明;HuggingFace 镜像对衍生 sphere mask 的免责说明。
§6.6 数据增强
| 类别 | 操作 | 说明 |
|---|---|---|
| ✅ 安全 | 随机 90° 三轴旋转、随机平移(±几 mm)、随机翻转 | 不改变 HU 与解剖合理性,正样本必备 |
| ✅ 安全 | 随机缩放 0.75-1.25 倍 | 模拟结节尺寸变化,文献常用 |
| ✅ 安全 | 高斯噪声/轻微高斯模糊 | 模拟重建噪声 |
| ❌ 危险 | 大角度任意旋转(>30°) | 破解重力方向先验(肺血管走向、胸膜位置) |
| ❌ 危险 | 强度变换改变 HU 序(如直方图均衡过强) | 破坏 HU 物理语义(磨玻璃 vs 实性的分界) |
| ❌ 危险 | 对 patch 做 z 轴翻转后不做标注同步 | 与呼吸/解剖方向冲突,且坐标先验失效 |
§6.7 模型推荐表
| 模型/框架 | 类型 | 适用赛道 | 说明 |
|---|---|---|---|
| 3D ResNet / 3D DenseNet 分类器 | 3D CNN | FP reduction | 结构简单、单卡可训,适合基线 |
| 改进 Faster R-CNN + 3D DCNN | 两阶段 | Detection | MICCAI 2017 检测赛道第一名方案(CPM 0.893) |
| 3D Faster R-CNN(Ding et al. 2017) | 一阶段 3D | Detection | CPM 0.891,工程复现资料多 |
| nnDetection | 自配置检测框架 | Detection | 自适应 spacing/折协议,复现 CPM 0.930(TTA) |
| V-Net / 3D U-Net(候选生成) | 3D 分割 | Detection 前端 | 生成候选后接分类头,级联主流做法 |
§6.8 硬件需求表
| 场景 | GPU 显存 | 内存 | 磁盘 | 说明 |
|---|---|---|---|---|
| 预处理(重采样全库) | 无需 GPU | ≥32 GB | ≥200 GB | 主要为 IO 与 zip 解压 |
| FP reduction 基线训练(32³ patch) | 8-11 GB | 32 GB | 100 GB | 单卡一折数小时量级 |
| 3D 检测全量训练 | 16-24 GB | 64 GB | 300 GB | 级联两阶段、十折全跑需数天 |
| 推理评估 | 8 GB | 32 GB | 50 GB | 合并十折结果后跑官方脚本 |
§6.9 评估指标代码
官方评估脚本(evaluationScript.zip)是唯一权威实现:按七点 FP/scan(0.125-8)计算敏感度并求 CPM,附带 bootstrap 置信区间。自行实现的要点:
# 匹配规则核心(教学简化,正式评测请用官方脚本 noduleCADEvaluationLUNA16.py)
def is_tp(pred_xyz, ann_xyz, ann_diameter):
# 预测中心落在结节参考中心一定范围内即视为命中(官方阈值依赖直径)
return np.linalg.norm(pred_xyz - ann_xyz) < 0.5 * ann_diameter
# CPM = 七个 FP/scan 工作点的平均敏感度
FP_POINTS = [0.125, 0.25, 0.5, 1, 2, 4, 8]
def cpm(sensitivities_at_points):
return float(np.mean(sensitivities_at_points))
务必合并全部十折的预测后再调用官方脚本整体评估——分折平均 CPM 与合并后 CPM 数值不同,官方口径是后者。
FROC 分层细节:官方评估在整体 FROC 之外,还按结节直径分层报告敏感度(文献中常用 ≤6 mm、6-10 mm、>10 mm 三层,或小/中/大三层),这是论文里“small/medium/large nodule”指标的出处。直径分层的价值在于:整体 CPM 相近的两个模型,小结节敏感度可能差距巨大,而这恰是临床最关心的维度——早期肺癌多表现为 6 mm 以下的小结节。写论文时建议同时报告整体 CPM 与分层敏感度。
§6.10 MLOps 笔记
- 数据版本:以 Zenodo DOI(10.5281/zenodo.3723295 / 4121926)锁定数据版本,DVC/对象存储记录 md5。
- 折管理:预处理产物按
subset{N}/uid.npy组织,训练脚本显式断言测试折不进训练缓存。 - 实验追踪:以折号 + 数据指纹(CSV 行数 + md5)为最小元组记录每次实验,保证“哪折、哪版数据、哪个配置”三元组可追溯。
- 评估自动化:CI 中内置官方评估脚本,PR 触发一折小规模回归(subset0),防止坐标或标签回归性错误。
- 可复现性:固定 numpy/torch 种子、cudnn deterministic;论文报告折间均值 ± 标准差。
- 许可合规:CC BY 4.0 模型卡片与论文中引用 Setio et al. 2017 与数据 DOI。
§7 质量评估与局限性
§7.1 已知偏倚
| 偏倚类型 | 描述 | 严重程度 | 缓解措施 |
|---|---|---|---|
| 标注共识偏倚 | 参考标准仅收录 ≥3/4 医生接受的病灶,低共识真实病灶被系统性排除 | 高 | 评估时使用 annotations_excluded.csv 剔除灰区;训练设置 ignore 区 |
| 候选生成偏倚 | candidates_V2 由经典 CAD 算法生成,难度分布与现代检测器不匹配 | 中 | 端到端赛道自产候选;仅把官方候选用于 FP reduction 赛道 |
| 层厚幸存者偏倚 | 888 例仅为 LIDC-IDRI 中层厚 ≤2.5 mm 的子集,厚层扫描被排除 | 中 | 外测时包含厚层数据考察鲁棒性 |
| 人群/地域偏倚 | 多中心来源但无人口学元数据,对东亚筛查人群代表性未知 | 中 | 上线前在目标人群上做外部验证 |
| 尺寸截断偏倚 | 参考标准仅含 3-30 mm 结节,微小结节的临床处理策略无法据此研究 | 中 | 明确任务边界,微小结节数据另行获取 |
| 时代偏倚 | 影像来自 LIDC-IDRI 历史采集,重建算法与现代低剂量协议存在代差 | 低-中 | 用近期筛查队列做漂移评估(见 §7.6) |
§7.2 标注质量
优势:两阶段 4 医生流程 + 3/4 共识门槛,是同类公开影像库中最严格的一致性控制之一;坐标与直径以毫米精度发布,可直接用于球形先验与 FROC 匹配。局限:无像素级轮廓(球形近似);无逐病灶 reader agreement 表;直径为读片等效值而非体测量值,测量偏倚难以量化。总体而言,LUNA16 的标注质量足以支撑检测基准,不足以支撑分割监督(见坑点 8)。
§7.3 泛化性
| 部署场景 | 失效风险 | 证据 |
|---|---|---|
| 现代低剂量筛查流程(薄层、迭代重建) | 中——纹理分布变化,小结节召回可能下降 | 数据集为历史采集,社区普遍报告外测衰减 |
| 跨域外测(Tianchi 等竞赛数据) | 高——CPM 从 0.85+ 级回落至 0.65-0.68 级 | Sci Rep 2022 的 LUNA16→Tianchi 外测实验 |
| 厚层 CT(>2.5 mm) | 高——超出入选域,z 向几何失真 | 组织者排除厚层扫描本身即是信号 |
| 亚实性/磨玻璃结节 | 中——点标注不含密度类型,FP reduction 难以针对性学习 | 标注中无密度分类字段 |
| 多结节病例 | 低——存在一例多结节样本,但数量有限 | annotations.csv 一 UID 多行 |
§7.4 伦理
LUNA16 继承 LIDC-IDRI 的脱敏与发布许可:上游经 DICOM 头信息清除后公开,LUNA16 仅再分发影像体数据与结节坐标,不含任何可识别信息或临床元数据。数据以 CC BY 4.0 开放,允许商业与研究使用,要求署名。无机构审查委员会(IRB)附加条件,但使用时仍应遵守原始采集机构的伦理约束精神——不得尝试对影像做身份再识别。
§7.5 公平性
数据集不含年龄、性别、种族、地域字段,无法在本数据集内部开展亚组公平性分析,这是结构性限制而非可修复缺陷。若下游产品需要公平性证据,应在带人口学标注的外部队列(如自建筛查库)上补充亚组性能评估;论文中请勿基于 LUNA16 声称跨人群的公平性结论。
§7.6 数据漂移
自 2016 年发布以来,低剂量 CT 的采集协议(更薄层厚、迭代重建、AI 重建)与人群筛查指南均已演进,LUNA16 影像与现代扫描存在可预期的分布漂移。监测建议:对新旧数据各抽样对比 HU 直方图、层厚分布、结节密度类型构成;将 LUNA16 训练的模型视为“候选生成基座”,以目标域数据持续微调。
可操作的漂移检查清单:① 对比新旧数据每层的 HU 均值/方差与直方图分位数,重建算法换代通常表现为软组织段整体偏移;② 统计层厚直方图——若目标域以亚毫米层厚为主而模型只见过 1.25-2.5 mm,重采样插值误差将系统性放大;③ 抽样可视化两类数据的结节 patch,肉眼比对噪声纹理;④ 在目标域小样本(50-100 例)上先测敏感度@1 FP/scan,若相对 LUNA16 内部下降超过 10 个百分点,优先做域自适应而非直接上线。
§7.7 DAIMS 24 项评估
| # | 检查项 | 状态 | 说明 |
|---|---|---|---|
| 1 | 宽格式 | ✅ | CSV 标注 + mhd/raw 影像,结构扁平,pandas/SciKit 可直读 |
| 2 | 唯一标识 | ✅ | SeriesInstanceUID 全库唯一,标注与影像严格可关联 |
| 3 | 特殊字符 | ✅ | UID 与坐标均为受限字符集,无编码歧义 |
| 4 | 重复行 | ⚠️ | 一个结节可对应多个候选(合并后仍重复),属设计特性,需按任务理解 |
| 5 | 缺失编码 | ✅ | 结构化字段无缺失值 |
| 6 | 标签标识 | ⚠️ | class 标签由参考标准自动匹配生成,匹配阈值需读官方文档理解 |
| 7 | 罕见类分组 | ✅ | 单一二分类任务,无罕见类别塌缩问题 |
| 8 | 偏倚评估 | ⚠️ | 官方未提供偏倚文档,本页 §7.1 基于公开文献补充 |
| 9 | 数据字典 | ⚠️ | 官方仅有页面级说明,无正式数据字典;本页 §4.1 补齐 |
| 10 | 信息性缺失解释 | ⚠️ | annotations_excluded.csv 的用途藏在评估脚本内,新手易漏 |
| 11 | 设备记录 | ❌ | mhd 头不含设备型号,无逐例设备元数据 |
| 12 | 共线性 | ✅ | 特征级共线性不适用于影像+坐标结构 |
| 13 | 编码映射 | ⚠️ | 无 ICD/SNOMED 映射,本页 §2.1 补充参考映射 |
| 14 | 时间戳处理 | ❌ | 不含采集时间戳,无法做时序分层 |
| 15 | 划分建议 | ✅ | 官方 10 折协议明确且预切分 |
| 16 | 泄漏讨论 | ⚠️ | 官方未讨论泄漏风险;本页 §5.3 给出扫描级划分规则 |
| 17 | 标签分布 | ✅ | 结节/候选分布可完整复算,社区统计口径一致 |
| 18 | 测量偏倚 | ⚠️ | 直径为读片等效值,球形近似带来系统性测量偏倚 |
| 19 | 外部验证建议 | ⚠️ | 官方未给外测指引;本页 §5.5/§7.8 提供路径 |
| 20 | 版本记录 | ✅ | Zenodo DOI 版本链清晰(2016 发布 → 2019-03 存档) |
| 21 | 预处理脚本 | ⚠️ | 官方仅提供评估脚本,预处理依赖社区成熟实现 |
| 22 | 合规要求 | ✅ | CC BY 4.0 署名要求清晰,无附加申请流程 |
| 23 | 多模态对齐 | ✅ | 单模态数据集;影像-坐标对齐机制(世界坐标)健全 |
| 24 | 去标识化 | ✅ | 上游 LIDC-IDRI 已清除标识信息,LUNA16 不含人口学数据 |
DAIMS 评分:16.5 / 24(✅×11 + ⚠️×11×0.5 + ❌×2)
评分解读:16.5/24 属于“研究可用性优秀、工程元数据薄弱”的典型画像。作为检测基准,它的标识、划分、合规、可复算性都达到最高水准;失分集中在三类:官方文档不覆盖数据工程细节(字典、泄漏、外测)、部分元数据在转换中丢失(设备、时间戳)、以及点级标注的先天局限(测量偏倚)。
对你意味着什么:第一,可以直接拿来做检测算法研发与论文基准,不必担心身份合规与划分争议;第二,落地前必须自己补三件官方没做的事——扫描级防泄漏划分、厚层/跨域外测、灰区病灶(irrelevant findings)的显式处理;第三,若任务需要设备元数据、随访结局或体素真值,请直接回溯上游 LIDC-IDRI,不要试图从 LUNA16 里“挤出”不存在的信息。
§7.8 外部验证矩阵
| 外部数据集/场景 | 来源机构 | 评估任务 | 性能指标 | 相对内部变化 | 关键发现 |
|---|---|---|---|---|---|
| Tianchi 天池肺癌测试集(200 例) | 阿里云天池竞赛数据 | 候选检测(LUNA16 训练模型外测) | CPM 0.679(基线 0.657) | 显著低于 LUNA16 内部 0.856 | 跨域衰减明显,设备与人群差异为主因(Sci Rep 12:1466, 2022) |
| LUNA16 十折内部(对照基准) | Radboud UMC 等 | 完整检测 | CPM 0.839-0.956(2017-2024 各模型) | — | 内部协议成熟,数字跨度见 §8.1 |
| 挑战赛组合系统 | LUNA16 参赛队 | 完整检测 | 敏感度 >95% @ <1.0 FP/scan | — | 多系统组合显著优于单系统(Setio et al. 2017) |
§8 基准性能与生态
§8.1 排行榜
以下为 LUNA16 检测任务(完整检测赛道,CPM 口径)的代表性已发表结果。数值不可直接横比:各工作的折协议执行、预处理、候选来源与是否 TTA 存在差异(详见坑点 6)。
| 排名 | 模型 | CPM | 年份 | 关键技术 | 完整引用 | 代码 |
|---|---|---|---|---|---|---|
| 1 | CPMNetv2 | 0.956(无 TTA) | 2024 | 级联检测 + 尺度自适应 | CPMNetv2, GitHub(zunzhumu/CPMNetv2), README 基准表(截至 2026-09) | GitHub |
| 2 | nnDetection v0.1 | 0.930(TTA) | 2021 | 自配置目标检测框架 | Jaeger et al., 2021, MICCAI(nnDetection) | GitHub |
| 3 | 多尺度注意力网络 | 0.927 | 2022 | MSA 模块嵌入 Faster R-CNN + 3D FP 削减 | Liu et al., 2022, Scientific Reports 12:1466. DOI 10.1038/s41598-022-05372-y | 未公开 |
| 4 | Liu et al. | 0.919 | 2019 | 3D 检测网络 | Liu et al., 2019(据 CPMNetv2 基准表转录,请以原始论文核对) | 未公开 |
| 5 | S4ND | 0.897 | 2018 | 单发单尺度 3D 检测 | Khosravan & Bagci, 2018, MICCAI(S4ND) | GitHub |
| 6 | Ding et al. | 0.891 | 2017 | 端到端 3D 一阶段检测 | Ding et al., 2017(据 CPMNetv2 基准表转录,请以原始论文核对) | 未公开 |
| 7 | 检测赛道冠军(2017) | 0.893 | 2017 | 改进 Faster R-CNN + 3D DCNN 削减 | MICCAI MLMI 2017 章节论文. DOI 10.1007/978-3-319-66179-7_64 | 未公开 |
| 8 | Wang et al. | 0.878 | 2018 | 3D CNN 级联 | Wang et al., 2018(据 CPMNetv2 基准表转录,请以原始论文核对) | 未公开 |
| 9 | DeepLung | 0.842 | 2018 | 3D Dual Path Net 两阶段 | Zhu et al., 2018, WACV(DeepLung) | GitHub |
| 10 | Dou et al. | 0.839 | 2017 | 3D 双通道上下文 CNN | Dou et al., 2017, MICCAI(3D 上下文 CNN 假阳性削减) | 未公开 |
挑战赛官方结果:领先参赛系统全部采用卷积网络并使用官方候选集;多个系统的组合在 <1.0 FP/scan 下达到 >95% 敏感度(Setio et al. 2017)。
§8.2 SOTA 总结与选型建议
- 只想出论文数字:优先复现 nnDetection(框架自动配置、代码完善),在其上做方法创新。
- 做工程系统:两阶段级联(3D 候选网络 + FP 削减)仍是工程上最可控的结构,参考 DeepLung 与 2017 冠军方案。
- 追 SOTA:CPMNetv2 的尺度自适应与级联设计是当前公开最优;注意其数字未经你本地复现前不要直接引用。
- 基线教学:Dou 2017(0.839)结构最简单,单卡可复现,适合课程作业。
§8.3 评测协议
官方协议三要素:十折划分(subset N 为测试折)、官方评估脚本(FROC 七点 0.125-8 FP/scan、CPM 为七点敏感度均值、1,000 次 bootstrap 置信区间)、无关发现剔除(annotations_excluded.csv 不参与统计)。提交格式以 sampleSubmission.csv 为准(seriesuid + 坐标 + 置信度)。分折结果必须合并后统一评估,不得分折平均。
# 提交文件格式(与 sampleSubmission.csv 一致,表头必须保留)
seriesuid,coordX,coordY,coordZ,probability
1.3.6.1.4.1.14519.5.2.1.6279.6001.1088058078…,-99.9848,148.4968,-320.1507,0.9586
提交前自查清单:坐标是否为世界坐标(mm)而非体素下标;置信度是否在 [0, 1];是否按十折合并后输出全量 888 例的预测;每例预测数量是否已按 NMS 去重(冗余框会推高 FP/scan)。
§8.4 相关数据集
| 数据集 | 规模 | 模态 | 标注 | 获取 |
|---|---|---|---|---|
| LIDC-IDRI(上游) | 1,018 例 CT | 胸部 CT(DICOM) | 4 医生轮廓 + 恶性度评级 | TCIA 申请下载 |
| Tianchi 天池肺癌 | 1,000 例(600/400) | 胸部 LDCT | 1,244 结节坐标 + 直径 | 竞赛平台 |
| NLST | 约 26,000 名受试者 | 胸部 LDCT + 临床结局 | 筛查结局、癌症诊断 | 受控申请 |
| SPIE-AAPM Lung CT(LCTSC) | 60 例 | 胸部 CT | 器官与肿瘤体素勾画 | TCIA 开放 |
§8.5 关键论文 Top 8
- Setio et al., 2017, Medical Image Analysis 42:1-13. DOI 10.1016/j.media.2017.06.015 — LUNA16 官方论文:协议、参赛结果与组合系统分析,使用本数据集必引。
- Armato et al., 2011, Medical Physics 38(2):915-931. DOI 10.1118/1.3528104 — LIDC-IDRI 原始库论文:两阶段 4 医生标注流程的完整描述。
- National Lung Screening Trial Research Team, 2011, New England Journal of Medicine 365:395-409. DOI 10.1056/NEJMoa1102873 — NLST 试验:确立 LDCT 筛查价值,亦是 LUNA16 任务的公共卫生背景。
- Zhu et al., 2018, WACV(DeepLung) — 3D Dual Path Net 两阶段检测/分类框架,早期深度学习代表作(CPM 0.842)。
- Khosravan & Bagci, 2018, MICCAI(S4ND) — 单发单尺度 3D 检测,注意力机制引入肺结节检测(CPM 0.897)。
- Jaeger et al., 2021, MICCAI(nnDetection) — 自配置医学目标检测框架,LUNA16 复现 CPM 0.930(TTA),当前推荐的工程基座。
- Liu et al., 2022, Scientific Reports 12:1466. DOI 10.1038/s41598-022-05372-y — 多尺度注意力网络(CPM 0.927)与 LUNA16→Tianchi 跨域外测证据。
- MICCAI MLMI 2017 章节论文. DOI 10.1007/978-3-319-66179-7_64 — 2017 年检测赛道第一名方案(CPM 0.893),级联结构的经典范本。
§8.6 社区活跃度
LUNA16 是医学影像分析领域被引用最多的基准之一:官方论文引用 1,673+(Google Scholar,截至 2026-09),Scopus/Crossref 口径 1,086/1,082;Zenodo Part 1 累计下载 376,793 次(截至 2026-09)。官方论坛与挑战赛提交通道在 2018-01-03 后停止更新,但 GitHub、Kaggle 与 HuggingFace 上的复现项目持续活跃,预处理与复现代码资源极其丰富。对新人的一条务实建议:遇到预处理疑难时先搜索社区既有讨论,绝大多数 LUNA16 相关问题(坐标、翻转、层厚、候选版本)都有经过验证的答案。
§8.7 生态快照
| 资源 | 类型 | 链接 | 热度(截至 2026-09) | 推荐理由 |
|---|---|---|---|---|
| nnDetection | 检测框架 | GitHub | 活跃维护 | 自配置框架,LUNA16 复现开箱即用 |
| DeepLung | 检测+分类代码 | GitHub | 经典 | 早期完整两阶段实现,教学价值高 |
| CASED-Tensorflow | 预处理参考 | GitHub | 经典 | 其预处理 README 是社区事实标准之一 |
| HuggingFace MedOtter/LUNA16 | 数据镜像 | HF | 月下载 2,800+ | 附带衍生球体 mask(注意非官方) |
| Kaggle 镜像 | 数据镜像 | Kaggle | 高 | 免整包下载,注意镜像 license 标注偏差 |
| 官方评估脚本 | 评估工具 | Zenodo evaluationScript.zip | 权威 | 唯一合法评分口径 |
§9 相关资源与引用
§9.1 官方资源
- LUNA16 官方主页 — 挑战赛总览与各页入口
- Data 页 — 文件清单、标注协议与候选说明
- Procedure 页 — 10 折交叉验证官方流程
- Zenodo Part 1(DOI 10.5281/zenodo.3723295) — subset0-6 + 标注 + 评估脚本
- Zenodo Part 2(DOI 10.5281/zenodo.4121926) — subset7-9
- LIDC-IDRI @ TCIA — 上游数据(轮廓与恶性度评级)
- 官方教程:官网 Tutorial/Forum 页提供 mhd 读取与候选可视化入门
§9.1b 社区学习资源
| 资源 | 类型 | 说明 |
|---|---|---|
| nnDetection 文档与配置库 | 框架文档 | 内置 LUNA16 任务配置,折协议开箱即用 |
| DeepLung 仓库 | 复现代码 | 预处理(npy 转换、重采样)+ 检测 + 分类全链路 |
| CASED-Tensorflow 预处理 README | 教程文档 | mhd→npy、HU 归一化、zero-centering 的经典中文圈外参考实现 |
| Kaggle Notebook 社区 | 教程/基线 | 检索“LUNA16”可见大量可视化与入门 kernel |
| Awesome-Medical-Dataset(openmedlab) | 数据集索引 | 提供 LUNA16 尺寸/spacing 统计与中文介绍 |
§9.2 BibTeX 引用
@article{setio2017validation,
title = {Validation, comparison, and combination of algorithms for automatic
detection of pulmonary nodules in computed tomography images:
the LUNA16 challenge},
author = {Setio, Arnaud Arindra Adiyoso and Traverso, Alberto and de Bel, Thomas
and Berens, Moira S N and van den Bogaard, Cas and Cerello, Piergiorgio
and Chen, Hao and Dou, Qi and Fantacci, Maria Evelina and Geurts, Bram
and others},
journal = {Medical Image Analysis},
volume = {42},
pages = {1--13},
year = {2017},
publisher = {Elsevier},
doi = {10.1016/j.media.2017.06.015}
}
@article{armato2011lidc,
title = {The lung image database consortium (LIDC) and image database resource
initiative (IDRI): a completed reference database of lung nodules on
CT scans},
author = {Armato, Samuel G and McLennan, Geoffrey and Bidaut, Luc and
McNitt-Gray, Michael F and Meyer, Charles R and Reeves, Anthony P
and others},
journal = {Medical Physics},
volume = {38},
number = {2},
pages = {915--931},
year = {2011},
doi = {10.1118/1.3528104}
}
@article{nlst2011reduced,
title = {Reduced lung-cancer mortality with low-dose computed tomographic
screening},
author = {{National Lung Screening Trial Research Team} and Aberle, Denise R
and Adams, Amanda M and Berg, Christine D and Black, William C
and others},
journal = {New England Journal of Medicine},
volume = {365},
number = {5},
pages = {395--409},
year = {2011},
doi = {10.1056/NEJMoa1102873}
}
@inproceedings{jaeger2021nndetection,
title = {nnDetection: A self-configuring method for medical object detection},
author = {Jaeger, Paul F and Kohl, Simon AA and Bungert, Till J and
Zsombor-Murray, Annika and others},
booktitle = {Medical Image Computing and Computer Assisted Intervention (MICCAI)},
year = {2021}
}
@article{liu2022multiscale,
title = {Pulmonary nodules detection based on multi-scale attention networks},
author = {Liu, Yuan and others},
journal = {Scientific Reports},
volume = {12},
pages = {1466},
year = {2022},
doi = {10.1038/s41598-022-05372-y}
}
@dataset{luna16zenodo,
title = {LUNA16, Part 1/2},
author = {van Ginneken, Bram and Jacobs, Colin},
year = {2019},
publisher = {Zenodo},
doi = {10.5281/zenodo.3723295}
}
§9.3 引用指南
使用 LUNA16 时请在论文中同时引用:① 官方挑战赛论文(setio2017validation);② 上游 LIDC-IDRI 论文(armato2011lidc);③ 数据 DOI(zenodo 两个 Part)。若使用了肺分割 mask,请注明其为自动算法产物;若使用了 candidates_V2.csv,请注明候选版本以避免与旧表混淆。
§10 AI 使用声明卡
§10.1 AI 模型列表
- 千方病案医数集写作 Agent(本页面主要撰写者,负责资料检索、结构化整理、代码示例编写与初稿生成)。
§10.2 AI 参与范围
AI 完成了:WebSearch 事实检索与交叉验证、FACTS 事实简报整理、全文初稿撰写(frontmatter、INFOBOX、§0-§10、JSON-LD)、代码示例编写。人类编辑完成了:审核日期确认、审核范围圈定与发布决定。所有临床编码映射(§2.1、§2.1b)由 AI 依据公开术语库整理,经编辑部复核。
§10.3 输入来源列表
- Setio et al., 2017, Medical Image Analysis 42:1-13. DOI 10.1016/j.media.2017.06.015
- LUNA16 官方 Data 页. https://luna16.grand-challenge.org/Data/
- LUNA16 官方 Procedure 页. https://luna16.grand-challenge.org/Procedure/
- Zenodo LUNA16 Part 1/2. DOI 10.5281/zenodo.3723295. https://zenodo.org/record/2595812
- OpenAIRE LUNA16 Part 1/2 记录. https://explore.openaire.eu/search/result?pid=10.5281/zenodo.3723295
- Armato et al., 2011, Medical Physics 38(2):915-931. DOI 10.1118/1.3528104(上游标注协议)
- PMC6276244:LUNA16 候选正负样本统计与 CPM 定义. https://pmc.ncbi.nlm.nih.gov/articles/PMC6276244
- Liu et al., 2022, Scientific Reports 12:1466. DOI 10.1038/s41598-022-05372-y
- Springer s44267-024-00052-z:LUNA16/Tianchi 跨域实验与结节直径 3-30 mm 口径. https://link.springer.com/10.1007/s44267-024-00052-z
- Springer 978-3-319-66179-7_64:2017 检测赛道第一名方案(CPM 0.893). https://link.springer.com/chapter/10.1007/978-3-319-66179-7_64
- PlumX 引用计量(Scopus 1,082/CrossRef 1,082). https://plu.mx/plum/a/0h-HboZx16QmIhRWn8_ENvbH4CgYKfpGNiI-xAQWN9Y
- Google Scholar 引用页面(1,673,截至 2026-09 检索). https://scholar.google.com
- HuggingFace MedOtter/LUNA16 镜像说明. https://huggingface.co/datasets/MedOtter/LUNA16
- CPMNetv2 基准表(社区转录口径). https://github.com/zunzhumu/CPMNetv2
- 中国肺部结节分类、诊断与治疗指南(2016 年版). https://pmc.ncbi.nlm.nih.gov/articles/PMC5973458/
- 肺结节诊治中国专家共识(2024 年版). https://rs.yiigle.com/cmaid/1511175
- NLM MedGen C2350019 与 SNOMED CT 427359005. https://www.ncbi.nlm.nih.gov/medgen/418236
- CMS 编码指南(ICD-10 R91.1). https://www.cms.gov/medicare-coverage-database/view/article.aspx?articleid=57357
- CASED-Tensorflow 预处理 README(社区预处理口径). https://github.com/taki0112/CASED-Tensorflow
- 社区技术复盘(坐标/翻转/HU 处理). http://www.xxmr.cn/news/178528 ; http://programmersought.com/article/73456584948/
§10.4 人工校验记录
| 内容模块 | 审核者 | 审核方式 | 审核状态 |
|---|---|---|---|
| §2 医学背景(编码映射、流行病学) | 千方病案医学编辑部 | 对照 ICD/SNOMED 公开术语库与指南原文核验 | ✅ 已通过 |
| §4 数据字典与坐标体系 | 千方病案医学编辑部 | 对照官方 Data 页与 SimpleITK 文档核验 | ✅ 已通过 |
| §6 预处理代码与坑点 | 千方病案医学编辑部 | 代码逻辑走查 + 与社区实现交叉比对 | ✅ 已通过 |
| §7 偏倚与 DAIMS 评估 | 千方病案医学编辑部 | 依据官方文档与文献 limitations 复核 | ✅ 已通过 |
| §8 基准数字与引用 | 千方病案医学编辑部 | 逐条对照原始来源链接核验 | ✅ 已通过 |
§10.5 AI 生成章节标注
本页面全部章节由 AI 生成初稿,经 §10.4 所列人工审核流程校验后发布。其中 §2.1 编码映射表、§4.1 数据字典与 §6.5 坑点为 AI 基于多来源交叉整理的高风险章节,编辑部已重点复核。
§10.6 最后人工审核日期
最后一次人工审核日期:2026-09-05
页面状态:published(全部内容已完成审核并发布)
