信息速览
Pan-Cancer-Nuclei-Seg 是得克萨斯石溪大学团队放在 TCIA 上的一份病理分析结果集。它在 TCGA 的 H&E 全切片上批量跑完逐核分割,覆盖五千二百余例受试者的六千余张切片,输出约五十亿个细胞核的轮廓坐标,另附一批小规模人工标注与三级质控记录。
它要解决的问题不是「没有核分割数据」,而是「核分割数据太小」。现有公开的核分割标注集都在几百到几千个 patch 的量级,够训练一个模型,不够回答「这个癌种的核形态分布是什么」这类问题;更不够把核形态与同一批患者的突变、表达、生存连起来,因为那些 patch 采集时就没有保留病例身份。
这份资源的分量在于它把两件事同时做到了:规模上到全切片,身份上回到病例。代价是它交付的东西性质变了——它给的是已经分好的结果,不是让你打分的数据。这个区别决定了它能不能用、怎么用,全文围绕这一点展开。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 全称 | Pan-Cancer-Nuclei-Seg: Dataset of Segmented Nuclei in H&E Stained Histopathology Images |
| 中文常用名 | 泛癌细胞核分割集、TCGA 泛癌核分割结果集 |
| 发布机构 | 石溪大学(Stony Brook University)生物医学信息学系与计算机科学系 |
| 托管平台 | The Cancer Imaging Archive(TCIA),analysis result 类目 |
| 数据标识 | DOI 10.7937/TCIA.2019.4A4DKP9U |
| 配套论文 | Scientific Data 7:185(2020),DOI 10.1038/s41597-020-0528-1 |
| 方法论文 | CVPR 2019,To Label or to Synthesize?,DOI 10.1109/cvpr.2019.00873 |
| 受试者 | 5,204 例 |
| 切片总量 | 6,142 张 WSI |
| 自动分割层 | 5,060 张 WSI,十个验证癌种,约五十亿个核 |
| 人工标注层 | 1,356 个 256×256 patch,十四癌种(十验证加四未验证) |
| 交付体积 | 665.94 GB,整包需 Aspera 传输 |
| 版本 | Version 1,更新于 2020-02-08 |
| 许可 | TCIA 页面写 CC BY 3.0;论文写 CC0(两处不一致) |
| 质控文件 | 三张 CSV 加一份 Read-Me 加一份 patch 对照表 |
| 主键 | TCGA 影像标识(含病例条码)与数字 Patch-ID 双轨 |
| 代码 | GitHub SBU-BMI/quip_cnn_segmentation,BSD-3-Clause |
| 可视化入口 | PathDB(caMicroscope 内核) |
§1 它到底是什么
1.1 一句话:它是「已经分好的五十亿个核」,不是「等你来分的几张图」
把这句话拆开看,三个词都要紧。
「已经分好的」——每个核的轮廓是现成的,你不需要训练模型才能用它,打开 CSV 就有坐标。这一点与标注集相反:标注集的产物是「标准答案」,你需要先有模型才能消费它;结果集的产物是「一份答卷」,你可以直接统计、直接聚合、直接与临床变量做关联。
「五十亿个」——这个量级不是靠人工堆出来的。论文写得很直白:五千零六十张切片、约五十亿个核。人工标注在同样的切片上只覆盖了一千多个 256×256 的小方块,两者相差六个数量级。
「不是等你来分的」——这是最容易被忽略的一层。它没有划分训练集与测试集,没有统一的评测脚本,也没有一份「这一千个核是标准答案」的清单。想拿它做基准,得自己造评测协议。
| 属性 | 标注集(如 MoNuSeg、PanNuke) | 本结果集 |
|---|---|---|
| 记录单位 | 一个 patch | 一张切片 |
| 核的来源 | 人工逐核描边 | 模型批量推理 |
| 规模量级 | 十的二次方到十的三次方个核 | 十的九次方量级 |
| 病例身份 | 多数只有组织类型 | 每张切片带 TCGA 条码 |
| 直接用途 | 训练与评测分割模型 | 核形态统计、病理组学、与分子数据关联 |
| 需要的前置工作 | 训练一个模型 | 写一套质控与聚合规则 |
1.2 三层交付物,三个用途
这个包里其实有三种性质完全不同的东西,混在一起谈就会出错。
第一层是自动分割结果:五千零六十张切片,每张一个多边形 CSV,加上一份灰度概率图和一份元数据。这一层是「推断值」,用途是规模化统计与特征提取,不能当标准答案。
第二层是人工标注:一千三百五十六个 patch,每个给原图、掩膜、可视化三件套。这一层是「参考值」,用途是评估自动分割的质量,或者做小规模的分割模型微调。它本身也不是完美的标准答案——评估时作者只用了每个 patch 中心的 226×226 像素,因为靠边界的标注本身就有歧义。
第三层是质控记录:三张 CSV,记录哪些切片被判为不可接受、哪些区域的抽样检查没通过。这一层是「使用说明书」,用途是决定哪些数据该丢。
| 层 | 数量 | 性质 | 能做什么 | 不能做什么 |
|---|---|---|---|---|
| 自动分割 | 五千零六十张切片 | 模型推断 | 核密度统计、形态特征、与分子关联 | 当金标准、算模型上限 |
| 人工标注 | 约一千三百余个 patch | 人工参考 | 评估自动层、小样本微调 | 训练大模型、覆盖全癌种 |
| 质控记录 | 三张表 | 元数据 | 筛掉坏切片、定位已知缺陷 | 提供逐核可信度 |
1.3 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 |
|---|---|
| 想统计某癌种的核密度与核大小分布 | 直接聚合多边形 CSV 的面积列,不需要自己跑推理 |
| 已经做完病理组学特征,想接生存分析 | 切片带 TCGA 条码,按前十二位接 GDC 的临床与随访 |
| 想验证自研分割模型在跨癌种上的表现 | 人工层可当小规模外部测试集,但只有十个癌种有对应 patch |
| 需要一个覆盖全切片的核分割基线 | 拿它当「上一版结果」,新模型在同样切片上比一比 |
| 想训练一个核分割模型但缺标注 | 它不能直接当训练标签;人工层太小,自动层有噪声 |
| 想找一批切片做弱监督学习 | 多边形坐标可以反过来当伪标签,但要先按质控表清洗 |
1.4 不适合谁:四条边界
如果需求是「拿一份干净的逐核金标准来评测模型」,这里给不了。自动层没有逐核人工确认,人工层只有一千多个 patch 且评估区只取中心。真要金标准,去 MoNuSeg、PanNuke、NuInsSeg 这类标注集。
如果需求是「训练一个从零开始的核分割模型」,这里也不合适。五千张切片的标签是模型自己产的,用它训练等于让学生抄自己的作业;人工层的一千多个 patch 又太少,撑不起一个泛化模型。
如果需求是「拿原始高清切片做影像组学」,先别急着下整包。论文明确声明不重新分发原始 WSI,包内 SVS 的实际分辨率未经逐例核实,稳妥做法是从 GDC 取原始切片,把这里当分割结果用。
如果需求是「覆盖三十三个 TCGA 癌种」,只有十四个。其中十个经过验证,四个(结肠、直肠、胃、葡萄膜)官方明说未经正式验证,仍可下载但不建议当分析主体。
1.5 三种典型错位期待
第一种,把它当成「更大的 PanNuke」。PanNuke 的价值在于「每个核都有类别标签、都经过质检」,这一份的五千张切片上恰恰没有这两件事。规模大不等于标注密度高。
第二种,把它当成「官方发布的 TCGA 分割真值」。TCIA 的 analysis result 类目托管的是研究者提交的分析产物,不是 TCIA 自己生产的标准件。它经过同行评审(配套论文发在 Scientific Data),但评审的是方法与描述,不是逐核正确性。
第三种,把它当成「一份可以直接喂进模型的数据集」。它没有统一的张量格式,没有划分,没有标签字典,多边形还是字符串。至少要先写三个脚本:解析多边形、栅格化成掩膜、按质控表过滤。
| 错位期待 | 实际情况 | 后果 |
|---|---|---|
| 更大的 PanNuke | 无类别标签、无逐核质检 | 训练出的模型学不到细胞类型 |
| TCIA 官方真值 | 研究者提交的分析结果 | 引用时把责任归错对象 |
| 开箱即用的数据集 | 多边形 CSV 加三张质控表 | 不做预处理直接报错 |
| 可直接与 TCGA 影像对齐 | 包内影像分辨率未核实 | 坐标系统错位、特征全废 |
§2 数据构成与规格
2.1 一个包,四类东西
整包六百多 GB,结构上只有四类东西:切片影像、分割结果、质控表、对照表。四类的组织方式不同,取用方式也不同。
| 类别 | 形态 | 组织方式 | 取用方式 |
|---|---|---|---|
| 切片影像 | SVS | 按癌种目录 | Aspera 整包 |
| 分割结果 | 多边形 CSV、灰度概率图、元数据 | 按癌种分三个目录 | Aspera 整包 |
| 质控表 | TXT/CSV | 平铺在页面 | 普通 HTTP 直下 |
| 对照表 | TXT/CSV | 平铺在页面 | 普通 HTTP 直下 |
这个设计有一个实际好处:四张表加起来不到 600 KB,几分钟就能下完。也就是说,在决定要不要下六百多 GB 之前,完全可以先把质控表读一遍,判断这批数据是否值得。
2.2 两个子集:全切片层与 patch 层
官方把交付物明确分成两个子集,这个分法必须记住,因为它对应两种完全不同的用法。
| 子集 | 覆盖 | 癌种 | 形态 | 用途 |
|---|---|---|---|---|
| 自动分割 | 五千零六十张 WSI | 十个验证癌种 | 多边形 CSV 加灰度图 | 规模化统计与特征 |
| 人工标注 | 1,356 个 patch | 十验证加四未验证 | PNG 原图加实例掩膜 | 质量评估与小样本参考 |
两个子集不是父子关系。人工层的 patch 确实切自同一批切片,但它的选取方式是「十四癌种均匀分布」,不是从五千张里按比例抽。所以不能用人工层去估计自动层的癌种构成,两者分母不同。
2.3 自动分割结果的真实形态:三列 CSV
这一层最容易被想错。很多人以为拿到的是掩膜图,实际拿到的是坐标字符串。
每个癌种有三个目录:多边形目录(*_polygon)、灰度概率目录(*_prob)、元数据目录(*_meta)。多边形目录里每张切片一个 CSV,每行一个核,三列。
| 列名 | 含义 | 单位 | 使用注意 |
|---|---|---|---|
| Area In Pixels | 核的像素面积 | 像素 | 随扫描倍率变化,跨癌种比较前要归一 |
| Physical Size | 折算到 40 倍的像素数 | 像素 | 用于跨倍率比较,但仍不是微米 |
| Polygon | 轮廓顶点串 | 形如 [x0:y0:x1:y1:…] | 需要自己解析成点列 |
这种交付形态有一个直接后果:单张切片的 CSV 可能有几十万行、几百 MB。五千张切片加起来,光文本就非常可观。读的时候必须按切片流式处理,不能一次全读进内存。
#--读一张切片的核表,先看规模再决定怎么处理
import csv
path = "BLCA_polygon/TCGA-2F-A9KO-01Z-00-DX1.csv"
n, area_sum = 0, 0.0
with open(path, newline="") as fh:
rd = csv.DictReader(fh)
for row in rd:
n += 1
area_sum += float(row["Area In Pixels"])
print("核数", n, "总核面积(像素)", round(area_sum))
print("平均核面积", round(area_sum / max(n, 1), 1))
这段代码只做两件事:确认列名能否对上,确认这张切片的核数量级。跑通之后再去写批量版本,否则容易在五千个文件上重复同一个错误。
2.4 人工 patch 的四件套与二十七个特例
人工层每个 Patch-ID 固定带三个文件:原图、修正后的掩膜、可视化。此外有二十七个 patch 多带六个文件——三名标注者各自的独立手工掩膜及可视化。
| 文件 | 内容 | 谁做的 |
|---|---|---|
_crop.png |
原始 H&E patch | 从切片裁出 |
_labeled_mask_corrected.png |
修正后的实例掩膜 | 三名标注者共同修正 Mask R-CNN 输出 |
_labeled_mask_corrected_rgb.png |
掩膜可视化 | 自动生成 |
_labeled_mask_common0-2.png |
独立手工掩膜 | 甲、乙、丙三人各自完成 |
_labeled_mask_common0-2_rgb.png |
上述三份的可视化 | 自动生成 |
这四件套的命名里藏着一个必须说清楚的事实:绝大多数所谓「人工分割」,起点是 Mask R-CNN 的结果。标注者做的是补漏、删误、改边界,不是从空白开始描。这个差别决定了这层数据的误差结构——它继承了模型在难例上的系统性偏差,只是被人修掉了一部分。
只有那二十七个 patch 保留了三份互相独立的手工结果。这是整份资源里唯一能算标注者一致性的地方,也是评估自动分割时那个「人类上限」的来源。
2.5 patch 到病例的对照表
文件名里带 Patch-ID 的图,光看图是不知道它来自哪个病人的。对照表补上了这一环。
它是一张七列 CSV,表头之上还有一段英文说明。
| 列 | 含义 | 例子 |
|---|---|---|
| Patch-ID | 数字编号,不连续 | 68 |
| CancerType | 癌种缩写,小写 | blca |
| WSI-ID | 来源切片 | TCGA-GU-A42Q-01Z-00-DX2 |
| X | 左上角横坐标 | 61434 |
| Y | 左上角纵坐标 | 45209 |
| SizeOriginal | 原始分辨率下的边长 | 396 |
| SizeIn40X | 折算到 40 倍的边长 | 400 |
这张表的实际价值超出「对照」二字。有了 X、Y 和边长,就能把 patch 精确放回切片原位,做「同一张切片上人工区与自动区的对比」;也能反过来用人工区的位置去抽样检查自动层在同一个位置的输出。
2.6 三张质控 TXT 的列结构
三张表的列数不同,回答的问题也不同。
| 文件 | 列 | 回答什么 |
|---|---|---|
| 已验证切片清单 | 癌种、切片标识、质控结论 | 这张切片过没过 |
| 切片级质控结果 | 八列,含核数、平均核尺寸、标注分层、可接受性 | 这张切片为什么没过 |
| 区域抽检结果 | 癌种、切片标识、不可接受区域数、抽样区域数 | 这张切片的局部错到什么程度 |
第一张表的结论列取值为空、通过、切片失败、图块失败四种,此外还能见到两个值粘在一起的情况(例如通过标记紧跟图块失败标记,中间没有分隔符)。这不是显示问题,是文件本身就有的格式瑕疵,解析时必须按子串匹配而不是按等值匹配。
第二张表的第六列是一个分层标签,取值包括核偏少、核过多、核偏小、核过大、尺寸变异小、尺寸变异大、随机抽样。这一列说明这张表不是全量普查,而是按异常统计量分层抽样后的复核记录。
第三张表只有四个数:一张切片抽了多少个区域、其中几个不可接受。默认每张抽十五个区域,少数切片抽三十个,个别切片只抽到一两个。
2.7 与库内六条 patch 级词条的定位差
库内已有六条核分割词条,全部是 patch 级。把它们与这一条放在一张表里,差别一眼可见。
| 词条 | 规模 | 层级 | 病例身份 | 标签性质 |
|---|---|---|---|---|
| monuseg | 千余个核边界 | patch | 无 | 人工 |
| pannuke | 二十余万核、数百 patch | patch | 无 | 半自动加人工复核 |
| nucls | 数千核、百余图 | patch | 部分 | 人工 |
| consep | 千余核、数十图 | patch | 无 | 人工 |
| cryonuseg | 数千核、数十图 | patch | 无 | 人工 |
| nuinsseg | 三万余核、数百 patch | patch | 无 | 人工 |
| 本结果集 | 约五十亿核、五千余切片 | 全切片 | 每张带 TCGA 条码 | 模型推断加小样本人工参考 |
一句话概括:前六条解决「模型怎么学」,这一条解决「学完之后能在多大范围上用、能不能接上分子数据」。
§3 身份层:它挂在 TCGA 的哪根枝上
3.1 分析结果集不是 collection
TCIA 里有两类东西:collection 是原始影像集合,analysis result 是研究者提交的分析产物。这一份属于后者。
这个身份有三层后果。其一,它没有独立的病例纳排流程,受试者完全继承自 TCGA 的十四个癌种队列。其二,它的版本由提交者控制,页面只有一个 Version 1,更新日期停在 2020 年初。其三,引用时要同时引数据集与 TCIA 平台,前者是 DOI,后者是平台论文。
| 维度 | collection | analysis result |
|---|---|---|
| 内容 | 原始影像 | 分析产物(分割、标注、特征) |
| 生产方 | TCIA 与提交机构 | 研究团队 |
| 版本节奏 | 随影像入库更新 | 一次性提交 |
| 引用 | 数据集 DOI 加平台引用 | 同上,另加方法论文 |
3.2 双主键:TCGA 条码与 Patch-ID
这份资源有两套互不相通的主键,必须分开处理。
切片层的主键是 TCGA 影像标识,形如「项目-中心-病例-样本-切片-染色批次.图像 GUID」。前十二位是病例条码,这是与 GDC 对接的唯一可靠入口。后面那段 GUID 是 TCIA 侧的图像编号,只在本平台内有意义。
patch 层的主键是纯数字的 Patch-ID。它不携带任何语义,既不含癌种也不含病例,只能通过对照表翻译。编号还不连续——中间有缺号,说明历史上删过一些 patch。
| 主键 | 形态 | 语义 | 能否直接连 GDC |
|---|---|---|---|
| TCGA 影像标识 | 字母数字加 GUID | 病例、样本类型、切片序号、染色批次 | 能,截前十二位 |
| Patch-ID | 纯数字 | 无 | 不能,须经对照表 |
3.3 十个验证癌种、四个未验证癌种与十五个癌种名
页面的癌种清单里列了十五个名称,但正文说的是「十加四」。这两个数不矛盾,只是计法不同。
十五个名称里,宫颈鳞癌与宫颈腺癌在 TCGA 里属于同一个队列,两者合并计一个。于是十五个名称对应十四个队列:十个经过质控验证,四个(结肠、直肠、胃、葡萄膜)未经验证。
| 计法 | 数量 | 说明 |
|---|---|---|
| 页面癌种名称 | 15 | 按组织学名称逐个列 |
| TCGA 队列 | 14 | 宫颈两个名称合为一个 |
| 经验证 | 10 | 自动分割层的正式范围 |
| 未验证 | 4 | 可下载,官方不建议当分析主体 |
四个未验证癌种的存在方式也值得说清楚:它们的分割结果可以下载,但不在五千零六十张的统计里,也没有对应的验证结论。使用时应当单独报告,不能与十个验证癌种混在一张表里求平均。
3.4 四个分母:人、片、有分割的片、有质控的片
这份资源最容易被糊在一起的地方,是它同时挂着四个分母。它们分别回答不同的问题,混用就会出现「一例患者对应一点二张切片」这类说不通的表述。
| 数字 | 指什么 | 出处 |
|---|---|---|
| 5,204 | 受试者数 | 页面 Subjects 列 |
| 6,142 | 切片总数 | 页面 Studies 列与正文 |
| 5,060 | 有自动分割结果的切片数 | 论文与页面正文 |
| 4,187 | 质控文件覆盖的切片数 | 页面质控行的 Subjects 列 |
四个数字的分母各不相同。受试者与切片不是一对一,一位患者可能贡献多张切片(同一病例的不同染色批次、不同蜡块)。切片总数与自动分割数之间差一千余张,差的是未纳入十个验证癌种的部分。质控覆盖数与自动分割数之间又差八百余张。
这四者的关系可以写成一句话:五二零四是人,六一四二是片子,五零六零是有分割结果的片子,四一八七是有质控结论的片子。任何「这份数据有多少例」的表述,都必须指明用的是哪一个。
3.5 与 TCGA 与 GDC 的上下游关系
上游是 TCGA 的诊断切片。论文的引言里提到,TCGA 计划在十年间分子刻画了两万余例原发肿瘤与配对对照,覆盖三十三个癌种,其中很大一部分患者有诊断级全切片。这份资源取的是这一批里的十四个癌种。
下游是所有拿它做特征提取或弱监督训练的工作。中间没有别的转换层:切片坐标就是 TCGA 的切片坐标,病例条码就是 TCGA 的病例条码,没有重新编号。
| 层 | 内容 | 与本文对象的关系 |
|---|---|---|
| 上游 | TCGA 诊断切片与分子数据 | 提供影像与病例身份 |
| 本层 | 逐核分割结果与质控 | 分析产物 |
| 下游 | 病理组学特征、弱监督模型、形态统计 | 消费方 |
3.6 明确不包含什么
不含分子数据。不含临床表。不含 GDC 的文件清单。不含原始切片的分辨率保证(见 §5.2)。不含逐核的可信度分数。不含训练好的模型权重——权重在 GitHub 的容器镜像里,不在 TCIA 包里。不含任何划分文件。
这条清单比「包含什么」更能界定用途:它是一层结果,不是一个可以自给自足的研究底座。
§4 质量层:五百七十六张被判次优的切片
4.1 两级质控的分工
作者设计了两级质控,两级回答的问题不一样。
切片级质控回答「这张切片整体能不能用」,做法是抽样看局部,再按异常统计量挑出可疑切片做人工视觉复核。patch 级质控回答「自动分割与人工标注差多远」,做法是拿人工标注当参考算重叠度。
两级质控的产物不同:前者产出可接受与不可接受的判定,后者产出 Dice 一类的连续指标。前者决定丢不丢,后者决定信几分。
| 级别 | 抽样方式 | 判定方式 | 产物 |
|---|---|---|---|
| 切片级 | 每张抽十五个 256×256 区域 | 精确率与召回率均达 75% 记为合理 | 质量分档与可接受性 |
| patch 级 | 人工标注的全部 patch | 与人工掩膜算重叠度 | Dice、实例 Dice、计数相关 |
4.2 切片级:每张抽十五个区域
具体做法是:每张切片随机抽十五个 256×256 的区域,把五千零六十张切片的所有抽样混在一起,约七万六千个区域,逐个判断分割是否合理。判据是精确率与召回率都不低于 75%。
这个设计的巧妙之处在于「混在一起」。如果按切片逐张评判,评判者的标准会随切片漂移;打散之后,同一批区域里既有好切片也有坏切片,标准更容易稳定。
代价是覆盖率。七万六千个区域分摊到五千张切片上,每张只有十五个,相当于用十五个 256×256 的窗口去代表一张几万乘几万的切片。这个采样率足以发现系统性问题,不足以发现局部问题。
4.3 五百七十六与四十九:两条不同的失败路径
论文给出两个数,容易混。
第一个是五百七十六张:按切片级质控分档后,被判为分割次优的切片数,后续分析把它们排除在外,但数据仍然发布。这是「批量筛出来的」。
第二个是四十九张:从异常统计量挑出约五百张切片做人工视觉复核,之后再对每个癌种追加百分之二到百分之四的抽样复核,累计又多判了四十九张不可接受。这是「人工看出来的」。
| 数字 | 来源 | 处置 | 数据是否仍在包内 |
|---|---|---|---|
| 576 | 切片级质控分档 | 后续分析排除 | 在 |
| 49 | 视觉复核追加 | 判为不可接受 | 在 |
| 328 中 15 | 技术验证的随机抽样 | 估计总体不可接受率 | 在 |
这三组数字放在一起,勾出这份资源最重要的使用纪律:坏数据没有被删掉,只是被标注了。包是全的,判断要自己做。
4.4 patch 级:九百七十一、八百六十八与零点九三二
人工层有一千三百五十六个 patch,但定量评估只用了其中九百七十一个。差的那些是四个未验证癌种的 patch——它们没有对应的自动分割结果可比。
评估时还有一个裁剪:只用每个 patch 中心的 226×226 像素。理由写在论文里,靠近边界的标注本身有歧义,因为边界外的上下文不完整。这个裁剪同时适用于人工掩膜与自动结果,属于公平处理,但也意味着评估口径比 patch 本身小一圈。
排除不可接受的那一批之后,八百六十八个 patch 上的总体数字是:平均 Dice 约 0.79,平均实例 Dice 约 0.67,核计数的皮尔逊相关 0.93。论文的表述是每个癌种的平均 Dice 不低于 77%,实例 Dice 不低于 62%。
| 指标 | 数值 | 含义 |
|---|---|---|
| 平均 Dice | 约 0.79 | 像素级重叠 |
| 平均实例 Dice | 约 0.67 | 逐核匹配后的重叠 |
| 核计数相关 | 0.93 | 数得准不准 |
| 平均绝对误差 | 约 16% | 计数偏差的相对量级 |
4.5 三张 TXT 怎么联合起来读
三张表单独看都有盲区,合起来才能判断一张切片该不该用。
| 判断 | 看哪张表 | 怎么判 |
|---|---|---|
| 这张切片整体过没过 | 已验证切片清单 | 结论列为通过则保留 |
| 为什么没过 | 切片级质控结果 | 看备注列的具体描述 |
| 局部错得厉害吗 | 区域抽检结果 | 不可接受区域数除以抽样区域数 |
| 属于哪类问题 | 切片级质控结果 | 看分层标签,核过多与核过大最常见 |
一个可操作的规则:先用第一张表筛掉明确失败的,再用第三张表按不可接受比例排个序,把比例高的那一批降级为「仅统计用、不进训练」。第二张表用来解释原因,不用于批量筛选,因为它只覆盖分层抽样的那部分。
4.6 案例一:一千三百六十五与一千三百五十六的四处不一致
这是这份资源里最容易把人绊倒的一处,而且它出现在官方材料内部,不是外部转述造成的。
| 位置 | 写法 |
|---|---|
| 页面正文 | 一千三百五十六 |
| 页面外链区 | 一千三百六十五 |
| 对照表文件名 | 1365patches |
| 对照表说明文字 | 两种写法在同一段里出现 |
| 论文 | 一千三百五十六 |
更细的一层:对照表的 Patch-ID 编号上界是 1365,但中间有缺号(例如 49、59、299、310 等位置)。也就是说,编号从 1 排到 1365 并不等于有 1365 个 patch,实际存在的是 1356 个;缺号的具体数目与位置没有官方说明,只能靠逐行数表头以下的数据行确认。
这个案例的意义不在于「官方写错了」,而在于它示范了这类资源的常态:计数是历史遗留的,不是设计出来的。任何写「这份数据有 N 个 patch」的句子,都应该补一句口径说明,否则复现时对不上。
4.7 案例二:所谓「人工分割」是修正过的模型输出
第二个案例更隐蔽,也更影响用法。
对照表的说明文字写得很清楚:那一份「修正后的掩膜」,是把 Mask R-CNN 的分割结果交给人修正得到的,由三名标注者共同完成。只有二十七个 patch 另存了三人各自从零开始的手工结果。
这意味着两件事。
第一,人工层的误差不是独立误差。Mask R-CNN 在难例上的系统性漏检,如果标注者没注意到,就会原样留在「人工标注」里。用它去评估另一个模型,两者的错误可能相关。
第二,人工层不能当「人类水平上限」的干净估计。真正能算一致性的只有那二十七个 patch,而二十七个样本算出的 kappa 或 Dice,置信区间很宽。
| 层 | 起点 | 人工参与度 | 可用来做什么 |
|---|---|---|---|
| 自动分割 | U-Net 直接输出 | 无 | 规模化统计 |
| 修正掩膜 | Mask R-CNN 输出 | 补漏、删误、改边界 | 评估自动层 |
| 独立手工 | 空白 | 从零描边 | 估计标注者一致性 |
4.8 一个反直觉的结果:机器比人更「一致」
论文的表格里有一个值得停一下的现象:自动分割与人工修正掩膜之间的平均 Dice 约 0.79,而三名标注者两两之间的 Dice 在 0.75 到 0.77 之间。
机器与人的一致性,高于人与人之间的一致性。
这不说明机器比人准。它说明的是:当参考标准本身由「修正模型输出」得到时,参考标准已经带上了模型的偏好,两者自然更接近。同时也说明像素级 Dice 在这个任务上已经接近饱和——核的边界在 H&E 上本来就有肉眼难辨的模糊带,人和人画出不同的边,是任务属性,不是谁错。
| 比较 | Dice | 解读 |
|---|---|---|
| 自动 vs 修正掩膜 | 约 0.79 | 同一血脉,偏高 |
| 甲 vs 乙 | 约 0.76 | 独立人工,偏低 |
| 乙 vs 丙 | 约 0.75 | 同上 |
| 丙 vs 甲 | 约 0.77 | 同上 |
把这三个数放在一起,可以得出一条使用建议:在这份数据上比 Dice 的高低,意义有限;比核计数的一致性、比下游任务的增益,信息量更大。
§5 交付层:怎么取、怎么接、怎么用
5.1 唯一通道是 Aspera
整包只提供 Aspera 传输,需要先装 IBM 的客户端插件。这一点在实操上很要命:普通浏览器下载会得到一个需要专用客户端打开的链接。
三张质控表与对照表不走 Aspera,是普通 HTTP 直链,几秒钟能下完。
#--先把四张小表拿到手,几秒钟,不占带宽
base="https://www.cancerimagingarchive.net/wp-content/uploads"
for f in list_of_verified_wsis.txt \
wsi_quality_control_result.txt \
random_segmentation_region_checking_result.txt \
Pan-Cancer-Nuclei-Seg_1365patches_to_TCGA-ID_readme.txt; do
curl -sSL -o "$f" "$base/$f"
printf '%s\t%s 行\n' "$f" "$(wc -l < "$f")"
done
这段脚本跑完,你会得到四张表的行数。行数本身就是一个校验:切片清单的行数应当接近五千,区域抽检表的行数应当与之一致,质控表的行数则明显更少。
5.2 六百六十五 GB 到底装了什么
这里有一个必须点出来的口径冲突。
| 信号 | 说法 |
|---|---|
| 页面格式列 | SVS |
| 页面数据类型 | 病理切片与分割结果 |
| 页面体积 | 665.94 GB,对应六千一百四十二张切片 |
| 论文正文 | 不重新分发原始切片,需自行从 TCGA 下载 |
| 旧版说明页 | 切片影像单独计 1,200 GB,走 Box 分发 |
把四个信号放在一起,只能得出一个稳妥结论:包里的 SVS 未必是 TCGA 原始 40 倍全分辨率影像。六千余张切片摊到六百多 GB,平均每张一百 MB 出头;而 TCGA 的诊断级全切片通常在数百 MB 到 GB 量级。旧版说明把影像单独记为 1,200 GB、现版整包反而更小,也指向「重新打包时换了形态」。
这不等于数据有问题,但意味着:把它当影像源之前,必须开一张图看层级。
#--开一张切片,检查层级数与 0 级尺寸,确认是不是原始分辨率
python3 -c "
import openslide, sys
s = openslide.OpenSlide(sys.argv[1])
print('层级数', s.level_count)
print('0 级尺寸', s.level_dimensions[0])
print('倍率', s.properties.get('openslide.objective-power'))
print('微米每像素', s.properties.get('openslide.mpp-x'))
" BLCA/TCGA-2F-A9KO-01Z-00-DX1.svs
判断标准很直接:0 级尺寸在几万像素量级、倍率标 40、每像素约 0.25 微米,才是原始分辨率;如果 0 级只有几千像素,那就是降采样后的版本,不能用来做精细形态测量。
5.3 解析多边形 CSV
多边形是字符串,形如方括号里用冒号分隔的坐标对。解析要小心两点:分隔符是冒号不是逗号,坐标是字符串不是数值。
#--把多边形串解析成点列,顺带算一下顶点数分布
import csv, re
def parse_polygon(s):
nums = [int(x) for x in re.findall(r"-?\d+", s)]
return list(zip(nums[0::2], nums[1::2]))
path = "BLCA_polygon/TCGA-2F-A9KO-01Z-00-DX1.csv"
verts = []
with open(path, newline="") as fh:
for row in csv.DictReader(fh):
pts = parse_polygon(row["Polygon"])
verts.append(len(pts))
verts.sort()
print("核数", len(verts))
print("顶点数中位数", verts[len(verts) // 2])
print("顶点数范围", verts[0], verts[-1])
顶点数的中位数是一个有用的健全性检查。如果中位数只有三四个,说明这份 CSV 存的是包围盒而不是轮廓;如果是几十上百,才是逐点描出的多边形。
5.4 从多边形还原掩膜
要把多边形变回掩膜,用现成的栅格化工具即可,不必自己写扫描线。
#--把一张切片的核多边形栅格化成实例掩膜,供后续特征计算
import csv, re
import numpy as np
from PIL import Image, ImageDraw
W = H = 4000 # 分块边长,与官方输出粒度一致
def parse_polygon(s):
nums = [int(x) for x in re.findall(r"-?\d+", s)]
return list(zip(nums[0::2], nums[1::2]))
mask = Image.new("I", (W, H), 0)
draw = ImageDraw.Draw(mask)
with open("BLCA_polygon/TCGA-2F-A9KO-01Z-00-DX1.csv", newline="") as fh:
for i, row in enumerate(csv.DictReader(fh), start=1):
pts = parse_polygon(row["Polygon"])
if len(pts) >= 3:
draw.polygon(pts, fill=i)
arr = np.array(mask)
print("实例数", int(arr.max()), "前景占比", round(float((arr > 0).mean()), 4))
mask.save("tile_mask.tif")
这段代码假设 CSV 内的坐标是块内相对坐标。如果实际是切片全局坐标,要把原点偏移减掉,否则掩膜会画到画布外。第一次跑务必打印坐标的最大最小值核对。
5.5 按条码接回 GDC
这是这份资源真正的价值所在:切片有身份,身份能连分子。
#--把切片清单里的病例条码抽出来,与 GDC 的临床表做交集
import csv, json, urllib.request
cases = set()
with open("list_of_verified_wsis.txt", newline="") as fh:
for row in csv.DictReader(fh):
wsi = row["WSI-ID"]
parts = wsi.split("-")
if len(parts) >= 3:
cases.add("-".join(parts[:3]))
print("可解析出的病例数", len(cases))
#--用 GDC 的项目接口确认癌种侧写,不拉具体病例
req = urllib.request.Request(
"https://api.gdc.cancer.gov/projects/TCGA-BLCA?expand=summary,summary.experimental_strategies&pretty=true")
with urllib.request.urlopen(req, timeout=30) as resp:
info = json.load(resp)
print(info["data"]["summary"]["case_count"], "例(该癌种在 GDC 的病例数)")
两个提示。第一,切片的项目号在条码第三段,某些切片用的是中心码而不是标准项目码,解析时要允许例外。第二,GDC 的病例数与本地的可解析病例数不会完全相等,差值来自没有影像的病例与条码异常的切片。
5.6 把五百七十六张挡在训练集外
如果不做这一步,五千余张里会混进作者自己都判为次优的那一批。
#--合并三张质控表,给每张切片打一个可用性标签
import csv
verdict = {}
with open("list_of_verified_wsis.txt", newline="") as fh:
for row in csv.DictReader(fh):
v = (row.get("QCResult") or "").strip()
bad = ("failed" in v)
verdict[row["WSI-ID"]] = "fail" if bad else "ok"
region = {}
with open("random_segmentation_region_checking_result.txt", newline="") as fh:
for row in csv.DictReader(fh):
n_bad = int(row["NumOfUnacceptableSegRegions"])
n_all = max(int(row["NumOfSampledRegions"]), 1)
key = row["WSI-ID"].split(".")[0] # 该表省掉了图像 GUID 与扩展名
region[key] = n_bad / n_all
def usable(wsi, thr=0.2):
if verdict.get(wsi, "ok") == "fail":
return False
return region.get(wsi, 0.0) < thr
kept = sum(1 for w in verdict if usable(w))
print("清单内切片", len(verdict), "按阈值保留", kept)
这里有一处必须先处理的陷阱:区域抽检表的切片标识只写到染色批次(形如 TCGA-14-0813-01Z-00-DX2),省掉了图像 GUID 与扩展名;清单表写的是完整标识。两张表直接按字段等值连接会一条都对不上,得到一张空表却不会报错。上面代码里的截断键就是为此加的。
阈值取多少没有官方答案。二成是一个保守起点:区域抽检里超过两成不可接受,基本可以认定这张切片的分割没法直接用于形态统计。
5.7 可视化:PathDB 与 caMicroscope
官方指了一个可视化入口 PathDB,它基于 caMicroscope,可以直接在浏览器里叠着看切片与分割结果。论文里提到的可视化工具也是 caMicroscope,用于切片级的视觉复核。
对使用者的意义是:不必先把六百多 GB 下完,就能抽查几张看看分割长什么样。适合在立项阶段判断「这个分割质量能不能支撑我的问题」。
5.8 存储与算力预算
| 项 | 量级 | 说明 |
|---|---|---|
| 整包下载 | 六百多 GB | 需要 Aspera 与足够磁盘 |
| 单张切片多边形 CSV | 数十到数百 MB | 与核密度成正比 |
| 栅格化后的掩膜 | 每块 4000×4000 | 建议存成整型 TIFF |
| 单张切片推理 | 数 GPU 小时 | 论文报告的量级,供重跑参考 |
如果只做统计不做影像,可以不下载 SVS,只取多边形 CSV。这是这份资源少见的「可分割消费」特性:结果与影像是分开的文件,不必整包拿。
§6 与库内词条的关系
6.1 关系图谱
它在库内的位置很清楚:上游是 TCGA 影像与分子数据,平级是六条 patch 级核分割词条,下游是各类病理组学与弱监督工作。
| 层级 | 代表词条 | 关系 |
|---|---|---|
| 上游 | tcga、tcga-brca、tcga-luad、tcga-gbm | 提供影像与病例身份 |
| 平级 | monuseg、pannuke、nucls、consep、cryonuseg、nuinsseg | 同为核分割,但层级不同 |
| 下游 | 病理组学与生存分析相关工作 | 消费本层结果 |
6.2 与六条 patch 级词条的分工
一条可操作的判断规则:要训练模型,去 patch 级;要规模化统计或接分子,来这里。
| 需求 | 该用哪一类 | 理由 |
|---|---|---|
| 训练一个核分割网络 | patch 级标注集 | 有逐核人工标签,规模够 |
| 评测模型的跨癌种泛化 | patch 级标注集 | 有划分与基准 |
| 统计某癌种的核形态分布 | 本结果集 | 全切片覆盖,样本量大 |
| 把核特征与突变、生存关联 | 本结果集 | 切片带病例条码 |
| 做弱监督的伪标签 | 本结果集 | 量大,但要先按质控清洗 |
6.3 与 TCGA 系列词条的分工
TCGA 总词条讲计划的组织与范围,单癌种词条讲某个癌种里有什么,这一条讲「病理影像上已经算出了什么」。
三者的关系是「计划—病种—产物」。找背景看总词条,找某个癌种的影像与临床看单癌种词条,找可以直接用的核级结果看这一条。
6.4 三种组合配方
配方一,训练加铺开:先用 patch 级标注集训练一个核分割模型,再用本结果集的切片做大规模推理,两边对照着看模型在自己没见过的癌种上会不会崩。
配方二,形态加分子:从本结果集算核密度、核面积、核形状的切片级汇总,按条码接 GDC 的突变与表达,做「形态特征与分子亚型是否相关」的分析。
配方三,结果加原图:把本结果集的多边形当初始分割,回到 GDC 的原始切片上做精细修正,兼顾规模与精度。这条路线的前提是先按 §5.2 核实物料层级。
§7 质量评估与局限性
7.0 读本节前先换一把尺子
评估这份资源,最容易犯的错是拿 patch 级标注集的标准来量它。
标注集的评价维度是「标签准不准、覆盖全不全、划分合不合理」。用这三把尺子量本结果集,会得出「标签不准(没有逐核人工确认)、覆盖不全(只有十个癌种)、划分缺失(没有训练测试集)」三个否定结论,然后判定它不行。
这是评价框架错位。它是结果集,该问的是另外三件事:结果的可信度有没有被量化、不可信的部分有没有被标出来、标出来的信息够不够支撑剔除决策。
按这三问,它的答案是:可信度被量化了(Dice、实例 Dice、计数相关),不可信的部分被标出来了(三张质控表),剔除信息够用(可接受性字段加区域不可接受比例)。三项都成立。
7.1 DAIMS 八项评分
DAIMS 把数据质量拆成描述层、结构层、访问层三组。按这八项打分,能看出它的强项在文档与描述,弱项在层级一致与模态配对。
| DAIMS 维度 | 评分 | 依据 |
|---|---|---|
| 描述层身份与边界 | 4.0 | 名称、机构、DOI、癌种范围、版本日期齐全;但 patch 计数三处不一致、包内影像形态与论文声明冲突,身份清楚而边界模糊 |
| 描述层文档完备度 | 4.5 | 一篇 Scientific Data 论文加一份方法论文加一份 Read-Me 加三张质控表,字段级说明基本齐全,连失败案例都给了解释 |
| 结构层标识体系 | 4.0 | 切片层用 TCGA 条码,行业内最稳的一套标识;patch 层退回纯数字编号,靠对照表翻译,编号还不连续 |
| 结构层层级一致性 | 3.5 | 受试者、切片、有分割的切片、有质控的切片四个分母并存,人工层与自动层不是父子关系,跨层计数必须现算 |
| 结构层模态配对 | 3.0 | 分割结果与原图配对良好,坐标可回放;但与分子模态的配对不在包内,须自行接 GDC,且影像分辨率存疑 |
| 访问层开放程度 | 4.0 | 无需注册、无需申请,四张小表 HTTP 直下;整包限定 Aspera,对无客户端的环境构成门槛 |
| 访问层可复现性 | 4.0 | 单一版本、冻结在 2020 年初,字节稳定;但未提供整包校验清单,代码栈停留在 Python 2 与 TensorFlow 1 |
| 访问层许可清晰度 | 3.5 | 页面写 CC BY 3.0,论文写 CC0,两种许可的义务不同,二次分发前须自行判断以哪一份为准 |
八项相加没有意义。做形态统计的人最看重结构层的层级一致性,做合规审查的人最看重访问层的许可清晰度。
7.2 分数怎么读
两项四点五与四项四分说明它的交付是认真的:文档写得细,标识用得对,访问没有人为门槛。这类资源在学术提交里属于上乘。
三项三点五及以下指向同一件事:它是一份「有历史的」数据。计数不一致、许可两说、影像形态存疑,都不是设计失误,是多次打包与多轮表述叠加的结果。
最该注意的是结构层模态配对那项的三分。这不是说分割不好,而是说「分割加分子」这条最有价值的用法,中间那一段连接完全在包外。谁想走这条路,工作量的大头不在数据侧。
7.3 五条可枚举的偏差
第一条,参考标准偏差。人工层的多数掩膜以模型输出为起点,评估时又拿它当参考,形成循环。表现为自动分割与人工的 Dice 高于人工之间的一致性。
第二条,采样偏差。切片级质控每张只抽十五个区域,足以发现系统性失败,难以发现局部失败;人工层的 patch 按癌种均匀分布,不按切片数量加权,与自动层的实际分布不匹配。
第三条,分块偏差。分割以 4000×4000 分块执行,跨块的核被切开,边缘不足 2000 像素的块不分割。论文自己说,所有验证结果都包含这类「设计内误差」。
第四条,语料偏差。上游是 TCGA 的诊断切片,以手术切除标本为主,晚期与活检小样本覆盖有限;十四个癌种之外的组织类型完全没有。
第五条,许可表述偏差。同一份数据在平台页与论文里给了两种许可。这不是法律问题,是引用规范问题:写论文时按哪一份声明,会影响到后续能否二次分发。
7.4 它为何能持续
这份资源从 2020 年初冻结至今,没有再更新,但引用一直在增加。靠的是三件事同时成立。
其一,位置独占。全切片级的公开核分割结果,至今没有第二个同量级的替代。想做大样本核形态研究,绕不开它。
其二,身份可接。切片带 TCGA 条码这件事,把它从一个「图像数据集」变成了「可以接分子数据的表」。这个属性的价值随时间上升,因为 GDC 侧的分子与临床数据一直在补。
其三,成本已被支付。五十亿个核的推理成本由原作者一次性付掉了。任何想复现这个规模的人,要么重跑数千 GPU 小时,要么用它。这种「沉没成本形成的公共品」在学术资源里不多见。
它的生存方式不是「被更新」,而是「被引用」。这也解释了为什么它不需要维护:一旦成为某个量级的唯一选项,维护的动力就来自使用方,而不是发布方。
§8 生态位与历史
8.1 从 CVPR 到 Scientific Data
时间线很短,但每一步都有痕迹。
2019 年 6 月,方法论文在 CVPR 发表,题目是一个设问:标注还是合成。核心主张是用合成数据替代大量人工标注,并用重要性采样让合成数据在训练中的权重可控。
2019 年,数据集在 TCIA 建档,DOI 落在 2019 年的号段。
2020 年年中,Scientific Data 发表数据描述论文,给出完整的质控流程与验证数字。
2020 年 2 月,TCIA 页面更新为 Version 1,此后再无版本变更。
| 时间 | 事件 | 意义 |
|---|---|---|
| 2019-06 | CVPR 方法论文 | 确立合成数据加重要性采样的路线 |
| 2019 | TCIA 建档 | 数据获得独立 DOI |
| 2020-02 | Version 1 | 交付形态冻结 |
| 2020-05 | Scientific Data 论文 | 质控与验证公开 |
8.2 上游:TCGA 病理影像的十年存量
TCGA 的分子刻画覆盖三十三个癌种、两万余例样本,其中相当一部分患者有诊断级全切片。这批影像在 2013 年前后陆续公开,到 2019 年已经积累了数年,但围绕它们的分割结果一直停留在零散的小规模试验。
这份资源的时机正好:影像存量足够大,硬件足够跑得动,合成数据的方法刚刚成熟。三者凑齐,才有「一次跑完五千张」的可能。
8.3 下游:谁在用它
三类用法最常见。
第一类是核形态特征提取。把切片级的多边形聚合成核密度、核面积分布、核形状参数,再与临床变量做关联。这类工作看重的是覆盖面,不看重单核精度。
第二类是弱监督与伪标签。拿多边形当初始标签训练分割网络,用大量未标注数据做自训练。这类工作看重的是量,但必须先按质控表清洗,否则噪声会放大。
第三类是方法对比的基线。新方法在同样的切片上跑一遍,与这份结果比覆盖率与一致性。这类工作看重的是「有一个公开的参照」。
| 用法 | 看重什么 | 主要风险 |
|---|---|---|
| 形态特征提取 | 覆盖面 | 未过滤次优切片 |
| 弱监督伪标签 | 数量 | 噪声被自训练放大 |
| 方法对比基线 | 可复现 | 参照本身有系统偏差 |
8.4 同类对照
| 资源 | 层级 | 规模 | 与本文对象的差异 |
|---|---|---|---|
| MoNuSeg | patch | 千余核边界 | 人工精细,规模小,无病例身份 |
| PanNuke | patch | 二十余万核 | 有细胞类别,半自动,规模中等 |
| NuInsSeg | patch | 三万余核 | 多器官,含模糊区掩膜 |
| TCGA 原始影像 | 全切片 | 三万余张 | 有图无标签 |
| 本结果集 | 全切片 | 五千余张带分割 | 有标签但为推断值 |
一句可操作的判断:要精度选 patch 级,要广度选本结果集,要原图选 GDC。
8.5 为什么这类「结果集」比「标注集」更少见
标注集容易发,结果集难发。
标注集的贡献可以说清楚:多少人、标了多久、一致性多少。结果集的贡献要说清楚「凭什么信这个模型的输出」,需要一整套验证设计——这正是这篇 Scientific Data 论文花了大半篇幅做的事:两级质控、四个人工标注者、五档质量分组、逐癌种的指标表。
另一层原因是责任。发布标注集,错了是标注错;发布结果集,错了是方法错,而且会被大量下游工作继承。这也是为什么这份数据在发布时把「哪五百七十六张不行」写在了论文正文里,而不是悄悄删掉。
§9 使用指引
9.1 三种角色的路径
做形态统计的人,路径是「质控表 → 多边形 CSV → 切片级聚合 → 临床关联」。先筛切片,再算特征,最后接变量。顺序不能反,反了会把次优切片的伪特征带进模型。
做模型的人,路径是「人工层 → 评估协议 → 自动层当伪标签 → 自训练」。先用人工层定一个可比的评估口径,再去用海量结果。
做数据工程的人,路径是「四张小表 → 整包清单 → 分癌种解包 → 流式解析」。先把元数据理顺,再动大文件。
9.2 一条最短可用流程
第一步,下四张小表,十分钟内完成。第二步,用切片清单筛出通过的切片,得到可用集合。第三步,只解包其中一个癌种的多边形目录,跑通解析与聚合。第四步,把该癌种的切片级核密度按条码接到 GDC 的临床表,看能不能对齐。第五步,对齐成功后再扩到其余癌种。
这五步的意义是「先用最小代价验证链路」。六百多 GB 的包,最怕的是下完才发现坐标对不上、条码接不上。
9.3 引用怎么写
三层都要引。
数据层引 TCIA 的数据集 DOI,并注明获取日期与版本。方法层引 CVPR 那篇,说明分割是怎么产生的。描述层引 Scientific Data 那篇,说明质控与验证口径。
只引数据 DOI,审稿人无法判断分割的可信度;只引方法论文,读者找不到数据。三层齐全,才算把来源交代清楚。
9.4 合规清单
确认许可按哪一份执行(页面与论文不一致)。确认没有再分发原始切片。确认在方法里写明了用的是哪一层(自动、修正、独立手工)。确认写明了是否剔除次优切片以及阈值。确认引用了 TCIA 平台本身。
五条都做到,合规与可复现两项基本无虞。
§10 AI 使用声明
10.1 它在训练流程里的位置
它不是训练集,是「预训练语料」或「伪标签源」。
如果要做自训练,合理的位置是:用人工层的一千多个 patch 做初始监督,用自动层的多边形做无监督或弱监督的扩展,用质控表控制噪声比例。反过来,直接拿自动层当监督信号从零训练,等于把模型的偏置固化。
划分也要小心。切片来自同一位患者的多张片子,按切片随机划分会把同一患者的切片分到训练与测试两侧,指标虚高。正确做法是按病例条码划分。
10.2 生成式模型最容易说错的四个数
第一个是核的总数。论文写约五十亿,任何精确到个位的表述都不可信,因为这个数本身是估计。
第二个是 patch 数。一千三百五十六与一千三百六十五两个版本都在官方材料里出现,最稳的写法是「约一千三百余」。
第三个是癌种数。十个验证加四个未验证,共十四个队列、十五个组织学名称。说「覆盖三十三个 TCGA 癌种」是明显错误。
第四个是切片数。六千一百四十二是总量,五千零六十是有分割的,四千一百八十七是有质控结论的。三个数不能互换。
10.3 不该由它承担的判断
诊断、分级、预后告知这三类判断,都不该建立在这一层结果上。它没有病理医生的复核,没有与诊断金标准的对照,也没有前瞻设计。
「核密度高所以恶性程度高」这类推断尤其危险:核密度受组织量、切片厚度、扫描倍率影响,未做归一化之前不具备跨切片可比性。
跨癌种的形态比较同样要谨慎。不同癌种的组织结构差异极大,十四个队列的切片在染色、扫描批次上并不齐平,直接比平均值会把批次差异当成生物学差异。
常见误读(避坑清单)
| 常见说法 | 实际情况 | 证据 |
|---|---|---|
| 「这是 TCGA 官方发布的核分割金标准」 | 是研究者提交到 TCIA 的分析结果,TCIA 只托管不背书 | 页面类目为 analysis result,DOI 归属数据集而非平台标准件 |
| 「五千张切片的核都经过人工确认」 | 一个都没有;只有一千多个 patch 有人工参与 | 论文的数据记录章节,自动层与人工层分列 |
| 「人工层是从零开始手工描的」 | 多数是对 Mask R-CNN 输出的修正,仅二十七个 patch 有独立手工 | 对照表说明文字逐条列出文件名与来源 |
| 「人工层就是一千三百五十六个」 | 官方材料里一千三百五十六与一千三百六十五并存 | 页面正文、外链区、对照表文件名三处 |
| 「直接用全部五千张训练就行」 | 五百七十六张被作者判为次优,另有四十九张不可接受 | 论文正文与技术验证章节 |
| 「它能当影像源,包里有原始 SVS」 | 论文声明不分发原始切片,包内影像分辨率未经逐例核实 | 论文数据可用性声明与页面体积对比 |
| 「许可是 CC BY 3.0,可以随意再分发」 | 论文写 CC0,页面写 CC BY 3.0,两者义务不同 | 页面许可字段与论文声明 |
| 「Dice 0.79 说明机器接近人类水平」 | 人与人之间只有 0.75 到 0.77,说明指标已接近饱和 | 论文的标注者一致性表 |
| 「一千三百五十六个 patch 都参与了评估」 | 只有九百七十一个,且只算中心 226×226 像素 | 论文技术验证章节 |
| 「覆盖三十三个 TCGA 癌种」 | 十个验证加四个未验证,共十四个队列 | 页面癌种清单与正文 |
| 「切片数就是病例数」 | 受试者五千二百零四,切片六千一百四十二 | 页面 Subjects 与 Studies 两列 |
| 「分割是 Mask R-CNN 直接产出的」 | 数据集由 U-Net 生成,Mask R-CNN 只用于辅助人工标注 | 论文方法章节 |
| 「三张质控表能按切片标识直接连起来」 | 区域抽检表的标识省掉了图像 GUID 与扩展名,等值连接得到空表却不报错 | 两表 WSI-ID 字段逐行比对 |
FAQ
Q1:它到底是数据集还是分析结果?
两者都是,但身份以后者为准。TCIA 把它归在 analysis result 类目,意味着它是一份提交上来的分析产物,不是平台自己生产的标准件。它有独立 DOI、有同行评审论文、有版本号,可引用性没有问题;有问题的是「官方背书」这层想象。
Q2:为什么说它不能当金标准?
因为它自己就是模型的输出。拿它当金标准去评另一个模型,等于用一把没有校准的尺子量另一把尺子。要金标准只能用人工层,而人工层只有一千多个 patch,覆盖十个癌种,评估区还只取中心。
Q3:五千零六十张之外的那些切片是什么?
是四个未验证癌种的分割结果。它们可以下载,但不在验证范围内,官方明说未经正式验证。用的时候应当单独报告,不要和十个验证癌种混在一起求平均。
Q4:三张质控表要全用吗?
不必,但至少要读第一张。第一张给的是通过与否,直接决定筛不筛。第二张解释原因,第三张给局部的量化,两者用于更细的分级。三张都不读就全量使用,是这份数据最常见的误用。
Q5:多边形 CSV 为什么不是掩膜图?
因为存储效率。一张切片几十万个核,存成掩膜图体积巨大,存成多边形文本小得多,还能保留轮廓精度。代价是消费端要自己栅格化,多写一段代码。
Q6:能只用多边形、不下载影像吗?
可以。结果与影像是分开的文件,只做统计的话,取多边形 CSV 就够。这是它少见的优点:六百多 GB 的包可以按需切片消费。
Q7:为什么下载非要 Aspera?
整包体量大,平台对大包只提供专用传输通道。四张小表不受此限,先下它们不影响后续决策。
Q8:与 GDC 的数据怎么对齐?
按切片标识的前三段拼出病例条码,再与 GDC 的病例标识做交集。注意有少量切片的条码不符合标准格式,需要例外处理。对齐率不会是百分之百,差值来自没有影像的病例。
Q9:代码跑不起来怎么办?
仓库基于 Python 2 与 TensorFlow 1,直接在新环境里装依赖大概率失败。仓库自带容器定义,用容器跑是更现实的路。只做解析与统计的话,不需要这套代码。
Q10:这份数据还会更新吗?
页面只有 Version 1,更新日期停在 2020 年初,此后没有版本变更记录。上游 TCGA 的影像与分子数据仍在补充,两者会逐渐拉开差距,跨年份复现时要记录取数时间。
术语表
| 术语 | 含义 |
|---|---|
| WSI | 全切片图像,一张玻璃切片扫描成的多亿像素影像 |
| H&E | 苏木精-伊红染色,病理最常用的染色法,核染成蓝紫 |
| 实例分割 | 不仅分出核的像素,还要把相邻的核区分成一个个实例 |
| 多边形标注 | 用顶点序列表示核轮廓,本数据集的自动层即此形态 |
| Patch | 从切片上裁下的小方块,本数据集的人工层为 256×256 |
| 分块推理 | 把大图切成固定尺寸的块分别推理,再拼回 |
| 分水岭 | 一种基于距离变换分离粘连实例的经典算法 |
| 染色归一化 | 把不同批次切片的颜色分布对齐,减少色差 |
| 合成数据 | 由算法生成、非真实采集的训练样本 |
| 重要性采样 | 按样本重要性重加权,让合成数据在训练中占合适比重 |
| Dice 系数 | 两个区域的重叠度,1 为完全重合 |
| 实例 Dice | 先做实例匹配再算重叠,比像素 Dice 更严格 |
| 精确率与召回率 | 找出来的有多少是对的、该找的找出多少 |
| 标注者一致性 | 多名标注者对同一对象的一致程度,用于估计任务上限 |
| TCGA 条码 | 一套分层标识,含项目、中心、病例、样本、切片等段 |
| analysis result | TCIA 的一类条目,托管研究者提交的分析产物 |
| collection | TCIA 的一类条目,指原始影像集合 |
| Aspera | 一种高速文件传输协议,大包分发常用 |
| caMicroscope | 网页端病理影像与标注的可视化工具 |
| PathDB | TCIA 的病理影像浏览入口,内核为 caMicroscope |
| CC BY 3.0 | 署名即可使用的许可,要求标注来源 |
| CC0 | 放弃著作权的主张,使用时不要求署名 |
附录 A:核心数字核对表
| 项 | 数字 | 来源 |
|---|---|---|
| 受试者 | 5,204 | 页面 Subjects 列 |
| 切片总量 | 6,142 | 页面 Studies 列 |
| 有自动分割的切片 | 5,060 | 论文与页面正文 |
| 验证癌种 | 10 | 页面癌种清单 |
| 未验证癌种 | 4 | 页面注释 |
| 人工 patch | 约一千三百余 | 页面与论文,两处写法不同 |
| 定点评估用 patch | 971 | 论文技术验证章节 |
| 核总数 | 约五十亿 | 论文摘要 |
| 整包体积 | 665.94 GB | 页面下载行 |
| 质控覆盖切片 | 4,187 | 页面质控行 Subjects 列 |
| 切片级抽样 | 每张 15 个区域 | 论文方法章节 |
| 抽样区域总量 | 约 76,000 | 论文方法章节 |
| 判为次优的切片 | 576 | 论文表一 |
| 视觉复核追加不可接受 | 49 | 论文技术验证章节 |
| 平均 Dice | 约 0.79 | 论文表三 |
| 平均实例 Dice | 约 0.67 | 论文表三 |
| 核计数相关 | 0.932 | 论文表三与图五 |
| patch 边长 | 256 像素 | 论文数据记录 |
| 评估中心区 | 226×226 像素 | 论文技术验证章节 |
| 分块边长 | 4000 像素 | 论文使用说明 |
| 版本日期 | 2020-02-08 | 页面版本行 |
附录 B:数字的来源分层
| 层级 | 代表数字 | 说明 |
|---|---|---|
| 平台字段 | 五千二百零四、六千一百四十二、665.94 GB、4,187 | 页面表格直接给出,可复核 |
| 论文正文 | 五千零六十、约五十亿、576、49、971 | 以 Scientific Data 论文为准 |
| 文件自身 | 三张表的列结构与行数 | 下载后可自行统计,最硬 |
| 派生推算 | 每张切片平均体积 | 整包体积除以切片数,用于判断影像形态 |
四层的可靠性依次上升:平台字段可能滞后于实际打包,论文数字对应成文时的状态,文件自身最硬,派生推算只能作旁证。
附录 C:完整参考文献
| 文献 | 用途 |
|---|---|
| Hou L, Gupta R, Van Arnam JS, Zhang Y, Sivalenka K, Samaras D, Kurc TM, Saltz JH. Dataset of segmented nuclei in hematoxylin and eosin stained histopathology images of ten cancer types. Scientific Data 7:185 (2020). DOI 10.1038/s41597-020-0528-1 | 数据描述、质控流程、全部验证数字 |
| Hou L, Agarwal A, Samaras D, Kurc TM, Gupta RR, Saltz JH. Robust Histopathology Image Analysis: To Label or to Synthesize? CVPR 2019, pp. 8533-8542. DOI 10.1109/cvpr.2019.00873 | 方法:合成数据加重要性采样 |
| TCIA 数据集条目. DOI 10.7937/TCIA.2019.4A4DKP9U | 数据引用与版本信息 |
| TCIA 数据使用政策 | 引用义务与再分发边界 |
| Clark K, Vendt B, Smith K, et al. The Cancer Imaging Archive (TCIA): Maintaining and Operating a Public Information Repository. J Digit Imaging 26(6):1045-1057 (2013) | 平台引用 |
| GitHub SBU-BMI/quip_cnn_segmentation(BSD-3-Clause) | 训练与推理代码、容器定义 |
附录 D:任务代码
#--统计四张小表的行数,作为下载完整性的第一步校验
for f in list_of_verified_wsis.txt wsi_quality_control_result.txt \
random_segmentation_region_checking_result.txt \
Pan-Cancer-Nuclei-Seg_1365patches_to_TCGA-ID_readme.txt; do
printf '%-52s %6s 行\n' "$f" "$(wc -l < "$f")"
done
#--按癌种汇总切片级核密度,输出一张可直接接临床的表
import csv, os, collections
root = "BLCA_polygon"
rows = []
for name in sorted(os.listdir(root)):
if not name.endswith(".csv"):
continue
n, area = 0, 0.0
with open(os.path.join(root, name), newline="") as fh:
for r in csv.DictReader(fh):
n += 1
area += float(r["Area In Pixels"])
rows.append((name.split(".")[0], n, round(area / max(n, 1), 1)))
print("切片数", len(rows))
print("核数中位数", sorted(r[1] for r in rows)[len(rows) // 2])
#--把 patch 对照表折算成病例级清单,用于按病例划分训练与测试
import csv, collections
by_case = collections.Counter()
with open("Pan-Cancer-Nuclei-Seg_1365patches_to_TCGA-ID_readme.txt", newline="") as fh:
lines = [ln for ln in fh if ln.startswith(tuple("0123456789"))]
for ln in lines:
parts = ln.strip().split(",")
if len(parts) < 3:
continue
wsi = parts[2]
case = "-".join(wsi.split("-")[:3])
by_case[case] += 1
print("病例数", len(by_case))
print("patch 最多的三个病例", by_case.most_common(3))
附录 E:如果只记五件事
第一,它是结果集不是标注集:五千零六十张切片上的核由模型生成,没有逐核人工确认。
第二,人工层不是纯手工:多数是对 Mask R-CNN 输出的修正,只有二十七个 patch 有三人独立标注。
第三,坏数据没被删掉:五百七十六张次优、四十九张不可接受,都还在包里,靠三张质控表自己筛。
第四,真正的价值是身份:切片带 TCGA 条码,核形态因此可以接到突变、表达与生存。
第五,计数有一处硬冲突:patch 数在一千三百五十六与一千三百六十五之间摇摆,引用时写「约一千三百余」最稳。
编辑说明
核验时间 2026-10-29。核验方式:TCIA 的 analysis result 页面正文逐段读取(癌种清单、Subjects 与 Studies 字段、版本行、许可字段、下载链接与体积);三张质控表与 patch 对照表经 HTTP 直链取回,逐行读取表头与样本行,确认列名、取值域与格式瑕疵(结论列的粘连值、Patch-ID 的缺号);Scientific Data 论文经 PMC 全文核对数据记录章节、质控流程、表三与表五、使用说明与数据可用性声明;CVPR 方法论文经页面摘要核对;GitHub 仓库经公开页面核对许可证与目录结构。本沙箱出网白名单不含 cancerimagingarchive.net,页面与附件均经网页抓取工具取回,未做字节级下载。
未覆盖的内容:未下载 665.94 GB 整包,故未逐例核对包内 SVS 的层级与 0 级尺寸,§5.2 的判断来自体积、论文声明与旧版说明页三方交叉,属推断并已在正文标明需开图复核;未统计三张质控表的完整行数(抓取时文件被截断),故 4,187 采信页面字段而非自行计数;未运行仓库中的推理代码,Python 2 与 TensorFlow 1 环境未搭建;未核对 PathDB 中本数据集的可见范围,仅确认入口可访问。修改记录:初稿即本版。体例遵循千方医数集 AI-Ready 词条规范 v5,正文汉字数与章节编号已通过本地三道校验。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- pannuke — 共享标签:医学影像 / 病理图像 / 医学图像分割 / 肿瘤学
- lizard — 共享标签:医学影像 / 病理图像 / 医学图像分割 / 肿瘤学
- peso — 共享标签:医学影像 / 病理图像 / 医学图像分割 / 肿瘤学
- cryonuseg — 共享标签:医学影像 / 病理图像 / 医学图像分割 / 肿瘤学
- glas — 共享标签:医学影像 / 病理图像 / 医学图像分割 / 肿瘤学
- crag — 共享标签:医学影像 / 病理图像 / 医学图像分割 / 肿瘤学
- digestpath — 共享标签:医学影像 / 病理图像 / 医学图像分割 / 肿瘤学
- sthelar — 共享标签:医学影像 / 病理图像 / 医学图像分割 / 肿瘤学
- bcss — 共享标签:医学影像 / 病理图像 / 医学图像分割 / 肿瘤学
- owl — 共享标签:医学影像 / 病理图像 / 医学图像分割 / 肿瘤学
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

