CancerVerse:1.46 万人随访 14 年的多癌种 CT 筛查集

24,422 份 CT / 13 类肿瘤体素标注 / 报告+病理+临床变量

来源 https://huggingface.co/datasets/BodyMaps/CancerVerse发布时间: 2026-10-26最后更新: 2026-10-26 阅读 8
CancerVerse:1.46 万人随访 14 年的多癌种 CT 筛查集

信息速览

数据集名称CancerVerse:1.46 万人随访 14 年的多癌种 CT 筛查集
数据类型原始影像,人工标注,配对报告,临床变量
规模14,599 名患者 / 24,422 份 CT / 22,344 次检查
接入方式https://huggingface.co/datasets/BodyMaps/CancerVerse
AI 就绪度

CancerVerse 是约翰霍普金斯大学 BodyMaps 团队在 MICCAI 2026 上发布的 CT 数据集。它想解决的问题很具体:现有的公开 CT 数据集都是「一个时间点、只有图像、只有一两种癌」,而癌症筛查真正需要的是「同一个人、很多个时间点、图像加报告加病理加临床变量、覆盖多种癌」。这份数据把这几件事第一次凑到了一起。

规模上,24,422 份盆腔/腹部/胸部 CT、14,599 名患者、22,344 次检查,采集跨度 2010 到 2025 年,最长随访 14.4 年。13 类肿瘤由 28 位人类专家手工勾画了 12,529 处体素级标注,历时 13 个月。每份 CT 都配了放射科报告,另含 8,799 人的「验证健康」队列用来测假阳性。

INFOBOX — CancerVerse 一屏速览

维度 内容
全称 CancerVerse: A Fully Open Longitudinal and Multimodal Dataset for Multicancer Screening
发布方 Johns Hopkins University · BodyMaps 团队
发表 MICCAI 2026(LNCS 16895),论文编号 0562
CT 份数 24,422
患者数 14,599
检查次数 22,344
癌种(体素标注) 13 类
肿瘤标注数 12,529 处
验证健康队列 8,799 人(63.5%)
随访 1 天 – 14.4 年,中位 299 天
单患者时间点 最多 26 个
采集年份 2010 – 2025
报告覆盖 99.8%
病理覆盖 44.8%
影像格式 NIfTI(ct.nii.gz)
体量 约 3 TB(影像)+ 40 GB(标注)
许可 CC BY-NC-ND 4.0
下载 Hugging Face,公开,无需申请

§1 它到底解决什么问题

1.1 几种常见的起点

你要做癌症早筛模型,但手上的数据都是单时点的。 LiTS、KiTS、PanTS 这些经典数据集都是一人一次扫描。模型学不到「肿瘤怎么长起来」,只能学到「肿瘤长什么样」。而筛查的核心恰恰是「在还没长成典型形态时抓住它」。

你要做影像-报告配对的多模态模型。 现有的 3D 影像-文本数据极少。MIMIC-CXR 是 2D 胸片,RadGPT 规模小,CT2Rep 只做报告生成不做筛查。要 3D CT 加自由文本报告,选择本来只有一两个。

你要在「低假阳性」这个真实约束下评估模型。 临床筛查不允许每扫一个人报出三个可疑灶。已有的数据集多数没有验证健康队列,特异度是在一堆「干净片子」上算出来的,数字漂亮但没有临床含义。

你要一次覆盖多种癌。 大多数公开集是单器官的。要做「一次腹部 CT 查多个器官」的多癌种筛查,得自己拼数据、自己统一标注口径,拼完还不知道各癌种之间的阴性样本怎么定义。

1.2 它能给到的与给不到的

你的需求 它给的 够不够
3D CT 体素级肿瘤分割 13 类癌、12,529 处标注 够
纵向随访序列 25.6% 患者有多次扫描,最多 26 个时间点 够,但长尾薄
影像-报告配对 99.8% 有报告 够
病理结果 44.8% 有 部分
临床变量 74.7% 有 部分
真实假阳性率评估 8,799 人验证健康队列 够,且是稀缺项
外部验证 3,035 份 CT(三区域) 够做一次泛化检验
多癌种(>13 类) 只有 13 类 不够
中国人群 无 不够
治疗前后配对 有随访但未按治疗线标注 需自行推断

1.3 一句话判断

你要做「3D CT 上的多癌种检测/分割,并且在意假阳性率」——它是目前唯一同时满足纵向、多模态、13 类标注、健康队列四项的选择。你要做的是「单器官精细分割」或「2D 报告生成」——它的粗粒度反而不如专项数据集。

1.4 不适合谁:五条明确边界

要商业产品的,许可不允许。 CC BY-NC-ND 4.0 三重限制:非商业、禁止演绎、必须署名。禁止演绎这一条尤其要注意——基于该数据微调的模型、基于该数据重写的标注,是否构成「演绎作品」在法律上并不清晰。要商业化必须走 BodyMaps 的授权渠道。

存储紧张的,跑不动。 3 TB 影像加 40 GB 标注。这个体量意味着你不能「先下下来看看」,必须提前规划存储、考虑按需拉取(Hugging Face 支持单文件下载),或者只用元数据 CSV 做前置研究。

要按扫描仪做稳健性分析的,字段缺失太多。 scanner、protocol_name、series_description 三列缺失率在 87% 到 95% 之间。也就是说绝大多数扫描你不知道是用什么机器、什么协议扫的。想做「不同厂商之间的域偏移」研究,这份数据给不了。

要按患者做诊断预测的,ICD 编码不能直接用。 icd10_code 缺失 60.6%,且它是检查级的(一次 CT 对应一个编码),不是患者级的诊断列表。要患者级标签,得从报告文本里抽,或者从 pathology 里推。

要非肿瘤疾病的,标注体系不覆盖。 13 类全是恶性肿瘤相关。结节、炎症、结石、囊肿这些常见良性发现没有体素级标注。虽然健康队列里 47.6% 是「仅有良性病变」,但这些病变本身没有被标出来——它们只是作为假阳性来源存在。

§2 数据的骨架

2.1 三层标识与目录结构

每份 CT 有三个标识层级,理解它们的区别是理解整个数据集的前提:

标识 含义 唯一值数量
CancerVerse ID 一次扫描(一份 CT 体积) 24,422
Encrypted Accession Number 医院侧的检查流水号,加密后 与上一行一一对应
Patient ID 患者,加密后 14,599

三个都是加密字符串,形如 CV_00000001 / SSEC7YIQBBLMRDLC / EMBK2NFJVJVCQO8G。第一个是可读的序号,后两个是定长随机串。跨机构的同一患者是否被正确合并,官方没有说明;从加密方式看,应该是在机构内部先做患者归并再加密。

下载完成后的目录结构:

CancerVerse/
├── CancerVerse_dataset_metadata.csv
└── CancerVerse/
    ├── CV_00000001/
    │   ├── ct.nii.gz
    │   └── segmentations/     # 13 类肿瘤掩膜
    ├── CV_00000002/
    └── ...

注意外层目录名与内层目录名同为 CancerVerse,解压时容易套娃。下载脚本已经在 . 下操作,所以最终路径是 ./CancerVerse/CancerVerse/CV_xxxxxxxx/。

2.2 规模数字的三个版本

这三个数字在不同地方不一致,最容易让人怀疑自己下错了文件:

来源 CT 数 患者数
Hugging Face README(3.5.1) 24,422 14,599
MICCAI 2026 论文正文 24,168 13,863
元数据 CSV 逐行统计 24,422 14,599

论文写作时的快照早于 3.5 版的扩充。3.5 版(2026 年 9 月)「修复了有问题的 CT、增加了更多 CT 与患者、并加入了肿瘤标注」,3.5.1 版(2026 年 10 月)「修正了跨患者的时间偏移不一致」。

引用时建议写明版本号:CancerVerse 3.5.1,24,422 份 CT / 14,599 名患者。只写「CancerVerse」而不写版本,无法判断你用的是哪一版。

2.3 纵向结构到底有多纵向

这是最容易被宣传语夸大的一处。README 说「随访最长 14.4 年」,论文说「每位癌症患者有 1 到 32 份纵向 CT」。但把元数据 CSV 按 Patient ID 聚合,看到的是这样的分布:

每患者扫描数 患者数 占比
1 10,863 74.4%
2 1,639 11.2%
3 824 5.6%
4 516 3.5%
5 221 1.5%
6–10 427 2.9%
11–31 109 0.7%

中位数是 1,均值 1.67,最大值 31(README 说时间点最多 26 个,CSV 里能看到 31 份扫描——差异可能来自同一检查日多次重建)。

读法:四分之三的患者只有一份 CT。真正的纵向分析只能在剩下的 3,736 人(25.6%)上做,而其中又有近一半只有两份。说「这是一份纵向数据集」没错,但纵向信息的实际密度远低于总量给人的印象。做纵向建模时,训练信号主要来自那 0.7% 的长序列患者。

2.4 时间跨度

元数据里的 exam_date 按年份分布:

年份 份数 年份 份数
2010 325 2018 1,659
2011 621 2019 1,645
2012 853 2020 2,225
2013 1,003 2021 2,160
2014 1,059 2022 1,281
2015 1,057 2023 1,208
2016 1,300 2024 1,920
2017 1,513 2025 440

16 年跨度,2020 年是峰值(2,225 份)。2025 只到 440 份,说明数据截止在上半年。exam_date 缺失 17.0%——这 4,153 份 CT 无法定位时间,纵向分析时必须剔除。

§3 13 类肿瘤的标注体系

3.1 全表

器官 掩膜变量名 带该标注的 CT 份数
肝 liver_lesion 6,540
胰 pancreatic_lesion 1,001
肾 kidney_lesion 994
胃 stomach_lesion 851
肾上腺 adrenal_gland_lesion 683
结肠 colon_lesion 637
膀胱 bladder_lesion 432
前列腺 prostate_lesion 417
食管 esophagus_lesion 287
脾 spleen_lesion 246
子宫 uterus_lesion 177
十二指肠 duodenum_lesion 172
胆囊 gallbladder_lesion 92
合计 12,529

3.2 这张表的三个读法

第一,极度不均衡。 肝一项占 52.2%,是第二名的 6.5 倍。最少的胆囊只有 92 份。做「13 类宏平均」时,肝的样本量会让它的方差远小于其他类,宏平均实际上被「样本少的那几类」主导。论文报告的 76.0% 平均敏感度就是宏平均,看单类时要回到分项。

第二,这份数据的地理来源决定了病种结构。 采集方是瑞士巴塞尔大学医院与土耳其伊斯坦布尔 Medipol 大学等机构。肝、胰病例多,与这两家机构是肝胆胰肿瘤转诊中心有关。这不是随机抽样的人群,而是「转诊人群」——患病率远高于筛查人群。

第三,七类此前没有公开的体素级标注。 论文明确写:「Seven of these cancer types have no prior public dataset with related CT scans or voxel-wise tumor annotations」。按表中顺序,肝、肾、胰、结肠这四类有前作(LiTS、KiTS、PanTS、以及结肠相关集),剩下九类中至少七类是首次公开。这是这份数据最硬的贡献。

3.3 标注是怎么做出来的

流程分三步,每一步都值得记住,因为它决定了标注的可信度上限:

  1. 初勾:放射科住院医师用 MONAI Label 作为勾画界面,逐层手工勾出每一处癌性病灶。
  2. 复核:八位执业放射科医师(board-certified)独立复核,重点看边界模糊处与多灶病变。
  3. 裁决:分歧通过 adjudication 解决,不是投票、不是取平均。

论文特别强调了两点否证:「No AI was used in the annotation pipeline, and no pseudo-labels were used」。MONAI Label 在这个流程里只是画图工具,它自带的 AI 辅助分割功能没有被使用。这一点在当下很重要——很多大规模数据集用半自动管线加速,标注质量里混着模型的偏见。这份没有。

质量验证的做法是:抽一部分肿瘤让多位专家各自独立标注,算专家间 Dice。结果是 62.2%(图 3a)。这个数字初看低得惊人,但它是理解整个数据集性能的钥匙,见 §5.2。

§4 多模态对齐:报告、病理、临床变量

4.1 四种模态的覆盖率

论文给的逐患者覆盖率:

模态 覆盖率 约合人数
放射报告 99.8% 14,570
病理结果 44.8% 6,540
人口学 80.4% 11,738
临床变量 74.7% 10,905

从 CSV 逐行统计得到的缺失率(按扫描计):

列 缺失率
report 0.1%
sex 21.3%
age 21.5%
phase 17.4%
exam_date 17.0%
icd10_code 60.6%
scanner / study_description / protocol_name 87.6%
series_description 95.1%

两套数字基本对得上(报告 0.1% 缺失 = 99.9% 覆盖,人口学 21.3% 缺失 = 78.7% 覆盖,与 80.4% 接近;差异来自按扫描计与按患者计的口径不同)。

实用含义:做「影像 + 报告」的双模态,几乎不损失样本。做「影像 + 报告 + 病理 + 临床」的四模态,样本会掉到 44.8% 那一档,也就是六千多人。这个收缩幅度必须在论文的方法节里写明,否则会被认为用了一万多人的四模态数据。

4.2 报告长什么样

报告是自由文本,语体接近欧洲临床习惯,常见结构是 Clinical information / Technique / Findings(或 COMPARISON)。中位长度 540 字符,均值 910,最长 8,285。下面是几条真实报告的节选(已去掉患者信息):

Clinical information: Newly diagnosed gastric cancer. Technique: Axial sections were obtained following oral and intravenous contrast administration… Findings: An asymmetric wall thickening extending toward the lesser curvature is observed at the gastric cardia. The thickest part measures 16 mm…

For known hepatic, pulmonary, and osseous metastatic breast carcinoma, the current RECIST evaluation shows a “stable disease” with overall size-reduced liver metastases…

Compared with the patient’s previous CT scan performed on 19/03/2021 and the thoracic CT scan performed on 04/02/2021. Trachea and both main bronchial lumens are patent…

三个特征需要注意:

报告里带尺寸。 「16 mm」「33x18 mm」「0.7 cm」这类测量随处可见。这对「从报告学习分割」的路线是有利条件——尺寸、位置、病灶数量都能抽出来当弱监督信号。论文的多模态分支正是这么做的:用 Llama-3-70B 从报告里抽肿瘤属性(位置、大小)作为辅助标签。

报告里有对比。 「Compared with the patient’s previous CT scan performed on 19/03/2021」——这直接给出了时间关系。但注意,报告里的日期是文本,不等于 exam_date 列,两者要分别解析。

报告是英文的,但有欧洲书写习惯。 RECIST、LI-RADS 这类评分体系频繁出现,LI-RADS 5、LI-RADS M、LI-RADS NC 都有。这意味着报告本身带了一定程度的标准化信息,可以当成结构化标签用。

4.3 ICD-10 编码

112 个不同取值,前 20 位:

编码 含义 份数
C79.5 骨与骨髓继发恶性肿瘤 2,004
C22.0 肝细胞癌 1,522
C64 肾恶性肿瘤(除肾盂) 742
C78.7 肝继发恶性肿瘤 683
C16.9 胃恶性肿瘤,未特指 573
C78.0 肺继发恶性肿瘤 488
C79.3 脑与脑膜继发恶性肿瘤 346
C78.6 腹膜后与腹膜继发恶性肿瘤 344
C79.88 其他特指部位继发恶性肿瘤 341
C79.7 肾上腺继发恶性肿瘤 267
C25.0 胰头恶性肿瘤 252
C61 前列腺恶性肿瘤 139

两个观察:

转移灶(C78/C79)比原发灶多。 C79.5 一项就有 2,004 份,是所有编码里最多的。这符合「转诊中心」的人群特征——很多患者是带着已知转移来做复查的。做筛查研究时这一点很关键:这份数据里的大部分阳性样本不是「筛查发现的早期癌」,而是「已知癌症的随访影像」。这直接限制了它在「早期检出」任务上的外部效度,论文用「lead time」这一维度来处理,但使用前必须自己意识到这个偏倚。

C22.0(肝细胞癌)与 C78.7(肝转移)要分开。 两者都在肝,但在临床上完全不是一回事,标注里也没有区分(都是 liver_lesion)。做肝病灶分类时这是一个已知的模糊点。

§5 基准:论文报了什么,以及怎么读

§5.1 内部评估:13 类癌种的敏感度与特异度

论文 Table 1 对比了五种主流分割骨干与「纵向+多模态」模型。分两组报告(有公开掩膜的 4 类、无公开掩膜的 9 类):

有公开掩膜的 4 类(平均)

模型 敏感度 特异度
SegResNet 70.6 86.9
SwinUNETR 70.4 84.1
Universal Model 70.0 86.1
MedFormer 72.1 87.2
nnU-Net 72.3 87.6
纵向+多模态 76.1 89.7

无公开掩膜的 9 类(平均)

模型 敏感度 特异度
SegResNet 72.6 80.3
SwinUNETR 71.4 80.4
Universal Model 70.1 81.2
MedFormer 72.4 80.7
nnU-Net 72.7 82.3
纵向+多模态 75.9 84.7

两组的一致规律:纵向+多模态模型比最强的单时点基线(nnU-Net)在敏感度上高 3.2–3.8 个百分点、在特异度上高 2.1–2.4 个百分点。

分癌种看,纵向+多模态模型在 13 类上的敏感度从 66.7(十二指肠)到 84.6(脾),跨度 18 个百分点。这个跨度比模型间的差距(70.0 到 76.1)大得多——说明癌种难度差异远大于模型架构差异。

5.2 Dice 51.1% 该怎么理解

论文报告纵向+多模态模型的平均 Dice 是 51.1%,比纯影像基线高 2.4 个百分点。分癌种:

癌种 DSC 癌种 DSC
肝 67% 肾上腺 55%
肾 64% 食管 49%
子宫 63% 胰 48%
前列腺 57% 胆囊 46%
脾 52% 结肠 41%
膀胱 45% 十二指肠 39%
胃 38%

单看 51.1% 会觉得「这么低」。但论文给了一个关键参照:三位执业放射科医师在同一子集上互相之间的 Dice 只有 62.2%,而模型在这个子集上达到 50.8%。

也就是说,这个任务的「人类上限」本身就只有 62%。肿瘤边界在 CT 上常常是渐变的、与周围组织等密度的、被治疗后改变模糊掉的。要求模型做到 80% 是把任务想简单了。

正确的读法:把 62.2% 当作天花板参照,51.1% 大约是天花板的 82%。剩下的 18% 差距才是模型真正要补的部分,而不是「49 个百分点」。

5.3 四种训练策略的消融

论文的 FROC 曲线(图 2)对比了四种策略,这是整篇论文最有说服力的一张图:

策略 输入 0.25 FP/scan 敏感度 0.5 FP/scan 敏感度
纯影像(单张 CT) 图像 51.5(基线) 54.7(基线)
纵向(多张 CT) 图像 + 时间 — 63.6
多模态(单张 CT + 非影像) 图像 + 报告/病理/临床 — —
纵向+多模态 全部 60.1 63.7

关键结论:纵向与多模态的收益是可加的。单用纵向、单用多模态都优于纯影像,两者合起来在低假阳性区间取得最大增益——相比纯影像基线,在 0.25 FP/scan 处绝对提升 8.6 个百分点,在 0.5 FP/scan 处提升 9.0 个百分点。

这个结果的含义超出数据集本身:它说明筛查模型的天花板不由架构决定,而由「能看到多少时间信息、多少非影像信息」决定。换更强的骨干网络带来的提升,可能还不如多加一份历史扫描。

5.4 外部验证

用 CancerVerse 训练,到三个外部区域队列上测:

队列 患者数 CT 份数
北加州(N. California) 705 1,271
东海岸(E. Coast) 366 870
东亚(E. Asia) 612 894
合计 1,683 3,035

结果:敏感度提升 2.6%,特异度提升 1.4%(相对纯影像基线)。提升幅度比内部评估小得多(内部是 3–9 个百分点),这是正常现象——跨机构、跨人群、跨协议时,纵向与多模态带来的增益会被域偏移吃掉一部分。但方向没有反转,说明这个增益不是过拟合训练集得来的。

三个外部队列的协议覆盖动脉期、静脉期与非增强,这一点值得记下来:泛化检验里如果只测一种对比期,结论会过于乐观。

5.5 与「先分割再诊断」两段式方案的关系

有人会问:既然 13 类都有体素掩膜,为什么还要一个「纵向+多模态」的复杂模型?直接把每一类单独训一个分割器不就行了?

单器官分割器在这份数据上的表现(Table 1 里的 nnU-Net 行)平均敏感度 72.7%、特异度 82.3%,纵向+多模态是 75.9% / 84.7%。差距只有三到四个百分点,看起来「多加那么多工程不如多训几个分割器」。

但差距集中在两类容易混淆的情形上,而这两类恰好是筛查最难的部分:

情形 单器官分割器 纵向+多模态
微小病灶(<10 mm) 容易漏,与周围等密度组织分不开 靠前次扫描的「这里本来没有」提供对照
治疗后改变 把瘢痕、纤维化误判为病灶 靠报告的「stable disease」等描述提供抑制信号
多灶患者的新增灶 与已有的多个病灶混在一起,分不清哪个是新出现的 时间差分层直接定位新增区域

也就是说,三到四个百分点的平均差距,在「初诊即晚期」这个最常见的情形上会被放大。论文报告的 0.25 FP/scan 处 +8.6 个百分点是最能反映这个差别的数字——假阳性约束越紧,纵向与多模态的价值越大。放宽到 5 FP/scan 时两者可能接近,但那个工作点临床上没有意义。

这也解释了为什么论文没有把「换更强的骨干」作为主要贡献:在低假阳性区间,骨干的边际收益远小于信息源的边际收益。

5.6 一张图读懂增益来源

把四个训练策略按「加了什么」拆开:

策略 图像 时间 文本/表格 0.5 FP/scan 敏感度
纯影像 ✓ — — 54.7
纵向 ✓ ✓ — 63.6
多模态 ✓ — ✓ (论文未单列,Fig. 2 中低于纵向+多模态)
纵向+多模态 ✓ ✓ ✓ 63.7

纵向上加了 8.9 个百分点,再叠加多模态只多了 0.1 个百分点。这个「叠加收益很小」的结果值得注意:它说明在 0.5 FP/scan 这个工作点上,时间信息已经吃掉了大部分可得的增益,文本信息起到的是补足而非叠加的作用。换到更严的 0.25 FP/scan,多模态的作用会更明显(论文报告该点总增益 8.6 个百分点,其中纵向部分略低)。

实践含义:如果只能做一件事,先做纵向;如果纵向已经做了,再加多模态的边际收益取决于工作点,别默认它一定有用。

§6 AI 就绪指南

6.1 十分钟跑通:只下元数据,先看懂再动手

3 TB 不是随手能下的。第一步只取那个 23.4 MB 的 CSV:

#--只拿元数据,23 MB,几十秒
curl -L -o CancerVerse_dataset_metadata.csv \
  "https://huggingface.co/datasets/BodyMaps/CancerVerse/resolve/main/CancerVerse_dataset_metadata.csv"
import pandas as pd

df = pd.read_csv("CancerVerse_dataset_metadata.csv")
print(df.shape)                       # (24422, 13)
print(df["Patient ID"].nunique())     # 14599

#--每患者扫描数分布:先确认纵向密度
per = df.groupby("Patient ID").size()
print(per.describe())                 # median=1, max=31
print((per == 1).mean())              # 0.744 —— 四分之三只有一份

#--四模态同时可用的交集有多大
core = df[["sex", "age", "report", "icd10_code"]].notna().all(axis=1)
print("四列齐全:", core.sum(), core.mean())

#--按年看采集分布
df["year"] = pd.to_datetime(df["exam_date"], format="%m-%d-%Y", errors="coerce").dt.year
print(df["year"].value_counts().sort_index())

这段跑完,你对「纵向到底有多少」「多模态实际能留住多少样本」就有数了,再决定要不要下 3 TB。

6.2 完整下载与断点续传

python -m pip install -U "huggingface_hub[cli]"
hf auth login                      # 可选,登录后限速更宽松

mkdir CancerVerse && cd CancerVerse
hf download BodyMaps/CancerVerse \
  download_CancerVerse_data.sh download_CancerVerse_label.sh \
  --repo-type dataset --local-dir .

bash download_CancerVerse_data.sh   # 影像 + 元数据,约 3 TB
bash download_CancerVerse_label.sh  # 标注,约 40 GB

官方脚本内部是一个 until ... do ... sleep 1800 done 循环,下载中断会等 30 分钟重试,且 hf download 会跳过已有文件。实际使用中的经验:3 TB 在普通宽带上要跑数天,中途被限速是常态,不要用 Ctrl-C 打断后手动重跑,让脚本自己重试更省事。

国内网络可以用镜像前缀:

export HF_ENDPOINT=https://hf-mirror.com

6.3 读一份 CT 与它的掩膜

import nibabel as nib
import numpy as np

cid = "CV_00000001"
img = nib.load(f"CancerVerse/{cid}/ct.nii.gz")
print(img.shape, img.header.get_zooms())      # 体素尺寸,单位 mm

#--HU 已经在 [-1000, 1000] 截断过
vol = img.get_fdata()
print(vol.min(), vol.max())

#--掩膜按器官分文件;先看目录里有什么
import os
seg_dir = f"CancerVerse/{cid}/segmentations"
print(os.listdir(seg_dir))

#--只读某一个器官的掩膜
m = nib.load(f"{seg_dir}/liver_lesion.nii.gz").get_fdata()
print("标注体素数:", int((m > 0).sum()))

三个必须检查的点:

朝向。 NIfTI 的 affine 矩阵决定了 voxel 索引到世界坐标的映射。官方说「consistent orientation」,但读入后仍应打印 nib.aff2axcodes(img.affine) 确认是 RAS 还是 LPS。跨数据集拼训练时朝向不一致是最难查的 bug。

体素间距。 get_zooms() 给出 mm 单位的体素尺寸。这份数据保留了原始采集参数,所以不同扫描的层厚不一样(1 mm 到 5 mm 都可能有)。直接 resize 到统一尺寸会破坏各向异性,做重采样时要考虑。

空掩膜文件是否存在。 不是每份 CT 都有全部 13 个掩膜文件。缺失可能是「该器官无病灶」,也可能是「该器官未标注」。这两者语义完全不同,官方文档没有明确区分。稳妥做法是以「文件不存在 = 无标注」处理,并在论文里写明这个假设。

6.4 坑点 1:把「14.4 年随访」当成「人人都有长随访」

74.4% 的患者只有一份扫描。如果按患者抽样做纵向训练集,你会得到一份「大部分样本长度为 1」的数据,时间差分层几乎学不到东西。

per = df.groupby("Patient ID").size().rename("n_scan")
long_pat = per[per >= 3].index          # 只有 1,360 人左右
sub = df[df["Patient ID"].isin(long_pat)]

正确做法:纵向任务单独构造子集,横向任务用全量。不要指望一个 dataloader 同时服务两种任务。

6.5 坑点 2:按扫描切分导致时间泄漏

如果按 CancerVerse ID 随机切训练/测试,同一患者的相邻两次扫描会分到两边。模型只要学会「认人」就能在测试集上虚高——因为测试集里那张片子跟训练集里那张是同一个人的同一个肝。

官方已经按患者切分(训练 11,091 人 / 测试 2,772 人)。你要做的是不要在自己重划验证集时破坏这个约束:

#--正确:按患者划
from sklearn.model_selection import GroupKFold
gkf = GroupKFold(n_splits=5)
for tr, va in gkf.split(df, groups=df["Patient ID"]):
    ...

6.6 坑点 3:在「转诊人群」上算患病率

这份数据里 C79.5(骨转移)出现 2,004 次、C22.0(肝癌)1,522 次。这不是人群患病率,是转诊中心的病例构成。如果拿它算「某癌的阳性率」,得到的数会比真实筛查人群高一个数量级。

#--不要这样算「患病率」
#-- prev = (df["icd10_code"] == "C22.0").mean()

#--要这样用:只作为病例来源,不作为患病率估计
hcc = df[df["icd10_code"] == "C22.0"]

论文用「lead time」这个维度处理了这个问题——它不假装自己是筛查人群,而是问「在确诊前 N 个月,模型能不能看出来」。研究设计上这是正确的处理,但作为使用者要清楚边界在哪。

6.7 坑点 4:拿宏平均掩盖单类崩塌

13 类的平均敏感度 76.0% 里,脾 84.6%、十二指肠 66.7%。如果只看平均值,会以为「13 类都还行」。实际做临床落地时,一个 66.7% 敏感度的器官意味着每三个癌症漏一个。

正确做法是分类报告 + 明确最低可接受线:

报告层级 建议写法
总体 13 类宏平均 76.0%(95% CI …)
分组 有公开掩膜的 4 类 76.1%,其余 9 类 75.9%
单类 逐类列出,标出低于 70% 的类别
最低类 十二指肠 66.7%,说明原因(解剖小、边界不清、样本 172)

6.8 坑点 5:忽略 exam_date 的 17% 缺失

4,153 份 CT 没有日期。纵向分析里这些样本必须剔除,但剔除之后剩下的样本在时间分布上是否还有代表性,需要单独检查。

df["year"] = pd.to_datetime(df["exam_date"], format="%m-%d-%Y", errors="coerce").dt.year
print("无日期:", df["year"].isna().sum())          # 4153
#--剔除后看年份分布是否变形
print(df.dropna(subset=["year"])["year"].value_counts().sort_index())

6.9 坑点 6:把 Dice 与敏感度混在一个结论里

敏感度 76.0% 与 Dice 51.1% 是两件事:

  • 敏感度回答「有多少癌症被发现了」,按病灶计,只要检出就算命中,不看边界画得准不准。
  • Dice 回答「画出来的边界与专家画的有多重合」,按体素计,边界偏一点分数就掉。

一个模型可以敏感度 90%、Dice 30%——它找到了所有病灶但边界糊成一片。筛查场景下敏感度更重要,手术规划场景下 Dice 更重要。写结论时把两者分开陈述,不要合成一个「综合性能」。

6.10 坑点 7:忽略掩膜的类别不平衡

肝 6,540 份 vs 胆囊 92 份,比例 71:1。直接混合训练时,胆囊的梯度会被肝淹没。

三种处理方式,各有代价:

做法 效果 代价
按类重采样 每类均衡 肝的样本大量浪费
损失加权(逆频率) 保留全部样本 权重需要调,容易过冲
分器官训练 每类独立最优 13 个模型,部署成本高

论文用的是统一模型 + 多类输出,报告时分类报。如果你的目标是某一个器官的落地,分器官训练通常更实际。

6.11 坑点 8:误读 CC BY-NC-ND 的「ND」

ND 是 NoDerivatives。常见的误解是「只要不卖就行」。实际上 ND 这一条管的是「改不改」而不是「卖不卖」:

行为 NC 管不管 ND 管不管
学术论文里用它训练模型 不违反 有争议
把影像重采样后重新分发 不违反 违反
把标注合并成自己的新标注集发布 不违反 违反
在公司内部做产品预研 违反 不违反

「用数据集训练模型」是否构成演绎,各国判例不同。保守做法:学术用途按原样使用,分发时只分发代码与权重、不分发数据;商业用途一律走授权。

§7 质量评估:DAIMS 框架

读这节之前先建立正确预期:CancerVerse 的质量问题不在「标注准不准」——那是 28 位专家 13 个月手工做的,可信度是它最强的一环。问题在元数据的完整度与人群的代表性:临床变量缺失三成,扫描仪信息缺失近九成,来源只有两个国家。

7.1 五维评分

维度 评分 依据
Data Collection(采集) ★★★★☆ 多机构、16 年跨度、四期对比、保留原始采集参数;扣分项:仅两国、转诊人群为主、87% 缺扫描仪信息
Annotation(标注) ★★★★★ 28 位专家 13 个月全手工、八位执业医师独立复核、裁决机制、报告专家间一致性 62.2%;无 AI 预标注
Intrinsic Quality(内在质量) ★★★★☆ 统一容积格式、HU 截断、患者级切分、3.5.1 修正了时间偏移;扣分项:类别极度不均衡、掩膜缺失语义未明
Metadata(元数据) ★★★☆☆ 13 列元数据 + 报告全文;扣分项:scanner/protocol 缺 87%–95%,icd10_code 缺 60.6%,掩膜文件缺省的语义未文档化
Standardization(标准化) ★★★★☆ NIfTI 标准格式、ICD-10 编码、RECIST/LI-RADS 出现在报告里;扣分项:无统一的病灶级结构化标签表

7.2 为什么 Annotation 给满分而 Metadata 只给三星

这个反差是这份数据最值得说的一点。

标注端做到了行业上限。 全手工、无 AI、双轮复核、有裁决、有专家间一致性数字。对比很多数据集「用模型预标注再人工修」的做法,这份的标注纯度确实高。62.2% 的专家间 Dice 也老老实实报了——很多数据集不会报这个数,因为报了显得低。

元数据端则明显是「够用就好」。 13 列里,scanner、study_description、series_description、protocol_name 四列的缺失率在 87% 到 95% 之间。这意味着你无法做「不同扫描仪之间的差异」这类研究。icd10_code 缺 60.6%,且是检查级编码。掩膜文件不存在的语义(「没病灶」还是「没标」)没有文档化。

这个组合的后果是:你能很好地训练分割模型,但很难做深入的亚组分析。想做「按厂商分层看性能」,做不了;想做「按病理类型分层」,只能靠 44.8% 那部分有病理的人。

7.3 已知的、可枚举的偏差

偏差 来源 方向
转诊偏倚 数据来自肝胆胰肿瘤转诊中心 患病率远高于筛查人群
晚期偏倚 转移灶(C78/C79)多于原发灶 早期病灶占比被低估
纵向稀疏 74.4% 只有一份扫描 纵向信号主要来自少数长序列患者
地理偏倚 仅瑞士、土耳其 种族、体型、扫描协议覆盖有限
语言偏倚 报告为英文(部分为英译) 非英语场景需另做适配
缺失偏倚 有病理的 44.8% 未必随机 缺病理的多为影像可诊断者
掩膜缺失语义不明 文件不存在 ≠ 无病灶 可能引入假阴性
单类主导 肝占 52.2% 宏平均被少数类主导

7.4 它为何存在,以及靠什么持续

一份近 3 TB 的医学影像数据集,从伦理审批、回顾性采集、去标识化、到 28 位专家 13 个月的手工标注,成本以百万美元计。它为什么会被做出来,又凭什么能持续更新?

需求侧的空洞是真实的。 癌症筛查的 AI 研究长期卡在一个循环里:要证明「早筛有效」,需要「确诊前有多次扫描」的数据;而这种数据只有长期随访的医院才有;医院有数据但不愿意开放,因为去标识化成本高、法律风险大。结果是所有人都挤在 LiTS、KiTS 这类单时点数据集上刷指标,刷出来的模型在真实筛查场景里没有意义。CancerVerse 直接打破了这个循环——它把「有随访的医院」和「愿意开放的团队」凑到了一起。

供给侧的前提是三个条件同时成立。 一是有一个愿意承担伦理与法务成本的机构联盟(巴塞尔大学医院、苏黎世大学、伊斯坦布尔 Medipol 大学等,伦理批号 Req-2025-00557);二是有约翰霍普金斯这样的团队愿意出人力组织标注;三是有基金支持(Lustgarten 胰腺癌研究基金会、NIH R01EB037669、波兰国家科学中心)。三者缺一,这件事做不成。

维持它被持续使用的是「基准」这个身份。 一个数据集的生命力不在于它多大,而在于有多少人拿它当评测标准。CancerVerse 的策略很明确:不只发数据,还发基准(13 类的敏感度/特异度/Dice)、发模型权重(论文称「released all trained segmentation backbones」)、发标准化的 FROC 评测协议。当别人要证明「我的筛查模型更好」时必须用它,它就活了。

它不可替代的部分。 目前没有第二个公开数据集同时满足:3D CT + 纵向 + 13 类体素标注 + 配对报告 + 验证健康队列。缺任何一项,都可以找到替代品;五项齐全,只有它一个。论文自己也承认,在「首次公开超过 20,000 份扫描」这个门槛上,只有它与 Stanford Merlin 两家。

四种失效情形。 一是若后续出现更大规模、覆盖中国与南亚人群的同类数据集,它的地理代表性优势会被稀释。二是若 CC BY-NC-ND 的授权在执行层面收紧(比如要求模型权重也受同等约束),工业界使用会大幅减少,基准地位随之下降。三是若「13 类」不再被认为是「多癌种」的合理代表(比如业内转向 30 类以上),它的覆盖会被视为不足。四是若无人维护(3.5.1 之后停止更新),元数据里的已知缺陷(掩膜缺失语义、ICD 检查级编码)会长期固化。

§8 基准与生态

8.1 论文的核心结果一览

指标 数值 出处
13 类平均敏感度 76.0% Table 1 / 正文
13 类平均特异度 86.2% 同上
平均 Dice 51.1% Fig. 3a
有公开掩膜 4 类平均敏感度 76.1% Table 1
无公开掩膜 9 类平均敏感度 75.9% Table 1
0.25 FP/scan 敏感度增益 +8.6 个百分点 Fig. 2
0.5 FP/scan 敏感度增益 +9.0 个百分点 Fig. 2
专家间 Dice(三人) 62.2% Fig. 3a
模型在同子集 Dice 50.8% Fig. 3a
外部敏感度增益 +2.6% Fig. 4
外部特异度增益 +1.4% Fig. 4

8.2 三处容易被误读的数字

第一,「9% 提升」是绝对百分点还是相对比例。 论文写的是「9% absolute sensitivity gain at 0.5 FP/scan」,明确是绝对百分点(54.7 → 63.7)。引用时不要写成「提升 9%」,那会被读成相对提升(54.7 × 1.09 ≈ 59.6)。

第二,Dice 51.1% 与专家 62.2% 不同分母。 62.2% 是三位专家在一个较小的子集上互相标注得到的;51.1% 是模型在全测试集上的平均。要公平比较,必须看「同一子集上模型 50.8% vs 专家 62.2%」这一对。混用会得出「模型只有专家 82%」的错误结论(全测试集比小样本专家子集,不可比)。

第三,外部验证的提升小得多不是失败。 内部 +9.0,外部 +2.6,看起来缩水七成。但这是跨机构、跨国家、跨协议的泛化,方向没有反转就是成功。把 +2.6 写成「效果不明显」是误读,把它写成「与内部一致」也是误读。

8.3 生态位

数据集 模态 纵向 体素标注 癌种数 报告 健康队列
CancerVerse 3D CT 有 13 类 13 有 有(8,799)
LiTS 3D CT 无 肝 1 无 无
KiTS 3D CT 无 肾 1 无 无
PanTS 3D CT 无 胰 1 无 无
AbdomenAtlas 3D CT 无 多器官(非肿瘤) — 部分 无
Stanford Merlin 3D CT 无 无 — 有 无
MIMIC-CXR 2D 胸片 有 无 — 有 无
RadGPT 3D CT 无 有 多 有 无

从这张表能看出 CancerVerse 的位置:它不是「更大的 LiTS」,而是把五列都打上勾的唯一一行。这也解释了为什么它的标注量(12,529)不如 AbdomenAtlas 的器官分割量大——它做的不是「把每个器官都标出来」,而是「把每处癌都标出来」。

§9 使用指引

9.1 四类用户的路径

做分割算法的: 先用元数据筛出「有掩膜且 exam_date 有值」的子集,按患者做 5 折,从肝(6,540 份,最容易)开始跑通,再迁到胆囊(92 份,最难)。不要一上来就 13 类联合训练。

做筛查/检测的: 必须用验证健康队列当阴性来源。如果只用「其他癌种患者」当阴性,得到的特异度会虚高,因为这些片子上有大量良性发现与治疗改变,正是临床假阳性的主要来源。

做影像-语言模型的: 报告覆盖 99.8%,是最完整的模态。可以从报告抽「位置 + 尺寸 + 病灶数」当弱监督标签,论文的多模态分支就是这个思路(Llama-3-70B 抽属性 + 交叉注意力融合)。

做纵向建模的: 只有 25.6% 的患者可用。先锁定 ≥3 次扫描的 1,360 人左右,做时间差分层的实验。这个子集不大,适合做方法验证而不适合做大规模预训练。

9.2 引用要求

数据集与论文要分别引:

@InProceedings{LiWen_CancerVerse_MICCAI2026,
  author = {Li, Wenxuan AND Bassi, Pedro R. A. S. AND Zhou, Xinze AND ...},
  title  = {{CancerVerse: A Fully Open Longitudinal and Multimodal Dataset for Multicancer Screening}},
  booktitle = {Medical Image Computing and Computer Assisted Intervention -- MICCAI 2026},
  year   = {2026},
  volume = {LNCS 16895},
  publisher = {Springer Nature Switzerland}
}

同时要在正文里写明版本号(如 CancerVerse 3.5.1)与下载日期。这份数据在 2026 年内更新了四次(3.0 七月、3.5 九月、3.5.1 十月),不写版本号的结果无法复现。

9.3 版本与文件锁定

必须记录 原因
版本号(3.0 / 3.5 / 3.5.1) 每次更新都改了样本量与时间偏移
元数据 CSV 行数 24,422 是 3.5.1 的值;旧版是 24,168
下载日期 Hugging Face 仓库会原地更新
掩膜文件清单 哪些 *_lesion.nii.gz 存在,关系到有无标注
训练/测试划分文件 若官方提供划分清单,必须固定使用

§10 AI 使用声明

本篇的所有数字来自三处:Hugging Face 数据卡(3.5.1 版 README)、MICCAI 2026 论文 PDF(0562 号)、以及元数据 CSV 的逐行统计。凡属逐行统计得出的(如每患者扫描数分布、各列缺失率、年份分布、ICD 前 20 位),文中已注明是「逐行统计」;凡属官方声明值(如专家间 Dice 62.2%、各癌种敏感度特异度),文中注明出处为论文表格或图。

本篇未下载 3 TB 影像本体,因此所有影像层面的描述(NIfTI 格式、HU 截断、朝向一致性)来自官方文档,未做实际读取验证。掩膜文件的实际命名与目录结构也是依据 README 的目录树,未逐一核对 24,422 个目录。

论文正文与 README 在样本量上不一致(24,168/13,863 对 24,422/14,599),已在 §2.2 单列一节说明,未做取舍性判断——两个都是真实存在过的版本快照。

摘要中的「9% absolute sensitivity gain」是绝对百分点,非相对提升,已在 §8.2 标注。

常见误读(避坑清单)

误读 实际 依据
「14.4 万人」 14,599 人是 1.46 万,不是 14 万 README
「24,422 名患者」 24,422 是 CT 份数,患者是 14,599 元数据 CSV
「每人都有 14 年随访」 74.4% 只有一份扫描,中位随访 299 天 CSV 聚合
「13 类样本量均衡」 肝 6,540 vs 胆囊 92,差 71 倍 README 表
「Dice 51% 说明模型很差」 专家间 Dice 只有 62.2%,模型在同子集 50.8% 论文 Fig. 3
「9% 是相对提升」 是绝对百分点(54.7 → 63.7) 论文 Fig. 2
「可以直接算患病率」 转诊人群,C79.5 骨转移占第一 论文 + CSV
「CC BY-NC-ND 只是不能商用」 ND 还禁止演绎,重新分发重采样影像即违反 许可原文
「有多癌种就能查 30 类癌」 只有 13 类,且七类此前无公开标注 论文
「报告是中文的」 英文(部分英译),欧洲书写习惯 CSV 抽查
「掩膜文件不存在 = 无病灶」 也可能是「未标注」,官方未文档化 推断,需谨慎
「可以直接拿 ICD 当患者标签」 缺失 60.6%,且是检查级编码 CSV 统计

FAQ

问:CancerVerse 到底有多少份 CT、多少名患者?
答:当前 README 与 3.5.1 版标称 24,422 份 CT、14,599 名患者、22,344 次检查。MICCAI 2026 论文正文写的是 24,168 份、13,863 名患者,那是论文写作时的快照。两个数都对,差的是版本。元数据 CSV 逐行统计为 24,422 行、14,599 个唯一 Patient ID,与 README 一致。

问:13 类肿瘤是哪 13 类?
答:肝、胰、肾、胃、肾上腺、结肠、膀胱、前列腺、食管、脾、子宫、十二指肠、胆囊。掩膜变量名分别为 liver_lesion、pancreatic_lesion、kidney_lesion、stomach_lesion、adrenal_gland_lesion、colon_lesion、bladder_lesion、prostate_lesion、esophagus_lesion、spleen_lesion、uterus_lesion、duodenum_lesion、gallbladder_lesion。

问:为什么肝脏标注数量远多于其他器官?
答:6,540 份 CT 带 liver_lesion,占总标注量 12,529 的一半以上。原因是采集这批数据的医院以肝胆肿瘤诊疗为主,肝转移与原发性肝癌病例最集中。这也意味着按癌种平均性能时,肝的权重远超其他 12 类。

问:「验证健康队列」是什么意思?
答:8,799 名患者(63.5%)在最后一次纳入的 CT 之后至少随访一年,且这一年里没有被诊断出这 13 类癌症中的任何一类。这样才算「验证过」的健康,而不是「这一次扫描没看到病灶」。队列里 47.6% 仅有良性病变、32% 患这 13 类之外的恶性肿瘤、20.4% 完全无癌。

问:能用来做商用的模型吗?
答:数据本身是 CC BY-NC-ND 4.0,明确禁止商业使用与演绎。用这份数据训练出来的模型能否商用,许可没有直接回答,属于灰色地带。需要商用授权走 thebodymaps.com 的联系渠道。

问:下载要多大空间?
答:CT 体积约 3 TB,肿瘤标注约 40 GB,元数据 CSV 约 23.4 MB。下载脚本会跳过已存在文件、中断后等 30 分钟自动重试,但 3 TB 意味着普通工作站至少要一块 4 TB 的盘。

问:官方训练集和测试集怎么分的?
答:按患者切分。训练集 11,091 人,测试集 2,772 人,两者人口学分布做了平衡。患者级切分是纵向数据集的底线,按扫描切会让同一患者的相邻时间点同时出现在训练和测试里。

问:为什么用 FROC 而不是 ROC?
答:筛查场景下不能只挑一个阈值看。实际做法是固定每份扫描允许的假阳性数(0.25 或 0.5 个),再看能查出多少癌症。ROC 的 AUC 会掩盖低假阳性区间的差异,而那个区间才是筛查真正工作的区间。

问:模型性能到什么水平?
答:纵向+多模态模型在 13 类上平均敏感度 76.0%、特异度 86.2%、Dice 51.1%;相比纯影像单时点基线,在 0.25 与 0.5 FP/scan 处分别提升 8.6 与 9.0 个绝对百分点。外部三个区域数据集(3,035 份 CT)上敏感度提升 2.6%、特异度 1.4%。

问:Dice 只有 51% 是不是很差?
答:不能这么看。三位执业放射科医师之间互相的 Dice 只有 62.2%,模型在同一子集上达到 50.8%。肿瘤边界在 CT 上本来就模糊,多灶病变、治疗后改变都会让边界不可判定。

问:有没有中文或中国数据?
答:没有。原始数据来自瑞士与土耳其。外部验证集里的「E. Asia」是区域队列(612 人、894 份 CT),未标明具体国家。报告语言为英文。

问:和 MIMIC-CXR 有什么不同?
答:MIMIC-CXR 是 2D 胸片 + 报告,没有 3D CT、没有体素级肿瘤标注、不覆盖多癌种。CancerVerse 是 3D CT + 体素标注 + 纵向序列。两者不是替代关系。

问:标注是全人工的吗?
答:是。论文明确写「No AI was used in the annotation pipeline, and no pseudo-labels were used」。MONAI Label 只作为勾画界面,不提供 AI 预掩膜。28 位专家历时 13 个月完成。

术语表

术语 含义
体素级标注(voxel-wise) 逐三维像素勾画病灶范围,不只是画框
FROC Free-Response ROC,敏感度按病灶计、假阳性按扫描计的评测曲线
FP/scan 每份扫描的平均假阳性个数,筛查场景的核心约束
lead time 确诊之前的提前量,用于衡量「能不能更早发现」
index date 索引日期;本数据定义为病理确认日,无病理时为首次确诊影像日
DSC / Dice Dice 相似系数,分割重合度,0–1
HU Hounsfield Unit,CT 密度单位;本数据截断在 [-1000, 1000]
验证健康队列 末次影像后随访逾一年且未诊断目标癌种的对照人群
RECIST 实体瘤疗效评价标准,报告里常见「stable disease」等表述
LI-RADS 肝脏影像报告与数据系统,用于 HCC 风险分级
portal_venous / arterial_late / arterial_early / non-contrast 四种 CT 对比期
MONAI Label 开源 3D 医学影像标注工具,本项目仅用作勾画界面

附录 G:把它接进自家管线时的五个工程决策

数据下下来之后,真正的成本在工程侧。这五个决策点每个都会影响后续几个月的工作量,值得先想清楚再动手。

G.1 全量落地还是按需拉取

方案 存储 首次可用时间 适合场景
全量下载 3 TB+ 数天 反复训练、需要全库统计
按需(单文件 HTTP Range) 数百 GB 分钟级 只做特定癌种、做探索
只下元数据 + 标注 40 GB 小时级 方法验证、标注质量研究

Hugging Face 的仓库结构是 CancerVerse/CV_xxxxxxxx/ct.nii.gz 一目录一文件,可以按前缀单独拉取。如果只做肝癌,先从上表筛出带 liver_lesion 的 6,540 个 ID,再逐个下载,体量能压到七分之一左右。

G.2 存储格式要不要转

原始是 ct.nii.gz,压缩率不错但随机读取慢。三种选择:

格式 读取速度 体积 代价
保持 .nii.gz 慢(需解压整卷) 最小 训练时 IO 成瓶颈
转 .npy / .npz 快 中等 丢失 affine,需另存元信息
转 LMDB / WebDataset 分片 最快 较大 工程量大,但分布式训练必需

做小规模实验用第一种即可;要上多卡训练,第二种是性价比最高的折中——把 affine 与 spacing 单独存一份 JSON,数据本体存 int16 的 npy,比 float32 省一半空间且无损(HU 是整数)。

G.3 重采样到统一间距

原始层厚不一致(1 mm 到 5 mm 都有)。三种做法:

做法 优点 缺点
全部重采样到 1×1×1 mm 一致、便于 3D 卷积 层厚 5 mm 的卷会被插值放大 5 倍,体积暴涨
保持原始间距,按 patch 训练 不失真 不同样本的 patch 物理尺寸不同
重采样到 1.5×1.5×1.5 mm 折中,体积可控 仍有插值误差

论文没有写明它用的是哪一种。复现时这是一个必须自己决定的点,也是结果对不上的常见原因之一。

G.4 类别不平衡的处理顺序

13 类标注从 92 到 6,540,差 71 倍。处理顺序建议:

  1. 先确认评估口径(宏平均还是微平均),这决定你要不要平衡。
  2. 宏平均 → 必须平衡,否则少数类的梯度被淹没。
  3. 微平均 → 不必强制平衡,但要分类报告。
  4. 无论哪种,都要单独报最少的三类(胆囊 92、十二指肠 172、子宫 177)。

G.5 阴性样本怎么取

这是最容易被忽略、又最影响结论的一步。三种取法给出三种特异度:

阴性来源 特异度的含义 数值倾向
只取「完全无异常」的扫描 「干净片子」上的特异度 最高,虚高
取验证健康队列全部 真实筛查场景的特异度 中,最可信
取「其他癌种患者」 有病变背景下的特异度 最低,最严

论文的做法是混合:阴性同时来自验证健康队列与「患其他癌种的患者」,理由是「真实筛查中,评估某一癌种时遇到的是健康人加其他病人」。这个理由成立,但如果你的应用场景是「无症状人群普筛」,第二种取法才对应你的场景。

这个选择必须在论文里写明。只写「特异度 86.2%」而不写阴性来源,这个数在什么条件下成立就无从判断。

附录 A:核心数字核对表

数字 值 来源 可否复算
CT 份数 24,422 README 3.5.1 可,CSV 行数
患者数 14,599 README 3.5.1 可,Patient ID 去重
检查次数 22,344 README 3.5.1 需按检查日聚合
肿瘤标注数 12,529 README 表合计 可,逐类相加
癌种数 13 README + 论文 可,掩膜文件类型
验证健康队列 8,799 论文 §2 不可,需诊断信息
随访上限 14.4 年 README + 论文 部分可,按患者日期跨度
单患者最多扫描 26(README)/ 31(CSV) 两处口径不同 可,CSV 聚合
中位随访 299 天 论文 §2 可,按患者日期跨度
采集年份 2010–2025 README 可,exam_date 年份
报告覆盖率 99.8% 论文 §2 可,report 非空率
病理覆盖率 44.8% 论文 §2 不可,CSV 无病理列
人口学覆盖率 80.4% 论文 §2 近似可,sex/age 非空率
临床变量覆盖率 74.7% 论文 §2 部分可
训练/测试患者数 11,091 / 2,772 论文 §2 需官方划分清单
平均敏感度 76.0% 论文 Table 1 不可,需模型
平均特异度 86.2% 论文 Table 1 不可
平均 Dice 51.1% 论文 Fig. 3a 不可
专家间 Dice 62.2% 论文 Fig. 3a 不可
0.5 FP/scan 增益 +9.0 pp 论文 Fig. 2 不可
外部敏感度增益 +2.6% 论文 Fig. 4 不可
外部验证 CT 数 3,035 论文 §3 不可,未公开

附录 B:数字的来源分层

层级 覆盖的数字 可信度 处理方式
官方数据卡 24,422 / 14,599 / 22,344 / 12,529 / 13 / 14.4 年 / 26 时间点 / 2010–2025 高 直引,注明版本 3.5.1
论文正文与图表 8,799 / 299 天 / 99.8% / 44.8% / 80.4% / 74.7% / 11,091 / 2,772 / 76.0% / 86.2% / 51.1% / 62.2% / 50.8% / +8.6 / +9.0 / +2.6 / +1.4 高 直引,注明表格编号
本文逐行统计 每患者扫描数分布 / 各列缺失率 / 年份分布 / ICD-10 前 20 位 / 报告长度统计 中(依赖下载到的 CSV 版本) 注明「逐行统计」,附聚合方式
推断 掩膜文件缺失语义 / 加密标识的归并方式 / 外部「E. Asia」的具体国别 低 正文中明确写为推断

附录 C:完整参考文献

  1. Li W, Bassi PRAS, Zhou X, Wasserthal J, Hamamci IE, Er S, Menze B, Akan GE, Płotka S, Prządo J, Chen Q, Tang Y, Xu D, Sitek A, Wang K, Yang Y, Yuille AL, Zhou Z. CancerVerse: A Fully Open Longitudinal and Multimodal Dataset for Multicancer Screening. MICCAI 2026, LNCS 16895. PDF
  2. BodyMaps. CancerVerse 数据卡(3.5.1). Hugging Face. https://huggingface.co/datasets/BodyMaps/CancerVerse
  3. Bilic P, Christ PF, Vorontsov E, et al. The Liver Tumor Segmentation Benchmark (LiTS). arXiv:1901.04056, 2019.
  4. Heller N, Sathianathen N, Kalapara A, et al. The KiTS19 Challenge Data: 300 Kidney Tumor Cases. arXiv:1904.00445, 2019.
  5. Li W, Zhou X, Chen Q, et al. PanTS: The Pancreatic Tumor Segmentation Dataset. NeurIPS 2025.
  6. Li W, Qu C, Chen X, Bassi PR, et al. AbdomenAtlas: A Large-Scale, Detailed-Annotated, & Multi-Center Dataset. Medical Image Analysis, 2024:103285.
  7. Blankemeier L, Kumar A, Cohen JP, et al. Merlin: A Computed Tomography Vision–Language Foundation Model and Dataset. Nature, 2026.
  8. Johnson AE, Pollard TJ, Greenbaum NR, et al. MIMIC-CXR-JPG: A Large Publicly Available Database of Labeled Chest Radiographs. arXiv:1901.07042, 2019.
  9. Bassi PR, Li W, Chen J, et al. Learning Segmentation from Radiology Reports. MICCAI 2025:305–315.
  10. Li W, Bassi PR, Lin T, et al. ScaleMAI: Accelerating the Development of Trusted Datasets and AI Models. arXiv:2501.03410, 2025.
  11. Isensee F, Wald T, Ulrich C, et al. nnU-Net Revisited: A Call for Rigorous Validation in 3D Medical Image Segmentation. arXiv:2404.09556, 2024.
  12. Rokuss MR, Kirchhoff Y, Roy S, et al. Longitudinal Segmentation of MS Lesions via Temporal Difference Weighting. MICCAI 2024:64–74.
  13. Diaz-Pinto A, Alle S, Nath V, et al. MONAI Label: A Framework for AI-Assisted Interactive Labeling of 3D Medical Images. Medical Image Analysis, 2024;95:103207.
  14. de Grauw M, Scholten ET, Smit EJ, et al. The ULS23 Challenge: A Baseline Model and Benchmark Dataset for 3D Universal Lesion Segmentation in CT. Medical Image Analysis, 2025;102:103525.
  15. Bassi PR, Wu Q, Li W, et al. Label Critic: Design Data Before Models. ISBI 2025:1–5.

附录 D:它为何存在,以及靠什么持续

D.1 需求端:早筛研究长期缺一样东西

癌症早筛的 AI 研究有一个结构性难题:要证明「早筛有效」,必须证明模型能在确诊之前发现病灶。这要求数据里有「同一患者在确诊前若干次的扫描」。这种数据只有长期随访的医院才有,而这类医院通常不开放数据——去标识化成本高、法律风险大、且这些影像本身是核心资产。

结果是研究界长期在单时点数据集上刷指标:LiTS 上 Dice 刷到 90%,KiTS 上刷到 95%,然后宣称「可用于早筛」。但这些指标回答的是「给一张已经有明显肿瘤的 CT,能不能画准」,而不是「给一张还没有明显肿瘤的 CT,能不能发现」。两者不是一回事。

D.2 供给侧:四个条件必须同时成立

伦理与法务。 跨机构回顾性采集需要统一的伦理框架。论文给的批号是 Req-2025-00557,覆盖瑞士与土耳其的参与机构。

去标识化。 三级加密标识(检查号、流水号、患者号)的设计是为了在保留可追溯性的同时切断身份。这需要工程投入。

标注人力。 28 位专家、13 个月、12,529 处体素勾画。这是一个组织问题,不是技术问题——你得找到八位执业放射科医师愿意做独立复核与裁决。

资金。 Lustgarten 胰腺癌研究基金会、NIH R01EB037669、波兰国家科学中心 2025/57/B/ST6/03100。三项资助对应的是「标注」「基础设施」「欧洲侧协调」三块成本。

D.3 让它持续被使用的三个特征

它定义了评测协议。 FROC 在固定 FP/scan 下测敏感度,这个协议一旦成为共识,后来者必须用它报结果。

它给了天花板参照。 专家间 Dice 62.2% 这个数,让所有报 Dice 的论文都必须面对「人类也只有 62%」这个事实。这是一个罕见的、对领域有纠偏作用的贡献。

它开放了权重。 论文称「released all trained segmentation backbones」。数据 + 基线权重一起放,降低了复现门槛,也提高了被引概率。

D.4 它的脆弱点

授权与工业界的张力。 CC BY-NC-ND 让工业界无法直接使用。而推动领域进步的往往是工业界的大规模实验。这个张力如果长期存在,可能出现「学术界用它发论文、工业界另建私有数据」的分裂。

地理覆盖的单薄。 瑞士 + 土耳其两国,加上一个未标明国别的东亚外部队列。对全球人群的代表性有限,尤其缺南亚、非洲、拉美。

元数据的欠账。 扫描仪信息缺 87%–95%,这意味着很多亚组分析做不了。这是低成本可补的(DICOM 头里就有),但需要一次重发布。

D.5 什么情况下它会失效

情形 后果
出现覆盖中印的同类更大数据集 地理代表性优势被稀释,退为「欧洲基准」
授权执行层面收紧到模型权重 工业界退出,引用量下滑
「多癌种」门槛被推到 30 类 13 类被视为不足
停止维护 元数据缺陷固化,掩膜语义问题长期无解
出现 2D/低剂量筛查数据集成为主流 3D 高剂量 CT 的临床相关性下降

附录 E:与三条替代路线的对照

E.1 路线一:单器官专项数据集(LiTS / KiTS / PanTS)

深度最好,但只有一类癌、单时点、无报告。适合做分割算法本身的方法学研究,不适合筛查。

方案 癌种 纵向 报告 规模
CancerVerse 13 有 有 24,422
LiTS 1 无 无 131 训练 + 70 测试
KiTS 1 无 无 300(KiTS19)
PanTS 1 无 无 数千

E.2 路线二:多器官分割数据集(AbdomenAtlas)

器官覆盖广、标注量大,但标的是「器官」不是「癌」。适合做解剖先验、器官定位,不适合直接做肿瘤筛查。

E.3 路线三:2D 影像-报告数据集(MIMIC-CXR)

报告质量高、纵向结构好、样本量大,但是 2D 胸片、无体素标注。适合报告生成与视觉-语言预训练,不适合 3D 肿瘤分割。

E.4 怎么选

你的问题 推荐
3D CT 多癌种检测/分割 CancerVerse
单器官精细分割的 SOTA 对应专项集(LiTS/KiTS/PanTS)
解剖结构分割、器官先验 AbdomenAtlas
2D 报告生成、视觉-语言预训练 MIMIC-CXR
低假阳性率的临床评估 CancerVerse(唯一带验证健康队列)
中国人群、中文报告 都不合适,需另找

实际的做法往往是组合:用 AbdomenAtlas 预训练器官分割,用 CancerVerse 微调肿瘤检测,用 MIMIC-CXR 做报告的预训练。三者的数据格式不同,但都是 NIfTI 或 DICOM 起点,工程上可以打通。

附录 F:从报告文本抽结构化标签的可行路径

这份数据最容易被低估的部分是报告——99.8% 覆盖,中位 540 字符,含尺寸、位置、病灶数、对比期、以及 RECIST/LI-RADS 这类半结构化评分。如果能稳定抽取,等于免费得到一份病灶级的弱标签。

F.1 值得抽的六类信息

信息 报告里的典型表述 用途
病灶位置 “at the gastric cardia”、“liver segment II” 弱监督分割的空间先验
病灶尺寸 “measures 16 mm”、“33x18 mm” 回归目标、体积估计
病灶数量 “5 stationary liver hemangiomas” 多灶识别、FROC 的病灶级真值
对比期 “following oral and intravenous contrast” 与 phase 列交叉校验
比较对象 “compared with the previous CT performed on 19/03/2021” 时间对齐、纵向配对
疗效评分 “RECIST … stable disease”、“LI-RADS 5” 治疗反应标签

F.2 一个最小可用的抽取脚本

import re

SIZE = re.compile(r'(\d+(?:\.\d+)?)\s*(?:x\s*(\d+(?:\.\d+)?))?\s*(mm|cm)')
SEG  = re.compile(r'segment\s+([IVX]+|\d+)', re.I)
DATE = re.compile(r'(\d{2})/(\d{2})/(\d{4})')

def parse(report: str) -> dict:
    out = {"sizes_mm": [], "segments": [], "ref_dates": []}
    for a, b, u in SIZE.findall(report):
        k = 10 if u.lower() == "cm" else 1
        out["sizes_mm"].append(round(float(a) * k, 1))
        if b:
            out["sizes_mm"].append(round(float(b) * k, 1))
    out["segments"] = sorted(set(SEG.findall(report)))
    out["ref_dates"] = ["-".join(d) for d in DATE.findall(report)]
    return out

这段只能抽「显式写出」的信息,抽不到「暗示」的信息。实际使用前必须人工标注 100–200 条做校验,算准召。报告里的数字有歧义:33x18 mm 是两个维度、0.7 cm 是单个、1.5 mm slice thickness 是层厚不是病灶——正则很难区分,必须靠上下文规则或小模型。

F.3 为什么值得做

论文的多模态分支正是用这条路:Llama-3-70B 从报告抽肿瘤属性(位置、大小)当辅助标签,再与影像特征交叉注意力融合。结果显示多模态分支单独用就优于纯影像。也就是说,报告里的信息本身就带独立价值,不是影像的附庸。

F.4 三个已知陷阱

单位混用。 mm 与 cm 在同一份报告里同时出现很常见,上面脚本已处理,但 1.5 mm slice thickness 这类会污染尺寸列表,需要在抽取前先剔除含 slice、thickness、pitch 的句子。

尺寸指代不明。 “The largest of these measures 33x18 mm” 里的「these」指上一句的淋巴结,不是肿瘤。要正确归属,需要句法分析或按句窗口维护指代栈。

否定表述。 “No mass-like lesion is identified” 里也有 lesion,但语义相反。任何按关键词匹配的做法都必须先过一遍否定检测。

编辑说明

本篇的数字来源分三层,已在附录 B 列明:官方数据卡(24,422 / 14,599 / 22,344 / 12,529 / 13 / 14.4 年等)、MICCAI 2026 论文正文与图表(8,799 / 299 天 / 各式覆盖率 / 基准指标)、以及本文对 24,422 行元数据 CSV 的逐行统计(每患者扫描数分布、各列缺失率、年份分布、ICD-10 前 20 位、报告长度)。核验时间 2026-10-26。

未做的核验:3 TB 影像本体未下载,因此 NIfTI 格式、HU 截断范围、朝向一致性、掩膜文件命名均依据官方文档描述,未做实际读取验证;24,422 个目录未逐一清点;8,799 人健康队列的构造无法从公开元数据复算(CSV 无诊断随访列);训练/测试划分清单未公开,11,091 / 2,772 两个数仅来自论文。

已知的两处官方内部不一致:①样本量(README 24,422/14,599 vs 论文 24,168/13,863),已在 §2.2 单节说明,按版本解释;②单患者最多扫描数(README 26 vs CSV 31),推测差异来自同一检查日的多次重建,未获官方确认。

论文的「9% absolute sensitivity gain」是绝对百分点,不是相对提升,已在 §8.2 与避坑清单中标注,防止被转写为「提升 9%」。

未覆盖内容:各癌种的病灶级真值分布;掩膜文件缺失的语义(「无病灶」还是「未标注」);加密标识的跨机构患者归并规则;「E. Asia」外部队列的具体国别;3.5 版修复的「有问题的 CT」具体是什么问题;3.5.1 版修正的「时间偏移不一致」的幅度。

许可为 CC BY-NC-ND 4.0。本篇引用其数字与图表结论属学术评论,不构成对数据本体的再分发。


相关数据集导航

以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:

  • spinal-multiple-myeloma-seg — 共享标签:医学影像 / CT / 医学图像分割 / 肿瘤学 / 多模态影像
  • biomedparse — 共享标签:医学影像 / CT / 医学图像分割 / 肿瘤学 / 多模态影像
  • pddca — 共享标签:医学影像 / CT / 医学图像分割 / 肿瘤学
  • ct-org — 共享标签:医学影像 / CT / 医学图像分割 / 肿瘤学
  • headneck-radiomics — 共享标签:医学影像 / CT / 医学图像分割 / 肿瘤学
  • synthrad — 共享标签:医学影像 / CT / 肿瘤学 / 多模态影像
  • lctsc — 共享标签:医学影像 / CT / 医学图像分割 / 肿瘤学
  • segrap — 共享标签:医学影像 / CT / 医学图像分割 / 肿瘤学
  • kits23 — 共享标签:医学影像 / CT / 医学图像分割 / 肿瘤学
  • structseg2019 — 共享标签:医学影像 / CT / 医学图像分割 / 肿瘤学

导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

返回 AI-Ready 数据集