信息速览
医学影像领域的大多数公开数据集,回答的都是「有多少」。有多少患者、多少层、多少个标注框——体量本身就是卖点,也是所有人比大小的尺子。
Mayo Clinic 的低剂量 CT 重建挑战赛(Low Dose CT Grand Challenge)不在这条路上。它的名字里有「挑战赛」,它的首页却在讲一整套观察者研究设计与评分公式;它的公开库只有两百多例,放在今天动辄十万例的 CT 库旁边毫不起眼;但它做了一件极少数数据集敢做的事——把同一名受检者的同一段解剖,放在原始剂量、四分之一剂量以及更低剂量下,摆成一条可以直接对比的横轴。
于是它真正回答的问题变成了「在哪个剂量上,医生还能看见那颗转移灶」,而这个问题在它之前几乎没有公开数据能回答。代价也正藏在这里:这条横轴上真正被采集下来的刻度只有一格,其余的刻度是算出来的。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 官方名称 | Low Dose CT Grand Challenge;公开库名 Low-dose CT image and projection dataset |
| 主办与托管 | AAPM 主办,Mayo Clinic 采集与读片,TCIA 托管,DOI 10.7937/9npb-2637 |
| 公开库规模 | 250 余例检查,含腹部增强、头部非增强、胸部低剂量三类 |
| 挑战赛规模 | 30 例腹部:10 例训练、20 例测试,另附一例 ACR 体模扫描 |
| 剂量阶梯 | 原始、四分之一、十分之一、二十分之一四档;前两档官方明确,更低两档见镜像说明 |
| 数据形态 | 图像层为 DICOM 序列;投影层为 DICOM-CT-PD,附字典、读取工具与手册 |
| 重建核 | 西门子 B30 中频与 D45 锐利,层厚 1 毫米或 3 毫米 |
| 采集条件 | 西门子定义 AS+ 或 Flash 单源,飞行焦点,自动曝光与管电压,参考 120 kV 与 200 有效毫安秒 |
| 参考真值 | 医师标注病灶位置与类型,真值取自病历、组织学或随访 |
| 评分方式 | 病灶级与病例级归一化分数,拉丁方读片,11 名高年资医师读片 |
| 镜像 | Kaggle 第三方镜像,清单记 12,100 次下载、20 GB |
| 许可 | 学术使用协议;免费限非商业研究,商用须单独申请 |
| 库内同域 | lctsc、ct4harmonization-multicentric、ldctiqac2023、daroct |
| 最适合 | 投影域与图像域去噪方法对比、剂量-图像质量权衡的定量研究、观察者研究的方法学示范 |
§1 它要解决的具体麻烦
1.1 真正的稀缺品是「同一段解剖在几个辐射强度下的对照」,而不是病例
CT 的辐射剂量一直是悬在这一模态上方的实际问题。一次腹部增强检查的有效剂量在几毫西弗量级,所以「能不能把剂量降下来而诊断不塌」是放射物理与临床科室长期在问的事。降剂量本身不难:把管电流调小、把管电压调低,任何一台机器都能做。难的是降完之后,你怎么知道图像还够不够看。
这个「够不够看」的问题主要靠两条路回答。一条是物理指标——噪声标准差、对比噪声比,这些量在体模上算得非常干净,但它们和医生能不能看见一颗八毫米的转移灶之间隔着一段说不清的距离。另一条是临床经验——放射科医师长期形成的剂量参考水平,那是统计意义上的「一般够用」,不是「这一张图够不够用」。
要把这两条路接起来,需要一种很难获得的样本:同一名受检者、同一段解剖、在几个不同剂量下各拍一次,让同一批医生在同一套读片流程下去判断。真实世界里这样的数据几乎不存在,因为没有人会为了做研究,让同一名患者在同一天承受四倍的扫描剂量;回顾性配对又要求同一名受检者在短期内用完全不同剂量做过两次检查,概率极低。
这就是这个数据集存在的理由。它用「一次真实采集 + 投影域模拟」绕过了伦理与概率的双重限制:真实采集只做一次,然后把这段采集的原始投影拿出来,按泊松统计插入噪声,把等效入射光子数降到四分之一、十分之一、二十分之一。模拟数据与原始数据在解剖、体位、呼吸相位上完全一致,差别被限定在噪声这一项上。
这个设计的价值不在于产出了多少张图,而在于它把一条原本只能靠经验描述的曲线变成了可以逐点去画的曲线:横轴是剂量,纵轴是图像质量,第三个隐含轴是医生的诊断把握。
1.2 三条常见的错误期待
第一条:以为四个剂量档都是采集出来的。 四个档位里有三个来自模拟,只有四分之一剂量在挑战赛的正式材料中被反复交代,更低的两档来自镜像与后续使用的转述。模拟的噪声在统计上可以做得相当接近真实低剂量采集,但有一个本质差别:模拟出的档位共享同一段采集几何、同一次患者体动、同一套探测器增益校准,而真实世界里低剂量扫描会重新摆位、重新屏气。换句话说,这套数据完美地隔离了剂量这一个变量,代价是它也隔离掉了真实采集里那些与剂量纠缠在一起的噪声来源。
第二条:以为「挑战赛数据集」自带一个可以复现的排行榜。 2016 年那场比赛在当年四月就收卷了,读片、评分、颁奖都已完成,报名通道早已关闭。今天任何人都能下载数据、在自己定义的划分上跑模型、报出很高的峰值信噪比,但这些数字彼此之间无法横向比较,因为没有统一的划分、没有统一的指标、没有统一的核与层厚约定。
第三条:以为两百多例的体量意味着这是一份轻量数据。 真正占体积的是投影。一次腹部增强检查的原始投影包含全部探测器帧,体量远大于重建后的图像;再加上每例的多档剂量与多种重建核,整包下载对磁盘与内存都是压力。只顾着下图的团队,往往会错过这份数据最独特的那一层。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 同一受检者的剂量-图像质量配对 | 原始与模拟低剂量一一对应,解剖一致 | 够,最不可替代的一点 |
| 原始投影做迭代或双域重建 | DICOM-CT-PD 完整投影,附几何与噪声图 | 够,带投影的公开资源极少 |
| 投影域噪声的统计先验 | 每帧等效入射光子数噪声图 | 够,可直接作统计重建输入 |
| 病灶级诊断真值 | 位置、类型、大小,来自病历与病理 | 基本够,只在挑战赛说明里交代 |
| 多厂商、多机型泛化验证 | 只有西门子同一系列机型 | 不够,跨厂商结论不能由它支撑 |
| 真实低剂量(非模拟)对照 | 模拟为主 | 不够,需另找真实采集的数据 |
| 巨块型、弥漫型病灶样本 | 三厘米与五个的上限,已排除 | 不够,被系统性筛掉 |
| 统一的训练与测试划分 | 只有 2016 年的比赛划分 | 不够,必须自己按受检者重划 |
| 商用授权 | 学术使用协议 | 不够,须单独申请 |
| 现成的评测脚本与基线 | 评分公式公开 | 不够,没有随数据发基线 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 没有能同时拿到图像和投影的 CT 库,双域方法只能在自造数据上验证 | 同时提供图像层与投影层,两套解剖对齐 | 先取少量受检者跑通投影读取,再决定下不下全量 |
| 要论证「降到某水平后诊断开始塌」,但只有体模指标 | 提供真实解剖上的多档剂量与病灶真值 | 先做出噪声与剂量的关系,再挑档位做读片 |
| 去噪网络只在自建数据上跑过,被质疑过拟合 | 有公开可查、同行常用的对照集 | 先确认用的是哪层、哪几例、哪个核,再报数 |
| 想复现某篇经典低剂量去噪论文 | 那批论文多数以它为训练与验证来源 | 按对方写明的受检者与切层范围复现 |
| 科室剂量方案讨论缺一张能上台的图 | 有剂量档与图像质量的直接对应 | 挑病例做并排展示,标明哪些档是模拟 |
| 想训练商用重建产品 | 许可不允许 | 只能做研究原型,产品化前走授权 |
| 课题需要跨厂商数据 | 只有单一厂商 | 换用其他资源,它只能当一端 |
| 需要大量标注切片做预训练 | 体量小、标注只到病灶级 | 另找大语料,它适合当评测集 |
1.5 一句话判断
它用「一次真实采集、四档模拟剂量」把剂量与图像质量的权衡摆上台面,稀缺性在命题不在体量;把它当成可以刷分的大训练集,会同时错过唯一的长处并踩中最深的坑。
1.6 不适合谁:四条边界
第一条,需要跨厂商或跨机型结论的人。 全部腹部病例来自同一家医院、同一系列机型、同一套参考管电压设定。在这样的数据上训练出的模型,换一台机器性能怎么变,这份数据一个字都答不上来。
第二条,做真实低剂量临床验证的人。 模拟低剂量的噪声在投影域是泊松的、在空间上近似独立的,而真实低剂量采集还会带出电子噪声、探测器串扰、散射与重建伪影的联合效应。用模拟数据训练出来的去噪模型,在真实低剂量图像上常见的一类失败模式是把结构性伪影也当成噪声抹掉。
第三条,需要病灶谱完整的人。 入选条件把单病灶限制在三厘米以内、病灶总数限制在五个以内,这意味着这组数据里没有巨大的占位、没有弥漫性浸润、没有治疗后改变。用它的结论去推断「在复杂病例上还能不能看见」,会系统性地过于乐观。
第四条,想把成果直接做成产品的人。 平台上的条款是学术使用协议,免费范围限于非商业研究。这不是可以靠换一个下载源绕开的技术限制。
§2 数据构成与规格
2.1 三层结构:挑战赛的那一份、公开库的那一份、镜像的那一份
理解这份数据最省事的办法,是先把它拆成三个同心圆。
最内层是 2016 年的挑战赛:30 例腹部病例,10 例训练、20 例测试,加一例 ACR 体模扫描。训练材料含原始剂量与四分之一剂量的滤波反投影图像、对应投影数据、以及标了病灶位置的图像;测试材料按参赛者选择只给一类——四分之一剂量的图像(1 毫米或 3 毫米层厚),或完整预处理的投影数据与噪声图,并明确不给原始剂量数据。
中间层是后来公开发布的库,托管在 NCI 癌症影像档案上,2021 年库说明给出的规模是 250 余例,覆盖三类指征:急性认知或运动障碍的非增强头部 CT、高风险人群肺结节筛查的低剂量胸部扫描、寻找肝脏转移灶的腹部增强扫描。腹部这一支是挑战赛来源,使用也最广。
最外层是第三方镜像。Kaggle 上有一个同名镜像,清单记录为 12,100 次下载、20 GB、十三万余个文件。它把图像层重新整理、附了标签表,代价是只剩图像、没有投影,也不随官方修订同步。
| 层 | 覆盖范围 | 含投影 | 剂量档 | 主要用途 | 风险 |
|---|---|---|---|---|---|
| 挑战赛材料 | 30 例腹部 + 1 例体模 | 训练含,测试可选 | 原始 + 四分之一 | 复现当年结论 | 报名关闭,需经库获取 |
| 公开库(TCIA) | 250 余例,含头、胸、腹 | 含 | 原始 + 模拟低剂量 | 方法研究主来源 | 体量大,读取链路复杂 |
| 第三方镜像 | 腹部图像层为主 | 不含 | 四档标签 | 快速原型、教学 | 体量小、不随官方修订 |
| 论文附表 | 20 例测试的读片汇总 | 不适用 | 不适用 | 引用当年结论 | 只有汇总,无逐例明细 |
有一处需要说清:镜像里的四档剂量标签,在官方挑战赛材料里只交代过两档,更低两档是后续使用中逐步固定的说法。本文采用四档说法,同时在附录 A 标明每档的来源层级,不做合并,也不做真假判断。
2.2 字段与记录的完整字典
这里把能落到字段层面的东西尽量列全。投影层与图像层的字段体系不同,分两段列。表中「取值」一栏只写类型与可能范围,不写统计分布——分布需要下载全量后逐条统计,那一步应该由使用者自己做。
| 层 | 字段或属性 | 类型 | 含义 | 取值与备注 |
|---|---|---|---|---|
| 通用 | 受检者编号 | 字符串 | 去标识后的病例主键 | 全库唯一,跨剂量档一致 |
| 通用 | 检查日期 | 日期 | 采集日期 | 去标识时做过日期偏移 |
| 通用 | 检查类型 | 分类 | 临床指征大类 | 头非增强、胸低剂量、腹增强 |
| 通用 | 扫描仪 | 分类 | 设备型号 | 定义 AS+ 或 Flash 单源 |
| 通用 | 管电压 | 数值 | 采集管电压 | 自动选择,参考 120 千伏 |
| 通用 | 有效毫安秒 | 数值 | 曝光量 | 自动曝光控制,参考设定 200 |
| 通用 | 对比剂期相 | 分类 | 增强时相 | 腹部门静脉期,注射后 70 秒 |
| 图像 | 序列编号 | 字符串 | DICOM 序列标识 | 一个重建核与层厚对应一个序列 |
| 图像 | 重建核 | 分类 | 卷积核 | 西门子 B30 中频、D45 锐利 |
| 图像 | 层厚 | 数值 | 切片厚度 | 1 毫米或 3 毫米 |
| 图像 | 层间距 | 数值 | 相邻切片间隔 | 提交要求 3 毫米层厚、2 毫米间隔 |
| 图像 | 剂量档标签 | 分类 | 所属剂量 | 原始、四分之一、更低档;部分依赖目录名 |
| 图像 | 病灶标注 | 结构 | 位置与类型 | 仅挑战赛材料中给出,公开库需对照别表 |
| 投影 | 采集几何 | 结构 | 机架角度、探测器排布 | 写入 DICOM-CT-PD 专有标签组 |
| 投影 | 原始投影矩阵 | 数值数组 | 各帧对数化投影值 | 已预处理并取对数,可直接重建 |
| 投影 | 噪声图 | 数值数组 | 每帧等效入射光子数 | 供统计迭代重建使用 |
| 投影 | 数据字典 | 文件 | 标签定义 | 随数据附送,读取前须加载 |
| 结果 | 病灶级分数 | 数值 | 单病灶净得分 | 命中加一,误报漏报各减一 |
| 结果 | 病例级分数 | 数值 | 单病例净得分 | 二十例为分母 |
| 结果 | 总体表现分 | 数值 | 上两项均值 | 满分一百,可为负 |
2.3 一条记录的完整解剖
一条记录可以沿「同一位受检者、同一天、同一个剂量档、同一个重建核」拆到底。下面的目录示意结构真实、编号做过替换,不指向任何具体受试者。
LIDC_LOW_DOSE/
├── manifest.csv #-- 病例索引:受检者、检查类型、剂量档、序列
├── DICOM-CT-PD_dictionary.txt #-- 投影标签字典,读取前必须先加载
├── DICOM-CT-PD_UserManual.pdf #-- 投影格式说明与读取示例
└── L123/
├── full/
│ ├── images/
│ │ ├── B30_3mm/ #-- 中频核、3 毫米层厚
│ │ └── D45_1mm/ #-- 锐利核、1 毫米层厚
│ └── projections/
│ ├── geometry.xml #-- 机架与探测器几何
│ ├── projections.bin #-- 对数化投影矩阵
│ └── noise_map.bin #-- 每帧等效入射光子数
└── quarter/
├── images/B30_3mm/
└── projections/ #-- 同一几何,插入噪声后的投影
这段结构里有四件事值得单独说。
第一,同一个受检者下,原始剂量与低剂量两个目录在结构上完全对称。两侧的层数、切片位置、解剖内容一一对应,做配对训练时不需要额外配准。若某一天发现两侧层数不一致,那不是数据问题,是下载或解包时丢了序列。
第二,投影目录里的几何文件与投影矩阵是分开的。几何描述机架在每个采集时刻的角度与探测器排布,投影矩阵只是一堆数值。重建程序必须把两者合起来用,只读投影矩阵而忽略几何,结果不会报错,只会看起来模糊。
第三,噪声图是独立文件,给出每一帧的等效入射光子数,是统计迭代重建的权重来源。对统计模型的重建算法来说它是必需输入——没有它,算法退化成等权最小二乘。
第四,目录命名里的重建核与层厚是连写的。这意味着同一受检者同一剂量档下可能有四个图像序列,做实验时必须锁死用哪一个。
2.4 剂量档与规模的两个口径
规模有两个并行口径,混用会得出互相矛盾的结论。
第一个是挑战赛口径:30 例。这是实际进入比赛的病例数,也是大量论文描述自己训练用了多少例时默认引用的数字。10 例训练公开给所有参赛者,20 例测试赛前保密。当年 20 家单位报名,读片人为 11 名高年资住院医师或专科培训医师。
第二个是公开库口径:250 余例,覆盖头、胸、腹三类。挑战赛的 30 例是其中一个子集,其余病例在赛后陆续整理公开,供研究使用但不参与当年评分。
| 口径 | 病例数 | 含投影 | 是否公开 | 典型用途 |
|---|---|---|---|---|
| 挑战赛训练集 | 10 | 含 | 是 | 当年参赛者训练 |
| 挑战赛测试集 | 20 | 按参赛者选择 | 赛后公开 | 复现当年结论 |
| 挑战赛体模 | 1 | 含 | 是 | 验证投影读取链路 |
| 公开库腹部支 | 30 例外另有扩充 | 含 | 是 | 后续方法研究 |
| 公开库全体 | 250 余 | 含 | 是 | 三类指征的通用研究 |
四档剂量在官方材料里的地位并不对等:原始剂量是采集得到的,四分之一剂量在挑战赛页面与比赛论文里都有方法说明,十分之一与二十分之一在官方页面上找不到对应的噪声插入参数。下表因此只用「页面明确」与「见镜像说明」两种措辞。
| 剂量档 | 相对比例 | 来源方式 | 交代程度 |
|---|---|---|---|
| 原始剂量 | 百分之百 | 临床采集 | 页面明确 |
| 四分之一 | 百分之二十五 | 投影域插入泊松噪声 | 页面明确,有方法说明 |
| 十分之一 | 百分之十 | 投影域插入泊松噪声 | 见镜像说明 |
| 二十分之一 | 百分之五 | 投影域插入泊松噪声 | 见镜像说明 |
2.5 与同类资源的字段差异
放在几个相邻资源旁边,字段层面的差别就清楚了。
| 资源 | 投影层 | 剂量对照 | 参考真值 | 差异 |
|---|---|---|---|---|
| 本数据集 | 有 | 原始 + 模拟低剂量 | 病灶位置类型大小 | 唯一同时给投影与多档剂量对照的腹部集 |
| lctsc | 无 | 无 | 器官轮廓 | 放疗勾画,脏器边界真值更完整 |
| ct4harmonization-multicentric | 无 | 五档真实拍摄 | 体模组织类别 | 用体模换掉患者,剂量差异来自真实拍摄 |
| ldctiqac2023 | 无 | 无配对 | 医生感知评分 | 评图像好不好看,不评诊断对不对 |
| daroct | 无 | 不适用 | 不适用 | 跨域方法示范,模态是 OCT |
概括起来:其他资源要么有真值没有投影,要么有真实剂量差异没有患者,要么有评分而评分不是诊断结论。这份数据的独特性来自「投影 + 患者 + 剂量对照」三件事同时在场,而这种同时在场也决定了它的规模不会大。
§3 它是什么:一次被设计成数据集的受控实验
3.1 「挑战赛」这个词在这里到底意味着什么
2016 年这一届的组织方式和今天常见的榜单式比赛差别很大。它没有实时刷新的排行榜,没有公开的提交接口,参赛者从报名到交卷只有一轮:一月中旬报名关闭,随后训练材料放出,二月一日测试材料放出,四月三十日午夜前必须把降噪或重建后的图像交回主办方,五月由主办方组织读片,八月在年会上宣布结果。
奖励也不是奖金,而是三样东西:在年会专题讨论会上讲自己的方法、一张年会注册的减免名额、以及被邀请把方法与结果写进《医学物理》当年的专刊。
这种设计决定了数据的产品形态——它不是一份为长期使用而整理的数据集,而是一份为一次性比赛准备的考卷。考卷的特征是:训练份量小、测试份量小、评分规则写得极细、但没有为后来的使用者留出可复现的接口。这解释了为什么今天用这份数据时,划分、指标、预处理几乎都得自己搭。
3.2 任务被限定得很窄:只找肝脏转移灶
比赛页面把任务限定得非常具体:在低剂量腹部 CT 上检测肝脏病灶。参赛者可以选择走图像域,即对主办方给出的滤波反投影图像做降噪;也可以走投影域,即对完整预处理的投影数据与噪声图做重建。两类方法被放在同一个评分体系下比较,这是当年这场比赛的看点——图像域与投影域方法第一次在同样的病例、同样的读片流程下被摆到一起。
读片环节的设计值得单独说。病例被打散后分给多位读片人,任何一位读片人不会把同一例看两遍;每一位读片人看到的是每例病例的每一种方法各一次。这种拉丁方安排把读片人自身的水平差异平均到各参赛者身上,避免某个方法恰好被一位宽容的读片人评分。读片人只做一件事:在图像上标出可疑病灶的位置,或者判定这一例没有病灶,并给出置信度。
评分规则写在页面上:病灶级别上,命中一个病灶加一分,在无病灶处标出一个病灶减一分,漏掉一个病灶减一分;病例级别上,判对一例加一分,判错一例减一分。两者各自归一化到百分制,再取算术平均作为总成绩,允许出现负分。
3.3 参考真值是怎么来的
真值的质量决定了这份数据能支撑什么结论。页面对此有交代:每一例受检者的参考诊断都取自病历,来源是组织学结果或者后续影像的随访结论,用来确立主办方诊断的准确性。病灶位置由受过统一培训的腹组放射科医师标注,读片使用统一工具,读片前做过严格的培训。
这意味着真值的层级是「临床确诊 + 位置标注」,而不是「病理切片级的分层标注」。它不是像素级分割掩码,也不是逐层到齐的轮廓,而是「这颗病灶在这个位置、属于哪一类」。对检测任务已经足够,对分割任务远远不够——很多人在下载后发现找不到分割掩码,原因就在这。
3.4 它不是什么
它不是一个疾病队列。入选条件是按图像上的表现筛的,不是按诊断路径筛的,队列里既有无病灶的正常肝脏,也有良性病灶与转移灶,但没有随访、没有治疗记录、没有生存终点,也没有人口学信息。
它不是一个体模数据集。训练材料里附的那一例 ACR 体模扫描,是为了帮参赛者验证投影读取代码写得对不对,不是研究对象。
它不是一份带基线代码的基准。评分公式公开,但没有随数据发布可以一键复现的基线实现。
§4 质量与特色
4.1 案例:二十分之一剂量下那颗八毫米转移灶
下面这个案例是本书为说明问题而构造的情景,其中的受检者编号与具体数值均为示意,不对应任何真实病例,但它涉及的机制全部来自官方页面与论文摘要的交代。
设想某团队要做一件事:论证「把剂量降到原始的二十分之一,转移灶检测还守得住」。他们从公开库里取一位受检者,肝脏右叶有一枚八毫米的转移灶,原始剂量下边界清晰,与周围肝实质的对比在门静脉期因为造影剂而更加突出。他们把这个受检者在四个剂量档下的图像并排放置,请三位放射科医师各自盲评,记录「看得见 / 勉强看得见 / 看不见」。
第一步就会撞上一个问题:在二十分之一那档上,判断分歧最大——两个人说勉强看得见,一个人说看不见。如果他们就此写「二十分之一剂量下检测率下降到三分之二」,这个结论站不住,三个人三个判断,样本量不足以支撑任何比率。
第二步是加大样本。他们把所有有病灶的受检者在四个档位上各取一层,凑出一批判断,再算每个档位的检出率。这时曲线开始有形状:从原始到四分之一,检出率几乎不掉;从四分之一到十分之一,开始明显下降;到二十分之一,下降变陡。这条曲线说明剂量的代价不是线性的,前面几档几乎是免费的,代价集中在后面。
第三步是换一个提问方式:不问「检出率多少」,改问「图像质量的代理指标能不能预测检出率」。用峰值信噪比、结构相似度这类全参考指标去拟合检出率,会发现这些指标在轻度降噪上非常敏感,在重度降噪上趋于饱和,而检出率在重度降噪上恰恰掉得最快。指标好看的地方,诊断已经掉下去了。
第四步,也是最容易出错的一步,是把结论写成「在低剂量 CT 上,二十分之一剂量仍可接受」。这里有三重跳跃:从一名受检者跳到所有受检者;从模拟低剂量跳到真实低剂量;从这组经过筛选、病灶不超过三厘米的病例跳到真实临床。任何一重都足以让结论失效。正确的写法把范围限定死:在这组经过筛选的腹部增强病例、在模拟的二十分之一剂量下,检出率相对原始剂量下降了多少。
这个案例后面还会被引用三次,分别用来说明划分陷阱(§7.2)、评测指标错位(§7.3)和最短流程(§9.2)。
4.2 投影层的价值被严重低估
大多数使用者只取图像层。原因很实际:图像层是现成的 DICOM,读进来就能用;投影层需要先加载自定义标签字典,再自己写几何拼装,代码量翻好几倍。但从方法学角度看,投影层才是这份数据真正稀缺的部分。
公开的 CT 投影数据极少,因为体量大、格式不统一、且涉及设备的采集细节。把投影转成厂商中立的格式并公开发布,需要设备厂商配合。这份数据做到了:投影被转成一种扩展的 DICOM 格式,采集几何与投影矩阵存在同一套标签体系里,并附了字典、读取工具与用户手册。正是这一层,使统计迭代重建、双域网络、投影域去噪有了公开可比的实验台。代价是门槛高:读取链路任何一环出错,重建结果都不报错,只是模糊或者带条纹。
4.3 剂量与诊断的关系在这份数据上长什么样
这份数据支持的结论大致有三种形状。
第一种是「剂量-噪声」关系:剂量降低到几分之一,光子数同比下降,噪声标准差按光子数的平方根反比上升。这种关系在任何体模上都能测,这份数据的价值在于它是在真实解剖上测的,能看出噪声在器官边界、脂肪与肠气界面上的不均匀放大。
第二种是「噪声-可读性」关系:这一层带主观性,靠读片实验去测。当年比赛的读片设计就是为了测这一层,结论汇总在《医学物理》当年的专刊里。
第三种是「可读性-诊断正确性」关系:这是最难测的一层。图像好看不等于诊断正确,因为过度平滑的图像会让人「看着舒服但漏掉小的低对比病灶」。这也是这份数据最想纠正的一种直觉——干净和正确是两件事。
4.4 数据本身的粗糙之处:一份诚实的清单
把不完美的地方列清楚,比夸它好更有用。
病灶与病灶总数的双重上限筛选,使这批病例在难度上偏简单。真实临床里最难判的巨块型伴坏死、治疗后改变、脂肪肝背景下的低对比病灶,在这里基本见不到。
全部腹部病例来自同一家医院、同一系列机型,无法回答任何跨设备问题,而跨设备恰恰是临床落地时最先撞上的墙。
模拟低剂量的噪声是插入的不是采集的,它不会带来探测器电子学层面的变化,也不会带来曝光时间改变导致的运动模糊模式改变。
2016 年的测试集只给低剂量、不给原始剂量。这条规定当年是为了逼参赛者做无参考降噪,却直接导致今天用测试集算全参考指标不成立。
标签体系依赖目录命名。官方没有统一的清单文件说明哪个目录是哪个剂量档、哪个核,不同镜像的约定还不一样,跨镜像混用会造成剂量标签错配。
4.5 质量评估:DAIMS 五维
DAIMS 是评估数据集 AI 就绪度的五维框架,这里按可获得性、准确性、完整性、一致性与及时性打分,每维一句判据。
| 维度 | 分值 | 判据 |
|---|---|---|
| 可获得性 | 4 | 公开可下载,但商用受限,投影读取需专用工具链 |
| 准确性 | 5 | 真值取自病历与随访,位置由受训医师标注 |
| 完整性 | 3 | 真值只到位置与类型;无分割、无人口学、无随访 |
| 一致性 | 4 | 同机同协议,跨档解剖对齐;但目录命名不统一 |
| 及时性 | 3 | 2016 年建库,2021 年更新后无系统性扩充 |
| 综合 | 3.8 | 作为方法学对照集非常扎实,作为通用训练集则四面受限 |
§5 怎么拿到:三条路径、读取链路与字段级陷阱
5.1 三条获取路径的取舍
| 路径 | 拿到什么 | 体量 | 前置条件 | 适合谁 |
|---|---|---|---|---|
| TCIA 官方集合 | 图像 + 投影,全量三支 | 大,按需分批 | 需用官方客户端,读使用条款 | 做重建、做双域、要投影的人 |
| 挑战赛页面 | 任务说明、评分规则、时间线 | 极小 | 无 | 要引用当年结论的人 |
| Kaggle 镜像 | 图像层 + 标签表 | 20 GB 量级 | 需 Kaggle 账号 | 做原型、做教学、只要图像的人 |
三条路径可以组合,但纪律是:报数时说清数字来自哪条路径。用镜像训练的模型与用官方投影重建的图像不能放进同一张表。
5.2 环境准备
读取 DICOM 需要 pydicom,读取投影需要官方的字典文件,做重建需要至少一个能处理几何的库。下面只装最基础的几个依赖,投影读取的具体实现因人而异,这里不提供。
#-- 建一个干净的环境,避免和已有 pydicom 版本冲突
python3.11 -m venv venv-ldct
source venv-ldct/bin/activate
pip install --upgrade pip
pip install pydicom numpy scipy pandas matplotlib
#-- 校验安装
python3.11 -c "import pydicom, numpy; print(pydicom.__version__, numpy.__version__)"
5.3 先取一例把链路跑通
不管是走哪条路径,第一步都应该是取一例、读进来、看一眼像素值范围对不对。用官方客户端时可以按受检者筛选后只下载单例;用镜像时先解压出一例。下面假设已经把某一例的 DICOM 目录解到本地。
#-- 读入单个受检者的一个序列,只做最小检查
import pydicom
from pathlib import Path
import numpy as np
case_dir = Path("./data/L123/quarter/images/B30_3mm")
files = sorted(case_dir.glob("*.dcm"))
print("切片数", len(files))
ds0 = pydicom.dcmread(files[0])
print("层厚", getattr(ds0, "SliceThickness", None))
print("重建核", getattr(ds0, "ConvolutionKernel", None))
print("管电压", getattr(ds0, "KVP", None))
print("窗宽窗位", getattr(ds0, "WindowWidth", None), getattr(ds0, "WindowCenter", None))
#-- 用 RescaleSlope/Intercept 换算到 HU,没做这一步的图像不是 HU
vol = []
for f in files:
d = pydicom.dcmread(f)
img = d.pixel_array.astype(np.float32)
slope = float(getattr(d, "RescaleSlope", 1.0))
inter = float(getattr(d, "RescaleIntercept", 0.0))
vol.append(img * slope + inter)
vol = np.stack(vol)
print("体数据形状", vol.shape)
print("HU 范围", float(vol.min()), float(vol.max()))
跑完这段,如果 HU 范围落在大约负一千到正一千之间,说明换算做对了。如果范围是零到四千,说明漏了截距,后面的噪声统计会全错。
5.4 按剂量档建索引
目录命名在不同镜像里不一样,靠目录名猜剂量档不可靠。稳妥的做法是显式维护一张索引表,把受检者、剂量档、重建核、层厚四件事写死。
#-- 显式索引:不靠目录名猜,把剂量档写成表
import csv
from pathlib import Path
rows = []
for case_dir in sorted(Path("./data").glob("L*")):
for dose in ("full", "quarter", "tenth", "twentieth"):
image_root = case_dir / dose / "images"
if not image_root.exists():
continue
for series in sorted(image_root.iterdir()):
kernel, _, thickness = series.name.partition("_")
rows.append({
"patient_id": case_dir.name,
"dose_level": dose,
"kernel": kernel,
"thickness_mm": thickness.replace("mm", ""),
"n_slices": len(list(series.glob("*.dcm"))),
})
with open("index.csv", "w", newline="", encoding="utf-8") as fh:
writer = csv.DictWriter(fh, fieldnames=list(rows[0].keys()))
writer.writeheader()
writer.writerows(rows)
print("索引行数", len(rows))
这张表不只是自查工具,同时也是可以随论文附上的清单——被问「你用了哪几例、哪个核、哪档剂量」时,直接给这张表即可。
5.5 配对抽层与按受检者划分
配对是这份数据的核心卖点,但配对做错的方式很隐蔽。常见错误是先随机抽切片,再去找同一位置的配对切片;正确顺序是先按受检者划分训练与测试,再在每一侧内部做配对抽层。
#-- 先按受检者划分,再在每一侧内部配对抽层
import numpy as np
import pandas as pd
index = pd.read_csv("index.csv")
patients = sorted(index["patient_id"].unique())
rng = np.random.default_rng(20261026)
rng.shuffle(patients)
cut = int(len(patients) * 0.8)
train_ids = set(patients[:cut])
test_ids = set(patients[cut:])
print("训练受检者", len(train_ids), "测试受检者", len(test_ids))
def sample_pairs(pid_set, per_patient=8):
out = []
for pid in sorted(pid_set):
sel = index[(index.patient_id == pid) & (index.kernel == "B30")
& (index.thickness_mm == 3)]
full = sel[sel.dose_level == "full"]
low = sel[sel.dose_level == "quarter"]
if full.empty or low.empty:
continue
n = min(int(full.n_slices.iloc[0]), int(low.n_slices.iloc[0]))
picks = rng.choice(n, size=min(per_patient, n), replace=False)
out.extend((pid, int(i)) for i in picks)
return out
train_pairs = sample_pairs(train_ids)
test_pairs = sample_pairs(test_ids)
print("训练配对切片", len(train_pairs), "测试配对切片", len(test_pairs))
这段代码有两个地方值得注意。一是它把重建核和层厚锁死成中频核与三毫米层厚,避免混用;二是它取两侧层数的较小值作为可抽范围,因为理论上一层数一致,实际下载时可能缺序列,取较小值可以避免越界。
5.6 算一组最小可用的对照指标
算指标的目的不是刷分,是确认链路正确。下面只算峰值信噪比与结构相似度两项,都是全参考指标,必须以原始剂量为参照。
#-- 最小对照:以原始剂量为参照,算低剂量图像的 PSNR 与 SSIM
import numpy as np
from skimage.metrics import peak_signal_noise_ratio, structural_similarity
def hu_to_unit(x, lo=-160.0, hi=240.0):
#-- 腹部软组织窗,只用于可比性,不改变原始数据
return np.clip((x - lo) / (hi - lo), 0.0, 1.0)
def score_pair(full_hu, low_hu):
a = hu_to_unit(full_hu)
b = hu_to_unit(low_hu)
return {
"psnr": float(peak_signal_noise_ratio(a, b, data_range=1.0)),
"ssim": float(structural_similarity(a, b, data_range=1.0)),
}
注意这里把窗区间写死。这是必须做的约定:不固定窗,两组实验的指标不可比;固定了窗,就要在论文里写明窗区间,否则别人复现不出来。
5.7 字段级陷阱:三个让结果静默出错的细节
陷阱一:截距被忽略。 DICOM 里存的通常是原始读出值,需要乘斜率再加截距才换算成 HU。快速脚本直接读像素数组就用,得到的是未换算灰度,噪声统计与窗宽窗位全部对不上,而代码不会报错。
陷阱二:剂量档靠目录名推断。 官方没有权威清单文件把目录名映射到剂量档。不同镜像的命名方式不同,有的用 full 与 quarter,有的用 dose_1 与 dose_4。跨镜像混用时会静默错配,模型学到的是「目录名对应的噪声水平」,而不是「剂量对应的噪声水平」。
陷阱三:层序未排序。 DICOM 文件在文件系统里的顺序与切片在解剖上的顺序无关。必须按 ImagePositionPatient 或 InstanceNumber 排序,否则体数据在 Z 方向上是乱的,任何三维指标都没有意义。
5.8 一份可执行的自查清单
| 检查项 | 通过标准 | 不通过的后果 |
|---|---|---|
| HU 换算 | 范围落在负一千到正一千 | 窗位与噪声统计全错 |
| 切片排序 | 相邻切片位置单调 | 三维指标无意义 |
| 层数一致 | 配对两侧层数相同 | 配对错位,指标虚高 |
| 重建核一致 | 索引表锁死核与层厚 | 两组实验不可比 |
| 划分粒度 | 训练与测试无重叠受检者 | 指标显著虚高 |
| 剂量标签 | 与索引表逐条对齐 | 学到目录名不是剂量 |
| 窗区间 | 固定并写入论文 | 他人无法复现 |
| 投影几何 | 几何与矩阵同时加载 | 重建模糊且不报错 |
§6 与库内条目的关系
6.1 关系图谱:它站在「方法学对照」这一层
库内与 CT 相关的记录可以粗分三层:任务层、资源层、方法层。这份数据站在方法层,相邻的几份各自承担不同角色。
| 库内对象 | 所在层 | 与它的关系 | 什么时候该换用它 |
|---|---|---|---|
| lctsc | 任务层(放疗勾画) | 脏器轮廓更完整,但没有投影与剂量对照 | 要做器官分割或剂量计算 |
| ct4harmonization-multicentric | 方法层(跨厂商协调) | 用体模换掉患者,剂量差异来自真实拍摄 | 要论证跨设备可比性 |
| ldctiqac2023 | 方法层(图像质量评分) | 有医生感知评分,但没有配对的高剂量参照 | 要训练无参考质量评估模型 |
| daroct | 方法层(跨厂商域适应) | 同为跨域方法示范,模态是 OCT | 要做域适应方法本身的原型 |
| abdomenct-1k | 资源层(多器官分割) | 体量大得多,但没有剂量维度 | 要多器官分割的大规模训练 |
| ct-rate | 资源层(影像-报告配对) | 有文本,但没有投影与剂量阶梯 | 要做视觉语言任务 |
库内在 CT 影像这块并不缺记录,缺的是「剂量」这一个维度。这份数据是库里第一个把剂量当作主轴来组织的对象:不是又一份腹部 CT,而是唯一一份把剂量差异做成核心字段的腹部 CT。
6.2 检索路径:从需求出发找落点
库里的检索通常是三种问法。问「做低剂量 CT 去噪用哪个数据集」,落点是本篇,理由在投影层与配对结构。问「做 CT 图像质量评估」,落点是 ldctiqac2023,那套有医生打分;这份数据有剂量档但没有逐图评分,只能自己组织读片。问「证明模型在跨设备上也行」,单一落点不存在,需要以它为一端、另找跨厂商资源为另一端做组合。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
读这一节之前,需要先纠一个根深蒂固的误判:把「公开」「被大量论文引用」「出现在官方挑战赛里」当成质量背书。这三件事说明的是它被用得多,不是它足够好。
更具体地说,常见的误判是把这份数据当成通用的低剂量 CT 基准,然后用它上面的绝对分数去比较不同方法的临床价值。这个做法在方法学上是错的:它的测试集在 2016 年被设计成只给低剂量、不给高剂量,全参考指标本来就不该在测试集上算;它的病例经过筛选,病灶谱偏向简单;它的全部病例来自单中心单系列机型,任何跨设备结论都超出覆盖范围。
正确的读法是把它当成受控实验台:在它上面比较 A 方法与 B 方法,前提是两者用同一批受检者、同一个重建核、同一套预处理、同一个窗区间。跨出这个范围,比较就不成立。
7.1 五维评分
除 DAIMS 外,再给一组针对「作为研究基础设施」的评分。
| 维度 | 分值 | 说明 |
|---|---|---|
| 命题稀缺性 | 5 | 投影加剂量对照的公开腹部集,几乎无替代品 |
| 数据洁净度 | 4 | 同机同协议,跨档几何对齐 |
| 体量充裕度 | 2 | 两百余例偏小,训练易过拟合 |
| 标注丰富度 | 2 | 只有病灶位置与类型 |
| 复现便利度 | 2 | 无官方划分与基线,投影读取门槛高 |
| 综合 | 3.0 | 命题一流,基础设施三流 |
7.2 划分与预处理:最常见的两类自伤
第一类是划分。按切片随机划分是这份数据上最常见的错误,因为它看起来最自然:把全部切片打散,二八开。后果是同一受检者的相邻切片分别落进了训练与测试,模型在测试时其实已经见过这名受检者的肝脏,指标虚高的幅度可以很大。
第二类是预处理。这份数据的图像没有做任何归一化,HU 是原样的。有些团队沿用自然图像的习惯做逐图标准化,把每张切片减均值除标准差,结果是不同剂量档的图像被拉到相似的整体亮度,噪声差异被部分抹掉。要保留剂量差异,就不能做逐图标准化,只能做全局固定的窗变换。
§4.1 的案例里,第四步提到的三重跳跃,前提就是把划分和预处理做对了。这两件事做错,后面的读片实验再精细,结论也是错的。
7.3 指标与诊断之间的错位
这是这份数据最值得写进教科书的一课,也是 §4.1 的案例第三步的核心。
全参考指标衡量的是「与参照图像有多像」,而降噪的目标不是像,是让人看得见病灶。两个目标在轻度降噪区间高度一致,在重度降噪区间会分叉:算法越激进,图像越平滑,像素差异可能反而变小,因为参照图像本身也带噪声;可是被抹平的恰恰是病灶边缘的高频信息。
换句话说,指标与诊断之间存在一个错位区,而错位区正好落在临床上最想去的那个低剂量区间。这就是为什么当年比赛不用指标评分,而是请放射科医师读片。
7.4 已知的、可枚举的偏差
| 偏差 | 原因 | 影响方向 | 缓解办法 |
|---|---|---|---|
| 选择偏差 | 病灶数与单病灶上限 | 复杂病例上过于乐观 | 声明适用病灶谱 |
| 单中心偏差 | 病例来自一家医院 | 跨机构外推失效 | 与多中心数据交叉验证 |
| 单厂商偏差 | 同系列机型、固定电压 | 跨设备泛化未覆盖 | 另找多厂商数据 |
| 模拟偏差 | 投影域插入噪声 | 低估真实伪影与电子噪声 | 在真实低剂量数据上复验 |
| 结构偏差 | 只有三类指征 | 其他部位与期相缺失 | 按指征挑选对比对象 |
| 标签偏差 | 真值取自病历与随访 | 小病灶真值可能不稳 | 小病灶单独报置信区间 |
| 划分偏差 | 无官方划分 | 不同论文数字不可比 | 公开自己的划分清单 |
7.5 外部验证矩阵
放到几个外部场景里问「还成立吗」,答案并不一致。
| 外部场景 | 是否成立 | 依据 | 说明 |
|---|---|---|---|
| 同院同机型另一批病例 | 大致成立 | 协议一致 | 剂量与噪声关系可迁移 |
| 另一家医院同机型 | 部分成立 | 协议可能不同 | 需重新标定噪声水平 |
| 另一厂商的设备 | 不成立 | 重建核与噪声结构不同 | 必须重做域适应 |
| 真实低剂量采集 | 部分成立 | 噪声来源不完全一致 | 结构性伪影处理会失配 |
| 其他部位(胸部、头部) | 部分成立 | 库内有对应支但以腹部为主 | 需按指征重新抽样 |
| 迭代重建算法对比 | 成立 | 投影层可用 | 它设计时的目标用途 |
| 深度学习去噪训练集 | 勉强成立 | 体量偏小 | 宜作微调或评测,不宜作唯一训练源 |
| 商用产品验证 | 不成立 | 许可限制 | 需走授权流程 |
7.6 它为何能持续:靠「一次采集、多次复用」把维护成本压到接近零
这份数据已经存在了十年,中间没有大规模扩充,也没有停止被使用,原因是它的成本结构非常轻。
采集只发生过一次。所有病例都是回顾性的、临床指征明确的检查,采集时不需要为研究额外做任何事,因此没有持续招募、没有随访、没有伦理复核的周期。噪声插入是离线的、一次性的,方法发表之后不需要随设备升级而重做。
格式也定了下来。投影转成厂商中立格式之后,那套扩展标签体系就冻结了,后续使用者直接按字典读,不需要和厂商再谈接口。图像层本来就是标准 DICOM。
真正会老化的部分只有两处:一是它覆盖的临床指征固定在三类,新增指征只能靠别的数据集补;二是模拟方法本身没有随重建技术的演进而更新,深度学习重建普及之后,「用泊松插入模拟低剂量」这个假设还够不够用,社区里已有讨论。这两处老化是缓慢的,不影响它作为对照集继续被引用。
§8 生态位与历史
8.1 历史沿革:从一场比赛到一个常被引用的对照
时间线不复杂,但每一步都改变了这份数据的性质。
| 时间 | 事件 | 影响 |
|---|---|---|
| 2015 年 | AAPM 与 Mayo 筹备挑战赛 | 数据开始就是为评分设计 |
| 2016-01-15 | 报名关闭 | 参赛者名单固定 |
| 2016-01-18 | 训练病例放出 | 10 例腹部与体模进入公开视野 |
| 2016-02-01 | 测试病例放出 | 给图像或投影,不给高剂量 |
| 2016-04-30 | 交卷截止 | 材料不再接受新提交 |
| 2016-08 | 年会宣布三名获奖者 | 方法进入学术视野 |
| 2017-10 | 专刊发表总述与三个获奖方法 | 数据开始被广泛引用 |
| 2021 | TCIA 库更新,规模扩到 250 余例 | 从考卷转为公开资源 |
| 2021 之后 | 第三方镜像出现 | 门槛下降,投影层被忽视 |
有两处值得单独说明。第一处是 2017 年十月那期专刊,它同时发表了比赛总述与三个获奖方法的论文,成了后续几乎所有低剂量 CT 去噪论文的必引文献。第二处是 2021 年的库更新,它把规模说明从挑战赛的三十例扩到两百余例,性质上完成了一次从比赛材料到研究资源的转变。
8.2 它在方法生态里的位置
低剂量 CT 重建的方法谱系大致分三代。第一代是基于模型的迭代重建,靠明确的噪声统计模型与正则项,在投影域求解。第二代是图像域的判别式去噪,用卷积网络直接从低剂量图像预测高剂量图像。第三代是生成式方法,用对抗训练或扩散模型合成细节。
这三代的分水岭之一,就是需不需要投影。第一代必须有投影,第二代只要有图像,第三代多数也只要图像。这份数据同时提供两层,因此成了少数能横跨三代的评测台:早期迭代重建论文用它验证统计模型,中期去噪网络用它做配对训练,近期的生成式方法把它当标准对照集。
也正因为如此,它被使用的方式高度同质化。绝大多数论文只取腹部那一支、只取图像层、只取部分受检者、只用中频核的三毫米层厚。同质化一方面是好事,对照基准一致;另一方面也意味着,投影层那部分价值长期没人兑现。
8.3 与另外几类资源的分工
| 类型 | 代表 | 擅长回答 | 回答不了 |
|---|---|---|---|
| 体模剂量研究 | ct4harmonization-multicentric | 设备差异有多大 | 人身上的诊断后果 |
| 感知质量评分 | ldctiqac2023 | 图像看起来好不好 | 诊断对不对 |
| 任务级标注 | lctsc | 器官边界在哪里 | 低剂量下还看得见吗 |
| 本数据集 | 挑战赛 | 剂量降下去后诊断守不守得住 | 换一家医院还守不守得住 |
这四类资源的关系是串联而不是替代。要回答「换一家医院还行不行」,得先用体模标定设备差异,再用本数据集测剂量效应,最后用另一家医院的真实数据做外部验证。任何单独一份都答不完整。
8.4 它在中国语境下的位置
国内的低剂量 CT 研究长期集中在肺癌筛查这一支,因为筛查人群基数大、剂量敏感度高、且有明确的指南驱动。腹部低剂量研究相对少,原因之一是腹部对比度天然低,降剂量的空间看起来更窄。
在这个背景下,这份数据的价值有两面。一面是方法学上的:它的观察者研究设计与评分公式是可以直接借鉴的模板,国内做类似研究不必从零设计读片流程。另一面是局限:病例全部来自美国单一机构,中国人群的体型分布、脂肪肝比例、造影剂使用习惯都与之不同,直接迁移会带系统偏差。务实的用法是把它当方法原型台,把本土数据当验证台。
8.5 未来可能怎么走
第一条是维持现状。它继续作为被高频引用的对照集存在,新增使用集中在方法对比而非数据扩展。这是最可能的路,因为原始采集方没有扩充动力。
第二条是社区补充划分。由使用者自发公开受检者划分清单,逐步形成事实上的几套主流划分,让数字重新变得可比。成本低,收益直接,但目前还没形成气候。
第三条是方法学更新。随着深度学习重建的普及,重新评估「泊松插入」这个假设在新一代重建算法下是否还成立。这需要原始投影,而原始投影就在这份数据里,条件具备。
§9 使用指引
9.1 三种角色的路径
算法研究者。 目标是把一个重建或去噪方法做到可发表。最短路径是:先用 §5.3 的单例读取把链路跑通,再用 §5.5 的按受检者划分建一套划分并公开,最后在固定窗区间与固定重建核上跑全部对照方法。必须同时报图像域指标与至少一项任务级代理指标,否则会被质疑「只会刷峰值信噪比」。走投影域的话,投影读取的正确性要先自证:用体模数据重建,与主办方给的图像对照,差值落在合理范围才继续。
临床与放射物理方向的研究者。 目标通常是回答一个具体的剂量问题,比如「本科室的腹部增强能不能把毫安秒再降两成」。最短路径不是训练模型,而是做读片实验:挑出病灶谱接近自己科室的病例,在原始剂量与目标剂量档上各取一套图像,按拉丁方设计安排读片,用官方公式算净得分。读片人少于三人,结论基本不能写进论文;模拟这一层必须写清楚,不能让人以为图像是真实低剂量采集的。科室若有真实低剂量数据,最好的做法是做一次桥接:在同一批病例上比较模拟与真实低剂量的图像统计特性,给出差值,再用这个差值校正结论。
做产品的工程团队。 目标多半是先做一个可演示的原型,再谈授权。最短路径是用第三方镜像把原型跑起来,因为镜像只有图像层、体量小、上手快。但两件事要提前想清楚:原型阶段的数据和最终验证的数据不是一回事,镜像不随官方修订同步;许可不允许直接商用,授权流程越早启动越好。原型跑通之后,建议回到官方库用投影层做一次端到端验证,确认方法在真实投影上也能收敛。
9.2 一条最短的可用流程
下面这条流程把前面各节的要点串起来,从零到一个可以写进论文的数字。命令按顺序执行,路径按各自的下载方式调整。
#-- 一、环境
python3.11 -m venv venv-ldct && source venv-ldct/bin/activate
pip install pydicom numpy scipy pandas scikit-image matplotlib
#-- 二、取一例验证链路(此处以本地已解开的目录为例)
python3.11 - <<'PY'
import pydicom
from pathlib import Path
import numpy as np
d = Path("./data/L123/full/images/B30_3mm")
fs = sorted(d.glob("*.dcm"))
ds = pydicom.dcmread(fs[0])
arr = ds.pixel_array.astype(np.float32)
hu = arr * float(getattr(ds, "RescaleSlope", 1.0)) + float(getattr(ds, "RescaleIntercept", 0.0))
print("切片", len(fs), "HU 范围", hu.min(), hu.max())
PY
#-- 三、建索引
python3.11 build_index.py --root ./data --out index.csv
#-- 四、按受检者划分
python3.11 split_by_patient.py --index index.csv --seed 20261026 --out splits/
#-- 五、跑对照
python3.11 evaluate.py --splits splits/ --kernel B30 --thickness 3 --window -160 240
这条流程里第三步到第五步的脚本官方没有提供,需要自己写。§5.4 与 §5.5 给出了核心逻辑,可以直接搬。第五步的窗区间必须与论文一致,改窗等于换了一套实验。
§4.1 的案例里那位受检者,如果按这条流程走,会落在测试侧或训练侧二者之一,绝不会同时出现在两侧——这正是 §5.5 那段划分代码要保证的事。
9.3 引用方式
引用这份数据时需要同时交代三件事:挑战赛本身、官方库、以及实际使用的那一层。
| 引用对象 | 用途 | 备注 |
|---|---|---|
| 挑战赛总述论文 | 说明数据来源与比赛设计 | 发表于《医学物理》当年专刊 |
| 公开库数据论文 | 说明公开库的规模与格式 | 2021 年发表,含库的 DOI |
| 库的 DOI | 定位具体版本 | 附录 A 给出 |
| 受检者清单 | 保证可复现 | 官方未强制,但几乎必被追问 |
如果使用了投影层,还应当引用 DICOM-CT-PD 格式的说明与随数据附送的用户手册;如果使用了第三方镜像,应当在方法一节明确写出镜像来源与获取日期。
§10 AI 使用声明
| 项 | 说明 |
|---|---|
| 写作方式 | AI 辅助起草,人工核对事实、结构与数字 |
| 事实来源 | AAPM 项目页、库说明论文摘要、Kaggle 镜像页元描述 |
| 数字核对 | 硬数字均在附录 A 标注来源与层级,无法核实的标为未核实 |
| 未核实项 | 更低两档的噪声插入参数;腹部支确切例数;镜像目录命名 |
| 影像内容 | 未查看原始影像,描述来自官方页面与论文摘要 |
| 站点核对 | TCIA 与 Mayo 页面核验时访问受限,相关描述取自 AAPM 页面转述 |
| 修改建议 | 数字与官方不一致时以官方页面为准 |
| 免责 | 本页不构成法律意见 |
| 更新日期 | 2026-10-26 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 「四个剂量档都是真实采集的」 | 只有原始剂量是采集得到的,其余由投影域插入噪声模拟 | 挑战赛页面「噪声插入以模拟降低剂量」一节 |
| 「训练集有三十例」 | 训练十例、测试二十例,三十是两者之和 | 页面两节分别写明 |
| 「测试集可以算峰值信噪比」 | 2016 年测试集只给低剂量,不给高剂量参照 | 页面明确写「不提供全剂量数据」 |
| 「有分割掩码」 | 只有病灶位置与类型,没有像素级轮廓 | 真值由读片人标注位置,非逐层勾画 |
| 「可以直接商用」 | 学术使用协议,商用须单独申请 | 平台无共享许可,条款限非商业研究 |
| 「可以直接训练大模型」 | 体量偏小且无官方划分,易过拟合 | 库说明的总量与无划分事实 |
| 「模拟低剂量等于真实低剂量」 | 噪声统计接近,但缺电子噪声与真实伪影 | 模拟在投影域插入,共享同一次采集 |
| 「Kaggle 镜像就是官方数据」 | 第三方转载,只有图像层,不随官方修订 | 镜像页描述只提图像扫描 |
| 「结论可以外推到别家医院」 | 全部病例来自单中心单系列机型 | 页面写明「相似机型」与固定参考电压 |
| 「病灶谱覆盖完整」 | 病灶上限五个、单病灶三厘米,复杂病例被排除 | 页面入选与排除条件 |
| 「按切片随机划分没问题」 | 相邻切片高度相关,指标会虚高 | 配对结构的直接后果 |
| 「比赛还在进行」 | 2016 年已结束,报名早已关闭 | 页面注册一节写明已关闭 |
FAQ
Q1:它到底有几个剂量档?
按社区通行说法是四档:原始、四分之一、十分之一、二十分之一。但官方材料只明确了前两档的方法,更低两档见镜像说明。论文里建议只写有把握的那几档,并注明来源。
Q2:为什么腹部病例全部来自西门子?
因为采集方是同一家医院。同一系列机型能保证重建核与噪声结构一致,这对「只改变剂量这一个变量」是必要的,代价是跨厂商问题没法回答。
Q3:投影数据怎么读?
先加载随数据附送的标签字典,再按字典解析投影矩阵与几何。官方给了用户手册与读取工具,但没有可直接 pip 安装的包,代码要自己写,写完用体模数据自检。
Q4:能不能只下图像不下投影?
可以。第三方镜像就只有图像层。但如果做的是重建方向的研究,投影层是这份数据最稀缺的部分,放弃它等于放弃最大的差异化。
Q5:两百多例够训练一个去噪网络吗?
作为唯一训练源偏少,易过拟合。常见做法是用它微调或评测,训练主体放在更大的数据上;只用它训练的论文都会做严格增广与交叉验证。
Q6:官方给训练测试划分了吗?
2016 年的比赛划分有(十例训练、二十例测试),但那不是为长期使用设计的。公开库本身没有划分文件,必须自己按受检者重划并公开。
Q7:为什么强调按受检者划分?
同一受检者的相邻切片高度相似。按切片随机划分时,模型训练时见过某人的肝脏,测试时又遇到他的另一层,性能会明显偏高,而且高得不动声色。
Q8:模拟低剂量和真实低剂量差多少?
没有统一答案。能确定的是:模拟保留了同一段采集几何与同一次体动,缺少真实低剂量采集时的电子噪声变化与再摆位差异。差多少取决于协议与算法,需用自己的真实低剂量数据标定。
Q9:读了片之后分数怎么算?
按官方公式。病灶级:命中加一,误报减一,漏报减一,除以病灶总数乘一百。病例级:判对加一,判错减一,除以二十乘一百。两者取算术平均,允许负分。
Q10:它和 2020 年那套 Mayo 数据什么关系?
两套不同的数据。本套以腹部增强为主,剂量档少而粗;2020 年那套面向胸部平扫与肺结节筛查,剂量阶梯更细。社区里常笼统称它们为 Mayo 低剂量 CT,选型时必须按解剖与剂量档区分。
Q11:Kaggle 那份 20 GB 镜像能直接用吗?
做原型可以,做正式实验不建议。它只有图像层、不随官方修订同步、目录命名也没保证。用它跑出的数字,一旦被追问原始投影就答不上来。
Q12:方法只能在图像域做,还有价值吗?
有,但价值打折。图像域方法只要图像层,这份数据与别的配对集差别不大;独特价值集中在投影层与多档剂量的组合。
Q13:可以先只做一个小实验吗?
可以,而且推荐。取一名受检者、一个重建核、两档剂量,把读取、换算、配对、指标四步走通,一两天就能完成,这条小链路上的每个坑都会在放大到全量之前暴露。
Q14:库内还有哪些资源可以配合使用?
跨设备对比配 ct4harmonization-multicentric,质量评分配 ldctiqac2023,器官分割配 lctsc。三者与它的关系是串联,见 §6.1。
术语表
| 术语 | 展开 | 含义 |
|---|---|---|
| 投影域 | projection domain | 探测器读数所在域,位于重建之前 |
| 图像域 | image domain | 重建之后的断层图像所在域 |
| DICOM-CT-PD | DICOM CT Projection Data | 存放 CT 投影与采集几何的扩展 DICOM 格式 |
| 噪声插入 | noise insertion | 投影域加噪以模拟更低剂量采集 |
| 泊松噪声 | Poisson noise | 光子计数服从泊松分布时的统计噪声 |
| 等效入射光子数 | noise-equivalent quanta | 每帧入射光子数当量 |
| 迭代重建 | iterative reconstruction | 反复求解模型与数据一致性 |
| 滤波反投影 | filtered backprojection | 经典解析重建,快但噪声敏感 |
| 重建核 | reconstruction kernel | 重建卷积核,决定锐度与噪声质感 |
| 门静脉期 | portal venous phase | 注射后约七十秒的增强时相 |
| 飞行焦点 | flying focal spot | 焦点快速切换以提高采样密度 |
| 拉丁方设计 | Latin square design | 平衡多因素的实验排布 |
| JAFROC | Jackknife Alternative FROC | 考虑置信度的观察者性能指标 |
| 全参考指标 | full-reference metric | 需参照图像才能算的指标 |
| 峰值信噪比 | PSNR | 全参考指标,对整体误差敏感 |
| 结构相似度 | SSIM | 全参考指标,对结构信息敏感 |
| 锥形束伪影 | cone-beam artifact | 锥形束采样不足时的结构性伪影 |
| 域适应 | domain adaptation | 让模型在目标域也能工作 |
| 受检者级划分 | patient-level split | 按受检者而非切片划分,避免泄漏 |
| 灰阶换算 | HU rescale | 用斜率与截距换算成 Hounsfield 单位 |
| 学术使用协议 | academic use agreement | 限定非商业研究用途的条款 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 挑战赛训练病例 | 10 例 | AAPM 项目页「训练数据」 | 官方页面 |
| 挑战赛测试病例 | 20 例 | AAPM 项目页「测试数据集」 | 官方页面 |
| 挑战赛报名单位 | 20 家 | AAPM 项目页「统计考虑」 | 官方页面 |
| 读片人数 | 11 名 | 比赛总述论文摘要 | 论文摘要 |
| 公开库总规模 | 250 余例检查 | 2021 年库说明论文摘要 | 论文摘要 |
| 挑战赛体模扫描 | 1 例 ACR 体模 | AAPM 项目页 | 官方页面 |
| 体模曝光档 | 120 千伏下 200 与 50 有效毫安秒 | AAPM 项目页 | 官方页面 |
| 参考管电压 | 120 千伏 | AAPM 项目页 | 官方页面 |
| 参考有效毫安秒 | 200 | AAPM 项目页 | 官方页面 |
| 对比剂时相 | 注射后 70 秒,门静脉期 | AAPM 项目页 | 官方页面 |
| 重建核 | B30 中频、D45 锐利 | AAPM 项目页 | 官方页面 |
| 测试图像层厚 | 1 毫米或 3 毫米 | AAPM 项目页 | 官方页面 |
| 提交图像规格 | 3 毫米层厚、2 毫米间隔 | AAPM 项目页 | 官方页面 |
| 训练期开始 | 2016-01-18 | AAPM 项目页时间线 | 官方页面 |
| 测试期开始 | 2016-02-01 | AAPM 项目页时间线 | 官方页面 |
| 交卷截止 | 2016-04-30 | AAPM 项目页时间线 | 官方页面 |
| 库 DOI | 10.7937/9npb-2637 | 库说明论文摘要 | 论文摘要 |
| 库说明论文 DOI | 10.1002/mp.14594 | Europe PMC 检索结果 | 论文摘要 |
| 比赛总述论文 DOI | 10.1002/mp.12345 | Europe PMC 检索结果 | 论文摘要 |
| 镜像下载量 | 12,100 次 | 项目清单记录 | 未核实(页面动态渲染) |
| 镜像体量 | 20 GB | 项目清单记录 | 未核实(同上) |
| 镜像文件数 | 133,025 个 | 项目清单记录 | 未核实(同上) |
| 十分之一与二十分之一档参数 | 未核实 | 官方页面未见 | 未核实 |
附录 B:数字的来源分层
第一层,官方页面。 AAPM 的挑战赛项目页把任务、材料、时间线、评分规则写全了,涉及 2016 年比赛本身的事实都以它为准。局限是页面不提供数据下载,对公开库只有一句话的转述。
第二层,论文摘要。 库说明论文的摘要给出公开库规模与三类指征,以及投影格式的名称与用途;比赛总述论文的摘要给出读片人构成与评分方法。摘要之外的内容没有逐句核对,凡引用的都在附录 A 写明。
第三层,未核实。 一是更低两档剂量的噪声插入参数,官方页面找不到;二是镜像的下载量、体量、文件数,来源是项目清单而非 Kaggle 页面本身,该页面为动态渲染、核验时取不到静态文本;三是公开库腹部支的确切例数,库说明只给了三类合计。
第三层里的镜像数字在传播中很容易被当成官方数字。它们描述的是一份第三方转载的副本,与官方库的规模没有一一对应关系。
附录 C:完整参考文献
| 编号 | 文献 | 类型 | 可用于支撑 |
|---|---|---|---|
| R1 | AAPM, Low Dose CT Grand Challenge 项目页 | 官方网页 | 任务、材料、时间线、评分、采集参数 |
| R2 | Moen TR 等, Low-dose CT image and projection dataset, Medical Physics, 2021, DOI 10.1002/mp.14594 | 论文 | 公开库规模、三类指征、投影格式 |
| R3 | McCollough CH 等, Low-dose CT for the detection and classification of metastatic liver lesions: Results of the 2016 Low Dose CT Grand Challenge, Medical Physics, 2017, DOI 10.1002/mp.12345 | 论文 | 比赛设计、读片构成、评分结果 |
| R4 | TCIA, LDCT-and-Projection-data 集合页, DOI 10.7937/9npb-2637 | 数据仓储 | 库的定位与下载入口 |
| R5 | Kaggle 镜像 ct-low-dose-reconstruction | 第三方镜像 | 图像层整理方式与标签表 |
| R6 | Flohr TG 等, Image reconstruction and image quality evaluation for a 64-slice CT scanner with z-flying focal spot, Medical Physics, 2005 | 论文 | 页面所引的飞行焦点技术说明 |
| R7 | Kachelrieß M 等, Flying focal spot in cone-beam CT, IEEE TNS, 2006 | 论文 | 同上 |
附录 D:任务代码
题目:给定一对同受检者、同重建核、同层厚的原始剂量与低剂量体数据,写一个函数,按固定腹部窗把两侧换算到同一尺度,逐层算结构相似度,返回每一层的分数与中位数。要求不依赖任何外部数据,只依赖 numpy 与 scikit-image。
#-- 参考答案:逐层 SSIM,窗固定,不改变原始数据
import numpy as np
from skimage.metrics import structural_similarity
def abdomen_window(x, lo=-160.0, hi=240.0):
#-- 全局固定窗,绝不做逐图标准化,否则剂量差异会被抹掉
return np.clip((x - lo) / (hi - lo), 0.0, 1.0)
def per_slice_ssim(full_vol, low_vol, lo=-160.0, hi=240.0):
#-- full_vol 与 low_vol 形状必须一致、切片已按位置排序
assert full_vol.shape == low_vol.shape, "两侧形状不一致,先检查层数与几何"
scores = []
for z in range(full_vol.shape[0]):
a = abdomen_window(full_vol[z], lo, hi)
b = abdomen_window(low_vol[z], lo, hi)
scores.append(float(structural_similarity(a, b, data_range=1.0)))
scores = np.asarray(scores)
return {
"per_slice": scores,
"median": float(np.median(scores)),
"p10": float(np.percentile(scores, 10)),
"worst_slice": int(np.argmin(scores)),
}
三个易错点:形状不一致时必须先检查层数与 ImagePositionPatient,不能靠裁剪对齐;窗区间必须与论文一致,改了窗等于换了实验;最差切片的位置要单独看,因为在低剂量档上最差的往往是膈顶或肠气交界这类高对比界面,那里的失败模式与常规噪声不同。
附录 E:如果只记五件事
- 它的稀缺性在于「同一段解剖、多档剂量、成对可比」,不在于体量。
- 四档里真正采集的只有原始剂量,其余由投影域插入噪声模拟。
- 评分不靠图像指标,靠放射科医师读片与拉丁方设计,这是它最值得借鉴的方法学。
- 2016 年的测试集只给低剂量,全参考指标不能直接在那上面算。
- 商用不行;跨厂商结论给不了;按受检者划分是底线。
编辑说明
事实核对以 AAPM 项目页(R1)与两篇论文摘要(R2、R3)为主,另参考项目清单对 Kaggle 镜像的记录。核验时 TCIA 与 Mayo 数据页访问受限,相关描述取自 R1 转述与 R2 摘要。影像内容未查看。更低两档噪声参数、腹部支确切例数、镜像下载量与体量,均在附录 A 标为未核实。
校核与撰写方法见附录 B;本页为静态文本,不随官方页面自动同步。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- acouslic-ai — 共享标签:医学影像 / 挑战赛数据集 / 图像分类
- stoic — 共享标签:医学影像 / CT / 挑战赛数据集 / 图像分类
- rsna-intracranial-hemorrhage — 共享标签:医学影像 / CT / 挑战赛数据集 / 图像分类
- ct-ich — 共享标签:医学影像 / CT / 挑战赛数据集 / 图像分类
- covid-ct — 共享标签:医学影像 / CT / 图像分类
- sar-covid — 共享标签:医学影像 / CT / 图像分类
- radimagenet — 共享标签:医学影像 / CT / 图像分类
- rad-chestct — 共享标签:医学影像 / CT / 图像分类
- chestpathct5-s100 — 共享标签:医学影像 / CT / 图像分类
- amplifai — 共享标签:医学影像 / CT / 挑战赛数据集 / 图像分类
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

