移植肾活检炎症细胞检测 — 一百一十九张切片的点标注

119 张移植肾活检 WSI · 四家训练中心 · 点坐标而非轮廓

来源 https://monkey.grand-challenge.org/发布时间: 2026-10-29最后更新: 2026-10-29 阅读 10
移植肾活检炎症细胞检测 — 一百一十九张切片的点标注

信息速览

数据集名称移植肾活检炎症细胞检测 — 一百一十九张切片的点标注
数据类型病理全切片,点标注,约 200GB,免费开放下载
规模119 张切片(公开训练集 81 张)
接入方式https://monkey.grand-challenge.org/

MONKEY 是 Radboudumc 计算病理组发起的一场公开挑战赛的缩写:Machine-learning for Optimal detection of iNflammatory cells in KidnEY。它要算法在 PAS 染色的移植肾活检全切片上,把淋巴细胞和单核细胞一个个找出来,并尽量分开。

它的名字里没有猴,标本里也没有猴。全队列 119 张切片取自六家医院、四个国家的移植受者常规诊断活检,猴子只是挑战赛的视觉主题,与物种无关。这件事必须先说清楚,因为名字带来的误读会一路传导到数据用途上。

真正值得记录的是它的标准答案怎么来:不是让病理医生凭肉眼猜细胞类型,而是先在同一张切片上做 CD3/CD20 与 PU.1 的双标免疫组化,把两类细胞染成棕色与品红,再靠配准把位置搬回 PAS 原染上。这是公开病理数据集里少见的「用另一条独立证据链来定义标签」。一屏速览见下表。

维度 内容
全称 Machine-learning for Optimal detection of iNflammatory cells in KidnEY
中文常用名 MONKEY 移植肾活检炎症细胞检测挑战
缩写来源 英文全称的首字母,不是物种名
标本类型 人移植肾穿刺活检,福尔马林固定石蜡包埋
全队列规模 119 张全切片、六家病理科、四个国家
公开训练集 81 张切片,四家中心
隐藏集合 验证 9 张、终测 19 张,共 28 张,来自另两家中心
兴趣区 全队列 231 个,平均面积 0.32 ± 0.22 平方毫米
原染 PAS(过碘酸雪夫),常规诊断染色
辅助染 CD3/CD20 双标(淋巴细胞,棕)与 PU.1(单核细胞,品红)
标注形式 点坐标,非轮廓;每张切片平均约 350 个淋巴细胞、180 个单核细胞
任务 点检测加二分类,两条排行榜
评价指标 FROC,横轴为每平方毫米假阳性数
发布机构 Radboud University Medical Center 病理学系计算病理组
运行平台 Grand Challenge,站点 monkey.grand-challenge.org
公开发布 2024-09-20,AWS 开放数据注册表托管
许可 CC BY-NC-SA 4.0
最后状态 排行榜关闭,已选出三支获胜团队

§1 它到底是什么

1.1 一句话:它教机器在肾切片里「数细胞」,而不是「画区域」

数字病理的公开数据集绝大多数在解决「这块组织是什么」的问题:肿瘤与非肿瘤、腺体与间质、坏死与存活。标签形态是区域、是掩码、是整张切片的诊断结论。

MONKEY 换了一个问题。它不问这块组织是什么,它问这片区域里有多少个淋巴细胞、多少个单核细胞,各自在哪里。标签形态因此退到最轻的一档:一个点,一对浮点坐标。

这个选择的后果比看上去深远。区域标签可以被粗心地使用——切一小块、缩一缩、模糊了也不影响结论;点标签不行,一个点的位置错 10 微米,在淋巴细胞这个类别上就已经落到容忍半径之外。它逼着使用者把空间精度当真。

标签形态 典型任务 评价方式 对位置误差的敏感度
切片级标签 分类 AUC、准确率 不敏感
区域或掩码 语义分割、实例分割 Dice、IoU 中等,可容忍边界偏移
点坐标 点检测、计数、定位 FROC、计数相关 高,容忍半径以微米计

1.2 三层交付物

这个包里其实有三种性质不同的东西,混着谈就会出错。

第一层是影像。每张切片有 1 至 3 个 PAS 扫描版本,加一张 IHC 复染切片,加一张组织掩膜。影像本身是连续的、大尺度的、带着扫描仪指纹的。

第二层是点。全队列 231 个兴趣区内,每个被认定的炎症细胞是一个点,按类别分文件存放。这是离散的、稀疏的、坐标级的。

第三层是上下文。一张 Excel 表,每张切片一行,记录中心、Banff 诊断、两种 IHC 的染色质量、三种配准的质量、每类细胞的计数、兴趣区个数。这是元数据,也是做子集筛选的唯一依据。

层 载体 粒度 主要用途
影像层 TIFF 全切片 像素 训练输入、可视化、配准
点标注层 JSON 与 XML 细胞 监督信号、评测标准答案
上下文层 单张 XLSX 切片 筛选、分层、误差归因

1.3 三十秒决策卡

你的处境 它能帮你什么
要做「细胞检测+分型」,手上只有分割掩码集 给你一套纯点级、跨中心的检测训练与评测材料
想验证模型在换医院后是否还稳 四家中心可作为留一中心交叉验证的天然分块
做肾病或移植病理的 AI,缺非肿瘤组织 全片都是移植肾活检,没有肿瘤标签,也没有肿瘤偏置
想找能直接做语义分割的数据 给不了,它没有掩码
想训练一个细胞核检测的预训练模型 可以用,81 张切片足够做自监督或检测预训练
需要动物毒理切片 给不了,全部是人源移植活检

1.4 不适合谁

如果你的需求是「找一个带器官、组织、细胞多层掩膜的肾病理分割集」,那它给不了你。它最细的标签是一个点,连细胞边界都没有标;想拿它做肾小球、肾小管、间质的语义分割,一类都没有。

如果你的需求是「找一批非人灵长类的组织学切片,用于药物安全性评价的 AI 模型」,它也给不了你。名字里的猴只是缩写,标本全部来自人;非人灵长类的毒理病理图像在这个平台上没有对应的公开集。

如果你的需求是「复现挑战赛的名次」,同样有障碍:终测集不公开,只能提交容器跑分,无法在本地算出与榜单一致的分数。

1.5 为什么名字会误导

MONKEY 是首字母缩写,但首字母组合恰好构成一个常用词,而这个词又是毒理学里最常用的实验动物。两个巧合叠在一起,很容易让人以为这是「猴肾」数据集。

正确拆法是:Machine-learning(M)+ Optimal(O)+ detection of iNflammatory(N)+ cells in the KidnEY(KEY)。七个单词取首字母,凑成 MONKEY。挑战赛页面本身也大量使用猴子表情符号作为装饰,进一步强化了这个联想。

读法 实际含义 是否成立
猴肾活检数据集 非人灵长类动物实验数据 否,标本是人源
MONKEY 缩写 机器学习检测肾脏炎症细胞 是,官方定义
猴子主题的挑战赛 视觉主题与徽标 是,仅限视觉

§2 数据构成与规格

2.1 两个规模口径:全队列与公开集

数字对不上是这份资源最常被引用错的地方,因为官方材料里同时挂着两套口径。

页面正文写「收集了来自六家病理科的 119 张全切片,正在标注 231 个兴趣区」。预注册报告写得更细:训练集 81 张,验证 9 张,终测 19 张与 9 张,合计 28 张;训练用四家中心,验证与终测用另外两家。

AWS 开放数据注册表写的是「80 张全切片、四家病理机构」。这个数字比 81 少一张,是注册表页撰写时与最终发布之间的差异,桶里实际有 81 张 PAS 主扫描。

口径 数字 出处 覆盖范围
全队列切片 119 挑战赛数据页正文、预注册报告第 22 项 六家中心、四国
全队列兴趣区 231 同上 六家中心
公开训练切片 81 预注册报告表 1 的四中心之和 荷兰、奥地利、美国
注册表口径 80 AWS 开放数据注册表页 同上,撰写时口径
隐藏切片 28 预注册报告表 1,验证 9 加终测 19 瑞士、美国
兴趣区求和合计 164 训练集上下文表逐行相加 仅公开部分

最后一行需要解释。上文那一行指的是把公开的 context-information.xlsx 里 Nb_rois 一列逐行相加,得到 164,与全队列 231 的差是隐藏集合的 67 个兴趣区。这不是官方给出的拆分,是从表里加出来的,引用时应说明来源。

2.2 四家中心的配额

训练集按中心成块,每家中心的病例数接近而不相等。

中心代号 机构 国家 训练切片 诊断配置扫描 原中心扫描
A Radboudumc 荷兰 26 14 无
B UMC Utrecht 荷兰 17 17 17
C Medical University of Vienna 奥地利 20 20 无
D Mayo Clinic 美国 18 18 18
E IGMP,伯尔尼大学 瑞士 18(验证 9+终测 9) 18 18
F Emory University 美国 19(终测) 19 19

这张表同时说明了为什么不能随机切分。四家训练中心的病例数是 26、17、20、18,加总正好 81;如果做五折交叉验证,每一折都会同时包含四家中心,评估结果无法回答「换一家医院还能不能用」。

2.3 单张切片的解剖

一张切片不是一张图,而是一个文件族。以 A 中心的 P000001 号病例为例,桶里能找到的东西如下。

#-- 同一病例在桶里的全部文件(以 A_P000001 为例)
annotations/json_mm/A_P000001_lymphocytes.json        #-- 点坐标,毫米单位
annotations/json_mm/A_P000001_monocytes.json
annotations/json_mm/A_P000001_inflammatory-cells.json
annotations/json_pixel/A_P000001_lymphocytes.json     #-- 同一批点的像素单位
annotations/json_pixel/A_P000001_monocytes.json
annotations/json_pixel/A_P000001_inflammatory-cells.json
annotations/xml/A_P000001.xml                          #-- ASAP 可读,含分组与颜色
images/pas-cpg/A_P000001_PAS_CPG.tif                   #-- 标注就落在这个坐标系里
images/pas-diagnostic/A_P000001_PAS_Diagnostic.tif     #-- 另一套扫描配置
images/ihc/A_P000001_IHC_CPG.tif                       #-- 双标复染
images/tissue-masks/A_P000001_tissue-mask.tif          #-- 组织所在区域二值

这七类文件的关系是:标注只存在于 CPG 扫描这个坐标系里,其余影像都靠配准对齐到它。想用诊断配置的扫描做增强,必须先把点坐标搬过去,而搬的方式官方没有直接给,只给了配准质量的一栏评估。

2.4 体积与存储

桶是匿名可读的,不需要 AWS 账号。按公开可见的前缀逐个数,各目录的文件数与体积如下。

目录 文件数 体积 说明
images/pas-cpg 81 43.1 GB 标注所在的扫描,平均每张 0.53 GB
images/ihc 81 41.8 GB CD3/CD20 加 PU.1 双标复染
images/pas-diagnostic 69 27.2 GB 缺 12 张,A 中心部分病例没有
images/pas-original 18 2.7 GB 只有 D 中心有,来自 Mayo 的原扫描
images/tissue-masks 81 3.2 GB 组织区域二值掩膜
annotations/json_mm 243 0.03 GB 每张切片三份,按毫米
annotations/json_pixel 243 0.03 GB 每张切片三份,按像素
annotations/xml 81 0.02 GB 每张切片一份,含分组

合计约 118 GB 上下,与预注册报告里「平均单张全切片 490 MB」的表述基本吻合。全量下载的瓶颈不在体积,在带宽——单文件几百 MB,81 张加复染是上百 GB 的连续读取。

§3 身份层:这是谁的数据、来自哪种组织

3.1 器官移植病理,不是肿瘤病理

库内已有的病理词条几乎全部服务肿瘤学:核分割、有丝分裂检测、浸润淋巴细胞评分。它们的组织来源是切除的肿瘤块,标签体系围绕肿瘤分级与预后。

MONKEY 的组织来源是移植后的穿刺活检。这不是「肿瘤旁边取的一块正常组织」,而是一种有独立诊断体系、独立评分标准、独立临床决策链的组织类型。

维度 肿瘤病理数据 本数据集
标本来源 手术切除为主 穿刺活检为主,组织量小
判读体系 分级分期(如 Gleason、Elston-Ellis) Banff 病变评分
核心问题 这是什么肿瘤、多恶性 移植物是否在被排斥、排斥到哪一步
标签对象 肿瘤区域、核、腺体 炎症细胞的数量与位置
时间性 多为一次性诊断 同一患者可多次活检,纵向随访

3.2 Banff 体系与十七个病变评分

Banff 分类是移植肾活检判读的国际标准。它由十七个病变评分构成,官方的表述是其中十个与不同肾间室里炎症细胞的存在与范围有关。

评分的方式是半定量的:观察某个间室里炎症细胞的多少,落在轻度、中度、重度三档中的哪一档。绝大多数评分只有三档,少量有更细的分层。

这个体系的价值在于把组织学观察变成可比较的离散变量,让不同中心、不同年份的活检能放进同一张表里做统计。它的弱点也在这里:三档之间的界线依赖观察者的经验,重复性只是中等。

层面 说明
评分数量 17 项病变评分
与炎症相关的评分 据官方表述为 10 项
分级方式 轻度、中度、重度为主
主要测量对象 炎症细胞在特定间室内的数量与分布
已知问题 重复性中等、耗时长
本数据集的位置 只解决「细胞在哪里、是哪一种」,不直接输出评分

3.3 兴趣区不是整张切片

一个必须讲清楚的事实:标注并不覆盖整张组织。标注只发生在被选定的兴趣区里。

每个兴趣区的平均面积是 0.32 平方毫米,标准差 0.22。这个量级相当于在显微镜 20 倍视野下看几分钟的范围。全片组织面积通常在几十到上百平方毫米,所以兴趣区只占很小一部分。

属性 数值 含义
兴趣区平均面积 0.32 平方毫米 约等于中等倍率下若干视野
面积标准差 0.22 平方毫米 大小差异明显,最大最小差数倍
每张切片兴趣区数 1 至 3 个 上下文表 Nb_rois 列取值
训练集兴趣区合计 164 个 上下文表求和

这带来一个使用上的基本事实:在兴趣区外推理得到的细胞,与在兴趣区内推理得到的细胞,在训练分布上没有可比性。官方做法是在兴趣区内评测,模型上线时却要在全片上跑,两者之间存在分布缺口。

3.4 病例的标识方式

每张切片有一个形如「中心字母 + 下划线 + P + 六位数字」的标识,例如 A_P000001。首字母对应中心,后六位是流水号。同名文件靠后缀区分染种与扫描配置。

这个标识体系的设计取舍很清楚:它不携带任何患者信息,也不携带诊断信息。诊断在上下文表里,需要按标识做一次连接才能拿到。

标识组成 示例 含义 能否推断患者
中心字母 A 采集中心 仅能定位到医院
流水号 P000001 该中心的第几张切片 不能
染色与扫描后缀 _PAS_CPG 染种与扫描配置 不能

3.5 明确不包含什么

不含患者年龄、性别、种族。不含供者与受者信息。不含术后时间。不含随访结局,例如肌酐变化、移植失败时间。不含合并用药。不含逐张切片的完整 Banff 评分明细——上下文表只给了最终诊断标签。

这份清单决定了一件事:它不能做预后预测。想做「活检图像预测移植失败」,得自己去找随访数据,而链接随访需要患者身份,本数据集不提供。

§4 标准答案层:IHC 怎么把看不见的细胞变成点

4.1 为什么肉眼看不够

PAS 染色下,淋巴细胞与单核细胞的形态差别很微妙。官方背景页给的对照是:单核细胞直径 15 至 22 微米,核多呈椭圆或肾形,染色质较淡,胞质中等;淋巴细胞直径约 7 微米,核圆而深染,胞质几乎看不见。

在间质炎症这种细胞密集、又混着肾小管上皮的场景里,这个差别常常不足以支撑稳定判读。官方的说法很直接:即使有典型形态特征,要确定区分不同细胞类型仍然困难。

细胞 直径 核形态 染色质 胞质 在 PAS 上的可分性
单核细胞 15 至 22 微米 椭圆或肾形、可有分叶 较淡 中等至丰富 差
淋巴细胞 约 7 微米 圆、深染 致密 稀少 差
肾小管上皮细胞 远大于两者 圆,居中 中等 丰富 可区分细胞但不可细分炎症类型

4.2 双标复染的做法

解决办法是再加一条染色通道。做法是在同一块组织的相邻切片上做免疫组化双标:CD3 与 CD20 双标定位淋巴细胞,显色为深棕;PU.1 定位单核细胞,显色为品红。

这一步改变了标准的来源。判读一张 PAS 片子时,观察者要在模糊的形态线索里做概率判断;判读一张双标片子时,观察者看到的是一个明确的颜色通道。前者的不确定性进了标签,后者不进。

染种 抗体组合 阳性细胞 显色 用途
PAS 无 全部组织成分 紫红 算法输入、标注落点
IHC CD3 与 CD20 淋巴细胞 深棕 定义淋巴细胞标准答案
IHC PU.1 单核细胞 品红 定义单核细胞标准答案

4.3 从 IHC 到 PAS 的四步搬运

点标注不是直接在 PAS 上点出来的,中间经过了配准。报告给的四步是:

第一步,在 Radboudumc 实验室完成复染,用同一蜡块切出的相邻切片。

第二步,用配准工具 HistoKat Fusion 把原中心扫描与复染扫描对齐到 PAS 的诊断配置扫描上,输出为 .sqreg 格式,这是全局坐标统一的起点。

第三步,用一套已发表的淋巴细胞检测模型在 IHC 上自动生成候选点,通过颜色去卷积把棕色与品红通道分开,得到两类细胞的初始位置。

第四步,学生标注者在 IHC 图上逐条核对这些候选点,删掉误检、补上漏检,再由一位肾病理医生通篇复核;遇到配准失败或自动检测失败的病例,由这位医生直接手点。

#-- 标准答案的产生链(自上而下,每一环都可能引入误差)
原中心扫描 / Radboud CPG 扫描
        ↓ HistoKat Fusion 配准
PAS 诊断配置扫描(统一的坐标系)
        ↓ 同一蜡块复染
CD3/CD20 + PU.1 双标 IHC 切片
        ↓ 颜色去卷积 + 已发表检测模型
两类细胞的候选点(自动)
        ↓ 学生标注者核对 + 肾病理医生复核
最终点标注(淋巴细胞 / 单核细胞 / 合并)

4.4 标注者与质量控制

报告给出的标注队伍是六人:四名学生标注者、一名第五年住院医师病理医生、一名肾病理专家。兴趣区由肾病理医生选定;学生只负责在既有兴趣区里核对点。

质量控制的方式是层层复核,而不是多观察者重复标注。这一点在后面评估章节会再出现:这套流程没有报告观察者之间的一致性指标,也没有让两个人独立标同一片再算一致率。

角色 人数 承担的工作 依据
肾病理专家 1 选定兴趣区、复核全部标注、困难病例直接标注 报告第 23 项
住院医师病理医生 1 参与标注 报告第 23 项
学生标注者 4 在 IHC 上核对自动候选点 报告第 23 项
合并方式 无 不做多标注合并,单人核对加专家复核 报告第 23 项写明不适用

4.5 标签集合只有两类,外加一个合并类

标注只有两种细胞:淋巴细胞与单核细胞。第三种文件「inflammatory-cells」是两者的并集,用于第一条排行榜。

标签 英文名 来源抗体 属于哪个任务 单张切片平均点数
淋巴细胞 lymphocytes CD3 与 CD20 任务二单类、任务一合并 约 350
单核细胞 monocytes PU.1 任务二单类、任务一合并 约 180
合并炎症细胞 inflammatory cells 两者之和 任务一 约 530

4.6 复染质量是一等公民

官方的病理背景页花了一整节讲复染质量,并明说这套多步复染流程相对复杂、可能出错,某些组织因素也会影响复染效果。

这不是谦辞。公开训练集的上下文表里,CD3/CD20 一栏有 71 张写 Good,5 张写「次优、中等强度」,2 张写「次优」,2 张写「差、极弱」,1 张写「差、弱」;PU.1 一栏分化更明显,写 Good 的只有 50 张左右,其余带「次优」「弱 PU.1」「非特异背景」等描述。

质量栏 判为正常 带次优或差描述 影响
CD3/CD20 71 10 淋巴细胞漏检风险上升
PU.1 约 50 约 27 单核细胞漏检与非特异着色混淆

4.7 一处应当注意的表述差异

官方材料在「与炎症相关的病变评分数量」上给过两个数。

挑战赛首页与病理背景页写的是十七个评分中有十个与炎症细胞的存在和范围有关。预注册报告的摘要段写的是十七个评分中有八个与炎症细胞在不同肾间室中的存在和范围有关。

出处 表述 差异
挑战赛首页 十个评分聚焦炎症细胞 多个间室
病理背景页 十个评分聚焦炎症细胞 与首页一致
预注册报告摘要 八个评分聚焦炎症细胞 少两个

这两个数的差别可能来自「是否把伴有炎症成分的慢性损伤类评分算进去」这类口径问题。引用时应当写明依据哪一份材料,不要混用。

§5 交付层:怎么取、怎么读、怎么把它变成训练集

5.1 三条取数通道

第一条是 S3 桶,monkey-training,美国西部二区,匿名可读。这是最直接的方式,不需要注册,也不需要申请。

第二条是 AWS 开放数据注册表的目录页,给的是同一个桶的入口与元信息。

第三条是挑战赛站点本身,部分页面需要登录才能看,例如提交页与数据集细节页。

通道 是否需要账号 内容 适用
S3 桶直取 否 全部公开影像、标注、元数据 批量下载、脚本化
AWS 注册表 否 描述与 ARN 查元信息
挑战赛站点 部分需要 规则、时间线、排行榜 理解任务与评测

5.2 命令行下载

#-- 匿名访问,不需要 AWS 凭证;
#-- 先看目录,再决定下哪几个前缀,避免拉满整个桶
aws s3 ls --no-sign-request s3://monkey-training/
aws s3 ls --no-sign-request s3://monkey-training/images/pas-cpg/ | head

#-- 只下标注与元数据(不到 100 MB),先确认标签再下影像
aws s3 cp --no-sign-request --recursive s3://monkey-training/annotations/ ./monkey/annotations/
aws s3 cp --no-sign-request s3://monkey-training/metadata/context-information.xlsx ./monkey/

#-- 影像按需下载:第一张 PAS 加对应 IHC,验证流程是否打通
aws s3 cp --no-sign-request \
  s3://monkey-training/images/pas-cpg/A_P000001_PAS_CPG.tif ./monkey/images/
aws s3 cp --no-sign-request \
  s3://monkey-training/images/ihc/A_P000001_IHC_CPG.tif ./monkey/images/

没有安装 AWS 命令行工具时,同样可以用 HTTPS 直接取,因为桶允许匿名读取。

#-- 等价写法:不装 aws cli 也能取
curl -s https://monkey-training.s3.us-west-2.amazonaws.com/ReadMe.txt
curl -O https://monkey-training.s3.us-west-2.amazonaws.com/images/pas-cpg/A_P000001_PAS_CPG.tif

#-- 列目录用 REST 的 list 接口,按前缀过滤
curl -s "https://monkey-training.s3.us-west-2.amazonaws.com/?list-type=2&prefix=annotations/json_mm/&max-keys=1000" \
  | grep -o '<Key>[^<]*</Key>'

5.3 读懂一份点标注文件

标注的 JSON 用的是 Grand Challenge 的点集格式,结构极简。

{
  "name": "monocytes",
  "type": "Multiple points",
  "points": [
    {"name": "Point 0", "point": [9746.66602, 87487.8594]},
    {"name": "Point 1", "point": [9736.31641, 87474.5547]}
  ]
}

字段只有三个:名字、类型、点数组。类型固定为「Multiple points」,每个点只有一个 name 与一个二元坐标。坐标的含义取决于文件所在目录:json_pixel 下是像素,json_mm 下是毫米,后者是官方提交格式所用的单位。

字段 类型 说明 注意
name 字符串 标签名,等于 monocytes、lymphocytes 或 inflammatory cells 与文件名一致,不要用文件名之外的推断
type 字符串 固定为 Multiple points 出现别的值说明格式变了
points[].name 字符串 点序号,无信息量 不要当主键
points[].point 二元浮点数组 x 与 y 顺序是 x 在前,与图像坐标约定一致

XML 版本是给 ASAP 看的,多了一组可视化信息。

<ASAP_Annotations>
  <Annotations>
    <Annotation Name="Annotation 0" Type="Dot" PartOfGroup="lymphocytes" Color="#3465a4">
      <Coordinates>
        <Coordinate Order="0" X="12245.4219" Y="86649.8672" />
      </Coordinates>
    </Annotation>
  </Annotations>
</ASAP_Annotations>

这一版把类别放在 PartOfGroup 属性里,颜色写死在 Color 里。解析时以 PartOfGroup 为准,颜色只是显示用的。

5.4 建立切片级索引

三个来源需要合成一张索引表:上下文表给元数据,标注目录给点数,影像目录给实际可用的扫描版本。

#-- 依赖:pandas openpyxl boto3(boto3 只在需要直接列桶时用)
#-- 产出:一张切片级索引表,一行一张切片,供后续划分使用
import json
import re
from pathlib import Path

import pandas as pd

ROOT = Path("./monkey")
ctx = pd.read_excel(ROOT / "metadata/context-information.xlsx", sheet_name="context info")
ctx.columns = [str(c).strip() for c in ctx.columns]
ctx = ctx[pd.to_numeric(ctx["Slide ID"], errors="coerce").isna()]  # 丢掉可能的序号列歧义
ctx["slide_id"] = ctx["Slide ID"].astype(str).str.strip()

def count_points(path):
    if not path.exists():
        return 0
    obj = json.loads(path.read_text())
    return len(obj.get("points", []))

rows = []
for sid in ctx["slide_id"]:
    rec = {"slide_id": sid, "lab": sid[0]}
    for cls, fn in [("lymphocytes", "_lymphocytes"), ("monocytes", "_monocytes")]:
        rec[f"n_{cls}"] = count_points(ROOT / f"annotations/json_mm/{sid}{fn}.json")
        rec[f"has_{cls}"] = (ROOT / f"annotations/json_mm/{sid}{fn}.json").exists()
    rec["has_pas_cpg"] = (ROOT / f"images/pas-cpg/{sid}_PAS_CPG.tif").exists()
    rec["has_ihc"] = (ROOT / f"images/ihc/{sid}_IHC_CPG.tif").exists()
    rows.append(rec)

idx = pd.DataFrame(rows)
merged = ctx.merge(idx, on="slide_id", how="left")
print(merged.groupby("lab")[["n_lymphocytes", "n_monocytes"]].agg(["count", "sum"]))
merged.to_csv("monkey_index.csv", index=False)

跑完之后应该看到四家中心的切片数与细胞总数。若某一类点数为零,先查该切片是否在上下文表的 Nb_lymphocytes 一栏写着零,不要立刻当作文件损坏。

5.5 转换成检测训练样本

点标注要做成检测训练的输入,需要两步:把全切片切成适当大小的块,把落在块内的点转成目标。这里给出一个最小可用的切块器。

#-- 依赖:openslide-python(或 tiffslide 替代)、tifffile、numpy
#-- 输入:一张 PAS CPG 全切片 + 对应 json_mm 点文件
#-- 输出:若干 512x512 的块与每块内的点(已换算到块坐标)
import json
import numpy as np
import openslide
import tifffile

TILE = 512
LEVEL = 1          # 具体层级以 openslide 的 level_count 与 downsample 为准
PATCH_MM = 0.5     # 只保留块中心附近的点,减少跨块重复

def load_points_mm(json_path):
    obj = json.loads(open(json_path).read())
    return np.array([p["point"] for p in obj["points"]], dtype=np.float32)

def slide_points_to_pixel(slide, pts_mm):
    #-- json_mm 以毫米记,需除以像素物理尺寸(官方报告写 0.24 微米每像素)
    mpp = 0.24 / 1000.0
    return pts_mm / mpp

def tile_and_label(slide_path, json_path, out_dir):
    slide = openslide.OpenSlide(slide_path)
    pts = slide_points_to_pixel(slide, load_points_mm(json_path))
    downsample = slide.level_downsamples[LEVEL]
    w, h = slide.level_dimensions[LEVEL]
    out_dir.mkdir(exist_ok=True, parents=True)
    for x in range(0, w - TILE, TILE):
        for y in range(0, h - TILE, TILE):
            pts_lv = pts / downsample
            in_tile = (
                (pts_lv[:, 0] >= x) & (pts_lv[:, 0] < x + TILE) &
                (pts_lv[:, 1] >= y) & (pts_lv[:, 1] < y + TILE)
            )
            if not in_tile.any():
                continue
            img = slide.read_region((x * downsample, y * downsample), LEVEL, (TILE, TILE))
            arr = np.asarray(img.convert("RGB"))
            local = pts_lv[in_tile] - np.array([x, y], dtype=np.float32)
            stem = f"{slide_path.stem}_{x}_{y}"
            tifffile.imwrite(out_dir / f"{stem}.tif", arr)
            np.save(out_dir / f"{stem}.npy", local)

这段代码有三处需要按实际文件调整:层级编号、每像素物理尺寸、是否要做背景块过滤。第三点尤其重要——肾活检切片里大片空白玻璃如果不滤掉,模型会把「没有点」学成阴性样本,而空白处本来就不该有细胞。

5.6 坑点 1:把 MONKEY 当猴肾

⚠️ 坑点 1:数据集名字与物种的误认(分类:标签理解)

问题:名字里的 MONKEY 是英文全称首字母,与实验动物无关。若按「非人灵长类毒理病理」去检索与使用,会得到完全错误的组织学先验:人移植肾活检里看不到猴肾的肾小球形态,也看不到毒理研究常见的药物性肾损伤谱。
症状:把模型迁移到猕猴或食蟹猴的肾切片上时,组织配准与细胞尺度对不上;论文方法学部分把数据来源写成动物实验,审稿必然被质疑。
解决:

  1. 简单方法:在使用前读一遍站点首页第一段的缩写展开,把「人移植肾活检」写进方法学。
  2. 进阶方法:用上下文表的 Lab 列核对四家机构全部是人医院病理科,没有一家是毒理试验机构。
  3. SOTA 方法:把「物种」单独作为数据卡字段,非人源需求直接在选型阶段排除本集,转去找毒理病理公开集。
    参考:挑战赛首页与数据页的缩写定义;预注册报告第 16 项写明标本来自常规诊断的移植肾活检。

5.7 坑点 2:以为是分割,结果是点

⚠️ 坑点 2:标签形态与评价指标的错配(分类:评估误用)

问题:没有掩码,只有点。用 Dice 或 IoU 评价一个在这里训练出来的模型,会把一个只能输出中心点的模型强行膨胀成掩码,指标反映的是膨胀半径的选择,不是模型好坏。
症状:同一模型在不同膨胀半径下 Dice 差出十几点,评审无法判断真实水平;与分割论文对比时数字不可比。
解决:

  1. 简单方法:改用基于点匹配的指标,官方用 FROC。
  2. 进阶方法:容忍半径按类别分别设定,官方给的是单核细胞 10 微米、淋巴细胞 4 微米、合并 7.5 微米。
  3. SOTA 方法:同时报告 FROC 与计数相关,用计数相关回答「总量对不对」,用 FROC 回答「位置对不对」。
    参考:预注册报告第 26 项,容忍半径与 FROC 的五个工作点。

5.8 坑点 3:随机切分带来的泄漏

⚠️ 坑点 3:按切片随机划分会高估泛化性(分类:数据泄漏)

问题:同一中心的切片共享染色批次、扫描仪、切片厚度与制备流程。随机把 81 张切片分到训练与验证两侧,验证集会带着训练集的机构指纹,指标虚高。
症状:本地验证 FROC 漂亮,换一家中心立刻掉一截;论文里的数字无法被第三方复现。
解决:

  1. 简单方法:按中心划分,留一中心做验证,四折正好用完四家中心。
  2. 进阶方法:按中心加诊断类别分层,保证每一折里各 Banff 诊断都有代表。
  3. SOTA 方法:同时报告留一中心与留一扫描配置两种切法,后者用同一批病例的诊断配置扫描作为域偏移测试。
    参考:预注册报告第 22 项明确按中心成块划分,验证集与终测集来自与训练集不同的中心。

5.9 坑点 4:坐标单位与坐标系

⚠️ 坑点 4:毫米与像素混用(分类:预处理陷阱)

问题:同一批点存了两份,一份毫米、一份像素。像素版本的坐标系绑定在某一次特定扫描上;用诊断配置的扫描当底图,坐标就错位了。
症状:点整体偏移,偏移量随层级与扫描配置变化;可视化时点落在组织外。
解决:

  1. 简单方法:一律读 json_mm,用每像素物理尺寸换算,官方报告写 0.24 微米每像素。
  2. 进阶方法:换算后用一张切片的前景掩膜做校验,点数在掩膜内的比例应接近全部。
  3. SOTA 方法:把扫描配置当作数据增强的一个维度,做配准后重算坐标,并记录配准质量一栏作为样本权重。
    参考:桶内 ReadMe 的目录说明;报告第 24 项写明所有扫描都配准到诊断配置扫描。

5.10 坑点 5:复染质量不筛选

⚠️ 坑点 5:IHC 质量分进训练集(分类:偏倚陷阱)

问题:上下文表已经标出了哪些切片的复染质量差。不筛选直接训练,等于让质量最差的那批切片贡献最嘈杂的标签。
症状:损失降不下去,模型偏向学「哪里有棕色」而不是「哪里是淋巴细胞」。
解决:

  1. 简单方法:按上下文表把 IHC 质量带「差」的切片从训练集剔除,留作困难样本集。
  2. 进阶方法:按质量分档赋权,差的切片权重降低但不剔除,保留困难样本。
  3. SOTA 方法:把质量分档作为辅助任务的标签,让模型在推理时同时输出一个「该区域复染可信度」。
    参考:上下文表 CD3CD20_IHC_quality 与 PU.1_IHC_quality 两列的解释页。

5.11 坑点 6:兴趣区与全片的分布缺口

⚠️ 坑点 6:训练在兴趣区,上线在全片(分类:评估误用)

问题:标注只在兴趣区里,兴趣区是肾病理医生挑出来的、有炎症细胞的地方。在全片上推理时,大部分区域是阴性背景,模型会输出大量低置信度点。
症状:全片推理的假阳性密度比验证集高一个数量级,且集中在组织边缘、皱褶、气泡处。
解决:

  1. 简单方法:先用组织掩膜裁掉背景,只在组织内计数。
  2. 进阶方法:加入纯背景块做负样本,让模型学会「没有细胞」这一类的输出。
  3. SOTA 方法:两阶段,先做肾间室分割再在间室内做细胞检测,用间室先验压掉不合适区域。
    参考:桶内 tissue-masks 目录的作用;报告第 19 项说明算法的应用场景是全片。

5.12 坑点 7:两个子类的不平衡

⚠️ 坑点 7:单核细胞天然稀缺(分类:偏倚陷阱)

问题:组织里淋巴细胞多于单核细胞,官方给的量级是每张切片约 350 个对 180 个。二分类任务用平衡采样会改变真实的类先验,不用平衡采样则单核细胞的召回被稀释。
症状:单核细胞的 FROC 明显低于淋巴细胞,且不同模型之间的差距被淋巴细胞分数掩盖。
解决:

  1. 简单方法:两类分别算指标,不取平均当作单一分数。
  2. 进阶方法:排行榜把两类分数平均,但要同时报告单类分数,官方页面的做法就是这样。
  3. SOTA 方法:用合并类检测作为共享前置,再用一个轻量分类头做二分类,让检测与分类解耦。
    参考:挑战赛交卷格式要求三份文件(合并、单核、淋巴各一);预注册报告第 27 项说明取平均是为了应对类别不平衡。

5.13 坑点 8:样本权重的物理意义

⚠️ 坑点 8:把兴趣区面积差异当噪声(分类:工程陷阱)

问题:兴趣区面积从零点几到一平方毫米不等,标准差接近均值。按兴趣区等权训练会让大兴趣区贡献更多细胞、小兴趣区贡献更少,按细胞等权训练又会过度放大少数密集区。
症状:模型在密集炎症区过拟合,在稀疏区召回骤降;跨中心评估时,中心间兴趣区面积的差异被误读为算法差异。
解决:

  1. 简单方法:FROC 的横轴统一用每平方毫米假阳性数,把面积差异吸收进分母。
  2. 进阶方法:按兴趣区面积做采样权重,并记录每个兴趣区的面积以便回溯。
  3. SOTA 方法:在损失里直接把面积归一化写进去,使每个细胞贡献的损失与其所在兴趣区的面积成反比。
    参考:报告第 21 项给出兴趣区面积 0.32 ± 0.22 平方毫米;第 26 项定义 FROC 的横轴。

6.1 关系图谱

它在库内的位置可以用一句话定位:病理影像的下游是细胞,细胞的上游是组织,而它站在「组织已知、只看细胞」这一格。

层级 代表词条 与本文对象的关系
上游 各类全切片数据集 提供原始影像的思路与工具链
平级,同为点或实例 pan-cancer-nuclei-seg、midog-plus 同为细胞级任务,但组织与物种不同
平级,同为病理分类 til-wsi-tcga、icdc-glioma 同为病理 AI,但标签粒度更粗
下游 各类 Banff 自动化评分工作 消费细胞级检测结果
旁支,非影像 tg-gates、tox21、toxcast 同为毒理与安全性评价,模态完全不同

6.2 与 pan-cancer-nuclei-seg 的分工

两条都在做细胞级标注,但方向相反。

pan-cancer-nuclei-seg 交付的是「已经分好的结果」:模型跑完的多边形,量大但没有逐核人工确认。MONKEY 交付的是「人工确认过的点」:量小,但每一个点都有 IHC 作为独立证据。

维度 pan-cancer-nuclei-seg 本文对象
标签形态 多边形轮廓 点
标签来源 模型批量推理 IHC 引导加人工核对
规模 数千张切片、数十亿个核 81 张切片、约九万个点
细胞类别 泛类,不细分炎症类型 细分淋巴细胞与单核细胞
适用 大规模形态统计 细胞级检测与分型

选型规则很直接:要规模用它,要标签质量用这一条;要做形态学描述统计用它,要做「淋巴细胞与单核细胞分开计数」用这一条。

6.3 与 til-wsi-tcga 的分工

til-wsi-tcga 做的是肿瘤浸润淋巴细胞评分,输出是切片级的评分或分级,中间过程往往不公开。MONKEY 做的是炎症细胞的逐个定位,输出是可复核的点表。

两者在概念上都在「数免疫细胞」,差别在于数完之后做什么:一个汇成一个分数供预后建模,一个保留到细胞层供 Banff 评分使用。

6.4 与 midog-plus 的分工

midog-plus 是有丝分裂象检测,目标物也是「点状」的,检测范式非常接近。两者的差别在目标本身:有丝分裂象是分裂期细胞核的形态,炎症细胞是特定谱系的细胞,判读依据不同。

若想复用代码,检测头、后处理、FROC 计算都可以直接搬过去,只需要换数据加载与容忍半径。

6.5 与 kipa22 一类肾影像的边界

肾病理方向还有做肾肿瘤或肾结构的影像集,它们与本文对象的关系最容易被误连。

关键区别是模态与组织:肾影像分割做的是在体断层图像上的器官与肿瘤勾画,这条做的是离体组织切片上的细胞定位。两者除了器官相同,任务、模态、标签、用途都不重叠。

对比项 肾影像分割类 本文对象
模态 在体断层影像 离体全切片
组织 完整肾脏或肿块 穿刺活检小条
标签 器官或肿瘤的体素掩膜 细胞点
任务 术前规划 术后病理判读

6.6 为什么非人源与毒理那一格是空的

库内非影像的毒理与安全性评价数据已经有三条:tg-gates、tox21、toxcast。它们覆盖的是分子与转录层面的毒性信号,用的是细胞系、化合物库、大鼠与人体组织的体外实验数据。

影像侧的毒理病理,也就是动物给药后的组织切片,在公开数据里几乎是空白。它的字母名字会让人以为它填了这一格,实际没有。

位置 现有 缺口
分子与转录层 tox21、toxcast、tg-gates 覆盖较全
人源病理组织学 本文对象、pan-cancer-nuclei-seg、til-wsi-tcga 已有若干
动物病理组织学 无 完整空白
器官移植病理 仅本文对象 仅一条

§7 质量评估与局限性

7.0 读本节前先换一把尺子

评估这份资源,最容易犯的错是拿肿瘤病理数据集的标准来量它。

肿瘤数据集的评价维度是「癌种覆盖广不广、切片量大不大、标签粒度细不细」。用这三把尺子量它,会得出「只有一个器官、只有 81 张公开切片、连轮廓都没有」三个否定结论。

这是框架错位。它服务的是另一个问题:在一种需要细胞谱系分辨、而组织量又很小的标本上,能不能把细胞的种类判对。该问的是另外三件事:标准答案有没有独立证据、难度有没有被设计出来、失败模式有没有被公开。

按这三问,答案都是肯定的:标准答案是另一条染色通道给的,不是肉眼共识;难度被设计进两条排行榜,先测「找得到」,再测「分得开」;失败模式写在病理背景页的复染质量一节里。

7.1 DAIMS 二十四项检查

DAIMS 把数据集的质量拆成二十四条可勾选的检查项。逐条过一遍,能看出它的强项在元数据与工作流文档,弱项在标签形态的表达力与划分的可复现性。

# 检查项 状态 说明
1 宽格式 ✅ 上下文表一列一字段,无嵌套
2 唯一标识 ✅ 中心字母加流水号,全局唯一
3 特殊字符 ⚠️ 诊断列含空格与括号,部分质量列带尾随空格
4 重复行 ✅ 上下文表 81 行对应 81 个标识,无重复
5 缺失编码 ⚠️ 缺失用「x」或留空的写法混用,说明页单列一条
6 标签标识 ✅ 三类文件名即标签名,无歧义
7 罕见类分组 ⚠️ 其他类诊断合并了 BK 肾病、肾盂肾炎、缺血性坏死等多种
8 偏倚评估 ✅ 按 Banff 形态类别等量收集,报告交代了配额
9 数据字典 ✅ 上下文表附解释页,逐列给出类型与取值域
10 信息性缺失解释 ✅ 「x」表示该扫描版本不存在,有明确解释
11 设备记录 ✅ 扫描仪型号与两套扫描配置均写明
12 共线性 ⚠️ 三种配准质量列高度相关,做特征时会共线
13 编码映射 ✅ 中心字母与机构名、国家一一对应
14 时间戳处理 ⚠️ 只有发布与更新时间,切片级采集时间未给出
15 划分建议 ⚠️ 报告给了按中心的成块划分,但训练集内部无官方切分
16 泄漏讨论 ✅ 明确按中心划分,并说明为何要域偏移测试
17 标签分布 ✅ 上下文表给出每张切片的细胞计数与兴趣区数
18 测量偏倚 ✅ 复染质量、配准质量分列,可据此筛选
19 外部验证建议 ✅ 终测集来自未见过的两家中心
20 版本记录 ⚠️ 预注册报告有 v2,数据集本身无版本号
21 预处理脚本 ⚠️ 官方教程仓库提供加载与评测算例,预处理不完整
22 合规要求 ✅ 伦理批准号与各站点数据转让协议均写明
23 多模态对齐 ✅ PAS 与 IHC 经配准对齐,配准质量可查
24 去标识化 ✅ 无患者身份信息,切片号不含语义

DAIMS 评分:14 / 24 项完全达标,10 项带条件(⚠️),没有一项判为不通过。

评分解读:达标项集中在元数据、文档、合规三块,这是它最扎实的部分——一张 Excel 把每张切片的诊断、染色质量、配准质量、细胞计数都摊开了,用起来不必猜。带条件的十项里,有六项是「表达力不足」而不是「记录不全」:标签只有点没有面、缺失编码两种写法混用、诊断标签把多种病变合并成其他、只有发布时间没有采集时间、数据集本身没有版本号、预处理脚本不完整。

对你意味着什么:拿到手第一件事不是跑模型,是读懂那张上下文表和解释页。它决定了你能不能按质量筛子集、能不能按中心做划分、能不能在写论文时说清「这一批切片为什么被排除」。跳过这一步,后面所有对比都建立在不知道子集构成的前提上。

7.2 DAIMS 八项细分视角

把二十四项归到描述层、结构层、访问层三组,能看出更清楚的强弱格局。

维度 评分 依据
描述层身份与边界 4.5 名称、机构、缩写来源、物种归属写得清楚;难点在于名字本身会误导
描述层文档完备度 4.5 预注册报告二十二项问答加病理背景页,连复染失败的例子都附了图
结构层标识体系 4.5 中心字母加流水号加染种后缀,人类可读、脚本可解析
结构层层级一致性 3.5 全队列 119 与公开 81 两个分母并存,兴趣区计数只有公开部分
结构层标签表达力 2.5 只有点,没有轮廓、没有面积、没有置信度;细分到两类已到极限
访问层开放程度 5.0 匿名 S3 直取,无注册、无申请、无 embargo
访问层许可清晰度 4.0 许可单一明确(非商业),但非商业条款限制了大部分商业应用
访问层可复现性 3.5 官方分片教程可用,但终测集不公开,榜单分数无法本地复现

最该注意的是标签表达力那项的二点五分。这不是设计缺陷,是设计选择:点标注的成本远低于轮廓,一张切片上万细胞,画轮廓不现实。代价是它只能回答「在哪」,回答不了「多大、什么形状」。

7.3 五条可枚举的偏倚

第一条,参考标准偏倚。IHC 判读本身有一套阈值,弱阳性与阴性之间的界线是人定的;复染差的切片上,这条界线最不清楚。

第二条,选择偏倚。兴趣区由肾病理医生挑选,倾向选炎症明显、结构清晰的区域。这会让训练集比真实切片「更好看」,模型对杂乱区域的鲁棒性被高估。

第三条,中心偏倚。四家训练中心的切片厚度、染色、扫描设备各不相同,上下文表里配准质量的分布也不同。不按中心做划分与报告,会把中心差异学成生物学差异。

第四条,类别偏倚。单核细胞数量只有淋巴细胞的一半,且复染质量更不稳定。二分类的短板始终在单核细胞这一侧。

第五条,用途偏倚。全部标本来自移植受者,免疫抑制状态下的组织学特征与普通肾炎不同。把它当作「通用肾脏炎症检测器」会有系统性偏差。

7.4 它为何能持续

这场挑战赛在 2025 年 2 月就关闭了排行榜,2025 年 4 月转入开放提交周期,奖项也已颁发。按常理,这类资源会逐渐失修。它没有,原因有三。

其一,桶在开放数据项目里。数据放在 AWS 开放数据注册表下,存储成本由平台承担,没有「交不起服务器费而下线」的风险。

其二,下游依赖已经形成。预注册报告里写明了后续计划:把最好的算法用于一个九位病理医生参与的阅读研究,让每位医生在不借助与借助 AI 两种条件下各判一百例。这条链一旦开始,数据就必须保持可用。

其三,先例在前。组织方此前办过几场病理挑战赛,公开数据长期留存的惯例已经建立,本次延期到开放提交本身也说明平台在有意维持。

它的生存方式不是「持续更新」,而是「一次性发布后长期在线」。这与持续迭代的数据集不同:它不会变好,也不会变差,只会一直在那里。

7.5 外部验证的现状

诚实地说,目前没有独立的第三方在本数据集上做的同行评审验证。已有的数字都来自参赛团队自己的报告,且集中在同一篇预印本里。

来源 任务 指标 是否独立 说明
组织方基线 两任务 FROC 是(组织方) Faster R-CNN,作为下限参照
参赛团队预印本 两任务 FROC 否 团队自评,方法学详尽
阅读研究 人机对比 待公布 是(组织方) 九位病理医生,各判一百例

这张表的意义在于提醒:在看到独立复现之前,把榜单数字当作「上限参考」而不是「当前最好水平」。

§8 基准性能与生态

8.1 排行榜的读数方式

终测榜有三列 FROC:合并炎症细胞、淋巴细胞、单核细胞。第一条排行榜看第一列,第二条排行榜看后两列的平均。

FROC 的定义是横轴为每平方毫米平均假阳性数、纵轴为真阳性率,取五个预定点上的敏感度构成一个分数。这个设计的好处是不预设单一工作点,难点在于不同实现取的点、插值方式、容忍半径不一致时,分数不可直接比较。

指标列 对应排行榜 聚合方式 主要风险
合并炎症细胞 第一条 直接取 FROC 合并类掩盖单类失败
淋巴细胞 第二条 与单核细胞取平均 被单核细胞分数稀释
单核细胞 第二条 同上 类内不平衡最严重

8.2 终测榜单

下列数字取自一篇参赛团队预印本中转录的终测榜单,非官方页面直接读取。挑战赛站点首页公告了获胜团队,但榜单表格需要登录或动态加载,无法静态获取。

排名 团队或方法 合并炎症细胞 淋巴细胞 单核细胞
1 多解码器检测网络(宽版) 0.3930 0.4624 0.2392
2 实例分割网络加分类器 0.3875 0.4515 0.2626
3 企业团队 A 0.3517 0.4471 0.1906
4 企业团队 B 0.3316 0.3935 0.1268
5 企业团队 C 0.3130 0.3702 0.1230
6 影像团队 D 0.2824 0.3703 0.1550
7 高校团队 E 0.2470 0.3049 0.0699
参照 组织方基线 0.2282 0.3120 0.1220

读这张表要注意四件事。

第一,第一名的单核细胞分数不是最高的。第二名的单核细胞 0.2626 高过第一名的 0.2392,据该预印本自述,第二名使用了超过两百万条从 IHC 图合成的额外标注。这说明单核细胞这一类的天花板受训练数据供给的影响很大。

第二,合并类与单类的排序不一致。合并类第一名是检测网络,单核细胞第一名是另一个团队。排行榜把两类平均后排名,掩盖了这个分裂。

第三,基线的单核细胞 0.1220 高于第七名的 0.0699。这说明单核细胞任务上,简单方法也可能胜过一个复杂的但训练不好的模型,绝对分数的解释要格外小心。

第四,第一名与第二名的合并类差距只有零点零零五五,在终测集只有十九张切片的规模下,这个差距是否显著,报告没有给出统计检验。

8.3 为什么这些分数不能横比

第一个原因是对外数据。规则允许使用公开的额外数据与预训练权重,只要求披露。用额外数据训练的模型与只用本数据集训练的模型,分数不在同一基准上。

第二个原因是容器与硬件。提交以容器形式在平台后端运行,离线、有算力上限,但不同时期的容器环境可能不同。

第三个原因是数据版本。训练数据在 2024 年 9 月发布后未见正式版本号,桶内文件若有过替换,不同时期的参赛者看到的分布可能不完全一致。

第四个原因是容忍半径的可调性。报告说分数计算在挑战期间可能微调,以便更好地区分头部方法。

8.4 选型建议

要在本数据集上做工程选型,建议按下面四条判断。

场景 推荐路线 理由
只求「数得准」 检测网络加分类头 部署简单,单核细胞可用额外数据补
求「分得开」 双阶段,先检测后分类 单核细胞稀缺,分类头可单独加权
求跨中心稳 多中心混合训练加染色归一化 四家中心的扫描配置差异是主要干扰
求可解释 输出点到全片,与 IHC 对照查看 点级结果最容易被病理医生复核

8.5 关键文献

与这份资源直接相关、可核对的公开文献如下。

类型 文献 贡献
预注册报告 Studer 等,2024,Zenodo,DOI 10.5281/zenodo.13794656 挑战赛设计与全部数据规格的权威出处
参赛方法 KongNet 预印本,2025,arXiv 2510.23559 终测榜首方法,并转录了完整榜单
领域综述 移植肾活检 AI 解读综述,2025 交代本挑战在 Banff 自动化中的位置
上游方法 淋巴细胞检测深度学习论文,2019 本数据集的自动候选点来自该方法
上游方法 肾组织深度学习评估,2019 同组的组织分割工作,可与本集组合

8.6 生态快照

资源 类型 状态 说明
挑战赛站点 主页、数据页、病理背景页 在线 排行榜需登录
AWS 开放数据桶 数据下载 在线,匿名可读 主通道
教程仓库 代码 公开 加载、训练、评测的基础样例
预注册报告 文档 在线,可下载 14 页,二十二项问答
全切片读取库 工具 活跃 组织方的教程依赖它
标注工具 工具 活跃 XML 标注可用它查看

§9 使用指引

9.1 三种角色的路径

做研究的、做工程的、做临床的,进入这份资源的路径不同。

角色 第一步 第二步 产出
算法研究者 读预注册报告 按中心做四折 可发表的方法对比
数据工程师 取上下文表与标注 建立索引与切块 可用的训练管线
移植病理医生 看病理背景页 打开 XML 在切片上核点 对模型输出的临床判断

9.2 最小可用实现

下面这段是一条能跑通的端到端路径:读点、切块、训练一个极简的检测头、算计数相关。它不追求性能,只验证数据链路。

#-- 依赖:torch numpy tifffile scikit-learn
#-- 目标:用最少的代码验证「点 -> 块 -> 计数」这条链是通的
import numpy as np
import torch
import torch.nn as nn

class TinyDensity(nn.Module):
    """把一块图像回归成一张密度图,再用积分得到计数。"""
    def __init__(self):
        super().__init__()
        self.net = nn.Sequential(
            nn.Conv2d(3, 16, 3, padding=1), nn.ReLU(),
            nn.MaxPool2d(2),
            nn.Conv2d(16, 32, 3, padding=1), nn.ReLU(),
            nn.Conv2d(32, 1, 1),
            nn.Upsample(scale_factor=2, mode="bilinear", align_corners=False),
        )

    def forward(self, x):
        return self.net(x)

def points_to_density(points, size, sigma=4.0):
    """点坐标 -> 高斯密度图;求和即为该块内的细胞总数。"""
    yy, xx = np.mgrid[0:size, 0:size]
    dens = np.zeros((size, size), dtype=np.float32)
    for x, y in points:
        if 0 <= x < size and 0 <= y < size:
            dens += np.exp(-((xx - x) ** 2 + (yy - y) ** 2) / (2 * sigma ** 2))
    return dens

#-- images: [N,3,H,W] 张量;points 为长度 N 的列表,每项是若干 [x,y]
def train_step(model, opt, images, points):
    targets = np.stack([points_to_density(np.asarray(p), images.shape[-1]) for p in points])
    target = torch.from_numpy(targets).unsqueeze(1)
    pred = model(images)
    loss = nn.functional.mse_loss(pred, target)
    opt.zero_grad()
    loss.backward()
    opt.step()
    return float(loss)

#-- 计数评估:积分预测密度,与真实点数比较
def count_mae(model, images, points):
    with torch.no_grad():
        pred = model(images).sum(dim=(1, 2, 3)).cpu().numpy()
    truth = np.array([len(p) for p in points], dtype=np.float32)
    return float(np.abs(pred - truth).mean())

这段代码的意义是把「点」转成「密度」,这是点监督最常见的桥。真正的检测模型会在密度图上找局部极大值,再按阈值定位置;这里只到计数为止。

9.3 评估指标的最小实现

官方用 FROC,本地复现时需要把容忍半径换算成像素。

#-- 依赖:numpy scipy
#-- 说明:距离匹配用的是按类别设定的容忍半径,单位为微米
import numpy as np
from scipy.optimize import linear_sum_assignment

RADIUS_UM = {"monocytes": 10.0, "lymphocytes": 4.0, "inflammatory_cells": 7.5}
MPP_UM = 0.24  # 每像素微米数,以全切片层级为准

def match(pred, gt, radius_px):
    """匈牙利匹配求最大一对一配对数,超出半径的配对不计。"""
    if len(pred) == 0 or len(gt) == 0:
        return 0
    d = np.linalg.norm(pred[:, None, :] - gt[None, :, :], axis=2)
    r, c = linear_sum_assignment(d)
    ok = d[r, c] <= radius_px
    return int(ok.sum())

def froc_points(pred, gt, cls, area_mm2, fp_levels=(10, 20, 50, 100, 200, 300)):
    radius_px = RADIUS_UM[cls] / MPP_UM
    tp = match(pred, gt, radius_px)
    fp = max(len(pred) - tp, 0)
    sens = tp / max(len(gt), 1)
    fp_per_mm2 = fp / max(area_mm2, 1e-6)
    #-- 单点近似:真实 FROC 需要按置信度排序后扫过阈值
    return sens, fp_per_mm2

这里刻意写成单点近似,因为完整 FROC 需要每个点的置信度排序。给出这个简化版是为了说明半径换算这一步,跑完整版时应当把置信度一并返回。

9.4 在 AI 流程里的位置

用一句话概括:它是「细胞检测模型」的训练与评测集,不是「Banff 评分模型」的训练集。

Banff 评分需要的是「炎症细胞在某个间室里占多少」,这既包含细胞计数,也包含间室分割,还要人改判的语义规则。本数据集只提供第一项。

环节 本数据集能提供 需要外部补齐
细胞检测 全部 无
细胞分型 两类 其他亚群需另找
间室划分 无 需要组织分割模型或掩膜
评分规则 无 需要 Banff 规则实现
临床结局 无 需要随访数据

9.5 合规使用的四条底线

第一,不做商业使用。许可写明非商业,且衍生作品要同许可传播。

第二,不推测个体。虽然已去标识化,但切片编号加机构加诊断的组合在小机构内仍有识别风险,不应做任何回溯个体的尝试。

第三,不当作诊断依据。所有结果都必须有病理医生复核,数据集本身不承诺任何临床结论。

第四,引用要引对。用这套数据发表,按规则应引用预注册报告,不是只引挑战赛网站。

§10 AI 使用声明

10.1 它在训练流程里的位置

合理的用法是「检测预训练」与「检测评测」两用,不适合做「端到端诊断模型」的唯一监督源。

用法 适配度 理由
细胞检测预训练 高 点级标签干净,跨中心多样
跨中心泛化评测 高 四家中心天然分块
非肿瘤病理的迁移实验 高 组织类型与肿瘤数据完全不同
细胞分割训练 低 没有轮廓
Banff 自动评分 低 只有细胞,没有间室与规则
商业产品训练 不允许 非商业许可

10.2 生成式模型最容易说错的四个数

第一个是切片总数。119 是全队列,81 是公开训练集,80 是注册表页写的数。这三个数不能互换。

第二个是中心数。四家训练中心、六家全队列中心。说「来自四家中心」时要说清是训练集。

第三个是兴趣区数。231 是全队列,公开部分按表求和是 164。引用时标明来源。

第四个是细胞数。单张切片平均约 350 个淋巴细胞与 180 个单核细胞,这是期望值不是精确计数;公开部分逐行求和是五万九千余与三万一千余。

10.3 不该由它承担的判断

不接受它的结果作为移植排斥的确诊依据。它没有间室分割,没有评分规则,也没有与临床结局的对照研究。

不接受它的结果作为药物安全性评价结论。全部是人源移植活检,没有给药背景,也没有动物数据。

不接受「在它上训练好的模型可以直接用于动物毒理」。组织学特征与物种间尺度差异都会导致系统性失效。

10.4 一句话交接

如果只能留一段话给下一位接手的人:先读上下文表,再读病理背景页,最后才碰影像。表告诉你这批切片里有什么、哪几张的染色不可靠;背景页告诉你为什么在这种染色下分不清两种细胞;影像本身不给任何提示,打开它只会看到一片紫红。

常见误读(避坑清单)

常见说法 实际情况 证据
「这是猴肾活检数据」 是人移植肾活检,MONKEY 是英文全称缩写 站点首页缩写展开;预注册报告第 16 项写明标本来自常规诊断移植肾活检
「这是毒理研究数据」 与毒理无关,是移植排斥的临床诊断材料 病理背景页通篇讲 Banff 排斥评分,无给药或剂量设计
「一共 119 张,下载就能拿到」 公开只有 81 张,28 张用于验证与终测且不公开 数据页写 119;预注册报告表 1 给 81、9、19 的拆分
「AWS 注册表写 80 张,所以是 80」 桶里实际 81 张 PAS 主扫描,注册表是撰写时口径 桶内 pas-cpg 前缀列举得到 81 个对象
「标注是语义分割掩码」 只有点,没有轮廓与掩码 桶内 ReadMe 与 JSON 结构,类型为 Multiple points
「做的是肾小球、肾小管、间质分割」 不打间室标签,只标两类炎症细胞 上下文表无间室字段,标注文件只有三类名称
「染色是 H&E」 主染是 PAS,另配 CD3/CD20 与 PU.1 的双标 IHC 数据页与病理背景页均写明 PAS 与 IHC
「231 个兴趣区全部可见」 公开部分按表求和为 164,差额在隐藏集合 上下文表 Nb_rois 列逐行求和
「许可是 CC BY,可以商用」 是 CC BY-NC-SA,禁止商业使用且须同许可传播 AWS 注册表与预注册报告第 11 项
「可以用 Dice 评测」 没有掩码,Dice 无从算起,官方用 FROC 预注册报告第 26 项
「终测分数能在本地复现」 终测集不公开,只能提交容器跑分 规则页与平台元信息写明终测标注不公开
「单张切片每张都有一份诊断配置扫描」 只有 69 张有,A 中心多数没有 桶内 pas-diagnostic 前缀对象数与表 1 对照
「样本来自四国六家中的随机抽样」 按 Banff 形态类别配额挑选,不是随机抽样 预注册报告第 22 项列出每类若干例的收集目标

FAQ

Q1:缩写里的 KEY 到底指什么?

KEY 是 KidnEY 的缩写,指肾。整个名字拼起来是「机器学习用于肾脏炎症细胞的最优检测」,七个词取首字母凑成 MONKEY。猴只是凑巧形成的一个词,挑战赛用它做了徽标与视觉主题。

Q2:全队列 119 张是怎么来的?

四家训练中心 26、17、20、18 章合计 81 张,瑞士那家中心 18 张被二分为验证 9 张与终测 9 张,美国另一家中心 19 张全部进终测。81 加 18 加 19 得 119。公开的只有 81。

Q3:为什么标注要做 IHC 复染,直接看 PAS 不行吗?

在 PAS 上区分淋巴细胞与单核细胞主要靠大小与核形态,官方明确说这很难。组织里细胞密集、又混着肾小管上皮时,肉眼判读的不确定性会直接写进标签。加一条染色通道等于给标准答案换了一条独立的证据链。

Q4:点标注能训练分割模型吗?

能,但要靠近似。常见做法是把点膨胀成小圆或生成密度图,再训练一个输出连续场的模型,推理时取峰值。这样训练出来的模型,其「分割质量」取决于膨胀半径怎么选,不是标签本身的信息。

Q5:为什么终测集有两家中心?

一家用于验证与终测对半分,目的是在算法于验证集上表现好而在终测上崩掉时,能定位是模型问题还是数据问题;另一家用更不同的扫描设备,作为纯留出,检验跨设备泛化。

Q6:能不能只用一张扫描版本训练?

可以,而且这是最省资源的方式。官方建议是验证与终测阶段只用 Radboud 那套扫描配置产出的版本,因为评测就在这个配置上进行。用诊断配置或原中心扫描做增强时,要先把坐标搬过去。

Q7:兴趣区只有一点几平方毫米,够训练吗?

单看面积不大,但细胞密度高。公开部分逐行加总是五万余个淋巴细胞与三万余个单核细胞,合计九万上下的点。对检测任务来说,这个量够做从头训练,但不适合训练很大的模型。

Q8:它和移植排斥的 Banff 评分是什么关系?

它是评分的一个子问题。十个与炎症相关的评分需要知道炎症细胞在哪个间室、有多少,它只回答「有多少、在哪」,间室由别的模型或人工划分。想端到端出评分,中间还差一层。

Q9:数据会一直在线吗?

目前在线,放在 AWS 开放数据注册表下,由平台承担存储费用。风险不在存储,在维护:挑战赛已进入开放提交周期,官方未承诺长期更新标注,只承诺数据可获取。

Q10:能不能拿它做动物实验的替代?

不能。它本身就是人源临床数据,不是动物实验数据,也不包含任何动物实验的对照设计。把它的结论外推到动物,在物种间组织学差异与用药背景两方面都缺乏依据。

附录 A:切片与目录速查

项 值
桶名 monkey-training
区域 美国西部二区
匿名访问 是
顶层目录 annotations、images、metadata,另加一份 ReadMe
标注子目录 json_mm、json_pixel、xml
影像子目录 pas-cpg、pas-diagnostic、pas-original、ihc、tissue-masks
命名规则 中心字母加下划线加 P 加六位流水号,再加染种与扫描后缀
上下文表 metadata/context-information.xlsx,两张工作表
公开切片数 81
公开兴趣区数 164

附录 B:标注类别与文件格式

类别名 文件后缀 文件数(每张切片) 格式 单位
lymphocytes _lymphocytes 1 JSON 与 XML 毫米与像素各一份
monocytes _monocytes 1 JSON 与 XML 同上
inflammatory cells _inflammatory-cells 1 JSON 与 XML 同上
格式 根节点 类别字段 坐标字段 可直接用于
JSON 对象 name points[].point 脚本读取
XML ASAP_Annotations Annotation 的 PartOfGroup Coordinate 的 X 与 Y 标注软件查看

附录 C:术语表

术语 含义
WSI 全切片图像,一张切片经扫描仪数字化后的超大影像
PAS 过碘酸雪夫染色,把糖原与基底膜染成紫红,移植肾活检的常规染色
IHC 免疫组化,用抗体标记特定蛋白并显色
双标 一张切片上同时标记两种抗原,用不同颜色区分
PU.1 单核细胞谱系的转录因子,本数据集用它定位单核细胞
CD3 与 CD20 分别标记 T 细胞与 B 细胞的表面抗原,合起来覆盖淋巴细胞
兴趣区 被选定并标注的组织区域,本数据集中平均面积 0.32 平方毫米
点标注 每个细胞用一个坐标表示,不标边界
Banff 分类 移植肾活检判读的国际标准,由多项病变评分构成
病变评分 对某个间室病变程度的半定量分级
间室 肾脏的组织分区,如间质、肾小管、血管
排斥 受者免疫系统攻击移植肾的过程,分细胞介导与抗体介导
FROC 自由响应受试者工作特征曲线,横轴为每单位面积假阳性数
容忍半径 预测点与真实点相距多少以内算命中
复染 在已完成一次染色的切片上再做一次染色
配准 把同一组织的两次扫描对齐到同一坐标系
去卷积 从混合颜色中分离各染料的贡献,用于把棕色与品红分开
域偏移 训练数据与部署数据分布不一致
留一中心 每次留一家中心做验证,其余做训练,轮流进行
计数相关 预测总数与真实总数之间的相关系数

附录 D:常见误读速查

误读 一句话纠正
猴肾 人移植肾活检
毒理数据 移植排斥诊断数据
分割集 点检测集
H&E PAS 加双标 IHC
119 张全可下载 公开 81 张
114 张 没有这个数,注意 119 与 81 的区别
商用可用 非商业许可
能出 Banff 评分 只能出细胞计数

附录 E:许可与引用

项 内容
数据许可 CC BY-NC-SA 4.0,署名、非商业、相同方式共享
预注册报告许可 CC BY 4.0,与数据许可不同,引用时分别注明
伦理批准 Radboudumc CMO 批准号 2022-13686,2022 年 3 月 31 日
站点数据转让 各参与中心另签数据转让协议
建议引用文案 引用预注册报告作为数据来源,另注明访问日期与桶路径
@misc{studer2024monkey,
  title        = {Structured description of the {MONKEY} challenge},
  author       = {Studer, Linda and van der Laak, Jeroen and van Midden, Dominique and Ayatollahi, Fazael},
  year         = {2024},
  publisher    = {Zenodo},
  doi          = {10.5281/zenodo.13794656},
  url          = {https://zenodo.org/records/13794656}
}

@misc{lv2025kongnet,
  title        = {KongNet: A Multi-headed Deep Learning Model for Detection and Classification of Nuclei in Histopathology Images},
  author       = {Lv, Jiaqi and Nasir, Esha Sadia and Xu, Kesi and Jahanifar, Mostafa and Chohan, Brinder Singh and Elhaminia, Behnaz and Raza, Shan E Ahmed},
  year         = {2025},
  eprint       = {2510.23559},
  archivePrefix= {arXiv},
  url          = {https://arxiv.org/abs/2510.23559}
}

编辑说明

核验时间 2026-10-29。核验方式:挑战赛站点首页、数据页、规则页、时间线页、病理背景页、奖项页、组织者页逐段读取;预注册结构化报告从 Zenodo 取回 PDF 全文,逐项核对二十二项问答中的切片数、中心配额、扫描配置、标注流程、容忍半径与伦理批准号;AWS 开放数据桶以匿名 REST 列举四个影像前缀与四个标注前缀,逐个统计对象数与体积,并直接读取 ReadMe 与上下文表两张工作表;榜单数字取自一篇参赛团队预印本中转录的终测表,并与站点首页公告的三支获胜团队交叉核对。

未覆盖的内容:终测榜与验证榜的原始表格需登录或动态加载,未做登录抓取,故榜单以第三方转录为准并在正文标明;未下载全量影像,故分辨率取自报告的 0.24 微米每像素而未逐张开图校验;未运行任何训练代码,训练管线与指标实现为按官方描述重写的最小版本;未统计隐藏集合的兴趣区与细胞数,全部由全队列与公开部分的差值推断。

修改记录:初稿即本版。


相关数据集导航

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

  • cervix93 — 共享标签:医学影像 / 病理图像 / 目标检测 / 图像分类
  • modus — 共享标签:医学影像 / 目标检测 / 图像分类
  • camelyon16 — 共享标签:医学影像 / 病理图像 / 目标检测 / 图像分类
  • bonemarrow-wsi — 共享标签:医学影像 / 病理图像 / 目标检测 / 图像分类
  • neptune — 共享标签:医学影像 / 病理图像 / 图像分类
  • chula-parasitic-egg — 共享标签:医学影像 / 目标检测 / 图像分类
  • kvasir-capsule — 共享标签:医学影像 / 目标检测 / 图像分类
  • midog — 共享标签:医学影像 / 病理图像 / 目标检测
  • panda — 共享标签:医学影像 / 病理图像 / 图像分类
  • acevedo-blood — 共享标签:医学影像 / 病理图像 / 图像分类

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

需要更高工程化程度或合规出域的商业版本?

当前展示的公开版本适用于学术研究与原型验证。千方医数集依托三甲医院直采网络,提供经专家标注、符合伦理合规的专病数据集交易服务。

前往商城查看可交易产品 →
返回 AI-Ready 数据集