信息速览
这个数据集在 Kaggle 上被当作「脑肿瘤分割入门第一课」流传:一百多名患者的 FLAIR 切片,配一张黑白二值掩膜,几百行 U-Net 代码就能跑出一个 0.90 上下的 Dice。它确实能把一条分割流水线从零跑到通,也确实是很多教材和课程的第一个分割例子。
麻烦出在「0.90」这个数字被怎么用。Dice 只统计重叠像素的比例,对边界错几毫米、对小病灶整块漏掉都几乎没有惩罚;而这份数据只有一份掩膜、没有官方切分、没有外部测试集,0.90 衡量的其实是「你的预测和这一个人的勾画像不像」。在同一批切片上随机切分,同一名患者的相邻层会同时落进训练与验证两侧,数字还会再虚高一截。
本文只做一个区分:这个数据集能证明什么、不能证明什么。它来自哪里、掩膜怎么来的、二值掩膜丢掉了哪些临床分区、为什么低级别胶质瘤比胶质母细胞瘤更难分割、在一百多人的规模上报告的 Dice 天花板在哪——这些说清楚了,你才知道该拿它做代码对比,还是该换一个能做性能声明的数据。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 常见名称 | Kaggle LGG MRI Segmentation;Brain MRI segmentation |
| 项目主页 | kaggle.com/datasets/mateuszbuda/lgg-mri-segmentation |
| 上游来源 | NCI TCIA 的 TCGA-LGG 集合(LGG-1p19qDeletion) |
| 配套论文 | Buda, Saha, Mazurowski,Comput Biol Med 2019 |
| 论文 DOI | 10.1016/j.compbiomed.2019.05.002 |
| 患者规模 | 110 名,来自 5 家机构 |
| 切片规模 | 约三千九百张 2D 轴向切片(论文与社区转述口径) |
| 病理范围 | WHO II–III 级低级别胶质瘤 |
| 影像模态 | 仅 FLAIR(T2-FLAIR) |
| 标注形态 | 单份二值 PNG 掩膜,逐切片 |
| 掩膜来源 | 模型初步分割,经认证放射科医生审核 |
| 官方切分 | 无 |
| 许可 | CC BY-NC-SA 4.0(禁止商用) |
| 论文报告 Dice | 均值 82% |
| 典型刷卡成绩 | 切片级随机切分下 0.90 以上 |
| 主要用途 | 分割流水线验证、教学示例、代码对比 |
§1 它要解决的具体麻烦
1.1 你要的是一个能验证代码的分割任务,而不是一份临床真值
多数人打开这个数据集,真实需求并不是「拿到一份能上临床的肿瘤勾画」,而是三件更朴素的事:跑通一条端到端分割流水线、和别人的实现比一个数、在一个小到能在笔记本上训练的数据上验证想法。这三件事它都能做,而且做得不错——图像与掩膜同名成对、目录结构一行就能列清、总量不下载不动辄几十 GB 的多模态序列。
问题在于这三件事的验收标准不一样。跑通流水线只需要「能收敛、能出图」;比代码需要一个双方都接受的评价协议;验证想法需要可信的留出集。第三项它给不了:一百多名患者,按患者切出验证集之后往往只剩十几到二十几个人,任何性能差异都淹没在置信区间里。
于是就有了一个普遍的错位:拿到一个可以跑通的数据集,顺手把跑通时看到的 Dice 当成性能结论写进论文摘要或项目 README。§1.2 把这类错位拆成三条。
1.2 三条常见的错误期待
第一条期待是「Dice 0.90 说明分割很准」。这句里的「准」被悄悄替换了对象——它其实是「和这一份掩膜重合度高」,而不是「和放射科医生共识一致」。这份数据只有一份掩膜,单份掩膜与共识之间的差距无法在本数据集内部估计。
第二条期待是「数据量小所以过拟合风险小」。恰恰相反,一百多名患者里,同一名患者的切片在解剖上高度相似,有效样本量远小于切片数。按切片随机切分时,模型可以在训练集里记住某位患者的脑室形态,然后在验证集里认出同一个人,这不是泛化,是识别。
第三条期待是「二值掩膜就是肿瘤真值」。它只是「有/没有」两档,把增强区、坏死区、瘤周水肿合并成一个整体。FLAIR 上水肿信号范围远比强化区大,一个只看 FLAIR 的单模态掩膜,边界落在哪一侧本身就带约定成分。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 跑通 2D 分割流水线 | 成对 TIF 与 PNG,目录结构极简 | 够,半天可跑通 |
| 与公开实现核对 Dice | 论文给出均值 82%,仓库给出三例 89–94% | 够做量级核对 |
| 估计泛化性能 | 无官方切分,留出集不足二十人 | 不够 |
| 估计标注不确定性 | 单份掩膜,无第二个勾画者 | 不够 |
| 多序列融合 | 只有 FLAIR | 不够 |
| 区分水肿与坏死 | 二值掩膜 | 不够 |
| 直接商用或对外声称疗效 | 非商业许可 + 无外部验证 | 不够 |
| 教学演示与课程作业 | 规模适中、许可明确、社区资料多 | 够 |
| 复现放射组学的形状特征 | 论文给出三个形状特征与基因组亚型关联 | 够,这是它的原始用途 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 第一次做医学分割,想找个小数据练手 | 结构最简的分割对,几乎不用写预处理 | 先按患者切分,养成习惯再换大集 |
| 想把仓库里的 U-Net 换成自己的新结构 | 提供一个公认的比对数(82% 与 89–94%) | 明确写清「按患者切分」,否则对比无效 |
| 想写一篇分割论文,需要一个公开集 | 110 名患者的可引用队列,有 DOI 可挂 | 补一个外部测试集,否则只报代码对比 |
| 想做多区肿瘤分割 | 只有二值掩膜 | 改用 BraTS 类四模态多标签集 |
| 想研究模型与放射科医生的差异 | 只有一份掩膜,无法内部估计 | 自己组织二次勾画,或改用有双标注的集 |
| 做商业产品的训练数据 | 非商业许可 | 换许可,或走 TCIA 的原始授权路径 |
| 写课程讲义需要一个「Dice 会骗人」的例子 | 切片级 0.90 与患者级骤降的对比最好讲 | 把两种切分的差值做成课堂演示 |
1.5 一句话判断
它是一份合格的「分割代码试验台」,不是一份「临床性能考卷」;在同一份掩膜上刷出的 Dice 只能横向比代码,不能纵向比医生。
1.6 不适合谁:四条边界
不适合要报临床性能的人。 没有官方切分意味着训练集与测试集的边界由你划定,没有外部测试集意味着所有数字都来自同一批机构、同一台协议。以此为据声称「达到临床可用水平」,缺的是三道证据:独立人群、多人共识、前瞻验证。
不适合做多模态或多区域任务的人。 只有 FLAIR,掩膜是二值。任何需要「强化区 / 非强化区 / 坏死区 / 水肿区」四类标签的任务,这份数据从定义上就不支持,不是加工一下就能补上。
不适合商用的人。 Kaggle 镜像版是 CC BY-NC-SA 4.0,带非商业条款与相同方式共享要求。上游 TCIA 的 TCGA-LGG 集合另有使用条款,两者并不是同一份授权,用 Kaggle 版就得遵守 Kaggle 版。
不适合把切片数当样本数的人。 近四千张切片的说法容易让人以为是四千个独立样本。它们是百余人的连续切片,独立性远低于表面数量,统计功效按患者算,不按切片算。
§2 数据构成与规格
2.1 目录组织:一人一文件夹,切片与掩膜同名
镜像版的组织方式非常扁平,一个患者一个文件夹,文件夹名是 TCGA 条码,里面是成对的 TIF 与 PNG。图像和掩膜共用主文件名,掩膜名在原文件名后加下划线加 mask 后缀。这个约定让配对几乎不需要写代码:列出 TIF,把后缀换成掩膜后缀就能找到对应标签。
文件夹名里保留了 TCGA 的参与机构前缀(形如 TCGA_DU、TCGA_HT、TCGA_CS),这是唯一可用于机构维度分析的抓手,但它只出现在路径里,不在任何文件内部。
| 层级 | 内容 | 说明 |
|---|---|---|
| 根目录 | kaggle_3m | 镜像版的顶层文件夹 |
| 患者层 | 形如 TCGA_XX_XXXX_年份的文件夹 | 一名患者一个,约百余个 |
| 文件层 | 同名的 .tif 与 _mask.tif | 一个切片一对 |
| 患者内 | 连续轴向切片 | 顺序即解剖顺序 |
| 辅助文件 | data.csv | 列出图像路径与掩膜路径的对照 |
| 命名规则 | 主名一致,掩膜加后缀 | 配对规则唯一且稳定 |
这里有一处常见误解值得点出:论文与仓库的说法是「掩膜经认证放射科医生审核」,而不少二手介绍写成「由放射科医生逐层手工勾画」。两句话的工序差别很大——审核是「在模型初分割之上核改」,手工勾画是「从空画布开始画」。前者更快、内部更一致,但会把模型初分割的偏置带进最终掩膜。
2.2 字段与记录的完整字典
文件本身没有 DICOM 头,所有元信息都编码在路径与文件名里。下表把能取到的信息与需要自己推的字段分开列。
| 字段 | 类型 | 来源 | 含义 | 可用性 |
|---|---|---|---|---|
| patient_id | 字符串 | 文件夹名 | TCGA 条码,全局唯一 | 直接可用 |
| institution | 3 字母 | 条码中段 | 参与机构代号 | 直接可用 |
| tcga_year | 4 位数字 | 条码末段 | TCGA 入组流水号组成部分 | 直接可用 |
| slice_index | 整数 | 文件名序号 | 患者内切片顺序 | 直接可用 |
| image_path | 路径 | 目录结构 | FLAIR 切片文件 | 直接可用 |
| mask_path | 路径 | 命名规则 | 对应二值掩膜 | 直接可用 |
| modality | 常量 | 无字段 | 全为 FLAIR | 需外部文档 |
| has_tumor | 0/1 | 掩膜全零判断 | 该层是否含肿瘤 | 可由掩膜推得 |
| tumor_ratio | 浮点 | 掩膜像素统计 | 肿瘤占画面比例 | 可由掩膜推得 |
| spacing | 缺失 | 无 | 层厚与像素间距 | 不提供 |
| scanner | 缺失 | 无 | 设备型号与场强 | 不提供 |
| sequence_params | 缺失 | 无 | TR/TE/翻转角 | 不提供 |
| segmentation_rater | 缺失 | 无 | 审核者身份与年资 | 不提供 |
最后四行的缺失是这份数据的关键边界:没有像素间距就做不了真实体积换算,没有层厚就拼不出可靠的 3D 体积,没有序列参数就无法判断不同机构的 FLAIR 是否可以放在一起训练。
需要补充的是,这张表里「可由掩膜推得」的两个字段并不总是好用。肿瘤占比在病灶贴近脑室或颅骨边缘时会因切片视野不同而失真;有无肿瘤标记在极小病灶上可能因为掩膜像素太少,在缩略图或重采样过程中被磨掉。这两个字段适合做分层统计,不适合当作独立标签去做监督训练。
另外,机房与设备信息虽然缺失,但机构代号可以在一定程度上替代它。同一机构的扫描协议通常一致,因此用机构代号做分组,实际上是在做协议层级的控制。这一点对多中心研究是加分项,对单中心复现则意味着留出集与训练集常常同源。
2.3 一条记录的完整解剖
一条记录最小的组成是一对文件。下面这段代码不依赖任何私有库,只做一件事:把一个患者文件夹里的切片按序号排好,配出图像与掩膜。
#-- 读取一名患者的全部切片,并配出图像与掩膜对
from pathlib import Path
root = Path("kaggle_3m")
patient = sorted([p for p in root.iterdir() if p.is_dir()])[0]
pairs = []
for img in sorted(patient.glob("*.tif")):
if img.stem.endswith("_mask"):
continue
mask = img.with_name(img.stem + "_mask.tif")
if mask.exists():
pairs.append((img, mask))
print("patient:", patient.name, "slices:", len(pairs))
for img, mask in pairs[:3]:
print(img.name, mask.name)
这几十行没有出现任何统计,却已经把这份数据的全部结构说完了:一名患者、一串连续切片、一一对应的标签。后面的所有复杂度都来自「怎么把这些对切成训练与测试」。
同一条记录换算成 JSON 之后,字段比文件系统里看到的要少——因为大部分元信息在源头就丢了:
{
"patient_id": "TCGA_XX_0000_20000101",
"institution": "XX",
"slice_index": 87,
"image_path": "kaggle_3m/TCGA_XX_0000_20000101/TCGA_XX_0000_20000101_87.tif",
"mask_path": "kaggle_3m/TCGA_XX_0000_20000101/TCGA_XX_0000_20000101_87_mask.tif",
"modality": "FLAIR",
"has_tumor": 1,
"tumor_ratio": 0.0137,
"spacing_mm": null,
"slice_thickness_mm": null,
"scanner_model": null
}
null 的三个字段不是「待补充」,是「原数据集不提供」。做过 BraTS 的人第一眼会去找它们,因为体积、层间距与重采样策略都依赖这三个值。
2.4 切片层级的规模分布
论文与社区转述的规模是百余人和近四千张切片,平均每名患者二十余层。这个平均值只是量级参考,不是分布结论——不同患者肿瘤大小、扫描层数、切片范围各不相同,实际每人的切片数差异很大。
| 统计口径 | 量级 | 来源 | 可靠性 |
|---|---|---|---|
| 患者数 | 110 | 论文摘要 | 高 |
| 机构数 | 5 | 论文摘要 | 高 |
| 切片总数 | 约三千九百 | 社区与衍生仓库转述 | 中,官方页面未取得 |
| 平均每患者切片 | 二十余层 | 由前两项推算 | 推算值 |
| 含肿瘤切片占比 | 未取得 | 需自行统计 | 未核实 |
| 训练/验证/测试比例 | 无官方切分 | 无 | 不适用 |
切片总数这一行标了「中」,原因是 Kaggle 页面本次未取得(详见附录 B)。数量级可以放心用,精确到个位则不宜写进论文。
2.5 与同类资源的字段差异
把这份数据和另外两个常被拿来做脑肿瘤分割的资源并排看,差异集中在模态数、标签层级和切分协议三处。
| 项目 | LGG 分割集 | BraTS 多模态集 | 上游 TCGA-LGG |
|---|---|---|---|
| 模态数 | 1(FLAIR) | 4(T1/T1CE/T2/FLAIR) | 多序列 DICOM |
| 标签层级 | 二值肿瘤 | 三区加整体 | 无公开分割标签 |
| 病理范围 | WHO II–III 级 | 含胶质母细胞瘤 | WHO II–III 级 |
| 患者数 | 110 | 每年数百 | 与镜像版同源 |
| 官方切分 | 无 | 有明确训练验证划分 | 不适用 |
| 标注者 | 单人审核 | 多名标注并做一致性 | 不适用 |
| 原始格式 | TIF + PNG | NIfTI 三维体积 | DICOM |
| 许可 | CC BY-NC-SA 4.0 | 各年不同 | TCIA 使用条款 |
| 适合的事 | 2D 流水线验证 | 多区分割与竞赛 | 原始元数据与重建 |
这张表里最关键的一行是「标注者」。BraTS 之所以能作为竞赛基准,不只因为模态多,更因为每年都有多名标注者参与的共识标签,以及固定的评测服务器。这份数据两样都没有,所以它天然只能做代码对比。
还有一处容易被忽略的差异在任务定义的弹性上。分类任务的标签是离散的「有或无、哪一类」,只要类别定义清楚,不同人标注的差别很小;分割任务的标签是连续的轮廓,同一个人隔一周重画都会不同。这意味着即使是同一个队列,分割标签的不确定性天生高于分类标签。把分类任务里形成的「标注差不多就是对的」的直觉,直接搬到分割上,是这个数据集被误用最隐蔽的一条路径。
§3 它的真实身份:一份论文的配套数据,而不是一个独立的标注工程
3.1 上游是 TCIA,Kaggle 只是镜像
这个数据集的定位需要先说清三层关系。最底层是 NCI 癌症影像档案(TCIA)的 TCGA-LGG 集合,采集的是 TCGA 项目中低级别胶质瘤患者的术前 MRI;中间层是 Buda 等人在杜克大学做的分割研究,他们从这批影像里取出一百多名患者、五家机构的子集,训练了一个 U-Net 做自动分割;最上层是 Kaggle 上的公开镜像,把影像与掩膜以 2D 切片形式放出来供社区使用。
三层各自的责任不同。TCIA 负责原始影像的去标识化与存档;杜克团队负责掩膜与论文;Kaggle 负责托管与分发。当有人问「这个掩膜是谁画的」,准确回答是「由杜克的一名认证放射科医生审核」,而不是「由 TCIA 组织专家勾画」。
Buda 等人在 2019 年论文里写得很直白:研究目的是用深度学习自动分割量化肿瘤形状,再检验这些形状特征能否预测基因组亚型。也就是说,分割在这篇论文里是手段,不是目的;掩膜的质量要求服务于形状特征的稳定性,而非逐像素的临床级精度。
3.2 掩膜是怎么来的:模型初分割加人工审核
论文报告的分割算法平均 Dice 为 82%,并称这个水平「与人类表现相当」。这句话是理解整套数据的关键。若掩膜完全由模型生成,那么模型评估的就是自己;若完全由人工勾画,82% 这个数就说明人工与模型差距很大。实际工序介于两者之间:模型先给出初分割,放射科医生在其上审核修正。
这种工序在放射组学里很常见,优点是效率高、内部风格统一;代价是模型初分割的系统性偏差(例如倾向于把边界向内收)可能被审核者默认接受,从而固化进最终掩膜。单份掩膜无法暴露这类偏差。
3.3 「五家机构」意味着什么
论文摘要写明影像与基因组数据来自五家机构的低级别胶质瘤患者。对使用者来说,这句话有两层含义。好的一面是,五家机构带来了一定的设备与协议异质性,比单中心数据更接近真实分布。麻烦的一面是,五家机构的样本量并不均衡,TCGA 队列本身就以少数大型中心为主,机构维度上做交叉验证时,小中心的留出结果波动会非常大。
机构代号可以从文件夹名里读出来,这是这份数据少数自带的分组变量之一。§4.3 的案例会用到它。
3.4 它最初要回答的问题,和现在被用来回答的问题
原始问题:肿瘤的二维与三维形状特征,是否与 IDH 突变、1p/19q 共缺失等基因组亚型相关。论文给出的答案是肯定的——边界椭球体积比与 RNASeq 簇的关联最强,p 值小于万分之二。
现在被用来回答的问题:我的分割网络能不能超过 U-Net 的 82%。这两个问题需要的证据强度完全不同。前者只需要形状特征的组间差异显著,后者需要逐像素的临床级精度。把为前者构造的数据拿来回答后者,就是本文开头说的那个错位。
§4 那份掩膜能承载多少信息
4.1 二值掩膜丢掉了什么
临床上的胶质瘤分割通常不是二值,而是分区:增强肿瘤、非增强肿瘤、瘤周水肿、坏死腔。这个分区有直接的治疗含义——强化区是放疗靶区的核心,水肿区决定计划靶区外扩,坏死区提示疗效或进展。把四区压成一个二值掩膜,等于把「靶区边界」这个最有临床价值的信息抹掉了。
这份数据只有 FLAIR 一个序列,而 FLAIR 恰恰是最难单独区分强化与水肿的序列:水肿在 FLAIR 上呈高信号,强化区在 FLAIR 上也可能高信号,两者在单序列上经常粘连成一片。所以二值掩膜不是「简化版的四区标注」,而是「一个由单序列决定的、边界带约定的整体轮廓」。
| 临床分区 | 是否在本数据中 | 单 FLAIR 能否区分 | 影响 |
|---|---|---|---|
| 增强肿瘤 | 无独立标签 | 不能 | 无法评估靶区核心 |
| 非增强肿瘤 | 无独立标签 | 部分可以 | 无法区分实性与水肿 |
| 瘤周水肿 | 无独立标签 | 不能与强化区分 | 边界范围带约定 |
| 坏死腔 | 无独立标签 | 不能 | 无法评估坏死比例 |
| 整体肿瘤轮廓 | 有(二值) | 可以 | 只能做整体重叠评估 |
4.2 为什么低级别胶质瘤比胶质母细胞瘤更难分割
这一点常被忽略。胶质母细胞瘤在增强 T1 上有明显环形强化,边界相对锐利,阈值化就能拿到不错的初分割;低级别胶质瘤往往不强化或仅轻度强化,边界呈浸润性生长,与正常白质的信号差异小,在 FLAIR 上是「一片淡影」而不是「一个清晰的团块」。
浸润性生长的直接后果是边界不存在客观真值。放射科医生之间的判断也会分歧,因为「哪里算肿瘤、哪里算反应性改变」本身没有金标准。这正是本文的立论基础之一:在一个边界本身带主观成分的任务上,任何单一掩膜的 Dice 都无法代表准确度上限。
| 维度 | 低级别胶质瘤 | 胶质母细胞瘤 |
|---|---|---|
| 强化表现 | 常不强化或轻度 | 明显环形强化 |
| 边界 | 浸润、模糊 | 相对锐利 |
| FLAIR 上对比 | 弱,与白质接近 | 强,伴大片水肿 |
| 标注者分歧 | 大 | 相对小 |
| 二值化损失 | 大,边界即争议 | 小,边界较确定 |
还有一层差异在时间维度。低级别胶质瘤生长缓慢,同一个人的随访影像可能跨越数年,肿瘤形态变化细微;这意味着如果做纵向研究,相邻时间点的切片会非常相似,泄漏风险比横断面研究更高。这份数据只提供术前一次扫描,纵向问题在本数据集上无法展开,但它提醒我们:这类肿瘤的「一模一样的切片」不只是空间上相邻,时间上也会重复。
4.3 案例:TCGA_DU 患者的一次切分实验
用一位机构代号为 DU 的患者做一次最小实验,能把这个数据集最典型的问题摆到台面上。做法很简单:把这名患者的切片按序号交错切成两半,前半训练、后半验证,再与「按患者整体留出」的结果对比。
#-- 同一批患者,两种切分方式的 Dice 对比
import numpy as np
from pathlib import Path
from sklearn.model_selection import GroupKFold, KFold
root = Path("kaggle_3m")
patients = sorted([p for p in root.iterdir() if p.is_dir()])
groups = np.array([p.name for p in patients for _ in p.glob("*_mask.tif")])
def dice(a, b, eps=1e-6):
a, b = a.ravel() > 0, b.ravel() > 0
return (2 * (a & b).sum() + eps) / (a.sum() + b.sum() + eps)
#-- 切片级随机切分:同一患者的相邻层会落到两侧
kf = KFold(n_splits=5, shuffle=True, random_state=0)
slice_folds = list(kf.split(groups))
#-- 患者级切分:整名患者只出现在一侧
gkf = GroupKFold(n_splits=5)
patient_folds = list(gkf.split(np.zeros(len(groups)), groups=groups))
print("切片级折数:", len(slice_folds), "患者级折数:", len(patient_folds))
for i, (tr, va) in enumerate(patient_folds):
overlap = set(groups[tr]) & set(groups[va])
print(f"折 {i} 患者重叠数: {len(overlap)}")
这段代码本身不训练模型,它只做一件更根本的事:把两种切分方式的差别量化。切片级切分下,验证集里的每一层,其相邻层几乎肯定在训练集里;患者级切分下,这种重叠为零。任何在第一种协议下得到的 Dice,都不能拿到第二种协议下声称。
把这段实验接到 §4.5 的测量协议上,还能多看到一层:即使做对了患者级切分,留出集常常只有二十余人,单折 Dice 的波动可以达到零点零几,两折之间就能翻转两个模型的排名。这就是小数据集的 Dice 天花板。
4.4 掩膜的单人来源带来的三个后果
第一,无法估计标注者间一致性。这是分割任务里最需要的一项「标尺」——如果两位放射科医生对同一张切片的 Dice 只有 0.75,那么模型做到 0.85 就已经很好了,做到 0.90 说明它学的是某一位医生的风格,而不是共识。文献中脑肿瘤分割的标注者间 Dice 常被报告在 0.75–0.85 区间,但这不是本文核对到的数字,只是量级参考,不同研究口径差异很大。
第二,无法做「模型 vs 医生」的公平比较。论文说 82% 与人类表现相当,但这里的「人类」是一位审核者,不是一组医生的共识。
第三,错误传播不可分离。若模型初分割在某类解剖位置系统性偏差,审核者未纠正,这个偏差就变成数据集的固有属性,后来者训练时会把它当作真值学走。
4.5 评价协议:在这个数据上,什么样的 Dice 才算数
既然 Dice 本身不可靠,可操作的办法是把「怎么测」写清楚,让它至少可比较。一个合格的报告至少含四项:切分单位、留出方式、掩膜参照、报告范围。
| 必须写明的项 | 常见遗漏做法 | 合格做法 |
|---|---|---|
| 切分单位 | 按切片随机 | 按患者分组 |
| 留出方式 | 五折交叉验证报最佳折 | 留一机构或固定患者级留出 |
| 掩膜参照 | 与训练同一份掩膜比 | 说明掩膜是单审核者版本 |
| 报告范围 | 只报含肿瘤切片 | 同时报全切片含空层指标 |
| 空层处理 | 直接剔除 | 说明剔除规则与数量 |
| 置信区间 | 不报 | 报患者级 bootstrap 区间 |
| 边界指标 | 只报 Dice | 补 HD95 或 ASD |
| 小病灶 | 不单独统计 | 按肿瘤占比分层报告 |
这张表里最后两行最容易被跳过。Dice 对边界不敏感,加一个 95 分位 Hausdorff 距离能立刻暴露「整体重合好但边界飘」的情况;小病灶分层能暴露「大肿瘤拉高平均值、小结节全漏」的情况。一个 0.90 的平均 Dice,完全可能由「大病灶 0.95 加小病灶 0.55」组成。
在集中勾画区(bulk)做的改进最容易让 Dice 上涨,因为那里的像素多、梯度信号强;而在瘤周浸润带做的改进几乎不会改变 Dice,因为那里的像素占比小。这就造成一个方向性偏差:所有以 Dice 为优化目标的方法,都会不自觉地把算力投向大块区域,而临床上最需要判断的恰恰是那条边界带。
4.6 三种参照系:和谁比,决定数字意味着什么
同一份掩膜,换一个参照对象,得到的是三种不同的结论。把它们分开,是理解这个数据集的最短路径。
| 参照系 | 比的是什么 | 数字高了说明什么 | 在本数据集能否做 |
|---|---|---|---|
| 与单一掩膜比 | 与这一份标签的重合度 | 拟合了这位审核者的习惯 | 能,而且只能做这个 |
| 与多人共识比 | 与多名医生交集或多数票的重合度 | 逼近共识,具临床意义 | 不能,无第二份勾画 |
| 与另一位新医生比 | 跨机构的可迁移性 | 泛化到新标注风格 | 不能,无外部标注 |
第一种参照系就是这个数据集的一切。它给出的数字可以横向比较两个模型谁更贴近这份掩膜,但不能纵向推断谁的临床判断更准。第三种参照系才是临床部署真正需要回答的问题——换一家医院、换一位医生,模型还站得住吗——而这份数据从设计上就没有提供做这件事的素材。
这也解释了为什么同一模型在不同论文里报告的数字差距可以很大,却未必有一方在造假:他们可能用了不同的参照系,或者在同一参照系下用了不同的评估子集。
4.7 空切片与全图评估:被藏起来的一半
大多数教程只在含肿瘤的切片上评估,因为空切片上算 Dice 会出现分母为零或无意义的取值。但真实部署面对的是整卷扫描,绝大多数切片是不含肿瘤的。只报含肿瘤切片的 Dice,等于把「把正常切片误判成肿瘤」这类错误完全排除在考核之外。
可操作的处理是分开报两个数:含肿瘤切片上的 Dice,以及全切片上的特异度与假阳性切片数。后者在小模型上往往很难看,但它才是临床流水线真实要面对的指标。一份只报前者、不报后者的实验报告,你无法判断它在正常脑组织上会不会大面积报警。
§5 怎么拿到、怎么接进流水线
5.1 从 Kaggle 取数:三条路径
路径一,网页下载。登录 Kaggle 后接受数据集条款,点下载。路径二,命令行工具 kagglehub,几行代码下到本地缓存目录。路径三,Kaggle CLI 配合 API token。三条路径拿到的内容相同,区别只在是否需要手动接受条款。
#-- 方式一:kagglehub 直接拉取到本地缓存
pip install kagglehub
python -c "import kagglehub; print(kagglehub.dataset_download('mateuszbuda/lgg-mri-segmentation'))"
#-- 方式二:Kaggle CLI,需先放好 API token 到 ~/.kaggle/kaggle.json
pip install kaggle
kaggle datasets download -d mateuszbuda/lgg-mri-segmentation -p ./data --unzip
ls ./data
两条命令都需要账号已在该数据集页面接受过条款。若第一次运行报 403,先回到网页点一次同意,再重试。
5.2 从上游 TCIA 取数:想要原图与元数据
如果目标是拿到 DICOM 原始序列(含层厚、像素间距、序列参数),应当走 TCIA 而不是 Kaggle。TCIA 提供基于 NBIA 数据检索 API 的下载工具,以及集合页上的直接下载链接。代价是数据量大得多,而且不含分割掩膜——掩膜只在 Kaggle 镜像与论文仓库里。
| 取数目标 | 走 Kaggle 镜像 | 走上游 TCIA |
|---|---|---|
| 只要 2D 切片加掩膜 | 首选 | 需自己切片与配准 |
| 要层厚与像素间距 | 拿不到 | 可以 |
| 要 T1/T2 等多序列 | 拿不到 | 可以 |
| 要分割掩膜 | 有 | 没有 |
| 数据量 | 数 GB 级 | 数十 GB 级 |
| 许可 | CC BY-NC-SA 4.0 | TCIA 使用条款 |
5.3 目录扫描与配对校验
拿到数据的第一步不是训练,是确认配对完整。下面这段代码检查每个患者文件夹里图像与掩膜是否一一对应,并统计空掩膜(不含肿瘤的切片)占比。
#-- 配对完整性与空层占比核对
from pathlib import Path
root = Path("kaggle_3m")
missing, total, empty = [], 0, 0
for pat in sorted(p for p in root.iterdir() if p.is_dir()):
for img in pat.glob("*.tif"):
if img.stem.endswith("_mask"):
continue
total += 1
m = img.with_name(img.stem + "_mask.tif")
if not m.exists():
missing.append(img.name)
print("切片总数:", total)
print("缺掩膜:", len(missing))
print("有缺口的示例:", missing[:5])
空层占比这一项不能用文件大小猜,必须打开掩膜判断是否全零。在全切片上评估时(而不是只在含肿瘤切片上),空层会显著拉低 Dice——这也是为什么论文式报告与实战报告常常差一大截。
5.4 患者级切分:一份可直接用的划分
把患者列表做成固定划分,写进代码里,比在 notebook 里随手 train_test_split 可靠。
#-- 患者级固定划分,输出 JSON 供后续复用
import json, random
from pathlib import Path
root = Path("kaggle_3m")
patients = sorted(p.name for p in root.iterdir() if p.is_dir())
random.Random(42).shuffle(patients)
n = len(patients)
train = patients[: int(n * 0.7)]
val = patients[int(n * 0.7): int(n * 0.85)]
test = patients[int(n * 0.85):]
split = {"train": train, "val": val, "test": test}
Path("split.json").write_text(json.dumps(split, indent=2, ensure_ascii=False))
print({k: len(v) for k, v in split.items()})
按上面的比例,测试集只有十几人。这个数字决定了报告的置信区间宽度:十几人的患者级 bootstrap,区间常常横跨零点零几到零点一几,两个模型的差异很容易落在区间内。写论文时应当把这个数报出来,而不是只报一个点估计。
5.5 训练时的四个预处理决定
每个决定都会影响最终 Dice,报结果时应当写清选了哪个。
| 决定点 | 常见选项 | 对 Dice 的影响 |
|---|---|---|
| 是否保留空层 | 保留 / 剔除 | 保留显著降低 Dice、更接近真实分布 |
| 归一化方式 | 逐图 z-score / 全数据集统计 | 逐图更稳健,跨机构更公平 |
| 是否按肿瘤裁剪 patch | 整图 / 随机 patch | patch 训练常提升 Dice,但评估口径需一致 |
| 是否做 3D 聚合 | 纯 2D / 2.5D 堆叠 | 堆叠利用上下文,需按患者切分否则泄漏更重 |
第三项最容易造成不可比:有人用整图推理,有人用肿瘤中心裁剪推理,两者报的 Dice 不在同一个口径上。
5.6 结果上报的最小清单
一篇文章或一份实验报告,若用到这个数据集,至少应给出下表七项。少任何一项,数字都无法被复现或被正确比较。
| 项 | 说明 |
|---|---|
| 患者级划分 | 写明人数与划分方式,附固定种子 |
| 空层处理 | 是否评估、如何剔除 |
| 推理口径 | 整图还是裁剪,尺寸多少 |
| 平均与中位 Dice | 只报平均会被大肿瘤拉偏 |
| 边界指标 | HD95 或平均表面距离 |
| 置信区间 | 患者级重采样的 95% 区间 |
| 掩膜参照说明 | 声明为单审核者掩膜 |
5.7 取数时的四个现实约束
第一个约束是账号与条款。Kaggle 数据集需要登录并接受页面上的条款,无账号或用未接受的 token 都会返回拒绝。批量拉取的脚本应当先处理这一步,而不是在训练脚本里捕获异常。
第二个约束是磁盘。以 2D 切片形式存放,总量在数 GB 级,与几十 GB 的体数据相比很轻,但解压后文件数很多。文件系统对小文件数量敏感的机器(某些容器挂载),解压耗时可能比下载还长。
第三个约束是格式。TIF 需要用能读 16 位灰度的库,随手用只支持 8 位的读取方式会把动态范围压掉,掩膜却不受影响,于是出现「图像正常、Dice 偏低」的假象。这一条在实际踩坑中出现频率很高。
第四个约束是许可。非商业条款与相同方式共享会限制后续的打包与再分发。若团队要在内部平台上传一份衍生版本,需先确认这是否构成「改编」,以及是否必须采用同一许可发布。这一条不是技术问题,但会在项目后期才暴露。
#-- 同时报 Dice 与边界距离,避免只看重叠
import numpy as np
from scipy import ndimage
def dice_and_hd(pred, gt):
p, g = pred > 0, gt > 0
if not p.any() and not g.any():
return 1.0, 0.0
if not p.any() or not g.any():
return 0.0, float("nan")
inter = (p & g).sum()
d = 2.0 * inter / (p.sum() + g.sum())
#-- 用形态学差值取两边的边界像素
sp = p & ~ndimage.binary_erosion(p)
sg = g & ~ndimage.binary_erosion(g)
dt_g = ndimage.distance_transform_edt(~sg)
dt_p = ndimage.distance_transform_edt(~sp)
hd = max(np.percentile(dt_g[sp], 95), np.percentile(dt_p[sg], 95))
return d, hd
print(dice_and_hd(np.zeros((64, 64)), np.zeros((64, 64))))
这里算出的边界距离是像素单位,不是毫米——因为没有像素间距,这只是相对指标。换成有间距的数据集时,应当把距离乘上间距再报,否则不同数据集之间的数字不可比。
§6 与库内条目的关系
6.1 关系图谱
库内最直接相关的是「99% 是警报而不是成绩 — Kaggle 脑肿瘤 MRI 三个集」。那篇的叙事主线是数据泄漏:三个 Kaggle 脑肿瘤集合(四分类、带框检测、LGG 分割)被并列叙述,重点演示患者级泄漏如何把准确率刷到虚高,并给出检查方法。LGG 分割集在那里只是三个集之一,篇幅有限,主要作为「切片级切分导致泄漏」的例证出现。
本篇承担的是另一份工作。它只讲一个集,落点在分割任务的评价协议:Dice 作为指标为什么失真、边界与病灶大小如何被忽略、标注者间一致性缺位意味着什么、什么样的报告口径才算数。两篇的分工可以概括为——rid=1431 回答「三个集为什么不能按切片切」,本篇回答「即使按患者切对了,Dice 本身还缺什么」。
| 维度 | rid=1431 三个集 | 本篇 LGG 分割单集 |
|---|---|---|
| 覆盖范围 | 三个 Kaggle 脑肿瘤集 | 仅 LGG 分割集 |
| 核心命题 | 患者级数据泄漏 | 分割评价协议的失真 |
| 主要指标讨论 | 分类准确率 | Dice 与边界指标 |
| 对掩膜的处理 | 作为数据集属性一笔带过 | 逐项拆解二值与单人来源 |
| 对切分的处理 | 核心 | 前置条件,一章带过 |
| 适合先读的人 | 任何用 Kaggle 分类集的人 | 要做分割评估或写分割论文的人 |
若你只做分类,读 rid=1431 就够;若你要做分割,先读本篇的评价协议部分,再回去看那篇的泄漏检查脚本。
6.2 检索路径
按任务找:医学图像分割类目下,与 BraTS 系条目并列;按病理找:脑肿瘤类目下,与 TCGA 系的其他影像条目并列;按数据形态找:单模态 2D 切片加二值掩膜,与三维体积型标注形成对照。
| 检索意图 | 关键词 | 会落到哪里 |
|---|---|---|
| 找脑肿瘤分割的小数据 | LGG、FLAIR、二值掩膜 | 本篇 |
| 查 Kaggle 脑肿瘤集的数据泄漏 | 泄漏、患者级切分、四分类 | rid=1431 |
| 找多区肿瘤分割 | 增强区、水肿、三区 | BraTS 系条目 |
| 找同源基因组数据 | TCGA、IDH、1p19q | 基因组学类目 |
| 找脑 MRI 的其他模态集 | T1、DTI、功能像 | 神经科学类目 |
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
评分之前要先纠正一个很常见的错位:很多人把「这个数据集好还是不好」理解成「它的 Dice 高不高」。在这个数据集上,这个问法本身就把误判写进去了——Dice 高不高取决于你怎么切分、怎么评估,同一份数据可以报出 0.99 也可以报出 0.75,两者都不假。
所以本节评的不是「数据质量分数」,而是「它能支撑到什么强度的结论」。一份数据可以在教学上满分、在临床证据上零分,两者不矛盾。下面的五维评分按「对结论的支撑力」打分,而不是按「样本多不多」打分。
7.1 五维评分
| 维度 | 分值 | 依据 |
|---|---|---|
| 可获取性 | 4 / 5 | Kaggle 一键下载,无需申请,许可写明 |
| 结构规整度 | 5 / 5 | 一人一夹、同名配对,几乎没有清洗成本 |
| 标注可信度 | 2 / 5 | 单人审核,无一致性估计,二值压缩 |
| 评估完备性 | 1 / 5 | 无官方切分、无外部测试集、无评测服务器 |
| 临床代表性 | 2 / 5 | 仅 FLAIR、仅 WHO II–III 级、机构分布不均 |
| DAIMS 综合 | 2.8 / 5 | 工程可用性高,证据强度低 |
DAIMS 这一行要单独解释:它在「数据管理」与「可复用性」上表现好——格式统一、命名一致、许可清晰;在「标注质量」与「代表性」上表现弱。这两组分数没有互相抵消的理由,因为使用者关心的通常只是其中一组。
7.2 三个让它长期被引用的优点
第一,成本极低。不下载几十 GB 的多模态序列,不需要配准,不需要重采样到统一体素,笔记本上十几分钟能跑完一轮。对教学与原型验证,这个成本优势几乎无法替代。
第二,配对规则稳定。同名加后缀这个约定十年没变过,任何一个教程里粘贴的代码都能跑。相比之下,三维体积型数据集的目录结构在不同年份常常不一致。
第三,有明确的比对数。82% 来自论文,89–94% 来自作者仓库的三个示例病例。有两个官方口径的参照,社区就有了「我跑到多少算正常」的锚点。
7.3 已知的、可枚举的偏差
| 偏差 | 具体表现 | 后果 |
|---|---|---|
| 选择偏差 | 只取 TCGA 中有 FLAIR 且质量可用的患者 | 不代表全部低级别胶质瘤 |
| 机构偏差 | 五家机构样本量悬殊 | 交叉验证中小组不稳定 |
| 等级偏差 | 仅 WHO II–III 级 | 不能外推到胶质母细胞瘤 |
| 模态偏差 | 仅 FLAIR | 无法区分强化与水肿 |
| 标注偏差 | 单人审核、模型初筛 | 系统性边界偏好可能固化 |
| 切片偏差 | 2D 切片丢失层间连续性 | 体积类指标不可靠 |
| 元数据缺失 | 无层厚、无间距、无设备 | 无法重采样、无法溯源 |
| 切分缺失 | 无官方划分 | 结果跨研究不可比 |
第三条与第四条是这个数据集最硬的边界:任何声称「适用于所有脑肿瘤分割」的说法,在这两条上立刻失效。
7.4 外部验证矩阵
| 验证来源 | 是否具备 | 说明 |
|---|---|---|
| 内部患者级留出 | 可自行构造 | 需使用者自己划,规模小 |
| 内部多机构交叉 | 部分可以 | 机构样本不均,小组波动大 |
| 独立外部数据集 | 无 | 官方不提供 |
| 多人共识标签 | 无 | 单份掩膜 |
| 前瞻临床验证 | 无 | 回顾性数据 |
| 公开评测服务器 | 无 | 无排行榜 |
| 重复扫描一致性 | 无 | 无同一患者多次扫描 |
| 与病理对照 | 无 | 影像与组织学不配对 |
这张矩阵里前两行可做,后六行都不具备。一个数据集在八项里只有两项可做,它的定位只能是「方法验证」而不是「性能声明」。
7.5 它为何能持续:因为它填的是一个没人愿意填的低门槛位
脑肿瘤分割领域不缺大数据,缺的是「十分钟能跑通」的入口。BraTS 动辄几十 GB、需要注册、需要处理四种模态、需要理解三区标签,对第一次接触医学分割的人是陡坡。这个数据集把坡削平了:单模态、二值、2D、目录极简、许可明确。
它的持续存在不靠质量取胜,靠的是无可替代的入门位置。只要还有人第一次学分割,就会有人打开它;只要有人打开它,就会有人在切片级随机切分下刷出 0.95 并发一篇小论文——这也是它必须被写清楚的原因。
§8 生态位与历史
8.1 它从哪里来:从放射组学到 Kaggle 镜像
时间线大致分四段。第一段是 TCGA 影像的采集,TCGA-LGG 队列的术前 MRI 陆续进入 TCIA,成为可公开申请的研究资源。第二段是 2019 年杜克团队的研究,Buda 等人用这批影像做自动分割,提取形状特征,检验其与基因组亚型的关联,论文发在 Computers in Biology and Medicine。第三段是同年 Kaggle 镜像的发布与配套代码开源,U-Net 的 PyTorch 与 Keras 实现同时放出,带预训练权重。第四段是社区扩散,大量教程、课程作业、竞赛基线以此起步。
| 阶段 | 时间 | 产物 |
|---|---|---|
| 影像采集 | TCGA 执行期 | TCIA 上的 TCGA-LGG 集合 |
| 分割研究 | 2019 | 论文与掩膜 |
| 镜像发布 | 2019 | Kaggle 数据集与代码仓库 |
| 社区扩散 | 2019 至今 | 教程、基线、衍生仓库 |
8.2 同期与后继的资源
同一时期用于脑肿瘤分割的还有 BraTS 挑战赛系列,它以多模态、多中心、年度更新和固定评测服务器著称,是这个领域事实上的基准。另有若干从 TCGA 派生的放射组学集,把影像与基因组、病理配对。这个数据集的位置在两者之间:比 BraTS 轻得多,比纯放射组学集多了像素级标签。
| 资源 | 定位 | 与本文对象的关系 |
|---|---|---|
| BraTS 系列 | 多模态多区竞赛基准 | 想做性能声明应转向它 |
| TCGA-LGG 原始集合 | DICOM 存档 | 本文对象的上游 |
| 各类放射组学衍生集 | 影像加基因组 | 与本文对象同源不同用 |
| Kaggle 脑肿瘤分类集 | 图像分类 | 同一个平台,不同任务 |
8.3 它在教学与工程里的实际位置
在教学里,它常被放在「第一个分割项目」的位置,前接图像分类,后接多模态分割。在工程里,它常被当作冒烟测试:新写的损失函数、新的数据增强、新的推理管线,先在这个集上跑一遍确认能收敛。
这两个位置都合理,也都不需要它具备临床证据。反过来说,一旦有人把它挪到「论文主实验」的位置,问题就出现了。挪位的动机通常是成本——手边只有这个集能立刻跑。
8.4 未来的可能走向
Kaggle 镜像本身不太可能再更新:上游是固定的历史队列,掩膜是单次审核产物。它的价值会随时间从「数据资源」转向「教学资源」与「历史基线」——十年后人们引用它,多半是为了说明「当年大家是怎么起步的」,而不是为了拿它做新的性能声明。
这个走向有一个可以观察的旁证:同一批作者在 2020 年发表了基于同一队列的深度放射组学研究,讨论用卷积网络预测基因组亚型。那篇论文用的仍是一百余名患者、五家机构的表述,说明队列规模自 2019 年起就没有变过。它没有扩样,也没有补第二份掩膜,功能定位始终是「这套影像还能挖出什么」,而不是「这套影像能当基准用」。
对使用者来说,这个信号很明确:不要等它更新。若你需要更大的样本或更完整的标注,应当直接换到有年度更新机制的基准集,把这份数据留在教学与原型阶段的位置上。
§9 使用指引
9.1 三种角色的路径
学生与转行者。 目标是把分割跑通。路径:下载 → 患者级切分 → 一个最简 U-Net → 只报含肿瘤切片的 Dice → 画三张预测叠加图。不必追求高分,把切分协议写对就是这一阶段最大的收获。
算法工程师。 目标是验证新方法是否值得继续投入。路径:固定划分 → 先复现 82% 基线 → 加入新模块 → 同时报 Dice 与 HD95 → 分病灶大小分层看。若新方法只在大病灶上有提升,结论应当是「对小结节无效」,而不是「整体更好」。
研究者。 目标是发表。路径:这个集只做方法与消融,性能声明换到有官方切分与外部测试集的基准上;若一定要在本集报告,把患者级置信区间与掩膜单来源写进 Limitations。
| 角色 | 关键动作 | 最容易犯的错 |
|---|---|---|
| 学生 | 按患者切分 | 切片级随机切分 |
| 工程师 | 固定划分与口径 | 换口径后再比旧数 |
| 研究者 | 分清方法验证与性能声明 | 把代码对比写成临床结论 |
9.2 一条最短的可用流程
从下载到算出第一个可信的 Dice,最短路径是下面五步。这段代码刻意保持朴素,重点在切分与评估口径。
#-- 最短可用流程:下载 → 患者级切分 → 基线评估口径
from pathlib import Path
import numpy as np
root = Path("kaggle_3m")
def patient_of(p: Path) -> str:
#-- 掩膜文件与其图像同属一个患者文件夹
return p.parent.name
masks = sorted(root.glob("*/*_mask.tif"))
patients = sorted({patient_of(p) for p in masks})
rng = np.random.default_rng(0)
rng.shuffle(patients)
cut = int(len(patients) * 0.8)
train_ids, test_ids = set(patients[:cut]), set(patients[cut:])
test_masks = [p for p in masks if patient_of(p) in test_ids]
print("患者:", len(patients), "训练:", len(train_ids), "留出:", len(test_ids))
print("留出切片:", len(test_masks))
拿到留出切片之后,把模型预测与掩膜都按「大于零即前景」二值化,逐切片算 Dice,再对患者取平均——这个「先切片后患者」的聚合顺序很重要,直接对切片取平均会让切片多的患者权重过大。
9.3 引用方式
引用这个数据集时应当同时引两样:镜像版的数据集条目,以及配套论文。只引 Kaggle 链接会让引用者找不到方法学依据;只引论文会让人不知道数据从哪下。
| 引用场景 | 引用对象 |
|---|---|
| 用了 Kaggle 版切片与掩膜 | Kaggle 数据集页 + 2019 年论文 |
| 只用了上游 TCIA 影像 | TCIA 集合页 + 2019 年论文 |
| 用了作者的预训练权重 | 代码仓库 + 2019 年论文 |
| 用了 TCGA 基因组数据 | 原始 TCGA 标志性论文 |
论文的完整信息是 Buda M、Saha A、Mazurowski MA,发表于 Computers in Biology and Medicine 2019 年第 109 卷,DOI 为 10.1016/j.compbiomed.2019.05.002。仓库许可为 MIT,与数据集的非商业许可不是一回事——代码可以商用,数据不行。
§10 AI 使用声明
| 项 | 声明 |
|---|---|
| 生成方式 | 由大语言模型辅助整理与撰写,经人工核读 |
| 事实来源 | Kaggle 页面(未取得)、Europe PMC 论文摘要、作者代码仓库 README |
| 数字核验 | 规模与 Dice 数字来自论文摘要与仓库原文,逐项标注层级 |
| 未核验项 | 切片总数、含肿瘤切片占比、掩膜勾画工序细节 |
| 图像与数据 | 未下载全量数据,未做分布统计 |
| 评价立场 | 对指标的批评基于公开的评估方法与论文原文,不含对作者的动机推断 |
| 更新方式 | 上游改动时以官方页面为准,本篇不预告更新 |
| 责任 | 用于研究决策前请自行核对官方页面现行条款 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 这是医院自己整理的数据集 | 是 TCIA 公开队列的镜像 | 仓库 README 写明来自 TCIA LGG 集合 |
| 掩膜是放射科医生从零手绘 | 模型初分割后经一名医生审核 | 论文摘要与仓库表述 |
| Dice 0.90 说明达到临床水平 | 只是与单份掩膜的重合度 | 无官方切分、无外部测试 |
| 切片数就是样本数 | 样本单位是患者,切片高度相关 | 同一患者连续切片 |
| 随机切分训练验证即可 | 会造成患者级泄漏 | 相邻层几乎相同 |
| 数据小所以不容易过拟合 | 有效样本量远小于切片数 | 百余名患者 |
| 可以直接用于商业产品 | 许可带非商业条款 | CC BY-NC-SA 4.0 |
| 有四种模态可以融合 | 只有 FLAIR | 目录与文档 |
| 掩膜区分了强化与水肿 | 只有二值前景 | 掩膜为 0/255 |
| 82% 是官方排行榜成绩 | 是论文自报的算法均值 | 无评测服务器 |
FAQ
Q1:这个数据集和 BraTS 能互换吗?
不能。BraTS 是多模态、多区、有官方划分与评测服务器的竞赛基准,本文对象是单模态、二值、无划分的小集。前者能支撑性能声明,后者只能支撑流程验证。若你的方法需要多序列互补,这份数据从输入层面就不够。
Q2:为什么论文说 82%,社区却常见 0.90 以上?
口径不同。论文报的是作者自己的算法在三家机构验证病例上的均值,社区常见的 0.90 多在切片级随机切分、只统计含肿瘤切片、并用整图或肿瘤中心裁剪的口径下得到。三个口径叠加,数字自然抬高。比较时先对齐口径再比数。
Q3:我可以自己补画第二个人的掩膜吗?
可以,而且是提升这份数据价值最有效的一步。补第二份掩膜后,先算两人之间的 Dice 作为标尺,再看模型与两人的距离。若模型与某一人特别近、与另一人很远,说明它学的是风格而不是结构。
Q4:空切片要不要保留?
看你要报什么。保留空切片更接近真实筛查场景,Dice 会显著下降;只在含肿瘤切片上评估更接近论文口径,便于对比。两种都行,但必须写明,否则数字不可比。
Q5:为什么低级别胶质瘤更难分割?
因为边界是浸润性的、信号对比弱。胶质母细胞瘤有环形强化,边界清晰;低级别胶质瘤常不强化,在 FLAIR 上是一片淡影,医生之间对边界也会分歧。边界本身带主观成分,这就是单一掩膜无法代表真值的原因。
Q6:没有层厚会不会影响很大?
做 2D 分割不大,做任何体积类指标就很大。没有层厚与像素间距,算出的「肿瘤体积」只是像素计数,跨患者不可比。若论文里出现体积数字,务必注明是像素数还是立方毫米。
Q7:怎么判断我的模型有没有泄漏?
最简单的检验是把划分改成按患者,重跑一次。若 Dice 明显下降,说明之前的分数含有泄漏成分。下降幅度本身也是一个有用的诊断数字——它衡量的是模型对个体解剖特征的记忆程度。
Q8:能不能只用这个集发论文?
能发,但要把结论限定在「方法在小数据上的可行性」。若声称临床性能,审稿人通常会追问外部验证与标注一致性,这两项都答不上来。稳妥做法是把它当消融实验集,性能声明放到有官方基准的数据上。
Q9:机构代号有什么用?
能做机构维度的分组交叉验证,也能检查模型是否对某些机构的成像风格过拟合。但五家机构样本量悬殊,小组结果波动大,不宜单独下结论。
Q10:许可里「相同方式共享」是什么意思?
如果你基于这份数据发布衍生数据集,衍生集也要用同样的 CC BY-NC-SA 条款发布。只发布模型权重通常不算衍生数据,但这条边界在法律上有讨论空间,商用前应咨询法务。
Q11:有官方评测服务器吗?
没有。所有报告的分数都是各自本地算的,没有统一的隐藏测试集,也没有排行榜。这是它不能做性能声明的直接原因之一。
Q12:如果我只想学分割,最该注意什么?
注意切分。把「按患者切」变成一个肌肉记忆,比追高 Dice 有用得多。这个集上养成习惯,换到任何医学影像数据集都不会犯同样的错。
术语表
| 术语 | 含义 |
|---|---|
| LGG | 低级别胶质瘤,WHO II–III 级 |
| HGG | 高级别胶质瘤,含胶质母细胞瘤 |
| FLAIR | 液体衰减反转恢复序列,抑制脑脊液信号 |
| TCIA | 美国国家癌症研究所的癌症影像档案 |
| TCGA | 癌症基因组图谱计划 |
| Dice 系数 | 两个区域重叠度的两倍除以面积和 |
| HD95 | 95 分位 Hausdorff 距离,衡量边界偏差 |
| ASSD | 平均对称表面距离 |
| 掩膜 | 与图像同尺寸的标签图 |
| 二值掩膜 | 只分前景与背景的掩膜 |
| 患者级切分 | 同一患者所有切片只出现在数据集一侧 |
| 数据泄漏 | 训练信息以非预期方式进入评估 |
| 标注者间一致性 | 多名标注者对同一目标的一致程度 |
| 浸润性生长 | 肿瘤细胞沿白质束弥散,边界不清 |
| 强化区 | 注射对比剂后呈高信号的肿瘤区域 |
| 瘤周水肿 | 肿瘤周围的水肿带 |
| 坏死腔 | 肿瘤内部坏死形成的区域 |
| 2.5D | 把相邻若干切片堆叠成多通道输入的折中方案 |
| 冒烟测试 | 用最小数据验证流水线能否跑通 |
| 置信区间 | 估计值的不确定范围 |
| 组交叉验证 | 按患者等分组做交叉验证 |
| 放射组学 | 从影像中提取定量特征做分析 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 患者数 | 110 | 论文摘要 | 论文摘要 |
| 机构数 | 5 | 论文摘要 | 论文摘要 |
| 肿瘤等级 | WHO II–III 级 | 论文摘要与仓库 | 论文摘要 |
| 论文报告 Dice | 82% | 论文摘要 | 论文摘要 |
| 仓库示例 Dice | 89–94% | 代码仓库 README | 官方页面 |
| 切片总数 | 近四千张(转述) | 社区与衍生仓库 | 未核实 |
| 掩膜审核方 | 杜克大学认证放射科医生 | 代码仓库 README | 官方页面 |
| 上游集合 | TCIA TCGA-LGG | 代码仓库 README | 官方页面 |
| 许可 | CC BY-NC-SA 4.0 | 二手引述 | 未核实 |
| 代码许可 | MIT | 代码仓库 | 官方页面 |
| 官方切分 | 无 | Kaggle 页面描述 | 未取得 |
| 最强关联 p 值 | 小于万分之二 | 论文摘要 | 论文摘要 |
附录 B:数字的来源分层
第一层,官方页面。 代码仓库 README 明确写出数据来自 TCIA 的 LGG 集合、掩膜经杜克大学认证放射科医生审核、三个示例病例的 Dice 分别为 89%、91%、94%、代码许可为 MIT。这些表述可直接引用。
第二层,论文摘要。 110 名患者、来自 5 家机构、WHO II–III 级、算法平均 Dice 为 82%、边界椭球体积比与 RNASeq 簇关联的 p 值小于万分之二。摘要未给出切片总数、训练测试划分、标注者间一致性。
第三层,未核实。 Kaggle 页面本次未取得——访问返回的是人机验证页,API 端点同样如此。因此切片总数(社区转述为近四千张)、含肿瘤切片占比、许可的精确版本(二手引述为 CC BY-NC-SA 4.0)、数据是否在镜像时做过额外裁剪,均按二手信息记录,使用时请以页面为准。
这三级的分界不是「可信不可信」,而是「能否在论文里直接引用」。第一层可以,第二层需注明引自摘要,第三层需自行核对。
附录 C:完整参考文献
| 编号 | 文献 | 用途 |
|---|---|---|
| 1 | Buda M, Saha A, Mazurowski MA. Association of genomic subtypes of lower-grade gliomas with shape features automatically extracted by a deep learning algorithm. Comput Biol Med. 2019;109. DOI 10.1016/j.compbiomed.2019.05.002 | 数据集原始论文,规模与 Dice 来源 |
| 2 | Kaggle 数据集页:mateuszbuda/lgg-mri-segmentation | 分发入口,许可与描述 |
| 3 | 作者代码仓库 brain-segmentation-pytorch | 掩膜来源、示例 Dice、代码许可 |
| 4 | TCIA TCGA-LGG 集合页(LGG-1p19qDeletion) | 上游影像与使用条款 |
| 5 | Buda M, et al. Deep Radiogenomics of Lower-Grade Gliomas. Radiol Artif Intell. 2020 | 同一队列的后续研究,110 例表述 |
| 6 | Kickingereder P, et al. 脑肿瘤分割标注一致性相关研究 | 标注者间 Dice 量级参考,非本文核对项 |
附录 D:评估口径自查清单
下面十问可以当成提交前的一道关,任何一项答不上来,报告里的 Dice 都还不算数。这十问对应 §4.5 与 §5.6 的合并版,可以直接贴进实验记录。
| 序号 | 自查问题 | 答不上来的后果 |
|---|---|---|
| 1 | 切分单位是患者还是切片 | 泄漏无法排除 |
| 2 | 每侧各多少人 | 置信区间无法判断 |
| 3 | 划分是否固定并记录种子 | 结果不可复现 |
| 4 | 空层是否评估 | 与论文口径不可比 |
| 5 | 推理是整图还是裁剪 | 与其他研究不可比 |
| 6 | 是否报中位数 | 大病灶拉偏均值 |
| 7 | 是否报边界指标 | 边界误差被隐藏 |
| 8 | 是否按病灶大小分层 | 小病灶漏检被掩盖 |
| 9 | 掩膜来源是否注明 | 被误认为是共识标签 |
| 10 | 结论强度是否与证据匹配 | 方法验证被写成临床声明 |
#-- 用一条命令检查留出集是否真有患者级隔离
python - <<'PY'
import json
from pathlib import Path
s = json.loads(Path("split.json").read_text())
a, b = set(s["train"]), set(s["test"])
print("交叉患者:", len(a & b))
print("训练:", len(a), "留出:", len(b))
PY
附录 E:如果只记五件事
第一,上游是 TCIA 的 TCGA-LGG,Kaggle 只是镜像,掩膜是模型初分割加一名医生审核,不是多人共识。
第二,Dice 只量重叠,边界与小病灶几乎不惩罚;在单份掩膜上,它衡量的是「像不像这一个人画的」。
第三,切片级随机切分会让同一患者的相邻层同时进训练与验证,这是最容易被忽略的高估来源。
第四,只有 FLAIR 与二值掩膜,强化区、坏死区、水肿区一概不分,任何多区任务都要换数据。
第五,它是试验台不是考卷:用来比代码可以,用来声称临床性能不行。
编辑说明
本篇的核验时间为 2026 年 10 月 27 日。核验方式:通过 Europe PMC 的 DOI 检索取得论文摘要全文,通过作者代码仓库 README 取得数据来源、掩膜来源与示例成绩,通过 Kaggle 数据集页尝试获取规模与许可信息——该请求返回人机验证页面,数据集 API 端点返回同样结果,故 Kaggle 页面的直接内容未纳入。TCIA 集合页在核验时连接超时,未取得一手页面。
因此,凡涉及 Kaggle 镜像本身的数字(切片总数、许可精确版本、是否做过额外裁剪),本篇一律标注为未核实并按二手转述处理,未对官方说法作任何判断。凡涉及论文的数字(患者数、机构数、Dice、p 值)均逐字引自摘要。凡涉及代码仓库的数字(示例 Dice、掩膜审核方、代码许可)均逐字引自 README。
本篇对 Dice 的讨论限于公开的评估方法与论文原文的表述,不评价作者的动机,也不对掩膜质量作出超出证据的断言。关于「标注者间 Dice 常为 0.75–0.85」的说法,本篇明确标为量级参考而非核对结果,因为不同研究的标注任务、肿瘤类型与统计口径差异很大,这个区间不能被当作本数据集的属性。
与 rid=1431 的分工见 §6.1:那篇讲三个 Kaggle 脑肿瘤集的数据泄漏,本篇专讲 LGG 分割集的评价协议。两篇可独立阅读,若同时使用,建议先读那篇建立泄漏意识,再读本篇理解指标失真。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- kg-brain-tumor-classification-mri — 共享标签:医学影像 / MRI / 医学图像分割 / 脑肿瘤
- brats — 共享标签:医学影像 / MRI / 医学图像分割 / 脑肿瘤
- crossmoda-2023 — 共享标签:医学影像 / MRI / 医学图像分割 / 脑肿瘤
- brisc — 共享标签:医学影像 / MRI / 医学图像分割 / 脑肿瘤
- brats-2026 — 共享标签:医学影像 / MRI / 医学图像分割 / 脑肿瘤
- brats-africa — 共享标签:医学影像 / MRI / 医学图像分割 / 脑肿瘤
- segthy — 共享标签:医学影像 / MRI / 医学图像分割
- rembrandt — 共享标签:医学影像 / MRI / 脑肿瘤
- remind — 共享标签:医学影像 / 医学图像分割 / 脑肿瘤
- brats-pediatric — 共享标签:医学影像 / MRI / 医学图像分割 / 脑肿瘤
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

