信息速览
LiTS 是 2017 年随 IEEE ISBI 与国际 MICCAI 两场会议举办的肝脏肿瘤分割挑战赛数据基准。它的任务只有一句话:在一张腹部增强 CT 上,先找到肝脏,再在肝脏里找到肿瘤。听起来像两个可以顺带完成的小任务,实际是医学影像领域最难被干净解决的一类问题——大的那个目标(肝)已经被做到 0.96 以上,小的那个目标(肿瘤)三届赛事都没能越过 0.74。
它的价值恰好来自这种不对称。201 例来自德、荷、加、法、以五国七家机构的 CT,把「多中心、多设备、多病灶形态」这层现实噪声一次性摆到台面上,让「在自家数据上很好、换家医院就掉点」这件事第一次有了公开对照的标准场地。它也顺手贡献了 Medical Segmentation Decathlon 的肝脏任务,成为后续几乎所有腹部病灶工作绕不开的预训练源。
难点在于怎么读它的成绩。本篇反复强调一件事:LiTS 的分数里藏着两个尺度完全不同的任务,把它们混在一起报告,是这个数据集最普遍、也最难被察觉的误用。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 数据集全称 | LiTS: The Liver Tumor Segmentation Benchmark(Liver Tumor Segmentation Challenge 2017) |
| 举办机构 | 慕尼黑工业大学主导,联合 Radboud、Polytechnique Montréal/CHUM、IRCAD、Sheba、Hadassah 等机构 |
| 举办年份 | 2017 年起,分 ISBI 2017、MICCAI 2017、MICCAI 2018 三届 |
| 模态 | 腹部增强 CT(含门静脉期等多种期相,未按期相分层发布) |
| 样本总量 | 201 例(131 例训练 + 70 例测试),其中 194 例含病灶 |
| 标注类别 | 肝脏掩膜、肿瘤掩膜,均为二值,肿瘤不分活性与坏死 |
| 数据格式 | NIfTI(.nii / .nii.gz),社区另有 PNG 镜像与 MSD 重打包版 |
| 空间分辨率 | 层厚 0.45–6.0 mm,面内 0.56–1.0 mm,轴向 42–1026 层 |
| 中心分布 | 5 国 7 院,训练 131 例与测试 70 例的中心构成相似 |
| 评测指标 | 分割 Dice、ASD、MSSD、RVD;检出 Precision / Recall / F1(按病灶直径分级) |
| 最佳肝脏 Dice | 0.963(MICCAI 2017) |
| 最佳肿瘤 Dice | 0.674 / 0.702 / 0.739(三届依次) |
| 最佳病灶召回 | 0.458 / 0.515 / 0.554(三届依次) |
| 论文 | Bilic P, et al. Medical Image Analysis 84: 102680, 2023 |
| 许可 | CC BY-NC-SA(官方口径);下游镜像有 CC BY-NC-ND 变体 |
| 测试集标注 | 不公开,只在 CodaLab 服务器端评估 |
§1 它要解决的具体麻烦
1.1 你的模型报出了 0.96,但它说的其实是肝脏
2017 年之前,肝脏分割已不算难题:阈值、区域生长、统计形状模型在几十例临床数据上就能到 0.9 上下,密集预测网络一来又把这层天花板顶到 0.95 以上。LiTS 出现的时点,恰好是「肝脏已经做得很好、肿瘤还完全不行」的分水岭。
它把两个任务捆在一起发布,不是要人一次解决两件事,而是逼参赛者面对同一张片子上大目标与小目标的难度差:肝脏一例有一千多毫升、边界不规则但连续;肿瘤可能是直径一厘米的小结,几十个体素,还被灌注异常区裹着。两者的 Dice 放进同一张表,很容易让人误以为「模型整体已经很强」。
判断一个 LiTS 分数是什么,只需要问一句:这是哪个类别的 Dice,按什么方式聚合的。如果论文只写「Dice 0.96」,八成是肝脏;如果写「肿瘤 Dice 0.75」,那才是这个数据集真正在考的东西。这条区分是后面所有讨论的地基。
1.2 三条常见的错误期待
第一条是把它当成「肿瘤分割已经解决」的证据。三届赛事的最佳肿瘤 Dice 停在零点七四,病灶级召回停在零点五五,也就是说将近一半的病灶根本没被完整找到。这两个数字从 2017 年到 2018 年只挪动了不到七个点,此后十年里公开报告的改进大多来自更强的骨干网络与集成策略,而不是对边界歧义的解决。拿一个零点九以上的数字宣称攻克,几乎总是把肝脏算进去了。
第二条是把它当成「多中心泛化」的证明。官方论文自己写得很清楚:训练集与测试集来自同一批机构的相似分布,因此 LiTS 并没有评测对未见中心的泛化。这句话常被二手介绍略去。七家机构确实带来了设备与人群差异,但这层差异在训练与测试两侧是同步出现的,模型不需要跨过它就能拿分。
第三条是把它当成「可复现的榜单」。标注不公开,官方也承认测试影像下发后防不住反复提交的过拟合。你能复现的只有训练集交叉验证,那个数与榜单不可比。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 一份带肝与肿瘤掩膜的腹部 CT | 131 例带标注训练集,二值双掩膜 | 够做基线,够做交叉验证 |
| 一个公开、权威、可引用的榜单 | CodaLab 排行榜与论文汇总 | 够引用,但榜单自 2018 年后基本静止 |
| 一个可以离线复现的测试集 | 测试影像公开、标注不公开 | 不够,只能在线提交 |
| 跨设备、跨国家的数据多样性 | 5 国 7 院,层厚跨度 0.45–6.0 mm | 够做设备分层分析 |
| 对未见中心泛化的证据 | 训练与测试中心分布相似 | 不够,官方自陈未评测 |
| 区分活性肿瘤与坏死、囊变 | 只有二值肿瘤掩膜 | 不够,须另找带亚区标注的数据 |
| 病灶级检出评估 | 官方提供 Precision / Recall / F1 与直径分级 | 够,论文附录给了完整协议 |
| 随访、治疗反应、病理分级 | 完全没有 | 不够,纯影像基准 |
| 可直接商用的数据 | CC BY-NC-SA,非商业 | 不够,商用需另议 |
| 与报告文本的配对 | 无文本,无报告 | 不够,属多模态数据之外的类别 |
读法是从下往上:越靠下的需求越容易被高估。多数团队真正需要的是第二行与第七行——一个可引用的榜单、一套病灶级评估协议;而大家以为需要的第一行,恰恰最容易替代。
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 刚接手一个肝脏分割项目,需要一份公认的起点 | 131 例训练集加成熟的开源基线,一周内能出第一个可发表的对照 | 先用 nnU-Net 跑五折,把肝与肿瘤分开报,别只报一个总数 |
| 论文里需要一个「通用腹部病灶基准」作为第三方对照 | 它是肝方向被引最多的公开基准之一,评审认得 | 写清你用的是 131 例自切还是官方测试集,两者不可混谈 |
| 模型在医院 A 上很好,换医院 B 就掉点 | 七家机构的层厚与设备差异可以当压力测试 | 按层厚或机构分组做分层评测,先定位掉点是不是分辨率造成的 |
| 想做小病灶检出,而不是像素重叠 | 官方给了按直径分级的病灶级指标与协议 | 别只看 Dice,把小于 10 mm 一档单独拎出来算 Recall |
| 要评估术后随访或疗效 | 数据没有任何时间维度 | 放弃这条路,改找带纵向随访的队列 |
| 想拿它训练一个商用分割器 | 许可是非商业的 | 先找官方确认商用条款,或改用许可干净的数据 |
| 想做分割加重建的联合模型 | 只提供掩膜,没有报告 | 另找带报告的数据,或自己做配对 |
1.5 一句话判断
如果你的问题里有「小目标」「边界歧义」「多中心设备差异」中的任何一个,LiTS 是必须过一遍的场地;如果你的问题只是「把肝脏勾出来」,它的肝脏部分在今天已经算不上难点,真正的价值全在肿瘤那一半。
1.6 不适合谁:四条边界
第一条,不适合把结果直接写进产品验证材料的团队。非商业许可、两百例上下、测试集不可复现,三条加起来只能支撑方法学章节,不能支撑性能验证。
第二条,不适合需要病灶亚区信息的研究。二值掩膜把活性肿瘤、坏死、囊变、治疗后纤维化压成同一个标签,做放疗靶区、疗效预测、影像组学的团队拿不到需要的粒度。
第三条,不适合需要人群多样性的公平性研究。五国七院看似国际,实际是人口结构相近的高收入国家,且没有任何人口学字段,连分层变量都不给。
第四条,不适合拿测试集成绩做主结论。标注不公开、防不住过拟合,「测试集达到某分数」本身不构成证据;能构成证据的是训练集上的严格交叉验证加一个可第三方重跑的划分。
§2 数据构成与规格
2.1 一份数据,四种拿到手的形态
LiTS 在社区里的流传形态比官方发布时多得多,这是初次接触最容易踩坑的地方。目前至少有四种版本在流通,它们的标签语义、体素间距处理、样本量都不同。
第一种是官方原始版本:131 例训练加 70 例测试,NIfTI 格式,保留原始体素间距与层厚,标签是同一文件里的整数编码。这是论文使用的口径,也是唯一与官方评估一致的版本。
第二种是 Medical Segmentation Decathlon 的 Task03_Liver:只含 131 例训练集,重打包成 Decathlon 的统一目录结构,标签合并为二值加背景。它少了测试集,但目录规范,直接能喂进 nnU-Net。
第三种是各类 PNG 镜像:把切层缩放到固定尺寸逐层导出,常见的是 256×256。这套东西在 Kaggle 上流传极广,带有 liver mask 与 lesion mask 两个独立掩膜。它的好处是能直接做 2D 实验,坏处是体素间距信息彻底丢失,任何体积类指标都失去意义。
第四种是各家论文的预处理缓存:重采样、裁包围盒、按窗宽窗位归一。它不进公开渠道,却常是高分工作实际用的输入。
选哪种取决于要回答什么问题:对齐榜单只能用第一种,做原型用第二种,复现论文先问清它用的哪一种。
| 形态 | 样本量 | 格式 | 标签编码 | 适合的用途 | 主要代价 |
|---|---|---|---|---|---|
| 官方原始版 | 131 + 70 | NIfTI | 0 背景 / 1 肝 / 2 肿瘤 | 论文口径、官方对齐 | 需自己处理间距与各向异性 |
| MSD Task03 | 131 | NIfTI + JSON | 0 / 1 / 2 | nnU-Net 直接可跑 | 无测试集,无中心信息 |
| PNG 镜像 | 130 | 逐层 PNG | 两枚独立掩膜 | 2D 快速实验、教学 | 间距丢失,体积指标失效 |
| 论文自建缓存 | 不定 | 各家自定 | 各家自定 | 复现特定工作 | 无法与别人对齐 |
还有一处差异很少被写进说明,却直接影响结果:肿瘤体素与肝脏掩膜的包含关系。官方原始标注里肿瘤通常被从肝脏掩膜中挖掉,MSD 沿用这一做法,PNG 镜像则拆成两张图,是否重叠取决于导出脚本。这个差别会让肝脏 Dice 差出几个点。
为了把这件事说清,下面按「拿到手第一件事要查什么」列一张表。这张表的每一行都是一次五分钟内能完成的检查,但每一项没查清,后面的实验结论都可能被它污染。
| 要检查的项 | 怎么查 | 查到什么代表正常 | 查到什么要停下来 |
|---|---|---|---|
| 影像与标注是否同一网格 | 比对两份文件头的 dim 与 affine | 完全一致 | 有任何一维不同,说明被重采样过 |
| 肿瘤是否从肝里挖掉 | 统计 (肝掩膜 & 肿瘤掩膜) 的体素数为零对非零 | 为零,即不重叠 | 非零说明是嵌套写法,须改评测口径 |
| 是否有空病例 | 逐例统计肿瘤体素和 | 极少数病例为零 | 大量为零,说明标签文件读错或错位 |
| 朝向是否统一 | 读 affine 的符号矩阵 | 同号为主 | 出现镜像翻转,须统一后再拼接 |
| 文件配对是否完整 | 影像数与标注数是否相等 | 相等 | 不等,说明有病例缺标注 |
| 编号是否从零连续 | 列出 volume 编号排序 | 连续或仅缺少量 | 跳号多,说明分卷未下全 |
2.2 体数据本身:为什么不能把它当成「一堆切片」
把 LiTS 当成二维图像集合处理,是入门最省事也最容易出错的路径。多数病例层厚在毫米量级、面内间距在亚毫米量级,同一枚球形病灶在轴位切层里呈圆,在冠状重建里却呈椭圆。逐层处理再堆回三维,会在层间产生阶梯伪影,Dice 看着还行,表面距离已经变差。
官方同时给 ASD、MSSD、RVD 三个表面与体积类指标,正是为了抓这类问题。做方法对比时如果只报 Dice,很难排除「猜了个差不多的球」。
2.3 字段与记录的完整字典
LiTS 没有一份官方发布的结构化元数据表,这是它和后来那些「数据加 CSV」的基准最不一样的地方。你在 131 个病例文件夹里能拿到的所有信息,都是影像头文件里的 DICOM 残留字段与文件名本身。下表把可用字段与它们的来源逐条列清楚。
| 字段 | 所在位置 | 类型 | 取值示例 | 对使用的意义 |
|---|---|---|---|---|
| Volume / volume-n | 文件夹与文件名 | 字符串 | volume-0.nii, volume-127.nii | 病例主键,与 segmentation-n 一一对应 |
| segmentation-n | 标注文件名 | 字符串 | segmentation-23.nii | 标签文件,同一文件内含肝与肿瘤 |
| voxel spacing | NIfTI 头 pixdim | 浮点三元组 | 0.7 × 0.7 × 1.0 | 决定体积换算,各向异性极强 |
| slice thickness | 头文件 z 方向间距 | 浮点 | 0.45–6.0 mm | 影响小病灶可分辨性,是分层评测的第一维度 |
| in-plane spacing | 头文件 x/y 间距 | 浮点 | 0.56–1.0 mm | 面内分辨率普遍优于层间 |
| slice count | 头文件 dim | 整数 | 42–1026 | 扫描范围差异极大,短扫描可能截断肝顶 |
| rows / columns | 头文件 dim | 整数 | 512 × 512 为主 | 决定原始视野,跨中心不完全一致 |
| image orientation | 头文件方向矩阵 | 浮点矩阵 | 多为 RAS 或 LPS | 直接拼接不同病例会得到镜像翻转 |
| patient ID(残留) | 头文件或 DICOM 域 | 字符串 | 已被替换为占位符 | 不可用于跨病例追踪,也不应尝试还原 |
| study date(残留) | DICOM 域 | 日期 | 多数被清空 | 不可用于时间分析 |
| center of origin | 论文附表 | 文本 | TUM / Radboud / CHUM … | 只在论文里有,影像文件内没有 |
| lesion count | 需自行从掩膜计算 | 整数 | 0–多枚 | 病灶级指标的分母 |
| has_lesion | 需自行计算 | 布尔 | 真 / 假 | 全队列 7 例为假 |
| liver volume | 需自行计算 | 浮点 | 千余毫升量级 | 评估肝脏侧是否合理的最快检查 |
| tumor burden | 需自行计算 | 浮点 | 差异极大 | 小肿瘤病例里常低于全图的万分之一 |
这张表里最重要的一行是最后一行。肿瘤负担的分布极度右偏:多数病例的肿瘤体素占全图的比例小到可以忽略,少数大肝癌病例又可能占到肝脏的很大一块。任何一个不做加权的总体 Dice,都会被这少数大病灶主导。
字段的稀缺还带来一个直接后果:你无法按性别、年龄、期相做分层。论文里能查到机构与层厚,影像文件里查不到。要做这类分析,只能自己按机构编号反推,而编号与机构的对应关系只在论文附表里,不在数据里。
2.4 一条记录的完整解剖
下面用一个虚构但符合真实结构的病例,把一例在磁盘上的样子走一遍。编号与数值都是示意,结构是对应的。
dataset/Training Batch 1/volume-42.nii 影像体数据,int16,Hounsfield 单位
dataset/Training Batch 1/segmentation-42.nii 标签体数据,uint8,0/1/2
#-- 头文件里能读出的事实(示意值)
dim 512 512 180
pixdim 0.78 0.78 1.50 #-- 面内亚毫米,层间一点五毫米
datatype int16
scl_slope 1.0
orientation LPS
#-- 标签里能数出来的事实(示意值)
label 1 体素数 约 1.6e6 → 肝脏,按间距换算近千毫升
label 2 体素数 约 3.2e3 → 一枚约 12 毫米的病灶
连通域个数 1
关键读法有三点。
第一,影像与标注是同一套体素网格上的两个文件,不做任何重采样。这意味着你不能把一份重采样过的预测直接与原始标注比较 Dice,必须先还原回原始网格。
第二,层厚一点五毫米配上亚毫米面内间距,是一个典型的高度各向异性体数据。如果你按体素计数算体积,等于默认三个方向等长,会把体积算错一大截。正确做法是体积乘上三个方向的间距。
第三,标签值 1 与 2 是并列的,不是嵌套的。肿瘤掩膜在多数实现里与肝脏掩膜不重叠,也就是肿瘤体素被从肝脏里挖掉了;也有实现是肿瘤包含在肝里。这两种做法算出来的肝脏 Dice 会差出几个点,跨论文比较时必须先问清是哪一种。这个细节在官方说明里没有逐字强调,却是复现时最常见的对不齐来源。
下面这段代码把一例的间距、体积与肿瘤负担一次算清楚,是拿到数据后应当先跑的自检。
#-- 读一例,核对间距、体积与肿瘤负担
import nibabel as nib
import numpy as np
img = nib.load("dataset/Training Batch 1/volume-42.nii")
seg = nib.load("dataset/Training Batch 1/segmentation-42.nii")
spacing = img.header.get_zooms()[:3] #-- 三个方向的体素间距,单位毫米
voxel_ml = float(np.prod(spacing)) / 1000.0
lab = np.asanyarray(seg.data_ndarray).astype(np.uint8)
img_arr = np.asanyarray(img.dataobj).astype(np.int16)
liver_vox = int((lab == 1).sum())
tumor_vox = int((lab == 2).sum())
print("spacing(mm):", spacing)
print("liver mL :", round(liver_vox * voxel_ml, 1))
print("tumor mL :", round(tumor_vox * voxel_ml, 3))
print("tumor / whole-body image ratio:",
round(tumor_vox / lab.size, 6))
跑完这一例,你手上就有了全篇讨论的第一个量化锚点:肿瘤体积与全图体积之比。这个比值在多数病例里小到小数点后四五位,而它正是整体 Dice 对肿瘤几乎不敏感的根本原因。
2.5 三届赛事的成绩分布表
官方论文按三届赛事汇总了名次与分数。下表摘出每一届的最佳值与次佳区间,用来观察「天花板是否在移动」。
| 赛事 | 肝脏最佳 Dice | 肿瘤最佳 Dice | 肿瘤最佳召回 | 提交算法数 | 说明 |
|---|---|---|---|---|---|
| ISBI 2017 | 未单列 | 0.674 | 0.458 | 17 队注册、5 队展示 | 首届,赛道与数据同时上线 |
| MICCAI 2017 | 0.963 | 0.702 | 0.515 | 26 队 | 肿瘤 Dice 提升近三点 |
| MICCAI 2018(MSD) | 0.962 | 0.739 | 0.554 | 18 个有效提交 | 提升放缓,召回仍不到六成 |
| 赛后综合重排 | 未变 | 未变 | 未变 | — | 三项指标排名相加,名次与单指标有出入 |
三列放在一起看才有意义。肝脏侧从 0.963 到 0.962 几乎没动,说明任务在开赛时就已接近饱和;肿瘤侧三届分别提升约三点与三点七点,召回爬了不到五个点,到第三届结束仍有近一半病灶没被完整检出。
提交数从 26 队降到 18 个有效提交,未必说明热度下降——同期平台累计提交一直在涨——更可能说明门槛提高了。这与「肿瘤 Dice 难涨」是同一件事的两面。
2.6 与同类资源的字段差异
LiTS 常被拿来和几个邻居比较,但它们能给出的字段并不一样。下表按字段逐项对比,比笼统的「规模大小」更有用。
| 字段或能力 | LiTS | MSD Task03 | 3D-IRCADb | SLIVER07 | KiTS19 |
|---|---|---|---|---|---|
| 样本量 | 201(131 训练) | 131(仅训练集) | 20 例 | 30 例 | 300(210 训练) |
| 器官范围 | 肝 + 肿瘤 | 肝 + 肿瘤 | 肝 + 肿瘤 + 多器官 | 仅肝 | 肾 + 肿瘤 + 囊 |
| 肿瘤亚区 | 无,二值 | 无,二值 | 无,二值 | 不适用 | 囊与实性分开 |
| 中心数 | 7 | 7(继承) | 1 | 1 | 1 |
| 测试集标注 | 不公开 | 无测试集 | 无 | 不公开 | 不公开 |
| 临床元数据 | 无结构化字段 | 无 | 有限 | 无 | 有病理与分期字段 |
| 官方评估代码 | 有,服务器端 | 有,本地脚本 | 无统一脚本 | 有 | 有,本地可跑 |
| 许可 | CC BY-NC-SA | CC BY-SA 4.0 | 学术使用 | 学术使用 | CC BY-NC-SA |
逐项看下来,LiTS 的独特之处只有两条:中心数最多、有完整的病灶级评估协议。器官范围不如 3D-IRCADb 宽,元数据不如 KiTS 全,许可也不如 MSD 干净。三项劣势恰好解释了「拿 MSD 训练、拿 LiTS 验证」这个常见组合——不是 LiTS 数据更好,是它的多中心属性没法在别处替代。
§3 它的身份:一次把「大目标 vs 小目标」摆上台面的公开实验
2.7 规模在同类中的位置
把规模放到肝方向的时间线上,能更清楚它为什么是那个节点。
| 基准 | 年份 | 例数 | 任务范围 | 层厚跨度 | 中心数 |
|---|---|---|---|---|---|
| SLIVER07 | 2007 | 30 | 仅肝 | 未统一 | 1 |
| 3D-IRCADb | 2009 | 20 | 肝 + 肿瘤 + 多器官 | 较窄 | 1 |
| LiTS | 2017 | 201 | 肝 + 肿瘤 | 十三倍 | 7 |
| MSD Task03 | 2018 | 131 | 肝 + 肿瘤 | 十三倍 | 7 |
| KiTS19 | 2019 | 300 | 肾 + 肿瘤 + 囊 | 较窄 | 1 |
| AMOS22 | 2022 | 600 | 十五器官 | 较宽 | 2 |
| FLARE23 | 2023 | 数千 | 多器官 + 泛癌 | 很宽 | 多 |
两件事值得注意:LiTS 的规模优势只维持了不到两年,AMOS 与 FLARE 很快在体量上超过它;但中心数与层厚跨度的提升至今没被肝方向的后来者超越,因为后来的多中心数据集大多转向多器官。
3.1 名字里的 benchmark 是量尺,不是数据集
LiTS 的官方名是 benchmark,不是 dataset。这个措辞差别在中文语境里常被抹平,但它决定了这份数据的正确用法。
dataset 的隐含承诺是「给你一批干净的数据,你去建模」;benchmark 的隐含承诺是「给你一把尺子,你放上去量」。LiTS 的尺子有两段刻度:粗的一段量肝脏,细的一段量肿瘤,细的那段还额外配了一把病灶级的卡尺。三届赛事的核心发现不是「谁的模型更强」,而是「没有单一算法能同时在两段刻度上都最好」。
对使用者的含义很直接:只想量粗的那段,任何一份肝脏掩膜数据都行;只有需要量细的那段、还要跟历史上的公开成绩对齐时,它才不可替代。它的身份是标定物,不是燃料。既然这样,就得先问它能标出哪些差别。
| 差别类型 | 粗刻度(肝脏)能否分辨 | 细刻度(肿瘤)能否分辨 | 说明 |
|---|---|---|---|
| 网络结构带来的改进 | 分不出,早已饱和 | 能分辨,但差值很小 | 0.96 以上任何差别都在噪声范围内 |
| 预处理与重采样策略 | 能分辨,边界处最明显 | 能分辨,小病灶受影响最大 | 层厚归一的做法会在肿瘤上显出差异 |
| 后处理与形态学清理 | 能分辨,主要是小连通域 | 能分辨,但方向可能相反 | 过滤小连通域会同时删掉小病灶 |
| 损失函数与类别加权 | 分不出 | 能分辨 | 加权与否在肿瘤上差出较多 |
| 集成与测试时增强 | 能分辨,提升稳定 | 能分辨,提升更明显 | 小目标对增强的方差更敏感 |
| 跨中心设备差异 | 分不出,因为训练测试同源 | 分不出,原因相同 | 想量这一项必须自己另设外部中心 |
| 病灶检出能力 | 完全反映不出 | 能分辨,召回三届未过六成 | 检出要用病灶级指标,不能看 Dice |
最该记的是最后两行。多数论文想证明的恰好是「设备差异」与「检出能力」,而 LiTS 在这两项上分不出或反映不全,都得靠自建设置补。
3.2 七家机构、七个中心:多中心到底带来了什么
论文附表给了每家机构贡献的训练与测试病例数,这张表决定了「多中心」这个词的真实含量。
| 机构 | 国家 | 训练例数 | 测试例数 | 合计 |
|---|---|---|---|---|
| TUM Rechts der Isar | 德国 | 28 | 28 | 56 |
| Radboud University Medical Center | 荷兰 | 48 | 12 | 60 |
| Polytechnique Montréal / CHUM | 加拿大 | 30 | 25 | 55 |
| IRCAD | 法国 | 20 | 0 | 20 |
| Sheba Medical Center | 以色列 | 5 | 5 | 10 |
| Hadassah Medical Center | 以色列 | 合计 131 | 合计 70 | — |
两处值得停一下。IRCAD 给了二十例训练却没有任何测试例,法国这一支的设备与人群特征只出现在训练侧,模型可以靠它扩多样性,却没有机制检验它是否学对。两家以色列机构各只有五例测试,小到无法做机构级分层。
再逐行算一遍训练与测试的配比,还能看出一个更隐蔽的失衡:Radboud 的多数样本在训练侧,测试侧只放出十二例;CHUM 反过来。哪家机构的样本更容易被考到,在七个中心之间并不均等。
| 机构 | 训练占比 | 测试占比 | 配比偏差 | 使用含义 |
|---|---|---|---|---|
| TUM | 约两成 | 四成 | 测试侧偏重 | 该中心的手法在榜单上被放大的机会更大 |
| Radboud | 约四成 | 不到两成 | 训练侧偏重 | 训练数据主体,但成绩的代表性有限 |
| CHUM | 约两成 | 三成半 | 略偏测试 | 北美设备特征在两侧都有体现 |
| IRCAD | 约一成半 | 零 | 只在训练侧 | 法国数据从未被当作独立检验对象 |
| Sheba | 不足半成 | 约一成 | 样本量过小 | 无法做机构级结论 |
| Hadassah | 并入合计 | 并入合计 | 未单列 | 无法单独评估 |
用法是:模型在某家医院的真实数据上表现不好时,回来查这家医院在 LiTS 里的配比,看它是否本来就偏在训练或测试一侧。这不能证明因果,但能排除「数据集本身代表不足」这一种解释。
3.3 二值肿瘤掩膜:一个被低估的让步
从标签编码看,肿瘤只有一类,常被当作简化的优点,实际上这是这份数据最大的信息损失。增强 CT 上的肝细胞癌有两套常分开勾画的成分:动脉期强化的活性肿瘤,与坏死、囊变或栓塞后的低密度区。评估疗效看的恰恰是活性成分的变化,合并成一个标签等于抹掉了最有临床意义的那层信息。
这个让步有理由:任务简单才能让更多队伍参与,亚区标注需要更多专家时间,七个中心难以拉齐标准。但它埋下一个后果——所有在这份数据上刷分的模型,输出的都是「病灶包络体」而非「活性肿瘤」,拿去做疗效评估或放疗靶区会系统性高估照射范围。
3.4 这一例有没有病灶:七例的空白带来的麻烦
全队列两百例出头,只有七例完全无肿瘤。这个比例牵动一整套评测取舍。无病灶例一多,总体 Dice 会被「预测出病灶则零分、正确给空则拿满」这类极端情况拉偏,所以官方把检出指标单独做成一套,用 3D 连通域定义病灶。但七例太少,意味着模型几乎从未见过「干净的肝」,筛查场景里会把灌注不均、血管断面、胆管扩张误认成病灶。想把假阳性压下去,必须另配无病灶的肝脏数据——这是从研究推向筛查业务时第一道会撞上的墙。
§4 它的质量:难在边界,不难在规模
4.1 为什么肿瘤的 0.74 不是模型不行
把肿瘤 Dice 上不去归因于「网络不够强」,最常见也最省事,但经不起一个简单检验:若只是容量不足,更强的骨干、更大的集成、更多轮次应当持续推高这个数。实际是,三届之后的公开工作报告里,肿瘤 Dice 大多落在零点七到零点七五之间,偶见零点七八。
真正的原因有三层,而且层层叠加。
第一层是尺度。肿瘤多数只占全图万分之几,几十到几百个体素。Dice 是交并比,小集合的体积本身就限制了上限:同样一圈边界误差,小病灶的相对误差远大于大病灶,直径十毫米以下的病灶错掉一两层就掉到零点五以下。
第二层是边界争议。活性肿瘤的边缘常与灌注异常区、包膜、邻近血管断面混在一起,灰度是渐变而非突变,不同医生勾出来的范围差出好几毫米是常态。官方还承认过小且不确定的疑似病灶省略不标、每中心只有一名标注者——一部分本该算标注噪声的差异被外化成了模型误差。
第三层是评测口径。整体 Dice 按病例算完再平均,官方说这种方式对病灶少的病例惩罚更重。但一例只有一个极小病灶、被完全漏掉,会拉低均值;一例大肝癌被切碎,又会因体积大压过前者。分数在病例之间不是线性可加的。
三层叠加,零点七四与其说「还没做到」,不如说已接近这份标注能支撑的上限。要往上走,靠的是更好的标注协议而不是更好的网络。
4.2 案例:一例 12 毫米病灶如何吃掉整个病例的 Dice
这是全篇反复引用的一个具体场景,它同时出现在 §5 的取数决策、§7 的偏差清单与 FAQ 里。
设想一例:肝脏约一千四百毫升,里面只有一枚直径十二毫米的病灶,按球体近似约零点九毫升,占肝脏万分之六,占整幅影像更少。模型把肝脏勾得分毫不差,Dice 一点零,却把这枚病灶整个漏掉。
按原始定义算「前景 Dice」(肝与肿瘤合并成一类),漏掉零点九毫升只影响千分位以下的数字,最终仍在零点九九以上。你会看到一条漂亮曲线,而临床上最该被发现的东西被完全忽略。
换成「肿瘤 Dice」,分子为零,这例直接记零分,均值掉一大截。同一个模型、同一个预测,两种口径结论相反。§4.2 的案例说明的不是模型好坏,而是指标选择本身携带了多大的判断力。
更麻烦的是勾大了的情况:把这枚病灶勾成三毫升,包进一圈灌注异常区。肿瘤 Dice 约零点六,前景 Dice 依然在零点九八以上。于是论文可以同时写「整体 Dice 0.98」和「肿瘤 Dice 0.60」,两句都真,看的人却只记住前一句。
实用价值在于它给了个十分钟能做完的自检:挑五例小病灶病例,把前景 Dice 与肿瘤 Dice 并排算。差值小于零点一,口径基本安全;超过零点三,论文里那个「Dice」几乎肯定在误导人。
4.3 标注一致性:官方披露到哪一步,没披露到哪里
论文对标注流程的披露比多数挑战赛细,但仍留空白。
已披露:每中心一名具三年以上肿瘤影像经验的放射科医生,用 ITK-SNAP 逐层勾画;另有三名读者盲审,冲突由最资深者裁决;过小且不确定的病灶省略不标;每中心只有一名标注者,论文自己指出这尤其对小病灶可能引入偏差。
未披露:观察者间一致性的具体数值、各中心的标注耗时与复核轮次、盲审是全查还是抽样、「省略不标」的阈值按直径还是按体积。
这几处空白决定你怎么用它。想把它当金标准训练「专家级」模型,得知道金标准本身有多稳,而目前只能估计到「单人标注、三人盲审」这个层级。凡是写「LiTS 提供了专家级金标准」的措辞,都比官方材料说得更满。
4.4 官方的基线做到什么水平:三届榜单的可比性
榜单可比性这件事,LiTS 比其他挑战赛更复杂,因为它的评估口径在三届之间调整过。
ISBI 2017 与 MICCAI 2017 只用 Dice 排名;赛后的综合重排则把 Dice、表面距离、体积差三项指标的名次相加。这意味着同一个提交,按单指标排和按三项综合排,名次可以不一样。论文专门讨论了这一点,给出的结论是:没有任何单一算法能同时在肝脏与肿瘤两个任务上排第一。
对使用者的含义有两条。引用「LiTS 上最佳肿瘤 Dice 0.739」时,要说清这是 MICCAI 2018 的单指标口径。想做横向比较时,别拿三届的数字直接连成一条趋势线,因为评测协议本身动过。
还有一个更容易忽略的点:官方限制参赛队只能用发布的训练数据优化方法。这条规则在有公开数据集的今天几乎无法执行,后来的工作普遍用外部数据预训练,再报 LiTS 成绩。因此榜单上的 0.739 与后来论文里的 0.78 之间,差的不只是模型,还有数据规模。
§5 怎么拿到、怎么接进去
5.1 四条下载路径与它们的取舍
官方入口是 CodaLab 挑战赛页,提供数据登记与在线评估。从它拿原始包要留意两点:部分批次分卷发布;页面是较早的前端实现,脚本抓取易失败,人工点击更稳。
多数人实际从派生渠道拿。MSD 站点给 Task03_Liver 直链,含 131 例训练集,与 nnU-Net 完全兼容;Kaggle 有多个 PNG 重打包版本;学术镜像也有 NIfTI 副本,但标签未必与官方一致。正式实验用 MSD,对齐榜单回 CodaLab,做原型用 PNG 但别拿它算体积。
| 路径 | 拿得到什么 | 需要注册 | 目录结构 | 适用 |
|---|---|---|---|---|
| CodaLab 挑战赛页 | 原始训练集、测试影像、在线评估 | 是 | 官方原始结构 | 与榜单对齐 |
| MSD Task03 直链 | 131 例训练集 | 否 | Decathlon 规范 | 训练与交叉验证 |
| Kaggle PNG 镜像 | 130 例切层 PNG | 是(Kaggle 账号) | 逐层图像 | 教学、2D 原型 |
| 学术镜像 / HF | 多为 NIfTI 副本 | 视镜像而定 | 各家自定 | 备选,需核对标签 |
四条路径的差别不只在入口,还在后面要补多少活。
| 环节 | CodaLab 原始包 | MSD Task03 | PNG 镜像 |
|---|---|---|---|
| 下载 | 人工点击,可能分卷 | 单文件直链 | 平台内下载 |
| 解压与整理 | 需合并分卷、建目录 | 解压即用 | 解压即用 |
| 转 nnU-Net 格式 | 需改名与写 dataset.json | 不需要 | 不适用 |
| 体素间距处理 | 自带原始间距 | 自带原始间距 | 已丢失 |
| 体积类指标 | 可算 | 可算 | 不可算 |
| 与官方榜单对齐 | 可以 | 不可以 | 不可以 |
| 与官方论文口径一致 | 完全一致 | 标签一致,样本少测试集 | 不一致 |
这张表给出的最实用的一条是第三行:从零转一次格式大约需要一段脚本和一次排查,而这段脚本一旦写好就能一直用。真正不值得省时间的是间距信息,PNG 路径看起来最省事,代价却是后面所有体积类结论都作废。
5.2 目录结构:Decathlon 版本是最省事的入口
MSD 版本的目录结构是医学分割社区事实上的通用格式,值得背下来。它的核心约定是:影像文件名带四位的通道后缀,标注文件名不带。
Task03_Liver/
imagesTr/
liver_0.nii.gz
liver_1.nii.gz
其余略
labelsTr/
liver_0.nii.gz
liver_1.nii.gz
其余略
dataset.json
dataset.json 里写着类别名、通道数、训练样本清单与体素间距参考值。nnU-Net 读的就是这个文件,所以只要它写对,后面的预处理全自动。要注意的是 MSD 版本只有 imagesTr 与 labelsTr,没有 imagesTs,因为官方从未发布带标注的测试集。
从官方原始包转到这个结构,需要做三件事:给影像文件名加通道后缀、把 segmentation 改名为 label、写一份 dataset.json。这三件事都不难,但第一件最容易错——后缀漏加会让 nnU-Net 把它当成多通道的同名样本,直接报错或静默读错。
5.3 把官方原始包整理成 nnU-Net 格式
下面这段脚本做完整的转换。它按官方原始目录读,输出到 Decathlon 规范的位置,并顺手生成一份病例子集清单,供后面做划分使用。
#-- 官方原始包 → nnU-Net / MSD 目录结构
import json
import shutil
from pathlib import Path
SRC = Path("dataset") #-- 含 Training Batch 1 等子目录
DST = Path("nnUNet_raw/Dataset003_Liver")
img_out = DST / "imagesTr"
lbl_out = DST / "labelsTr"
img_out.mkdir(parents=True, exist_ok=True)
lbl_out.mkdir(parents=True, exist_ok=True)
cases = []
for vol in sorted(SRC.rglob("volume-*.nii")):
idx = vol.stem.split("-")[1]
seg = vol.with_name(f"segmentation-{idx}.nii")
if not seg.exists():
continue
sid = f"liver_{int(idx):03d}"
shutil.copy(vol, img_out / f"{sid}_0000.nii")
shutil.copy(seg, lbl_out / f"{sid}.nii")
cases.append(sid)
meta = {
"channel_names": {"0": "CT"},
"labels": {"background": 0, "liver": 1, "cancer": 2},
"numTraining": len(cases),
"file_ending": ".nii",
}
(DST / "dataset.json").write_text(json.dumps(meta, indent=2), encoding="utf-8")
print("cases:", len(cases))
跑完查三件事:两侧文件数是否相等、影像是否都带 _0000 后缀、file_ending 是否与实际一致。任一不满足,预处理都会白跑。
5.4 划分:为什么多数人用 131 例自己切
官方测试集标注不公开,要拿到本地可复现的分数只有一条路:从 131 例训练集切出内部测试集,或做交叉验证。
论文没给官方的内部划分,你切的那份与别人那份不可比。这是复现里最容易忽略的陷阱:两个团队都说做了五折,但折法不同、种子不同,甚至有人把同一病人的不同期相拆到了不同折,分数自然不同。
稳妥做法两条:用固定的折文件并公开;或按机构、按层厚分组划分,模拟一次跨域检验,比随机划分更能暴露问题。
#-- 按层厚分组做五折,避免随机划分掩盖各向异性差异
import json
from pathlib import Path
import nibabel as nib
import numpy as np
cases = sorted(p.stem for p in Path("nnUNet_raw/Dataset003_Liver/labelsTr").glob("*.nii"))
recs = []
for c in cases:
hdr = nib.load(f"nnUNet_raw/Dataset003_Liver/imagesTr/{c}_0000.nii").header
recs.append({"case": c, "z": float(hdr.get_zooms()[2])})
recs.sort(key=lambda r: r["z"])
folds = [{"train": [], "val": []} for _ in range(5)]
for i, r in enumerate(recs):
k = i % 5
folds[k]["val"].append(r["case"])
for j in range(5):
if j != k:
folds[j]["train"].append(r["case"])
Path("splits_lits.json").write_text(json.dumps(folds, indent=2), encoding="utf-8")
print([len(f["val"]) for f in folds], "val sizes")
按层厚排序再取模分折是最简单的分层手段,能保证每一折的层厚分布接近全队列。若研究目标本身就是「厚层上是否掉点」,应改为按阈值硬切,把厚层整体留作测试。
5.5 训练与推理的最短命令链
目录与划分就绪后,训练是标准流程。下面这组是 nnU-Net v2 的口径,只需改数据集编号。
#-- 预处理并校验(会自动做间距归一与各向异性规划)
nnUNetv2_plan_and_preprocess -d 3 --verify_dataset_integrity
#-- 先跑一折验证流程通不通,再铺开五折
nnUNetv2_train 3 3d_fullres 0
#-- 用第 0 折的模型在第 0 折的验证例上推理
nnUNetv2_predict -d 3 -c 3d_fullres -f 0 \
-i "$nnUNet_raw/Dataset003_Liver/imagesTs_fold0" \
-o preds_fold0
三个容易出问题的地方:一是 -d 3 这个编号必须与数据目录名 Dataset003_Liver 的编号一致,写错会报找不到数据集;二是推理的输入目录需要是带 _0000 后缀的影像;三是 nnU-Net 默认会把肝脏与肿瘤一起评,想分开报必须自己写后处理脚本,不能只看它打印的均值。
报错信息常指向离真正原因很远的地方,下面按症状查原因。
| 症状 | 最可能的原因 | 检查方式 | 修法 |
|---|---|---|---|
| 报找不到数据集 | 目录编号与 -d 不一致 |
看目录名里的三位数字 | 改目录名或改命令参数 |
| 预处理时通道数报错 | 影像没带 _0000 后缀 |
列一遍 imagesTr 的文件名 | 批量补后缀 |
| 训练集与标签数不匹配 | 转换脚本漏掉某例 | 比对两侧文件数 | 找出缺的那一例单独补 |
| 训练损失很快归零 | 标签读成了全背景 | 统计标签唯一值 | 检查 file_ending 与路径 |
| 推理结果全为肝无肿瘤 | 类别合并或后处理覆盖 | 统计预测里的标签值 | 关掉小连通域过滤后再看 |
| 指标异常偏高 | 验证例混进了训练集 | 比对折文件与训练清单 | 重新生成折文件 |
| 显存不足 | 各向异性数据被强制立方体重采样 | 看 plan 里的 patch 大小 | 换低分辨率配置或减 batch |
| 结果复现不出 | 随机种子与数据顺序不同 | 固定种子并记录 | 把划分与种子一起公开 |
最该先查的是第五行:小连通域过滤是 nnU-Net 的默认后处理,而小病灶恰好属于被删的那一类。很多团队说的「肿瘤 Dice 上不去」,在查过后处理配置前不该归因于模型。
5.6 本地复刻官方的肿瘤 Dice 与病灶级指标
官方评估在服务器端跑,本地复刻要靠自己写。下面实现论文定义的两个核心量:按病例的肿瘤 Dice 与按 3D 连通域的病灶检出 F1。
#-- 肿瘤 Dice 与病灶级 P/R/F1,按病例聚合
import numpy as np
from scipy import ndimage
def dice(a, b):
a, b = a.astype(bool), b.astype(bool)
s = a.sum() + b.sum()
return 1.0 if s == 0 else 2.0 * (a & b).sum() / s
def lesion_stats(gt, pr, iou_thr=0.1):
gt_l, n_gt = ndimage.label(gt)
pr_l, n_pr = ndimage.label(pr)
matched = 0
for i in range(1, n_pr + 1):
m = pr_l == i
overlap = np.bincount(gt_l[m], minlength=n_gt + 1)
overlap[0] = 0
if overlap.size > 1 and overlap.max() > 0:
j = int(overlap.argmax())
inter = overlap[j]
union = m.sum() + (gt_l == j).sum() - inter
if inter / union >= iou_thr:
matched += 1
tp = matched
fp = n_pr - tp
fn = n_gt - matched
prec = tp / (tp + fp) if tp + fp else 0.0
rec = tp / (tp + fn) if tp + fn else 0.0
f1 = 2 * prec * rec / (prec + rec) if prec + rec else 0.0
return n_gt, prec, rec, f1
#-- 逐例调用,最后按病例平均
per_case = []
for gt, pr in pairs:
per_case.append(dice(gt == 2, pr == 2))
print("mean tumor dice:", round(float(np.mean(per_case)), 4))
这里的 IoU 阈值取零点一,属宽松设定,官方协议的具体阈值以论文附录为准。算出来的数不能与榜单直接比,但可以在自己的版本之间相对比较——这正是自切划分的意义。
§6 与库内条目的关系
6.1 关系图谱
LiTS 在肝脏影像这条线上是枢纽:上游是 SLIVER07 与 3D-IRCADb,下游是 MSD 肝脏任务与今天的一批多器官数据集。
| 库内条目 | 与它的关系 | 差异要点 |
|---|---|---|
| SLIVER07 | 前身 | 只做肝脏、三十例、指标冻结;LiTS 加了肿瘤与多中心 |
| 3D-IRCADb | 平行 | 二十例单中心,但标注更细,含多器官与血管 |
| MSD Task03 | 派生 | 就是 LiTS 训练集的重打包,标签语义一致 |
| BTCV | 互补 | 多器官、十三类、无肿瘤;LiTS 只有肝与肿瘤 |
| AMOS | 互补 | 十五类器官、含 MRI;不做肿瘤分割 |
| KiTS19 / KiTS23 | 对照 | 同一套「器官 + 肿瘤」思路的肾脏版,单中心 |
| CT-ORG | 互补 | 多器官,含肝但不含肿瘤 |
| FLARE | 后继语境 | 多中心泛癌分割,规模远超 LiTS |
最容易被误连的一条边是 MSD Task03——它不是另一个数据集,就是 131 例训练集换了个包装。论文里把两者同时列为「两个独立验证集」,是常见的重复计数错误。
6.2 检索路径
按需求找条目,可以走三条路。
按任务走:只要肝脏掩膜 → SLIVER07、3D-IRCADb、BTCV;要肝加肿瘤 → LiTS、MSD Task03、3D-IRCADb;要器官全景 → AMOS、BTCV、CT-ORG。
按肿瘤亚区走:要区分实性与囊性 → KiTS 系列;要区分活性与坏死 → 库内暂无肝方向对应条目,须另找带亚区标注的公开集。
按许可走:要可商用 → MSD、AMOS;学术使用即可 → LiTS、BTCV、SLIVER07。许可最容易在项目后期才被想起,建议一开始就过一遍。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
在给 LiTS 打分之前,必须先校正一个几乎人人都会犯的误判:把「LiTS 的分数」当成一个单一的、可以跨论文比较的数。
这个误判的根源是指标本身没有唯一的定义域。同一份预测,按前景算、按肿瘤算、按病例平均、按病灶平均、用不用测试时增强、肿瘤是否从肝里挖掉,得到的数字可以差出零点二以上。论文里写「Dice 0.9」时,如果没有交代这几项,这句话的信息量接近于零。
第二个误判是把「榜单不动」等同于「数据集过时」。2018 年后榜单基本静止,使用量却没降——它从「刷分场地」变成了「预训练源」与「外部验证集」。这个角色变化不体现在引用数字上,体现在引用位置:从前在结果表,现在在数据来源与外部验证两节。
第三个误判是把「官方披露不全」等同于「数据不可用」。已披露的部分(单人标注、三人盲审、省略小病灶)足以估计标注噪声的量级。评估时把「文档完备性」与「标注可用性」分开记,两者不能互相替代。
下面的评分是相对同类肝脏影像资源的横向口径,不是绝对分。
7.1 五维评分
| 维度 | 分数(满分 5) | 依据 |
|---|---|---|
| 规模 | 3.0 | 131 例带标注,够做交叉验证与微调,不够从零预训练 |
| 多样性 | 4.0 | 七家机构五国、层厚跨十三倍;但缺人口学字段,且训练测试同源 |
| 标注质量 | 3.0 | 双掩膜齐全、三人盲审;但每中心单人标注、肿瘤二值、小病灶省略 |
| 可接入性 | 4.5 | NIfTI 与 MSD 规范,nnU-Net 直接可跑;官方包需人工下载 |
| 许可清晰度 | 2.5 | 非商业,且官方与下游镜像的许可口径不一致 |
| 文档完备性 | 3.5 | 论文披露机构表与指标协议,但缺一致性数据与官方划分 |
六项合计二十点五(满分三十)。接入分最高,许可与标注质量拖后腿,这解释了它的两种典型用法:当预训练源(不必重评标注)、当外部验证集(只需推理)。
7.2 它擅长与不擅长的问题
擅长三类:小目标分割的鲁棒性(肿瘤本身就是极端小目标)、多设备数据一致性(层厚从厚层到亚毫米,是重采样策略的现成素材)、病灶级检出与分割的联合评估(官方给了完整协议)。
不擅长三类:人群与公平性(无人口学字段)、疗效与随访(无时间维度)、肝以外的一切。
把分数换成「什么情况下不该用它」,判断会更具体。下列五条各对应一个低分项。
| 边界条件 | 触发信号 | 为什么在这里失效 | 替代方案 |
|---|---|---|---|
| 项目要进产品注册 | 申报材料需要可复现的验证集 | 测试集标注不公开,第三方无法重跑 | 换许可允许商用且可划分的数据 |
| 目标是活性肿瘤或靶区 | 需要区分坏死与强化成分 | 肿瘤只有二值,输出是包络体 | 找带亚区标注的队列 |
| 需要人群分层结论 | 想按年龄、性别、地区比较表现 | 数据无任何人口学字段 | 用带结构化元数据的队列 |
| 需要跨中心泛化证据 | 论证的是「换医院不掉点」 | 训练测试同源,官方自陈未评测 | 另配一家不在 LiTS 里的外部中心 |
| 需要假阳性评估 | 关心筛查场景的特异性 | 无病灶例只有七例 | 补一份健康肝脏数据做负样本 |
五条里有三条同源:LiTS 的设计目标是「在固定一批中心上公平比较方法」,不是「证明方法能推广」。越过这条线它就会失效,而且失效得很安静——分数照样好看,只是证明不了你想证明的事。
§7.3 的偏差清单里,前两条是最该被记住的。
7.3 已知的、可枚举的偏差
第一条是尺度偏差,也是全篇的主轴。肿瘤体素占全图的比例在多数病例里低于万分之几,整体 Dice 对这部分几乎不敏感。任何不做类别加权的聚合,实际上都在测肝脏。
第二条是标注偏差。每个中心单人标注,小病灶按协议省略。这两条叠加的结果是:大病灶、边界清晰的病灶在标注里被完整覆盖,小病灶与边界模糊的病灶被系统性地低估或漏标。用这样的标注训练的模型,会学会「只找大病灶」,而这恰恰不是临床上最危险的那一类。
第三条是中心偏差,而且是隐性的。训练与测试来自同一批机构,模型的分数不包含跨中心的代价。法国那一支只有训练没有测试,意味着它的分布特征被学进去却从未被检验。
第四条是期相偏差。数据里没有期相字段,论文也未按期相分层发布。不同机构的增强方案不同,门静脉期、动脉期、延迟期混杂,而肝细胞癌在不同期相的可见性完全不同。任何模型都在这层混杂上学习,却无法把期相作为协变量。
第五条是人群偏差。五国七院全部是发达地区医疗机构,缺少年龄、性别、种族、基础肝病(肝硬化、脂肪肝)的结构化记录。中国、非洲、东南亚这些肝癌高发区的影像完全没有覆盖。把它当全球通用基准使用,是范围上的越界。
第六条是「无病灶」样本的稀缺。七例全空,导致假阳性率无法在这份数据上被有意义地评估。筛查场景的部署前,必须另配无病灶队列。
7.4 外部验证矩阵
| 证据类型 | 表现 | 强度 | 说明 |
|---|---|---|---|
| 论文采用 | 肝分割与肝肿瘤方向的论文普遍以它为对照 | 强 | 评审默认认得这个基准 |
| 官方榜单 | 三届赛事,累计数千次有效提交 | 中 | 2018 年后基本静止,且防不住过拟合 |
| 第三方复现 | 多个开源仓库提供 nnU-Net 基线 | 中 | 训练集上分数区间收敛,测试集无法复现 |
| 下游派生 | MSD Task03、多个 Kaggle 镜像 | 强 | 说明它已成为事实上的基础设施 |
| 临床验证 | 未见基于它单独完成的前瞻性临床研究 | 弱 | 定位仍是研究基准 |
| 跨中心泛化 | 官方自陈未评测 | 弱 | 想验证泛化须另配外部中心 |
第五行与第六行是这张表的关键。LiTS 的强项在「被用作对照」,弱项在「被用作泛化证据」。把它写进方法章节的对标表是合适的,写进泛化能力论证是不合适的。
7.5 DAIMS 六维评估表
| DAIMS 维度 | 本集表现 | 需人工补齐的动作 |
|---|---|---|
| 可发现 | CodaLab 页、MSD、多个镜像站四处可查 | 留存官方页快照,防止入口迁移 |
| 可获取 | 需注册,部分批次分卷下载 | 备好校验和,确认分卷完整 |
| 可理解 | 论文协议完整,但数据内无元数据 | 自建一份机构与层厚对照表 |
| 可交互 | NIfTI 通用,但间距与朝向不统一 | 做一次朝向与间距归一检查 |
| 可复用 | 非商业许可,改写需署名并同协议共享 | 记录所有重采样与标签改动 |
| 可持续 | 基础设施成熟,CodaLab 长期在线 | 定期回查,镜像可靠性低于官方 |
六项里两项需要较多人工动作:可获取与可理解。前者是入口老旧,后者是没有元数据表。其余四项属于中上水平。这个结构解释了为什么「拿到数据」和「用好数据」之间还隔着一段工作量。
7.6 它为何能持续:因为它占住了「唯一的多中心肝肿瘤公开基准」这个位置
一个基准的寿命,通常不由它发布时的分数决定,而由它占据的位置是否有人来替代决定。
LiTS 占的位置很具体:在肝脏方向,同时具备「多中心」「带肿瘤标注」「有公开评估入口」「有配套论文」这四条的公开资源,目前仍然只有它。3D-IRCADb 标注更细但只有二十例单中心;SLIVER07 指标冻结但不含肿瘤;MSD Task03 就是它自己;后来的多中心腹部数据集大多不做肿瘤。这个位置的稀缺性来自一件麻烦事——肝肿瘤的跨中心标注需要七家医院各自的专家,成本高到很少有人愿意重做第二遍。
它的第二层生命来自下游派生。MSD 把它变成了 Decathlon 的十个任务之一,这让它随着 Decathlon 一起被引用;Kaggle 镜像把它变成了教学素材,这让它出现在大量入门教程里。一条数据靠两条完全不同的路径被持续使用,这是多数挑战赛数据没有的待遇。
风险同样清楚。非商业许可挡住了产业侧的直接使用;肿瘤二值标注挡住了临床侧的深度使用;测试集不公开挡住了严格复现。这三点都不会因为时间推移而改善,反而会因为后来者的对照而显得更突出。但在出现一个「多中心、带亚区标注、许可更干净」的继任者之前,它仍会被引用。
§8 生态位与历史
8.1 从 2007 年的三十例到 2017 年的两百例
肝脏分割的公开基准有一条清晰的代际线。2007 年的 SLIVER07 用三十例确立了「在线提交加隐藏测试集」的范式,指标一冻结就是十几年;2009 年的 3D-IRCADb 把标注做细,加了肿瘤与多器官,但样本只有二十例、来自一家医院。
这两份数据解决的是「有没有标准」的问题,没有解决「标准够不够广」的问题。到 2016 年前后,深度学习方法在肝脏上批量突破 0.95,单一中心的三十例已经无法区分方法优劣——任何像样的网络都能刷满。这时候需要的是一份「让差方法掉下来」的数据,而不是一份「让好方法上不去」的数据。
LiTS 的立项动机就落在这条缝里。两百例、七家机构、层厚跨度十三倍,肿瘤大小从毫米到十几厘米,这组设置本身就是难度来源。
8.2 2017 到 2018:三届赛事与一次评估口径的调整
三届赛事的节奏值得单独记,因为它解释了为什么榜单数字不可直接连成趋势线。
ISBI 2017 是首届,十七支队伍注册、五支在研讨会上展示方法,肿瘤最佳 Dice 零点六七四。MICCAI 2017 扩到二十六支队伍,肿瘤 Dice 提到零点七零二,肝脏侧同时出现了零点九六三的峰值。MICCAI 2018 与 Decathlon 联合,有效提交十八个,肿瘤 Dice 到零点七三九。
三届之后,官方做了一次赛后综合重排,把体积重叠、表面距离、体积相似度三项的名次相加。这次重排没有改变最佳值的量级,但改变了部分队伍的相对位置,也留下了「单指标排名与综合排名不一致」这个结论。
另一个常被忽略的事实是提交总量。到 2022 年四月,CodaLab 上累计评估了三千四百多次有效提交、近二十四万次容积分割,注册用户超过九百人。也就是说,榜单头部虽然静止,底部的参与量一直在涨——这正是一个基础设施型基准的典型形态。
8.3 2019 年之后:从挑战赛走向基础设施
三届赛事结束后,LiTS 的角色开始转变,转折点是 Decathlon。
Decathlon 把 131 例训练集重打包成 Task03_Liver,连同其他九个任务发布,用的是更宽松的许可。这一步让它从「需要注册的挑战赛数据」变成「下载即用的标准训练集」,此后论文里写的「在 MSD 或 LiTS 上预训练」基本指同一批影像。
同期另一条支线是医学影像基础模型的兴起:大规模预训练需要海量带病灶标注的 CT,LiTS 的肿瘤掩膜恰好补上了「病灶监督」。这是它今天被引用最多的场景之一,尽管多数引用只是把它列进数据清单。
8.4 它在今天的生态位
一句话概括:LiTS 是「肝肿瘤方向的外部验证集与预训练源」,而不是「刷分场地」。
三个现象支撑这个定位:近年论文很少再报测试集分数,多报训练集五折并注明「与榜单不可比」;它越来越多出现在「外部验证」小节而非「主要结果」;nnU-Net、MONAI 与各类笔记本对它有现成支持,当基线试金石的门槛极低。
对照的是 KiTS19 那类单中心数据集:更干净、更容易刷分,但缺少「换一家医院就掉点」这层真实噪声。两者合用最合理——LiTS 提供多样性与难度,单中心数据提供干净的训练信号。
§9 使用指引
9.1 三种角色的路径
算法研究者:先用 MSD Task03 跑通 nnU-Net 基线,肝与肿瘤分开报;明确划分方式并公开折文件;改模型之前先做 §4.2 的案例里那个十分钟自检。论文写清是 131 例自切还是官方测试集。
数据工程与标注管理者:重点看标注协议。单人标注加三人盲审是可复制的低成本方案,但要注意它对小病灶的漏标。本院复刻时至少在小病灶上做双人独立标注,否则一致性无法量化。
临床与产品团队:当成上线前的压力测试集,用本院数据训练、用 LiTS 验证,看掉点是否集中在薄层或厚层、是否集中在小病灶。不要用它做产品性能声明,许可与可复现性两条都过不了。
9.2 一条最短的可用流程
从拿到数据到第一个可比的分数,最短是五步。每步都有明确产出,出问题能定位。
#-- 第 1 步:拿 MSD 版本(131 例训练集)
wget -c http://medicaldecathlon.com/files/Task03_Liver.tar
tar -xf Task03_Liver.tar
ls Task03_Liver/imagesTr | wc -l
#-- 第 2 步:放到 nnU-Net 规范位置
mkdir -p "$nnUNet_raw/Dataset003_Liver"
cp -r Task03_Liver/imagesTr Task03_Liver/labelsTr "$nnUNet_raw/Dataset003_Liver/"
cp Task03_Liver/dataset.json "$nnUNet_raw/Dataset003_Liver/"
#-- 第 3 步:预处理与完整性校验
nnUNetv2_plan_and_preprocess -d 3 --verify_dataset_integrity
#-- 第 4 步:先跑单折
nnUNetv2_train 3 3d_fullres 0
#-- 第 5 步:推理并分别算肝与肿瘤指标
nnUNetv2_predict -d 3 -c 3d_fullres -f 0 -i imagesTs_fold0 -o preds_fold0
第五步之后别直接看 nnU-Net 打印的均值——它把两类合成一个平均,肿瘤会被肝脏稀释。用 §5.6 的脚本单独算一遍肿瘤。
9.3 引用方式
正式引用用 Medical Image Analysis 的期刊版,这是与数据集配套的正式论文:
Bilic, P., Christ, P., Li, H.B., Vorontsov, E., Ben-Cohen, A., Kaissis, G.,
Szeskin, A., Jacobs, C., Mamani, G.E.H., Chartrand, G., et al. (2023).
The Liver Tumor Segmentation Benchmark (LiTS). Medical Image Analysis, 84,
102680. https://doi.org/10.1016/j.media.2022.102680
只用 MSD 版本时还应引 Decathlon 的数据描述论文(arXiv 1902.09063),目录结构与标签合并是它做的。另有一句常被漏掉:许可为非商业,且 CodaLab 原始包与 MSD 的条款不同,须注明用的是哪条路径。
§10 AI 使用声明
| 项目 | 声明 |
|---|---|
| 内容生成方式 | 本篇由 AI 辅助起草,结构、URL 与数字经人工核对公开来源 |
| 数字来源 | Europe PMC 收录的论文全文(PMC10631490)、Medical Decathlon 官网任务页、Kaggle 镜像页 |
| 未核实项 | 标注者间一致性数值、官方对「省略小病灶」的阈值、CodaLab 峰值榜前若干名的具体构成 |
| 数据处理 | 仅阅读公开页面与论文全文,未下载影像包,未做任何逐例统计 |
| 判断性内容 | 五维评分、边界判断、误读清单的「实际」列属编辑判断,非官方结论 |
| 时效性 | 核对日期 2026-10-27;挑战赛页可能变更,标注公开状态以官方为准 |
| 责任边界 | 本篇不构成临床使用建议,任何临床决策须经独立验证 |
| 纠错渠道 | 发现数字或表述错误,请通过千方医数集页面反馈 |
常见误读(避坑清单)
| 常见说法 | 实际 | 证据 |
|---|---|---|
| LiTS 上 Dice 已经到 0.96,肿瘤分割基本解决 | 0.963 是肝脏侧;肿瘤侧三届最佳只到 0.739 | 论文成绩汇总表,肝脏与肿瘤分列 |
| 测试集可以下载来自己评 | 测试影像公开、标注不公开,评估只在官方服务器端 | 论文数据可用性段落 |
| LiTS 只有 131 例 | 131 例是带标注的训练集,另有 70 例测试,合计 201 例 | 论文摘要与机构贡献表 |
| 肿瘤掩膜区分活性区与坏死区 | 只有一个二值肿瘤标签,不区分亚区 | 标签定义段落 |
| 它来自 7 家医院,所以能证明跨中心泛化 | 训练与测试来自同一批机构的相似分布,官方自陈未评测未见中心 | 论文讨论泛化局限性一节 |
| MSD Task03 是另一个独立数据集 | 就是 LiTS 131 例训练集的重打包,标签语义相同 | Decathlon 官网任务说明 |
| 每例都有肿瘤 | 全队列有 7 例完全无病灶 | 论文数据集描述 |
| 病灶检出召回可以到 0.9 以上 | 三届最佳召回 0.458 / 0.515 / 0.554,均不到六成 | 论文检出指标汇总 |
| 数据可以商用 | 许可为非商业(CC BY-NC-SA),部分镜像更严 | 论文与镜像页许可声明 |
| 层厚是统一的 | 0.45 到 6.0 毫米,训练与测试的层厚分布存在显著差异 | 论文扫描参数描述 |
FAQ
Q1:LiTS 到底有多少例?
201 例腹部增强 CT,其中 131 例带标注作为训练集,70 例作为隐藏测试集。二百例里只有七例完全没有病灶,其余都含原发性或继发性肝肿瘤。
Q2:为什么肿瘤 Dice 只有 0.74 上不去?
主因不在模型容量。肿瘤在多数病例里只占全图的万分之几,几十到几百个体素,边界又与周围灌注异常区渐变过渡,不同医生勾出来的范围可以差好几毫米。层叠加起来,零点七四已经接近这份标注能支撑的上限。
Q3:测试集标注能拿到吗?
不能。论文明确写真实标注只在组织方手中,参赛者上传预测后由服务器评估并回传 CSV。因此任何在本地说「测试集 0.9」的工作都不可复现,只能当作者自述看。
Q4:那我应该怎么得到可复现的分数?
把 131 例训练集自己切分,或者做交叉验证,并把折文件公开。论文里要明确写「训练集自切,与官方榜单不可比」。这是目前唯一诚实的做法。
Q5:肝脏和肿瘤的 Dice 该怎么报?
分开报,并且说明肿瘤是否从肝脏掩膜里挖掉。合成一个前景 Dice 会把肿瘤的失败完全掩盖,§4.2 的案例给了一个十分钟就能做完的自检方法。
Q6:MSD Task03 和 LiTS 是一回事吗?
数据上是,包装上不是。Task03 只含 131 例训练集,标签合并为背景、肝、肿瘤三值,目录是 Decathlon 规范。两者不能同时列为独立验证集。
Q7:能不能用它做商用产品?
官方许可是非商业(CC BY-NC-SA),部分镜像站用的是更严格的变体。商用需要另行联系权利方,或改用许可允许商业使用的数据。
Q8:数据里有没有病人的临床信息?
没有结构化的临床字段。影像头文件里的 DICOM 残留大多被清空,年龄、性别、病理分级、随访一概没有。机构与层厚信息只存在于论文附表,不在数据里。
Q9:它适合做多中心泛化研究吗?
只适合一半。它提供了七家机构的设备与人群差异,但训练与测试的中心构成相似,官方明确说没有评测对未见中心的泛化。要证明泛化,必须另配一家不在 LiTS 里的机构做外部验证。
Q10:小病灶为什么容易出问题?
两层原因。标注上,过小且不确定的疑似病灶按协议省略不标,所以部分真实小病灶在金标准里根本不存在;算法上,小目标的对齐误差容限极小,一两层切片的偏差就能让 Dice 掉到零点五以下。
Q11:如果官方数据更新了,还要不要重跑?
要。数据或标签一旦改版,历史分数就不可比。建议在论文里写明数据来源路径(CodaLab 原始包还是 MSD 重打包)、下载日期与是否做过重采样。
Q12:它和 KiTS 系列该怎么选?
看器官。肝脏方向选 LiTS,肾脏方向选 KiTS。两者的设计哲学不同:LiTS 多中心、更难、更接近真实分布;KiTS 单中心、标注更细、更容易刷分。两个都要做时,可以拿 LiTS 做训练多样性来源、拿单中心数据做干净基线。
术语表
| 术语 | 含义 |
|---|---|
| LiTS | Liver Tumor Segmentation Challenge,肝脏肿瘤分割挑战赛 |
| 肝脏掩膜 | 把肝脏从腹部 CT 中勾出的二值区域 |
| 肿瘤掩膜 | 把肝脏内肿瘤勾出的二值区域,不区分活性与坏死 |
| 前景 Dice | 把肝与肿瘤合并当一个类算的重叠度,容易被肝脏主导 |
| 肿瘤 Dice | 只对肿瘤类计算的重叠度,对小病灶极敏感 |
| 病灶级指标 | 以 3D 连通域为单位算的 Precision、Recall、F1 |
| 3D 连通域 | 三维空间中相互连通的体素集合,用来定义「一个病灶」 |
| 检出召回 | 被检出的病灶数除以真实病灶数 |
| IoU | 交并比,判断预测病灶与参考病灶是否算匹配的阈值依据 |
| ASD | 平均对称表面距离,衡量边界预测的平均偏差 |
| MSSD | 最大对称表面距离,衡量最坏情况的边界偏差 |
| RVD | 相对体积差,衡量预测体积与真值体积的偏离 |
| 各向异性 | 体素在三个方向间距不等,层间通常远大于面内 |
| 体素间距 | 相邻体素中心在三个方向上的物理距离,单位毫米 |
| NIfTI | 医学影像常用的体数据文件格式,扩展名 .nii 或 .nii.gz |
| ITK-SNAP | 一款开源的医学影像分割与标注软件 |
| 门静脉期 | CT 增强扫描的一个时相,肝实质强化最明显 |
| 动脉期 | CT 增强扫描的早时相,肝细胞癌常在此期明显强化 |
| 灌注异常区 | 肿瘤周围血供改变的肝组织,边界与活性肿瘤常难区分 |
| 活性肿瘤 | 仍有血供的肿瘤成分,与坏死、囊变相对 |
| 二值分割 | 只区分前景与背景,不区分子类 |
| 多中心 | 数据来自多家医疗机构,设备与人群存在差异 |
| 盲审 | 复审者在不知道初审结果的情况下独立复核 |
| 训练集自切 | 从公开训练集切出内部测试集的做法,与官方测试集区分 |
| 交叉验证 | 把数据分成若干折轮流做验证的评测方式 |
| 分层划分 | 按某一变量分层后再分折,以保证各折分布接近 |
| nnU-Net | 自配置的医学影像分割框架,自动规划预处理与网络结构 |
| MSD | Medical Segmentation Decathlon,医学分割十项全能 |
| CC BY-NC-SA | 署名、非商业、相同方式共享的知识共享许可 |
| 挑战赛榜单 | 参赛者提交预测后由官方服务器排名形成的公开成绩表 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 总例数 | 201 | 论文摘要 | 论文全文 |
| 训练集 | 131 | 论文摘要 | 论文全文 |
| 测试集 | 70 | 论文摘要 | 论文全文 |
| 含病灶例数 | 194 | 论文数据集描述 | 论文全文 |
| 无病灶例数 | 7 | 论文数据集描述 | 论文全文 |
| 机构数 | 7 | 论文机构贡献表 | 论文全文 |
| 国家数 | 5 | 论文机构贡献表 | 论文全文 |
| 层厚范围 | 0.45–6.0 mm | 论文扫描参数描述 | 论文全文 |
| 面内间距 | 0.56–1.0 mm | 论文扫描参数描述 | 论文全文 |
| 轴向层数 | 42–1026 | 论文扫描参数描述 | 论文全文 |
| 最佳肝脏 Dice | 0.963 | MICCAI 2017 成绩表 | 论文全文 |
| 最佳肿瘤 Dice | 0.739 | MICCAI 2018 成绩表 | 论文全文 |
| 最佳病灶召回 | 0.554 | MICCAI 2018 检出表 | 论文全文 |
| 提交算法数 | 75 | 论文摘要 | 论文全文 |
| 累计有效提交 | 三千四百余次 | 论文(截至 2022 年 4 月) | 论文全文 |
| 注册用户 | 九百余人 | 论文 | 论文全文 |
| 标签类别 | 0 背景 / 1 肝 / 2 肿瘤 | 论文标签定义 | 论文全文 |
| 数据格式 | NIfTI | 论文数据可用性 | 论文全文 |
| 许可 | CC BY-NC-SA | 论文与镜像页 | 论文全文 |
| 论文卷页 | Medical Image Analysis 84: 102680 | 期刊记录 | 论文全文 |
附录 B:数字的来源分层
第一层:论文全文直陈。 二百零一例的总量、131 与 70 的拆分、七家机构五国、层厚与层数范围、三届赛事的最佳成绩、提交数量、许可与格式。这些都在论文正文与附表里能直接读到,可放心引用。
第二层:由论文数据派生。 含病灶一百九十四例、无病灶七例,这个拆分来自论文对队列的描述;「肿瘤体素占全图比例在万分之几」,是按器官体积与病灶尺寸做的量级估算,不是逐例统计;「层厚跨度约十三倍」,由零点四五与六点零相除得出。
第三层:未核实。 读者间一致性的具体数值、省略小病灶的判定阈值、CodaLab 榜单前若干名的完整名单、各镜像站标签是否与官方逐一对应。这几项在公开材料里没有逐字给出,本篇不做推测性填补。
分层的意思是让使用者知道每句话的分量。看到第一层可以直接引用,看到第二层要注明是自己算的,看到第三层要么绕开、要么自己去做验证。
附录 C:完整参考文献
- Bilic P, Christ P, Li HB, Vorontsov E, Ben-Cohen A, Kaissis G, et al. The Liver Tumor Segmentation Benchmark (LiTS). Medical Image Analysis 84: 102680, 2023. DOI 10.1016/j.media.2022.102680.
- Bilic P, Christ P, Vorontsov E, et al. The Liver Tumor Segmentation Benchmark (LiTS). arXiv:1901.04056, 2019.(预印本版本,Kaggle 镜像与部分论文引用的是这一版)
- LiTS Challenge 官方挑战赛与评估页面. https://competitions.codalab.org/competitions/17094
- Antonelli M, Reinke A, Bakas S, et al. The Medical Segmentation Decathlon. Nature Communications 13: 4128, 2022.
- Simpson AL, Antonelli M, Bakas S, et al. A large annotated medical image dataset for the development and evaluation of segmentation algorithms. arXiv:1902.09063, 2019.
- Heimann T, van Ginneken B, Styner MA, et al. Comparison and evaluation of methods for liver segmentation from CT datasets. IEEE TMI 28(8): 1251–1265, 2009.
- Soler L, Delingette H, Malandain G, et al. 3D image reconstruction for thoraco-abdominal CT scans. IRCAD 3D-IRCADb 数据集说明.
- Isensee F, Jaeger PF, Kohl SAA, Petersen J, Maier-Hein KH. nnU-Net: a self-configuring method for deep learning-based biomedical image segmentation. Nature Methods 18: 203–211, 2021.
- Heller N, Isensee F, Maier-Hein KH, et al. The state of the art in kidney and kidney tumor segmentation in contrast-enhanced CT imaging: Results of the KiTS19 challenge. Medical Image Analysis 67: 101821, 2021.
- Kaggle LiTS PNG 镜像页(130 例,256×256 切层),https://www.kaggle.com/datasets/andrewmvd/lits-png
- Medical Segmentation Decathlon 官网任务说明页,http://medicaldecathlon.com/
附录 D:两个 Dice 并排算的诊断脚本
这个脚本一次给出前景 Dice、肿瘤 Dice、病灶级召回三组数,专门用来识别「整体 Dice 很高但肿瘤很差」的病例。它是 §4.2 的案例的可执行版本。
#-- 前景 Dice、肿瘤 Dice、病灶召回并排输出
import numpy as np
import nibabel as nib
from scipy import ndimage
from pathlib import Path
def dice(a, b):
a, b = a.astype(bool), b.astype(bool)
s = a.sum() + b.sum()
return 1.0 if s == 0 else 2.0 * (a & b).sum() / s
def recall_at(gt, pr, iou_thr=0.1):
gt_l, n_gt = ndimage.label(gt)
pr_l, n_pr = ndimage.label(pr)
if n_gt == 0:
return float("nan")
hit = 0
for i in range(1, n_pr + 1):
m = pr_l == i
ov = np.bincount(gt_l[m], minlength=n_gt + 1)
ov[0] = 0
if ov.max() == 0:
continue
j = int(ov.argmax())
inter = ov[j]
union = m.sum() + (gt_l == j).sum() - inter
if inter / union >= iou_thr:
hit += 1
return hit / n_gt
rows = []
for seg_path in sorted(Path("Task03_Liver/labelsTr").glob("*.nii.gz")):
pred_path = Path("preds") / seg_path.name
if not pred_path.exists():
continue
gt = np.asanyarray(nib.load(str(seg_path)).dataobj).astype(np.uint8)
pr = np.asanyarray(nib.load(str(pred_path)).dataobj).astype(np.uint8)
rows.append({
"case": seg_path.name,
"fg_dice": round(dice(gt >= 1, pr >= 1), 3),
"tumor_dice": round(dice(gt == 2, pr == 2), 3),
"lesion_recall": round(recall_at(gt == 2, pr == 2), 3),
})
import pandas as pd
df = pd.DataFrame(rows)
print(df.sort_values("tumor_dice").head(15).to_string(index=False))
输出的前十五行就是肿瘤最差的那些病例。把 fg_dice 与 tumor_dice 两列并排看,差值越大,说明这一例的「整体分数」越是被肝脏撑起来的。如果多数病例的差值都在零点二以上,那么任何只报整体 Dice 的结论都不能用。
附录 E:如果只记五件事
第一,201 例,131 例带标注训练、70 例隐藏测试,七家机构五国,二值是肝与肿瘤两类掩膜。
第二,肝脏 Dice 到 0.963,肿瘤 Dice 三届止于 0.739,病灶召回止于 0.554。前一个数不是后一个数的证据,两者必须分开报。
第三,肿瘤 Dice 上不去的主因是尺度与边界歧义,不是模型容量。小病灶只有几十个体素,边界又和灌注异常区渐变过渡,这份标注本身撑不起更高的数。
第四,测试集标注不公开,官方也承认防不住过拟合。可复现的做法只有 131 例自切,并在论文里写清这个分数不与榜单可比。
第五,它与 KiTS19 的差别在中心数而不是器官:LiTS 多中心、更难、更接近真实分布;KiTS19 单中心、更干净、更好刷分。要多样性与难度选 LiTS,要干净基线选单中心数据。
编辑说明
本篇核对日期为 2026-10-27。核对方式:读取 Europe PMC 收录的论文全文(PMC10631490)、Medical Segmentation Decathlon 官网的任务说明页、Kaggle 的 LiTS PNG 镜像页。未下载影像包,未做逐例统计。
需要说明一处口径:派发时给出的 DOI 为 10.1038/s41597-022-01882-6,经查该 DOI 对应的是 SPICE 化学量子力学数据集,与 LiTS 无关;给出的 GitHub 仓库地址也已无法访问。本篇改以 Europe PMC 检索到的同一篇 LiTS 论文为准,正式出处为 Medical Image Analysis 84: 102680(DOI 10.1016/j.media.2022.102680)。arXiv:1901.04056 是同名预印本,部分下游页引用的是它。
许可存在两种口径:论文与官方挑战赛页写 CC BY-NC-SA,部分下游镜像站标注为 CC BY-NC-ND 4.0。本篇按官方口径写 CC BY-NC-SA,同时记录这一差异,不做判断。使用者应以实际下载源显示的条款为准。
文中所有派生数字(含病灶一百九十四例、无病灶七例、层厚跨度约十三倍、肿瘤占比的量级)均已在附录 B 标明层级,方法与依据写在正文对应位置,可以复算。
六维评分与误读清单的「实际」列属编辑判断,依据写在评分表的依据列,不代表任何官方评价。FAQ 中关于使用方法的部分(如训练集自切的写法)同样是编辑建议。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- segthor — 共享标签:医学影像 / CT / 医学图像分割 / 挑战赛数据集
- sliver07 — 共享标签:医学影像 / CT / 医学图像分割 / 挑战赛数据集
- btcv — 共享标签:医学影像 / CT / 医学图像分割 / 挑战赛数据集
- medsam2-dataset — 共享标签:医学影像 / CT / 医学图像分割 / 挑战赛数据集
- parse2022 — 共享标签:医学影像 / CT / 医学图像分割 / 挑战赛数据集
- qubiq — 共享标签:医学影像 / CT / 医学图像分割 / 挑战赛数据集
- verse-spine — 共享标签:医学影像 / CT / 医学图像分割 / 挑战赛数据集
- lndb — 共享标签:医学影像 / CT / 医学图像分割 / 挑战赛数据集
- ct-ich — 共享标签:医学影像 / CT / 医学图像分割 / 挑战赛数据集
- covid-segmentation — 共享标签:医学影像 / CT / 医学图像分割 / 挑战赛数据集
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

