听神经瘤 MRI 分割集 — 二百四十二例双序列与原始轮廓

242 例伽玛刀、双序列、肿瘤与耳蜗轮廓与未插值原始标注

来源 The Cancer Imaging Archive https://www.cancerimagingarchive.net/collection/vestibular-schwannoma-seg/发布时间: 2026-10-29最后更新: 2026-10-29 阅读 7
听神经瘤 MRI 分割集 — 二百四十二例双序列与原始轮廓

信息速览

数据集名称听神经瘤 MRI 分割集 — 二百四十二例双序列与原始轮廓
数据类型影像数据,分割轮廓,放射治疗计划,人工标注
规模二百四十二例(2012–2018 年单发前庭神经鞘瘤、接受伽玛刀立体定向放射外科治疗者)
接入方式The Cancer Imaging Archive https://www.cancerimagingarchive.net/collection/vestibular-schwannoma-seg/
AI 就绪度

前庭神经鞘瘤长在桥小脑角,紧贴第八对脑神经,被脑干、小脑、面神经和耳蜗围在中间。它生长缓慢、几乎不恶变,治疗上有一件事必须先做对:量出它到底有多大。伽玛刀把剂量投进这个体积,处方剂量按体积与毗邻结构定档,体积算错,剂量就落错地方。Vestibular-Schwannoma-SEG 就是围绕这一步建起来的:二百四十二例在克里斯蒂医院接受伽玛刀治疗的患者,每人一套 ceT1 与 hrT2 双序列、一套肿瘤与耳蜗轮廓、一份放疗计划与剂量分布。

这份数据在库里的位置很特殊。颅底与桥小脑角这个解剖区域此前没有席位,脑膜瘤归在 BraTS-MEN,泛脑肿瘤归在 TopBrain,胶质瘤归在 BraTS 与 UPenn-GBM,而听神经瘤一个都没有。更特殊的是它与下游的关系:绝大多数分割集的误差止于 Dice 系数,这一份的误差会沿着轮廓进入体积、进入射束权重、进入处方等剂量线,最后落成一个可以给病人执行的剂量方案。

它还有一处工程上的稀缺性:包里同时存了插值后的 RTSTRUCT 与未插值的 contours.json,后者保留了标注者真实手绘的点列。这两套几何并存,既能研究标注习惯,也会让不读文档的人直接踩空。一屏速览见下表。

维度 内容
正式名称 Segmentation of Vestibular Schwannoma from Magnetic Resonance Imaging: An Open Annotated Dataset and Baseline Algorithm
发布方 克里斯蒂 NHS 基金会(The Christie NHS Foundation Trust)伽玛刀中心;数据整理与代码由伦敦国王学院生物医学工程与影像科学系主导(依作者单位)
分发方 The Cancer Imaging Archive(TCIA),DOI 10.7937/TCIA.9YTJ-5Q73
规模 二百四十二例 / 二百四十二个检查 / 1,936 个序列 / 48,582 幅 / 28.21 GB
图像模态 MR(ceT1 与 hrT2 各一),另含 RTSTRUCT、RTDOSE、RTPLAN 三类放疗对象
分割结构 肿瘤(多在 ceT1 勾画)与耳蜗(多在 hrT2 勾画),共识勾画
几何资产 RTSTRUCT(插值后)、contours.json(未插值)、.tfm 仿射矩阵(ITK 格式)
扫描设备 Siemens Avanto 1.5T,三十二通道,单通道头线圈
队列边界 2012–2018 年,十八岁以上,单发单侧,含既往手术者
许可 CC BY 4.0
版本 v2,2021-03-17(在 v1 基础上加配准矩阵与 JSON 轮廓)
官方状态 Complete
配套代码 KCL-BMEIS/VS_Seg,MONAI 实现的 2.5D U-Net 基线
标注单位 单个结构(肿瘤或耳蜗),不是病例、不是层

§1 它到底是什么:一个把分割误差换算成剂量的集合

1.1 一句话定义

Vestibular-Schwannoma-SEG 是一份带放疗计划的前庭神经鞘瘤分割参考集。它回答的问题不是「这片影不影响诊断」,而是:

在这个人的 ceT1 与 hrT2 上,肿瘤的边界画到哪里,耳蜗的边界画到哪里,这个边界最后变成了多少立方厘米的靶体积。

这句话里三个成分必须同时在场才有意义。只给影像,它是一份普通的脑 MRI;只给轮廓,它是一个 Dice 系数的分母;两者加上 RTDOSE 与 RTPLAN,它才变成一条「分割—体积—剂量」的完整链条。链条的存在决定了它的用法:既可以当纯分割任务用,也可以当剂量学研究的数据底座,而后者在公开数据里极少见。

1.2 为什么它不是一份普通的分割集

脑肿瘤分割的常规评测只关心掩膜与参考的重合度,误差是一个无量纲的分数。这一份不一样:轮廓是 GammaPlan 里的治疗结构,它先被用来算体积,体积再去匹配等剂量线,等剂量线决定每一发γ射线的权重,最后生成一张可以执行的剂量分布图。误差在这里不是分数,是物理量。

维度 常规分割集 这一份
参考标准来源 放射科医师勾画或专家复核 治疗神经外科医师与物理师在计划系统内共识勾画
下游用途 分割模型训练与评测 分割、体积测量、剂量计划、放射外科研究
误差的量纲 Dice、HD95 等无量纲分数 立方厘米、戈瑞、等剂量线覆盖率
随附对象 影像与掩膜 影像、结构集、剂量分布、计划、配准矩阵
几何来源 单一掩膜 插值后轮廓与未插值原始轮廓并存
序列关系 常为单序列 双序列,且有逐例仿射矩阵

第二行与第三行合起来,解释了为什么这份数据的标注者不是放射科医师而是治疗团队。勾画在这里不是描述性工作,是治疗计划的第一步,画多画少会改变治疗本身。

1.3 三十秒决策卡

你的处境 它能帮你什么
要做桥小脑角肿瘤的自动分割 二百四十二例双序列加共识轮廓,是目前公开规模最大的一批听神经瘤标注
要研究「分割误差如何传导到体积」 轮廓、剂量、计划三者齐全,可以逐例算体积误差与剂量覆盖的关系
要评测轮廓插值算法 同一病例同时有插值后与未插值两套几何,可直接做前后对照
要做 ceT1 与 hrT2 的跨序列融合 逐例给了 ITK 仿射矩阵,省掉自己配准
要做耳蜗保护相关的剂量研究 耳蜗被单独勾画,是这份数据里第二个结构
要一个带结局的疗效队列 给不了,没有听力、面神经功能、肿瘤控制率
要一批多中心、多设备的泛化测试 给不了,全部来自一台 1.5T 与一台伽玛刀
要直接可训练的实心掩膜 要先从 JSON 或 RTSTRUCT 自己重建,见 §4

1.4 不适合谁

如果你的研究问题是「哪个分割算法更准」,这一份只能算半个答案。 它只有一套共识轮廓,没有重复标注,也没有标注者间一致性数据。用一套参考标准去比较两种算法的 Dice,比出来的是「谁更贴近这三位作者的习惯」,而不是「谁更接近真实边界」。要谈后者,得另找有重复标注的集合做补充。

如果你想要的是「前庭神经鞘瘤的自然史」,这一份同样给不了。 全部影像是治疗前的一次采集,没有随访,没有观察等待组的连续测量,也没有「长到多大才治疗」的时间序列。它记录的是决策点上的一个横断面。

如果你要的是「足够大、足够杂的预训练语料」,体量也不合适。 二百四十二例在自监督预训练的尺度上偏小,真正值钱的是计划与剂量,而不是图像数量。拿它当预训练语料,等于把最稀缺的部分丢在一边。

1.5 库内定位差异

资源 核心内容 与本集合的差异
Vestibular-Schwannoma-SEG 双序列、肿瘤与耳蜗、放疗计划与剂量 唯一带治疗计划与剂量的听神经瘤集
crossMoDA 2022 前庭神经鞘瘤与耳蜗分割的跨模态挑战 任务同源,但以跨模态迁移为评测目标,无剂量
crossMoDA 2023 同一挑战的后续年份,扩展到脑膜瘤 任务相近,评测协议不同,无剂量
UCSD-VS-Longitudinal 前庭神经鞘瘤纵向多模态 MRI 有随访与时间维度,无放疗计划
BraTS-MEN 脑膜瘤术前四序列分割 病种不同,解剖位置部分重叠
ReMIND 脑肿瘤切除术中影像 术中场景,无伽玛刀计划
UPenn-GBM 胶质母细胞瘤多序列 MRI 病种与治疗路径都不同

一句话的选法:要剂量与计划 → 这一份;要跨模态迁移的评测协议 → crossMoDA;要随时间变化 → UCSD 那份纵向集。

§2 医学背景:从桥小脑角到剂量档位

2.1 编码映射与一处口径冲突

前庭神经鞘瘤是良性肿瘤,这一点在编码体系里体现得很清楚:形态学行为码是 0,疾病分类挂在良性颅内肿瘤之下。

体系 编码 名称 备注
ICD-11 实体 480288993 Vestibular schwannoma 类目码随版本调整,以官方浏览器为准
ICD-O-3 形态学 9560/0 Schwannoma, NOS 行为码 0 表示良性
SNOMED CT 126949007 Acoustic neuroma 同义词簇含 vestibular schwannoma
MeSH D009464 Neuroma, Acoustic 主题词仍沿用旧称
MONDO 0001569 acoustic neuroma 本体层与 SNOMED 对齐
UMLS C0027859 Acoustic neuroma 跨体系汇聚点
Orphanet ORPHA252175 Vestibular schwannoma 罕见病登记口径

这里有一处必须点出的口径冲突。TCIA 集合页把这一份同时挂在两个肿瘤类型下:Vestibular Schwannoma 与 Non-Cancer。看起来矛盾,实际是 TCIA 的字段设计——它的 Cancer Types 一栏按「影像涉及的疾病」登记,良性肿瘤与正常对照都归入 Non-Cancer。检索时若只筛恶性肿瘤类目,会漏掉它;反过来,在 Non-Cancer 里翻找又会误以为它是对照组数据。

另一处口径差异在命名上。英文文献里 acoustic neuroma 与 vestibular schwannoma 长期混用,中文里「听神经瘤」与「前庭神经鞘瘤」也混用。严格说,肿瘤起源是前庭神经的施万细胞,不是听神经,所以 vestibular schwannoma 是更准确的称法,而 acoustic neuroma 是历史遗留。集合名称用的是后者之外的正式称法,这一点在引用时不必纠结,检索时两个词都要试。

2.2 解剖:为什么这个位置难画

桥小脑角是颅后窝里一个狭窄的三角区,前界是岩骨后表面,内侧是脑桥与小脑中脚,后方是小脑半球。第七对与第八对脑神经从这里穿出脑干,一起进入内听道。前庭神经鞘瘤起源于内听道内的前庭神经节附近,长大后向桥小脑角池方向膨出,形成一个以听道口为蒂的球形或梨形肿块。

这个解剖结构带来了三个勾画难点。第一是边界对比:肿瘤在 ceT1 上明显强化,与脑干、小脑的边界通常清楚,但与内听道内部分、与相邻神经的边界在部分容积效应下会糊在一起。第二是毗邻结构密集:面神经在三叉神经下方、听神经前方走行,肿瘤压迫后位置会变形,而面神经本身在常规序列上不可见,只能靠解剖推断。第三是耳蜗的位置:耳蜗埋在前庭前方、岩骨内,是听力保护的关键结构,它在 hrT2 上的高信号与脑脊液相近,边界靠骨性结构衬出来。

正因如此,这个任务才需要两个序列。ceT1 有强化,肿瘤边界清楚;hrT2 是重 T2 的三维序列,脑脊液极亮、神经与血管呈低信号,适合看内听道内的精细结构和耳蜗形态。两者互补,缺一个都会让某一部分边界失去依据。

2.3 三条治疗路径与伽玛刀的位置

前庭神经鞘瘤的处理有三条路:观察等待、显微手术、立体定向放射外科。观察等待适用于体积小、症状轻、生长缓慢者,靠定期 MRI 测量生长速度决定是否干预;显微手术适用于体积大、脑干受压、或需要迅速解除占位的病例;放射外科适用于中小型肿瘤,或手术后残留与复发者,目标是把肿瘤控制住而不切除。

伽玛刀属于第三条路里的代表。它用立体定向头架把颅骨固定,建立一套与扫描仪、与治疗床共享的坐标,然后用数十到两百余束钴源射线在等中心汇聚,让靶区获得高剂量、周边迅速跌落。它的优势是无需开颅、门诊完成、对中小型肿瘤的长期控制率稳定;代价是起效慢,肿瘤缩小需要数月到数年,且对体积大的肿瘤容易造成周边水肿。

这三条路的分界点主要是体积与症状,所以体积测量在这个病里不是学术指标,是分流依据。这也是为什么这一份数据把轮廓、计划、剂量一起放出来——它们本来就是同一次决策的三个侧面。

2.4 一次伽玛刀治疗里,轮廓出现在哪一步

把流程拆开看,轮廓的位置就很清楚了。

步骤 做什么 与本集合的对应
固定 局麻下安装 Leksell 立体定向头架 头架上的定位盒产生基准点
成像 带定位盒做 ceT1 与 hrT2 两个 MR 序列即对应此处
勾画 在计划系统内逐层勾画肿瘤与危及器官 RTSTRUCT 与 contours.json
计划 布置等中心、优化射束权重、归一化处方剂量 RTPLAN 与 RTDOSE
执行 按计划投照,剂量分布写入记录 RTDOSE
随访 定期 MRI 测量体积变化 集合内不含

第三行是关键。勾画发生在计划之前,勾画结果直接决定第四步的靶区。第五步的剂量分布又反过来受靶区形状约束——形状不规则,等剂量线要贴着不规则边界走,覆盖度与选择度就会拉扯。

2.5 体积为什么能换算成剂量

伽玛刀的处方方式通常写作「某一等剂量线包绕靶区,处方剂量若干戈瑞」。前庭神经鞘瘤的通行做法是处方剂量落在十二至十三戈瑞区间,处方等剂量线多为五成左右,耳蜗受量尽量压到四至五戈瑞以下以争取保听。这些数字是临床惯例,不同中心会有差异,本集合不含处方档位字段,需要从 RTPLAN 与 RTDOSE 反推。

体积在这个体系里走三条路径影响剂量。第一条是等剂量线的形状匹配:靶体积越大,需要包绕的等剂量面越大,边缘的剂量梯度就越难做陡,周边正常组织受量上升。第二条是射束权重的优化:优化器以「覆盖靶区、避开危及器官」为目标分配权重,靶区边界向外多画一圈,优化器就会把这一圈也当作必须覆盖的区域,权重分配随之改变。第三条是归一化:处方剂量按某一等剂量线归一,体积变了,同一条等剂量线包住的绝对体积也变,归一化的基准随之漂移。

三条路径叠起来的结果是:体积误差没有安全裕度。多切一小片,可能不会改变处方档位,也可能正好把覆盖度推到阈值以下,逼着计划师提高处方线或加射束。把这一点说成「多切零点一立方厘米就多给一档剂量」是夸张的,把它说成「体积误差与剂量误差之间没有缓冲」则是准确的。差别在于:前者是断言,后者是机制。

2.6 三个可建模的任务

任务 输入 输出 评价重点
肿瘤分割 ceT1、hrT2 或两者 肿瘤掩膜 重合度与边界距离
耳蜗分割 hrT2 为主 耳蜗掩膜 小结构,重合度对少量体素极敏感
体积回归 影像或掩膜 立方厘米 相对误差,不是绝对误差

第四个可以加进来但需要谨慎:剂量覆盖预测。用分割结果去预测处方等剂量线能否覆盖靶区,需要 RTPLAN 里的参数,而这些参数反映的是这家中心的计划习惯,样本量二百四十二例也只够做机制演示。把它当作可部署的模型来训练,会高估泛化能力。

§3 规模层:官方给出的全部数字与资产清单

3.1 规模口径

集合页在标题下方用一行字给出规模,数据表再按资产分行重复一次。把这些数字并排放在一起,才能看清它们各自计的是哪一级。

层级 计数 说明
受试者 242 去标识后的 VS-SEG-xxx 编号数
检查 242 每例一次治疗前扫描,一例一检查
序列 1,936 每例平均八个序列,含定位、增强前后、双序列等
图像 48,582 每例平均两百幅左右,随层厚与序列数浮动
体积 28.21 GB 集合页状态栏;下载链接标注为 28.19 GB
结构 2 肿瘤与耳蜗
附带资产 3 类 目录名映射表、配准矩阵、JSON 轮廓

受试者数与检查数相等,是这份数据一个容易被忽略的性质。多数 TCIA 集合里一个病人可能有多次检查(治疗前、治疗后、复发),这里的入组条件是「治疗前影像完整」,所以影像只保留决策点上的那一次。这解释了为什么它的时间跨度长达七年,规模却只有二百四十二——七年里符合条件并被完整采集的连续病例就是这么多。

3.2 筛查漏斗:二百四十八怎么变成二百四十二

官方把入组过程写得很细,逐级剔除的数字都给了。这不是可有可无的方法学细节,它决定了这份数据的边界在哪里。

阶段 例数 剔除理由
初筛符合条件 248 2012–2018 年、十八岁以上、单发单侧、接受伽玛刀、含既往手术者
剔除 4 治疗前影像数据集不完整
剔除 2 肿瘤未完全落在影像视野内
最终入组 242 其中五十一例既往接受过手术治疗

两处剔除的性质不同。影像不完整是采集流程的缺口——少一个序列、少一段层,勾画就缺依据;肿瘤超出视野是解剖与摆位的限制——大肿瘤在有限视野里被截断,边界画不完整,体积必然偏小。后一类剔除会系统性地把大肿瘤排除在外,这一点在讨论泛化时要用到(见 §7.3)。

五十一例既往手术这个数字也值得留意。它意味着队列里超过两成病例的解剖已被改变:手术床、术后改变、可能的金属夹伪影、面神经走行改变。这些病例的勾画难度高于原发未手术者,而官方没有给出「是否术后」这一字段的逐例标注,只有总数。

3.3 四类 DICOM 对象与三件附加资产

影像部分是标准 DICOM,放疗部分是 DICOM RT 的三件套。三者的关系需要说清楚,否则拿到数据会发现「有轮廓但不知道怎么对应到影像」。

对象 内容 与谁绑定
MR 影像 ceT1 与 hrT2 两个序列 通过 Frame of Reference 与结构集绑定
RTSTRUCT 结构集,含肿瘤与耳蜗的轮廓序列 引用某一序列作为参考帧
RTDOSE 三维剂量分布 引用计划,带剂量网格与归一化
RTPLAN 计划参数,含射束、等中心、处方信息 引用结构集
.tfm 矩阵 ITK 格式的 4×4 仿射矩阵,两个方向各一 连接 T1 与 T2 的坐标帧
contours.json 原始轮廓点列,两个模态各一 各自落在 T1 或 T2 的坐标帧
目录名映射表 CSV,把描述性目录名映射到模态 解决下载后的命名问题

RTDOSE 与 RTPLAN 的存在是这份数据区别于普通分割集的关键。多数带轮廓的公开集会剥掉剂量,只留影像与掩膜,因为剂量涉及治疗参数、可能带机构信息。这里保留下来,代价是需要额外的去标识审查,收益是研究者可以反问「这个轮廓在计划里到底变成了什么」。

3.4 采集参数

官方给出了两套序列的具体参数,这些参数决定了预处理时能不能统一重采样。

项 ceT1 hrT2
序列 MPRAGE(三维梯度回波,带反转恢复) 3D CISS 或 FIESTA
TR / TE 1900 ms / 2.97 ms 9.4 ms / 4.23 ms
TI 1100 ms 不适用
面内分辨率 0.4 × 0.4 mm 约 0.5 × 0.5 mm
面内矩阵 512 × 512 384 × 384 或 448 × 448
层厚 1.0–1.5 mm 1.0–1.5 mm
设备 Siemens Avanto 1.5T,三十二通道,单通道头线圈 同左

这里有三个工程含义。第一,两套序列的面内分辨率不同(0.4 对 0.5 毫米),直接叠加会把其中一套模糊掉,融合前必须选一个目标网格并声明重采样方式。第二,层厚是区间而不是定值,不同病例的层厚可能不同,逐例读取像素间距是必须的动作,不能假设全库一致。第三,CISS 与 FIESTA 是不同厂商对同一类稳态自由进动序列的称呼,二者的对比特性相近但噪声纹理不同,做强度归一化时要按序列分别处理。

3.5 两个结构,以及为什么耳蜗也在里面

官方描述里明确写了两个结构:肿瘤与耳蜗。肿瘤是靶区,耳蜗是危及器官。这个组合说明这份数据从设计之初就是按放疗计划的需要组织的,而不是按「分割基准」的需要。

耳蜗被单独勾画,理由在剂量约束上。前庭神经鞘瘤的伽玛刀治疗要在控制肿瘤与保留听力之间取舍,耳蜗是听力器官的末端感受器,它的受量与治疗后听力下降相关。因此计划时会为耳蜗设一个剂量上限,而这个上限要作用在一个具体的轮廓上,所以耳蜗必须被画出来。

这也解释了官方那句容易读漏的话:肿瘤多在 ceT1 上勾画,耳蜗多在 hrT2 上勾画。这不是随意分工,而是各自的成像优势决定的——肿瘤靠强化显影,耳蜗靠重 T2 上的液体对比显影。分工的后果是两套轮廓出生在不同的层网格上,这正是 §4 全部麻烦的来源。

3.6 附加资产的实际体量

三个附加包的大小相差三个数量级,这个比例本身有信息。

资产 格式 体积 内容
目录名映射表 CSV 约 407 KB 描述性目录名到模态的对照
配准矩阵包 TFM 与 ZIP 约 251 KB 每例两个方向的 4×4 矩阵
轮廓包 JSON 与 ZIP 约 16 MB 每例两个模态的原始点列

轮廓包比矩阵包大两个数量级,原因是点列的存储方式:一条闭合轮廓要存几十到上百个三维点,每层一条,几百层叠起来就是可观的数据量。矩阵包只有几百字节一例,因为一个仿射变换只需要十六个数。这个比例也提示了一件事:矩阵是「轻但关键」的资产,容易被忽略,而它恰恰决定了双序列能不能对齐。

3.7 三处口径冲突

第一处是体积。集合页状态栏写 28.21 GB,下载链接的括号里写 28.19 GB。两者相差二十兆,属于取整与压缩方式的差异,不影响使用,但引用时应统一用状态栏的 28.21 GB,并在需要精确值的地方注明出处。

第二处是例数。TCIA 页面写二百四十二个受试者,配套仓库的说明里写有一个受试者(编号 VS-SEG-168)因数据不完整而被移出可用集。两句话不矛盾:TCIA 发布的是二百四十二例的完整档案,仓库作者在组织训练数据时又剔掉了一例。做基线复现时按二百四十一例对齐,做数据盘点时按二百四十二例计。

第三处是「检查数等于受试者数」。这在 DICOM 里是正常的(一次治疗前扫描就是一个 Study),但对习惯「一个病人多次检查」的人会造成误判,容易以为数据被截断。§3.1 已经解释过原因,这里只作提醒。

3.8 这些数字该怎么用

二百四十二例是一个需要正确理解的规模。做分割模型的训练,它与 BraTS 这类上千例的挑战集不在一个量级,单独训练容易过拟合;做迁移学习的微调、做外部验证、做方法学的可行性演示,它是够的;做「分割误差如何影响剂量」这类机制研究,它的规模反而是优势——每一例都带计划与剂量,样本的深度弥补了广度的不足。

序列数一千九百三十六与图像数四万八千五百八十二这两个数,在实际使用中价值有限。它们反映的是采集协议(每例八个序列、两百幅左右),而不是可用样本量。真正的可用样本量是二百四十二个肿瘤与二百四十二个耳蜗,其他序列是定位、增强前后、重复采集的产物。把图像数当样本量报在论文里,是这类集合最常见的误用。

§4 几何层:三套轮廓、两个坐标帧与一台不完美的配准

4.1 同一份标注,三种几何形态

这份数据里,同一组标注以三种形态存在。它们的语义并不相同,混用会直接产出错误的掩膜。

形态 存储 是否插值 坐标帧 适用场景
RTSTRUCT 轮廓 DICOM RT 是,已对齐到目标层 目标影像(T1 或 T2) 直接可视化、快速出掩膜
contours.json JSON 点列 否,保留原始层位 各自模态(T1 或 T2) 研究标注几何、重建真实掩膜
重建后的掩膜 NIfTI 或数组 由使用者决定 使用者选定的网格 训练、评测、体积测量

三者的差异不是格式差异,是几何差异。RTSTRUCT 里的轮廓已经被计划系统改写过一次——它把不在目标层上的点,插值成落在目标层上的点。JSON 里的轮廓没有被改写,它记录的是手真正画下的位置。

4.2 插值是怎么发生的

官方对这件事的描述值得逐句读。要点有四层:

第一层,勾画发生在哪一层,取决于结构。肿瘤多在 T1 上勾,耳蜗多在 T2 上勾,于是肿瘤的轮廓线与 T1 的层共面,耳蜗的轮廓线与 T2 的层共面。

第二层,配准之后,两套层不再重合。T1 与 T2 是在同一次固定下采集的,但层的位置与层厚可以不同(层厚是 1.0 到 1.5 毫米的区间),所以配准后 T2 的层通常不落在 T1 的层上,反之亦然。

第三层,合并后的轮廓线既不与 T1 层共面,也不与 T2 层共面。这句话是官方的原话意思:combined co-registered contour lines were neither jointly coplanar with the T1 nor with the T2 image slices。一个结构集里混着两种层位的轮廓,谁也不对齐。

第四层,导出时被插值。当把结构集导出到某个目标空间时,GammaPlan 会在原始轮廓线之间插值,生成新的、与目标层对齐的轮廓线。这就是 RTSTRUCT 里看到的东西。

这四层说完,结论就出来了:RTSTRUCT 是「计划系统认为应该长这样」,JSON 是「标注者实际画成这样」。前者方便,后者真实。

4.3 未插值意味着什么:价值与坑

未插值的原始轮廓在公开数据里很少见,原因很实际:绝大多数发布流程会先把轮廓栅格化成掩膜,再导出成 NIfTI 或 DICOM-SEG,而栅格化本身就包含插值。等到使用者拿到手,已经看不到原始点列了。

保留原始点列带来两个好处。一是可以研究标注习惯:同一个标注者在相邻层之间怎么走、拐角处是加密点还是直接连线、边界模糊处是保守内缩还是外扩,这些都能从点列里读出来,而掩膜里读不出来。二是可以做插值算法的对照实验:同一份原始点列,用线性插值、形状保持插值、曲面重建各生成一套掩膜,差异就是算法差异,参考标准是同一份,实验设计干净。

代价也很明确。直接把 JSON 点列当掩膜用,会得到一组「空心轮廓」——层与层之间没有填充,体积算出来接近零,训练时标签近乎全空。这是最常见的一次踩空,症状是损失函数不下降、Dice 恒为零,而数据看上去完全正常。

正确的做法是两步:先把点列按层栅格化成二维掩膜,再沿层方向插值成三维体。第二步的插值策略要显式声明,因为它会改变体积。

4.4 坐标帧:LPS 与那对矩阵

DICOM 的坐标约定是 LPS(左、后、上),ITK 内部用的是 LPS,而 NIfTI 用的是 RAS。这条链上任何一次转换写错方向,掩膜就会左右翻转,而左右翻转在轴位切片上看不出来——桥小脑角的肿瘤左右都可能长。

矩阵文件名把方向写在了名字里:inv_T1_LPS_to_T2_LPS.tfm 与 inv_T2_LPS_to_T1_LPS.tfm。名字里的 inv 表示这是把「从源到目标」的变换取逆之后的矩阵,也就是把目标空间的点映回源空间;两个文件名合起来给了一对互逆变换。文件格式是 ITK 定义的标准文本格式,可以直接用 SimpleITK 读取。

这里有一个细节容易出错:inv 前缀让人以为要再取一次逆,实际不需要。读进来直接用,方向由文件名声明。想验证,就取一个在两张影像上都可见的解剖点(例如脑干中心),变换后看落点是否一致。

4.5 配准是怎么做的,以及它不完美

官方的说明是:矩阵来自 Leksell 立体定向系统 MR 定位盒的基准点配准,基准点的定位与配准由 GammaPlan 自动完成。这意味着配准是基于外部基准点的刚性配准,不是基于图像灰度的可变形配准。

刚性配准的优点是稳定、可解释、不会把解剖结构拉变形;缺点是它只能校正整体位置与姿态,校正不了两种序列之间的局部几何差异——梯度非线性、层厚差异带来的部分容积、病人在这两次采集之间的微小移动。因此这套配准在脑干、颅骨附近通常很好,在颅底、岩骨、内听道这些磁化率差异大的区域会有可见的残差。

这一点的操作含义很直接:做多序列融合前,先看矩阵。看三件事。第一,看旋转角是否合理——绕三个轴的旋转超过几度就要警惕,正常人头部固定后不该有大角度旋转。第二,看平移量是否在合理范围——超过头架尺寸的平移几乎一定是配准失败。第三,看行列式是否接近 1——刚性变换的行列式应接近 1,明显偏离说明矩阵不是纯刚性或者被写坏。

如果只看两张影像叠在一起的效果,很容易被「大体上对得上」骗过去。大体对得上正是刚性配准的典型表现,而误差恰恰藏在细节里:内听道口、耳蜗、脑神经出入处。这些位置正好是勾画最需要精度的地方。

4.6 一个具体病例:VS-SEG-168 的去留

配套仓库的说明里写着:有一个受试者,编号 VS-SEG-168,因数据不完整而必须从数据集中移除。这句话短,但它同时说明三件事。

第一,发布与可用之间有一道缝。TCIA 的二百四十二例是发布口径,仓库的二百四十一例是训练口径。用官方数字写论文的方法部分,用仓库脚本跑实验,两边数字对不上时要能解释清楚。

第二,不完整的形态不止一种。§3.2 的漏斗里剔了四例影像不完整,那是入组阶段的剔除;VS-SEG-168 是在发布之后被使用方发现的。发布之后的缺失往往更隐蔽:文件在、序列在,缺的是某个环节,比如轮廓与影像对不上、某个模态的矩阵缺失。

第三,编号是可以用来做完整性检查的钩子。既然编号是连续的 VS-SEG-xxx 形式,就可以用「编号集合减去实际解压出的目录集合」找出缺号,而不是等训练跑完发现某一例全黑才回头查。这个检查写在 §9 的复现清单里。

4.7 单例目录解剖

下载并解压后,一例的目录大致长这样(描述性目录名,实际名称以映射表为准)。

VS-SEG-001/
├── manifest-1600000000000/          #-- TCIA 下载器生成的批次目录
│   ├── 1.2.840.113654.../           #-- 序列 UID 目录,一个序列一个
│   │   ├── 1-1.dcm                  #-- 单幅影像
│   │   └── ...
│   └── ...
├── RTSTRUCT/                        #-- 结构集,含插值后轮廓
├── RTDOSE/                          #-- 剂量分布
├── RTPLAN/                          #-- 计划参数
├── T1/inv_T1_LPS_to_T2_LPS.tfm      #-- T1 到 T2 的仿射矩阵
├── T1/contours.json                 #-- T1 坐标帧下的原始轮廓
├── T2/inv_T2_LPS_to_T1_LPS.tfm      #-- 反向矩阵
└── T2/contours.json                 #-- T2 坐标帧下的原始轮廓

两个细节。第一,序列目录是以 UID 命名的,人眼无法分辨哪个是 ceT1、哪个是 hrT2,必须读 DICOM 的 SeriesDescription,或者用官方给的目录名映射表。第二,JSON 轮廓按模态分开存放,T1 目录下的点列落在 T1 坐标帧,T2 目录下的落在 T2 坐标帧。把两个文件混着用,等于把两套坐标帧当成一套,结果一定是错位的。

4.8 从 JSON 到掩膜的最小流程

下面这段代码把一例的 JSON 轮廓栅格化成掩膜,并算出体积。关键在两步:把点列画到二维栅格上,再沿层方向插值。

#-- 依赖:numpy、nibabel、scipy。先读 DICOM 序列拿到几何,再画轮廓
import json, numpy as np, nibabel as nib
from scipy.ndimage import binary_fill_holes
from matplotlib.path import Path

def load_geometry(ct_dir):
    #-- 用 SimpleITK 读序列最省事,这里假设已导出为 nii 与仿射
    img = nib.load(ct_dir + "/series.nii.gz")
    return img.shape, img.affine

def json_to_mask(json_path, shape, affine, structure="Tumour"):
    pts = json.load(open(json_path))
    mask = np.zeros(shape, dtype=np.uint8)
    for c in pts:
        if c.get("name") != structure:
            continue
        #-- 轮廓点存的是物理坐标(mm),先映到体素坐标
        vox = nib.affines.apply_affine(np.linalg.inv(affine), np.array(c["points"]))
        k = int(round(vox[0, 2]))          #-- 取该轮廓所在层
        poly = Path(vox[:, :2])            #-- 二维多边形,行列顺序按数组轴
        yy, xx = np.mgrid[0:shape[0], 0:shape[1]]
        inside = poly.contains_points(np.c_[yy.ravel(), xx.ravel()])
        mask[:, :, k] |= inside.reshape(shape[0], shape[1])
    mask = binary_fill_holes(mask).astype(np.uint8)
    return mask

def volume_cc(mask, affine):
    vox_mm3 = abs(np.linalg.det(affine[:3, :3]))
    return mask.sum() * vox_mm3 / 1000.0

三点说明。第一,apply_affine 的输入顺序要跟 JSON 里点的存储顺序对齐,官方点列是三维坐标,而 contains_points 要二维,取哪两个轴由层方向决定,不能想当然。第二,binary_fill_holes 是必要的,未插值轮廓天然是空心的,不填充的话体积接近零。第三,volume_cc 用的是仿射矩阵的行列式,也就是单体素体积,若影像被重采样过,这个值必须跟着换,否则体积会整体偏移。

还需要补一步层间插值。上面的做法只在有轮廓的层上填了掩膜,层与层之间仍是空的。补齐的方式有线性插值、形状保持插值、以及按轮廓点重采样成等间距曲面。选哪一种要写进方法,因为它会改变体积——层厚一点五毫米、轮廓间隔一层的话,插值策略带来的体积差异可以达到几个百分点。

4.9 三套几何的体积对照

把这三种几何各算一次体积,差异的方向是可以预期的。

几何 体积偏差方向 原因
RTSTRUCT 插值轮廓 取决于插值方式,通常偏平滑 层间被补成线性过渡,尖角被削
JSON 原始轮廓(不插值) 系统性偏小 层间无填充,空心
JSON 原始轮廓(正确插值) 最接近真实 保留手绘几何,插值只补层间

第三行是应该追求的目标,但它不是一个「一键」的结果:插值策略仍然是选择,选择仍然要声明。这也是为什么这份数据的价值不在「给了你一个更好的掩膜」,而在「给了你一个可以自己定义掩膜的起点」。

§5 任务层:从轮廓到剂量,四类用法与一条基线

5.1 四类用法,各自的输入输出不同

同一份数据可以支撑四种差别很大的用法。它们的输入、输出、评价标准都不一样,混在一起谈会得出互相矛盾的结论。

用法 输入 输出 评价标准
单序列肿瘤分割 ceT1 或 hrT2 肿瘤掩膜 Dice、HD95
双序列融合分割 ceT1 与 hrT2(需配准) 肿瘤掩膜 Dice、HD95,另看融合增益
体积测量 影像或掩膜 立方厘米 相对误差,不是重合度
轮廓插值评测 原始点列 掩膜 与插值后轮廓的一致性

第三行与第一行的评价标准不同,这一点经常被忽略。Dice 高不等于体积准:一个均匀向内缩一圈的掩膜,Dice 可以很高,但体积系统性偏小。对伽玛刀这个场景,体积才是进入计划的量,所以只看 Dice 是不够的。

5.2 官方基线:一个 2.5D U-Net

配套仓库给了一个基于 MONAI 的 2.5D U-Net。所谓 2.5D,是把三维体数据按某一方向切成带上下文的一组二维切片输入网络,网络学的是二维卷积,但每次输入包含相邻层的信息。这样做的原因是数据量小——二百余例的三维卷积很难训稳,而二维骨干可以借用成熟的预训练权重。

仓库说明里列了三处与论文不同的实现:每个卷积块内加了残差连接、下采样改用步长为二的卷积而不是最大池化、除注意力模块外的每个卷积后加 dropout。这些差异说明仓库是「可复现的参考实现」而不是论文代码的原样归档,用它的结果去对比论文里的数字时要注意这一点。

仓库还提供了一条更实用的信息:训练与推理脚本、params/VSparams.py 里的路径配置、以及一份 split_TCIA.csv 示例划分。这份划分是官方给出的少数几个可以直接沿用的约定之一。

5.3 指标:为什么体积误差要单独报

指标 量纲 对什么敏感 在剂量语境下的意义
Dice 无量纲 整体重合度 高 Dice 仍可能体积偏小
HD95 毫米 局部最差边界 反映边界是否有离群误差
ASSD 毫米 平均边界距离 反映整体贴合程度
体积相对误差 百分比 系统性的内缩或外扩 直接对应剂量归一化基准
耳蜗受量误差 戈瑞 小结构的位置偏差 听力保护的关键量

耳蜗那一行值得单独说。耳蜗是一个体积很小的结构,几个体素的偏移就能让 Dice 掉到很低,但更严重的是它离肿瘤很近,掩膜向外多扩一点,耳蜗就会被算进靶区附近的高剂量区,受量估计随之偏高。对耳蜗这种小结构,单看 Dice 会低估问题,应该同时报质心距离。

5.4 双序列融合的四种做法

做法 怎么做 优点 风险
早融合 先把 T2 重采样到 T1 网格,双通道输入 一次前向,简单 配准残差直接进入网络输入
晚融合 两个模型各出概率图,再取平均或投票 单模态失败不影响另一个 两次前向,推理成本翻倍
中期融合 两支编码器,在瓶颈层拼接特征 兼顾互补性 实现复杂,需要更多数据
单模态加后处理 只用 ceT1,用 T2 人工核对边界 最简单,可解释 依赖人工,不能自动化

四种做法里,早融合最常被选,因为它最省事。但它对配准质量最敏感:矩阵偏差一毫米,网络看到的就是错位的两张图,学到的「互补」其实是「错位」。所以早融合之前必须先做 §4.5 的矩阵检查,并把配准误差写进局限性。

5.5 划分:只能按患者切

这份数据的所有切片都来自同一个患者,同一患者的相邻层高度相关。按切片随机划分会把同一患者的切片分到训练集与测试集,测试集上的 Dice 会虚高。正确的做法是按患者编号划分,训练、验证、测试三份不重叠。

官方没有强制划分,仓库给了一份示例 CSV。用它的时候要确认两件事:一是它是否包含 VS-SEG-168,若包含则与该例的实际缺失冲突;二是它的比例是否适合你的任务——二百四十二例做三份划分,测试集若只占一成,就是二十四例,评估的置信区间会很宽。

5.6 训练与推理的最小命令

仓库的命令行很朴素,两条命令覆盖全流程。

#-- 训练:结果落到 VS_crop/model/results/<名字> 下,含模型、日志、曲线
python3 VS_train.py --results_folder_name vs_t1_run --dataset T1 --split params/split_TCIA.csv

#-- 推理:需要与训练同名的结果目录,输出每例的预测掩膜与 Dice 日志
python3 VS_inference.py --results_folder_name vs_t1_run --dataset T1

两个参数值得说明。--dataset T1 与 --dataset T2 是互斥的两套实验,仓库没有提供双序列联合输入的开关,想复现双序列效果要自己改数据加载部分。--no_attention 与 --no_hardness 是消融开关,关掉注意力模块或关掉难例加权,用来验证论文里那两个设计的贡献。

5.7 坑点

坑点1 把 JSON 当掩膜直接读。得到的是空心轮廓,体积接近零,训练损失不下降。先栅格化再插值。

坑点2 不检查层厚就重采样。层厚是 1.0 到 1.5 毫米的区间,逐例不同。写死 1.0 会让部分病例的几何整体错位。

坑点3 把两个模态的 JSON 混用。T1 目录的轮廓落在 T1 帧,T2 目录的落在 T2 帧。混用等于把两套坐标当一套。

坑点4 以为 .tfm 里的 inv 还要再取逆。文件名已经声明方向,再取逆就反了。用解剖点验证一次。

坑点5 按切片随机划分。同一患者的相邻层进测试集,Dice 虚高。按患者编号切。

坑点6 用 Dice 挑模型。Dice 高的模型可能系统性内缩,体积偏小,在剂量场景里是坏的方向。

坑点7 忽略 VS-SEG-168。发布口径二百四十二例,训练口径二百四十一例。两边对不上时先查这一例。

坑点8 把 RTDOSE 当处方剂量。RTDOSE 是三维剂量分布,处方剂量与处方等剂量线在 RTPLAN 里,两者不能互相替代。

§6 与库内条目的关系

6.1 关系图谱

库内与这一份相关的词条可以按三条轴排列:解剖位置、模态组合、是否带治疗信息。

词条 与这一份的共同点 关键差异 组合用法
crossMoDA 2022 同样的疾病与同样的两个结构 评测目标是跨模态迁移,无剂量 用它做迁移预训练,用这一份做剂量侧验证
crossMoDA 2023 同一挑战的后续年份 扩展了脑膜瘤,协议不同 比较两个年份的评测口径
UCSD-VS-Longitudinal 同样的疾病,多模态 有纵向随访,无放疗计划 一份管「怎么变」,一份管「怎么治」
BraTS-MEN 同为颅内部肿瘤分割 脑膜瘤,四序列,无剂量 合并训练可增加颅内部结构的多样性
BraTS 脑肿瘤分割的评测范式来源 胶质瘤,评价体系成熟 借用它的指标与划分约定
ReMIND 术中影像与结构 术中场景,无伽玛刀 术前术后的解剖对照
UPenn-GBM 多序列 MRI 与分割 胶质母细胞瘤,无放疗计划 序列融合方法的对照
TopBrain 2026 全脑结构分割 血管,非肿瘤 提供血管与颅底结构的旁证

按需求找入口有三条路。要同一疾病的不同数据,用「前庭神经鞘瘤」「听神经瘤」「vestibular schwannoma」三个词交叉检索,能命中 crossMoDA 两份与 UCSD 那份。要同一解剖区域的分割任务,用「桥小脑角」「颅底」「cerebellopontine angle」检索,命中率低但准确。要同一方法学范式,用「2.5D」「MONAI」「放射外科」检索,能找到方法相近的条目。

三条互链值得在正文里显式给出:读分割方法时链到 crossMoDA 2022,读纵向变化时链到 UCSD 那份,读颅内部肿瘤的评测惯例时链到 BraTS。这三条覆盖了「同病不同任务」「同病不同时间」「同任务不同病」三种对照关系。

§7 质量评估与局限性

7.0 前置认知校正

评这一份之前,要先拆掉一个错位的框架:它不是基准集,是治疗档案。基准集的评价维度是「标注是否一致、划分是否公平、榜单是否可复现」;治疗档案的评价维度是「几何是否忠实、计划链条是否完整、边界是否写清」。用前一套尺子量它,会得出「没有重复标注、没有官方划分、没有排行榜」三个扣分项,而这三项对它本来就不适用。

反过来,用后一套尺子量,它的短板在别处:没有标注者间一致性、没有随访结局、没有跨中心样本。这两组结论都要说,但顺序不能颠倒——先说它是什么,再说它缺什么。

7.1 已知偏倚

类型 描述 严重程度 缓解
单中心 全部来自克里斯蒂一家伽玛刀中心 高 外部多中心验证
单设备 一台 1.5T 与一套定位头架 高 跨设备测试,声明设备边界
选择性入组 剔除肿瘤超出视野者,大肿瘤被系统性排除 高 明确体积上限,不外推到大肿瘤
治疗路径偏倚 只收接受伽玛刀者,观察等待与手术者不在内 中 与手术队列对照
既往手术混杂 五十一例有手术史,解剖已改变 中 分层分析,或按有无手术史分组
标注偏倚 单一共识,无重复标注 中 抽样复核,估计误差量级

第三行是最容易被忽略的一条。入组要求肿瘤完全落在视野内,这一条把巨大肿瘤排除在外,于是这份数据的体积分布天然缺了上端。用它训出来的模型,遇到大肿瘤时表现如何,数据本身给不出答案。

7.2 标注质量:共识勾画意味着什么

官方的表述是:所有结构由治疗神经外科医师与物理师在 ceT1 与 hrT2 上共识勾画,使用 GammaPlan 的平面半自动方法,逐层手动勾画。这句话包含三个信息。

其一,标注者是最懂这个病的人。 治疗神经外科医师与物理师不是被雇来画轮廓的标注员,他们画的是自己将要执行的计划。这类标注的解剖合理性通常很高。

其二,共识不等于一致。 共识是讨论后的结果,讨论过程没有留痕。数据里没有第二套轮廓,也没有一致性指标,所以无法从数据本身估计「换一个人画会差多少」。想知道这个量级,只能自己做重复标注实验。

其三,「半自动」的具体含义没有展开。 官方说 GammaPlan 用的是平面半自动分割方法,逐层手动完成。半自动通常指软件提供区域生长或阈值辅助,人工修正边界。辅助的强度、人工介入的深度,官方没有量化。这意味着掩膜的「人工程度」不可知——它可能非常手工,也可能大量依赖算法初稿。

7.3 泛化风险

场景 失效风险 证据
迁移到 3T 或 7T 扫描仪 对比度与伪影分布不同 全部为 1.5T
迁移到不同厂商序列 CISS 与 FIESTA 之外的稳态序列纹理不同 采集参数表
迁移到大型肿瘤 训练分布缺上端 入组剔除超视野者
迁移到双侧或 NF2 病例 队列只收单发单侧 入组条件
迁移到术后复发灶 解剖已改变,队列仅含治疗前 无随访影像
迁移到非伽玛刀治疗 勾画标准随治疗方式变化 单一治疗设备

第一行与第三行的风险最高。1.5T 到 3T 的迁移不是简单的分辨率提升,信噪比、磁化率伪影、脂肪抑制效果都会变,模型学到的纹理特征可能整体失效。大肿瘤的缺失则是分布层面的空洞,任何声称「适用于所有听神经瘤」的模型都不能用这份数据背书。

7.4 DAIMS 评分表

DAIMS 是数据管理与共享的成熟度评估框架,八项检查覆盖描述层、结构层、访问层。逐项打分如下。

# 检查项 状态 说明
1 描述层·身份与边界 ✅ DOI 唯一,集合页给出例数、年代、设备、治疗方式与入组漏斗
2 描述层·文档完备度 ⚠️ 有集合页与原论文,但无字段字典,无标注者一致性数据
3 结构层·标识体系 ✅ VS-SEG-xxx 贯穿影像、结构、剂量、矩阵与 JSON
4 结构层·层级一致性 ⚠️ DICOM 四级规范,但发布口径与可用口径相差一例
5 结构层·模态配对 ✅ 双序列逐例配对,且有逐例仿射矩阵显式声明关系
6 访问层·开放程度 ✅ 公开下载,无需申请,TCIA 与 IDC 双入口
7 访问层·可复现性 ⚠️ 有基线代码与示例划分,但无固定随机种子与评测脚本
8 访问层·许可清晰度 ✅ CC BY 4.0,引用格式官方给出,DOI 可解析

DAIMS 评分:六点五 / 八。扣分集中在文档完备度与可复现性两处,层级一致性扣半颗星是因为一例的口径差。

评分解读:身份与访问两项满分,说明它在「能被找到、能被合法使用、能被引用」这一层是干净的。结构层的模态配对拿到满分,是这份数据真正的强项——逐例矩阵比一句「已配准」有价值得多。文档层的扣分不是疏漏,而是这类治疗档案的通病:文档跟着论文走,论文不写的就不在页面上。

对使用者的含义:写论文时划分协议要自己定并写清;比较不同论文的数字前,先确认对方用的是 T1、T2 还是双序列,以及是否剔除了 VS-SEG-168。

7.5 外部验证矩阵

外部场景 来源 评估任务 关键发现
crossMoDA 挑战 同一批数据衍生的跨模态任务 ceT1 到 hrT2 的域迁移分割 该数据是这一挑战的源域之一
同中心回顾性复现 原作者仓库 2.5D U-Net 分割 仓库提交说明记录称结果与论文大致相当

外部验证的公开结果目前只有这两条口径,且第二条来自作者自己的仓库。这不是遗漏,而是这份数据的现状:它发布于二〇二一年,被引用次数在个位数量级,真正独立的跨中心验证尚未形成可引用的矩阵。诚实的写法是把它留白,而不是拿不相干的研究填进去充数。

需要点出的是 crossMoDA 那条的性质:它不是「拿这一份做外部验证」,而是「这一份被当成源域去训练、在别的数据上评测」。方向相反,但同样说明这份数据的标注质量足以承担源域的角色。

7.6 缺了什么,缺的那部分有多重要

缺口 影响面 能否补救
无重复标注 标注者间变异不可估计 可自建重复标注,成本高
无随访影像 无法研究体积变化与控制率 不可补救
无临床结局字段 无法做疗效预测 不可补救
无处方档位结构化字段 剂量分析需从 RTPLAN 反推 可解析,但需 DICOM RT 知识
无逐例设备参数差异 无法做设备分层 实际无差异,影响小
无大肿瘤样本 上端分布缺失 不可补救

第一行与第六行是两条硬边界。前者决定了任何「算法优于人类」的主张都无法在这份数据上成立——没有第二个人类读数作为对照。后者决定了模型的上限:它能学到的是中小型肿瘤的边界规律,超出这个范围就是外推。

第四行值得展开一句。处方剂量、处方等剂量线、射束参数都写在 RTPLAN 里,但它们是 DICOM RT 的嵌套序列,不是一张平表。要把它变成可分析的字段,需要写解析代码,且不同版本的计划系统导出的标签可能不同。这是一项工作量被普遍低估的前置任务。

7.7 伦理与去标识

数据在发布前由 TCIA 完成去标识,患者标识替换为 VS-SEG-xxx,面部结构做了 defacing。因为扫描带立体定向头架,影像里会留下头架与定位盒的痕迹,这些不属于可识别信息,但会出现在图像边缘,预处理时裁剪掉即可。

许可为 CC BY 4.0,允许商用与再分发,义务是署名并给 DOI。伦理层面还有一条不在许可里但必须遵守的:这份数据来自真实病人的治疗档案,任何以「自动分割可直接用于临床决策」为卖点的表述都应当避免,除非经过本地机构审查与前瞻性验证。

§8 版本、生态与为何能持续

8.1 版本时间轴

版本 日期 内容变化
v1 2021-02-26 首次发布,含影像、RTSTRUCT、RTDOSE、RTPLAN 与目录映射表
v2 2021-03-17 追加配准矩阵(.tfm)与原始轮廓(contours.json)
同名论文 2021 Scientific Data 发表数据描述与基线算法

两次发布相隔不到一个月,改动却决定了这份数据的性质。v1 只是一份带轮廓的影像集,v2 补上矩阵与原始点列之后,它才变成一份可以研究「几何从哪来」的数据。这个顺序值得记住:先有可用的东西,再有可研究的东西。

8.2 生态位

它在生态里的位置由两条线交叉决定。第一条是疾病线:前庭神经鞘瘤的公开影像数据很少,crossMoDA 挑战用的是同一批数据的派生子集,UCSD 那份提供了纵向维度,除此之外几乎没有。第二条是治疗线:带放疗计划与剂量的公开影像集本身稀少,多数集合在发布时剥掉了 RT 对象。

两条线交叉处只有一个点,就是这个集合。这也解释了它的引用结构:引用它的论文分两类,一类做分割方法,一类做放射外科的剂量与体积研究,后一类的数量在增长。

8.3 配套代码与权重

仓库提供三样东西:整理下载数据的预处理脚本、基于矩阵的配准与 DICOM 转 NIfTI 的转换脚本、以及基于 MONAI 的 2.5D U-Net 训练与推理脚本。三者构成一条从原始下载到可训练数据的通路。

权重另存于 Zenodo,分 T1 与 T2 两套结果目录,可以跳过训练直接推理。这一点对复现很关键:没有权重时,「跑不出论文的数字」可以是数据问题、代码问题或超参问题;有权重时,差异就被压缩到环境与版本上。仓库说明还提到单卡训练的时间不到一小时(一张移动版显卡),这个量级说明基线并不重,重的是预处理。

8.4 为何能持续

一份二〇二一年发布、引用数为个位数的数据集,凭什么还在被使用?三个理由。

第一,需求端是刚性的。 伽玛刀治疗前必须勾画,勾画耗时且依赖经验,自动分割的收益是直接的工时节省。只要这个临床流程不变,数据就有人用。

第二,它被挑战赛复用。 crossMoDA 把这份数据当成源域,挑战赛年年办,新参与者年年要下载。挑战赛的存在把一份静态数据变成了持续被引用的基础设施。

第三,门槛足够低。 CC BY 4.0、免申请下载、有代码、有权重、有示例划分。四件事凑齐,使用成本就低到「顺手试一下」的程度。数据集的长期存活率往往取决于这一点,而不是标注质量。

反过来说,它的脆弱处也在这里:一旦有更大规模、多中心、带结局的听神经瘤集出现,它的位置会被迅速替代,因为它的护城河是「唯一」而不是「最好」。

8.5 关键文献

文献 作用
Scientific Data 2021,数据描述与基线 官方引用首选,含数据构成与基线算法
Journal of Neurosurgery 2021,自动分割与体积测量框架 临床侧的动机与方法来源
MICCAI 2019,T2 上的空间注意力与难例加权 网络设计的出处
crossMoDA 挑战论文 数据在迁移任务中的用法

四篇文献的关系是:数据描述定义了什么在包里,临床论文定义了为什么需要它,方法论文定义了网络怎么搭,挑战论文定义了它后来被怎么用。引用时按用途选,不要一律引数据描述。

§9 使用指引

9.1 三种角色的路径

角色 建议路径 关键动作
做分割的研究者 先跑仓库基线,再改融合方式 按患者划分,报体积误差
做剂量学的研究者 先解析 RTPLAN 与 RTDOSE 把处方档位变成可分析字段
做数据工程的人 先建清单表,再做几何校验 检查缺号、层厚、矩阵行列式

9.2 最小实现:把矩阵与轮廓用起来

下面这段代码做三件事:读矩阵、检查它是不是一个合理的刚性变换、把 T2 的轮廓映到 T1 网格上。

#-- 依赖:SimpleITK、numpy。矩阵为 ITK 文本格式,可直接读成 Transform
import SimpleITK as sitk, numpy as np

def load_tfm(path):
    return sitk.ReadTransform(path)

def sanity_check(tf, max_rot_deg=10.0, max_trans_mm=150.0):
    #-- 刚性变换:看旋转角、平移量、行列式三个量
    rot = np.array(tf.GetMatrix()).reshape(3, 3)
    trans = np.array(tf.GetTranslation())
    ang = np.degrees(np.arccos(np.clip((np.trace(rot) - 1) / 2, -1, 1)))
    det = np.linalg.det(rot)
    ok = ang <= max_rot_deg and np.linalg.norm(trans) <= max_trans_mm and abs(det - 1) < 1e-3
    return ok, {"rot_deg": round(float(ang), 2), "trans_mm": round(float(np.linalg.norm(trans)), 2),
                "det": round(float(det), 5)}

def resample_to_t1(moving_img, fixed_img, tf):
    #-- 把 moving 重采样到 fixed 网格,变换方向由文件名声明,这里不再取逆
    res = sitk.ResampleImageFilter()
    res.SetReferenceImage(fixed_img)
    res.SetInterpolator(sitk.sitkLinear)
    res.SetTransform(tf)
    return res.Execute(moving_img)

三个函数对应三个动作。sanity_check 里的三个阈值是经验值,不是标准,用之前应按本院数据校准;它拦不住所有错误,但能拦住明显的坏矩阵。resample_to_t1 里注释那句是重点:inv_ 前缀已经声明方向,再取逆就反了。

9.3 在 AI 流程中的位置

把这一份放进一条完整的影像 AI 流程,它覆盖的是「标注与几何」这一段,往前需要采集协议,往后需要临床结局。它给不了结局,所以任何以它为唯一数据源的疗效预测研究,都缺了标签这一环。

一个务实的用法是把它当成中间层:上游用大规模无标注 MRI 做预训练,中游用它做有监督微调(因为标注质量高、任务定义清楚),下游在本地队列上做外部验证并补上结局。三层各司其职,比试图用一份数据打通全链条更现实。

9.4 复现清单

检查项 怎么做 不做的后果
缺号 编号集合与实际目录集合求差 训练时某例全黑,排查耗时
层厚 逐例读像素间距 重采样错位
矩阵 看旋转角、平移、行列式 融合错位,误差进模型
轮廓 先确认是插值版还是原始版 空心掩膜或体积偏差
划分 按患者编号切,检查是否含 VS-SEG-168 Dice 虚高或数据缺失
单位 体积用仿射行列式换算 体积整体偏移

第一行的检查可以用三行命令完成,前提是编号连续(实际起点以解压结果为准)。

#-- 列出实际存在的编号,与期望编号求差,缺的那几个就是可疑项
ls data | grep -oE 'VS-SEG-[0-9]{3}' | sort -u > have.txt
seq -w 1 242 | sed 's/^/VS-SEG-/' | sort -u > want.txt
comm -13 have.txt want.txt          #-- 只出现在期望集合里的编号,即缺号

§10 AI 使用声明卡

项 内容
性质 人工撰写的百科正文,事实来自官方集合页、配套仓库与原论文
用途 数据集选型、接入参考、几何与剂量关系的理解
不建议用途 替代原始论文的方法学阅读;替代 TCIA 数据使用政策;作为临床剂量决策依据
伦理 数据已去标识;使用者仍需遵守所在机构伦理审查
引用 见 §8.5 与 frontmatter 的 DOI
版本 对应 TCIA v2(2021-03-17)
状态 published

常见误读

常见说法 实际情况 证据
「这是脑膜瘤数据」 是前庭神经鞘瘤,良性,起源为施万细胞 集合页疾病字段与 ICD-O 形态码 9560/0
「有几百例,可以当预训练语料」 二百四十二例,规模偏小 集合页规模字段
「RTSTRUCT 与 contours.json 是同一份数据的两种存法」 前者已插值,后者未插值 集合页 Registration matrices and JSON contours 段
「JSON 读进来就是掩膜」 是空心轮廓,需栅格化加插值 官方点列说明
「双序列已经配准好,可以直接叠」 有矩阵,但刚性配准有残差 矩阵来自定位框基准点
「两百四十二例都能用」 基线口径两百四十一例,VS-SEG-168 被剔除 配套仓库说明
「有官方排行榜」 没有划分、没有评测脚本 集合页未列
「有随访,能研究生长速度」 只有治疗前一次采集 入组条件
「可以直接拿去做临床剂量决策」 缺本地复核与前瞻验证 单一共识轮廓
「耳蜗只是顺带标的」 是危及器官,剂量约束的作用对象 官方结构说明

FAQ

Q1:这个集合有几个分割结构?
两个:肿瘤与耳蜗。肿瘤多在 ceT1 上勾画,耳蜗多在 hrT2 上勾画,两套轮廓经配准后并入同一结构集。

Q2:contours.json 与 RTSTRUCT 该用哪个?
要复现计划系统的结果用 RTSTRUCT;要研究真实手绘几何、或做插值算法对照,用 JSON。两者都能用,前提是知道自己拿的是哪一种。

Q3:为什么 JSON 轮廓算出来体积接近零?
因为它没有插值,层与层之间是空的。先按层栅格化,再沿层方向插值,才能得到实心体。

Q4:两个序列是配准好的吗?
配准过,逐例有 ITK 格式的仿射矩阵,两个方向各一。矩阵来自定位框基准点的刚性配准,质量不完美,融合前应检查旋转角与行列式。

Q5:能直接训练三维网络吗?
能,但数据量偏小。官方基线用的是 2.5D 方案,把三维体拆成带上下文的二维切片,原因是这个规模下三维卷积难训稳。

Q6:有没有官方划分?
没有强制的划分,仓库给了示例 CSV。用它之前要确认是否包含 VS-SEG-168,并按患者编号而不是按切片切分。

Q7:有临床结局吗?
没有。集合只含治疗前影像、结构与剂量,不含听力、面神经功能、肿瘤控制率。要做疗效预测,得另找带随访的队列。

Q8:可以商用吗?
可以,CC BY 4.0 允许商用,义务是署名并给出 DOI。

Q9:RTDOSE 里是处方剂量吗?
不是。RTDOSE 是三维剂量分布,处方剂量与处方等剂量线在 RTPLAN 里,两者要配合读。

Q10:耳蜗分割的难点在哪?
体积小、位置深、在 hrT2 上靠液体对比显影。几个体素的偏差就会让重合度大幅下降,评价时应同时报质心距离。

Q11:和 crossMoDA 是什么关系?
同源。crossMoDA 用这一批数据构造跨模态迁移任务,把它当作源域,评测目标是从 ceT1 分割迁移到 hrT2。

Q12:为什么强调「剂量」这条主轴?
因为这个病灶的体积直接进入放射外科的剂量计划。分割误差在这里不是分数,是可能改变治疗方案的物理量。


术语表

术语 释义
前庭神经鞘瘤 起源于前庭神经施万细胞的良性肿瘤,旧称听神经瘤
桥小脑角 颅后窝内脑桥、小脑与岩骨之间的三角区,本病的发生部位
伽玛刀 立体定向放射外科设备,多束钴源汇聚于等中心
SRS 立体定向放射外科,单次大剂量精确照射
处方剂量 计划规定的靶区剂量,前庭神经鞘瘤多为十二至十三戈瑞
处方等剂量线 包绕靶区并按此处归一化的等剂量面,常见为五成
等中心 所有射束汇聚的空间点,剂量的峰值位置
危及器官 需要限制受量的邻近正常结构,本数据中为耳蜗
ceT1 增强 T1 加权像,肿瘤强化明显
hrT2 高分辨率 T2 加权像,常用 CISS 或 FIESTA 序列
CISS / FIESTA 稳态自由进动序列的两种厂商实现,脑脊液极亮
MPRAGE 三维梯度回波序列,用于 T1 加权
RTSTRUCT DICOM 结构集,存放轮廓序列
RTDOSE DICOM 剂量分布对象
RTPLAN DICOM 计划对象,含射束与处方信息
.tfm ITK 的变换文件格式,本数据中为 4×4 仿射矩阵
LPS / RAS DICOM 与 NIfTI 各自的坐标轴约定,方向相反
插值 在已知轮廓之间推算未知层上的边界
栅格化 把点列轮廓转换为像素掩膜
Dice 两个掩膜重合度的常用指标
HD95 95 百分位豪斯多夫距离,反映最差边界偏差
2.5D 以二维卷积处理带层间上下文的三维数据
去标识 移除可识别个人身份的信息
defacing 抹除面部结构以降低再识别风险

附录 A 速查卡

键 值
例数 二百四十二(基线口径两百四十一)
序列数 1,936
图像数 48,582
体积 28.21 GB
结构 肿瘤、耳蜗
序列类型 ceT1、hrT2
设备 Siemens Avanto 1.5T
年代 2012–2018
许可 CC BY 4.0

附录 B 文件清单

文件 内容
Vestibular-Schwannoma-SEG-Feb-2021-manifest.tcia 影像清单,供 Data Retriever 使用
DirectoryNamesMappingModality.csv 目录名到模态的映射
Vestibular-Schwannoma-SEG_matrices-Mar-2021.zip 逐例仿射矩阵
Vestibular-Schwannoma-SEG-contours-Mar-2021.zip 逐例原始轮廓
VS_train.py / VS_inference.py 基线训练与推理脚本
params/split_TCIA.csv 示例划分

附录 C 外部资源对照

资源 类型 用途
TCIA 集合页 官方 元数据与下载入口
IDC 门户 云镜 按集合检索与云端读取
KCL-BMEIS/VS_Seg 代码 预处理、配准、训练与推理
Zenodo 权重 模型 跳过训练直接推理
3D Slicer 工具 可视化 RTSTRUCT 与剂量

附录 D 结构与序列识别对照

现象 可能的对象 处理
肿瘤高信号、脑白质中等 ceT1 肿瘤边界的主要依据
脑脊液极亮、神经呈低信号 hrT2(CISS 或 FIESTA) 内听道与耳蜗的主要依据
灰度呈剂量梯度、无解剖结构 RTDOSE 与结构集叠加读
仅有轮廓点列、无灰度 contours.json 需配影像才能成掩膜

附录 E 关键词索引

关键词 定位
剂量 §2.5、§5.3
未插值 §4.2、§4.3
配准矩阵 §4.4、§4.5
体积 §4.8、§4.9
口径冲突 §3.7、§7.4

编辑说明

核验时间:2026-10-29。核验方式:以 TCIA 集合页正文为主源,配套仓库 README 与提交说明为辅源,疾病编码经 MedGen 与 MONDO 映射核对。未覆盖内容:逐例体积分布、双序列配准残差的定量评估、RTPLAN 字段的实际取值。上述三项需在下载数据后自行核对。本页不含任何来源于二手转述的数字。


相关数据集导航

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

  • cfb-gbm — 共享标签:医学影像 / MRI / 医学图像分割 / 神经科学 / 肿瘤学
  • ixi-dataset — 共享标签:医学影像 / MRI / 神经科学
  • promise12 — 共享标签:医学影像 / MRI / 医学图像分割 / 肿瘤学
  • crossmoda2022 — 共享标签:医学影像 / MRI / 医学图像分割 / 神经科学
  • brats-africa — 共享标签:医学影像 / MRI / 医学图像分割 / 肿瘤学
  • hntsmrg24 — 共享标签:医学影像 / MRI / 医学图像分割 / 肿瘤学
  • panther-pancreas-mri — 共享标签:医学影像 / MRI / 医学图像分割 / 肿瘤学
  • qin-prostate — 共享标签:医学影像 / MRI / 肿瘤学
  • atlas-v2 — 共享标签:医学影像 / MRI / 医学图像分割 / 神经科学
  • trackrad — 共享标签:医学影像 / MRI / 医学图像分割 / 肿瘤学

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

返回 AI-Ready 数据集