信息速览
前庭神经鞘瘤长在桥小脑角,紧贴第八对脑神经,被脑干、小脑、面神经和耳蜗围在中间。它生长缓慢、几乎不恶变,治疗上有一件事必须先做对:量出它到底有多大。伽玛刀把剂量投进这个体积,处方剂量按体积与毗邻结构定档,体积算错,剂量就落错地方。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 | 全脑结构分割 | 血管,非肿瘤 | 提供血管与颅底结构的旁证 |
6.2 检索路径
按需求找入口有三条路。要同一疾病的不同数据,用「前庭神经鞘瘤」「听神经瘤」「vestibular schwannoma」三个词交叉检索,能命中 crossMoDA 两份与 UCSD 那份。要同一解剖区域的分割任务,用「桥小脑角」「颅底」「cerebellopontine angle」检索,命中率低但准确。要同一方法学范式,用「2.5D」「MONAI」「放射外科」检索,能找到方法相近的条目。
6.3 互链建议
三条互链值得在正文里显式给出:读分割方法时链到 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 / 医学图像分割 / 肿瘤学
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

