低级别胶质瘤 MRI 分割的 Dice 会撒谎 — Kaggle 掩膜集

110 例 FLAIR / 二值掩膜 / 无官方切分

来源 https://www.kaggle.com/datasets/mateuszbuda/lgg-mri-segmentation发布时间: 2026-10-27最后更新: 2026-10-27 阅读 18
低级别胶质瘤 MRI 分割的 Dice 会撒谎 — Kaggle 掩膜集

信息速览

数据集名称低级别胶质瘤 MRI 分割的 Dice 会撒谎 — Kaggle 掩膜集
数据类型原始影像,人工标注,元数据
规模110(TCGA-LGG 队列,5 家机构)
接入方式https://www.kaggle.com/datasets/mateuszbuda/lgg-mri-segmentation
AI 就绪度

这个数据集在 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 / 医学图像分割 / 脑肿瘤

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

返回 AI-Ready 数据集