ImageBind-style · H&E / mIF / RNA / text · 最终结果与独立复现 · 2026-10-30

四模态病理嵌入模型

把 H&E 图像、多重免疫荧光(mIF,蛋白)、空间转录组(RNA)和病理文本放进同一个 1536 维空间。 锚点是冻结的 UNI2-h 图像空间;所有模态只用真实配对数据训练,虚拟和合成数据只用于评估。 最终模型(EJ-ad+MV,3 种子适配器平均)已训练完成,并提供从原始输入直接生成嵌入的接口 embed.py。 2026-10-29 又在独立 A800 环境中完成了发布模型评估、fold 0 重训、5 折重训和 release 重训,全部复现检查通过。

设定与数据

没有任何数据集同时测量四种模态,所以采用 ImageBind 的思路:每个模态只和 H&E 配对训练,H&E 以外的模态两两之间的对齐是“涌现”出来的。

  • 训练配对只用真实数据:ORION 结直肠癌(H&E–mIF)、HEST-1k Visium(H&E–RNA)、TCGA/PathGen(H&E–文本)。
  • 划分:按病人(HEST 按研究|病人组)分成 train/val/test,5 折交叉验证;val 只用于早停,所有数字都是 test 上的。
  • 虚拟和合成数据只用于测试:STPath 虚拟 RNA、MIPHEI 虚拟 mIF、GPT 合成描述。它们只用来给“没有真实配对”的模态对构建测试集。
  • 指标:100 个样本的检索库里的 R@1(双向平均,随机水平 0.01),抽 50 次取平均;配对准确率是同一 100 库里的一对一匈牙利匹配(随机水平 0.01)。
数据集配对规模用途
ORION CRCH&E – mIF(16 个标记)3,187 图块 · 约 40 名病人训练 + 测试
HEST-1k VisiumH&E – RNA(14,802 基因)9,484 spots · 57 项研究 · 16 器官训练 + 测试
TCGA / PathGen-1.6MH&E – 文本6,144 图像 · 6,115 条清洗后文本训练 + 测试
STPath / MIPHEI / GPT 描述虚拟 RNA、虚拟 mIF、合成文本ORION、TCGA 测试图块只用于测试
DLPFC(spatialLIBD)H&E – RNA(脑)482 spots · 3 名供体外部测试

最终模型

两阶段训练。第一阶段给每个编码器单独训练一个映射头,映射到冻结的 UNI2 空间。第二阶段冻结所有映射头,只训练一个 H&E 残差适配器,它同时读 UNI2 和 MedVTok 的特征。

  • 第一阶段:每个映射头用 InfoNCE 对齐冻结的 UNI2(文本是多正样本 InfoNCE,同一图像的多条文本都算正样本)。RNA 和文本是后期融合:z = normalise(Σ normalise(head_e(x_e)))。
  • 第二阶段:只训练 H&E 适配器和温度参数:H&E = UNI2 + mean_s A_s([UNI2, c·MedVTok])。损失是三种配对损失之和加上对 UNI2 相似度结构的蒸馏(λ=1),学习率 1e-4,1000 步,按验证集三种 R@1 的几何平均早停。用 3 个随机种子各训练一个适配器,取平均。
  • 后果:mIF、RNA、文本的嵌入和第一阶段完全一样,所以涌现配对不受第二阶段影响;只有 H&E 这一侧变好。
  • 发布版:models/ej_ad_mv/,用 fold 0 的 train + test 训练(ORION 3,000 图块、HEST 8,938 spots、TCGA 5,615 条文本),fold 0 的 val 用于早停。它没有自己的测试集,预期性能就是下面的 5 折交叉验证结果。

结果

最终模型,5 折测试集

配对类型数据集R@1R@10配对准确率
H&E ↔ mIF训练ORION0.801 ± 0.0430.9910.942
H&E ↔ RNA训练HEST0.203 ± 0.0330.6250.258
H&E ↔ 文本训练TCGA0.323 ± 0.0070.8130.347
mIF ↔ RNA(虚拟)涌现ORION0.141 ± 0.0070.6570.194
mIF ↔ 文本(合成)涌现ORION0.089 ± 0.0080.4910.104
文本 ↔ RNA(虚拟)涌现TCGA0.095 ± 0.0060.4360.100
文本 ↔ mIF(MIPHEI 虚拟)涌现TCGA0.046 ± 0.0050.2710.051
H&E ↔ RNA外部DLPFC(脑)0.0120.1120.012

随机水平:R@1 0.01,R@10 0.10,配对准确率 0.01。涌现配对的一侧是虚拟或合成数据,这些数据本身有误差,所以数值偏保守。DLPFC 是第一阶段(E)的结果;第二阶段不改变 RNA 侧。

各阶段的提升(训练配对 R@1,5 折均值)

涌现配对(R@1)

阶段mIF↔RNA(虚拟)mIF↔文本(合成)文本↔RNA(虚拟)文本↔mIF(虚拟)
单编码器,单独训练(S4)0.1220.0760.0690.038
单编码器,联合微调所有头(J8)0.1220.0730.0650.035
多编码器融合(E)0.1410.0890.0950.046
融合 + 联合微调 mIF 头(EJ-frz)0.1340.0870.0950.042
最终:只训练 H&E 适配器0.1410.0890.0950.046

独立复现:发布结果可重现

总体结论:在 cuipeng 服务器的一张 NVIDIA A800-SXM4-80GB 上,从发布的编码器特征重新执行完整的 reproduce.sh。流程包括评估已发布 fold-0 checkpoint、重训 fold 0、重训 5 折、逐项比较发布结果,以及用 fold-0 train + test 重训 release 模型。任务最终状态为 Success,日志给出 REPRODUCED within tolerance 和 FOURMODAL_REPRODUCTION_COMPLETE。

  • 任务记录:t-20261029185830-n649r;实际运行约 9 分钟(2026-10-29 16:12–16:21:57 UTC)。
  • 环境:Python 3.12.1、PyTorch 2.7.1+cu128、CUDA 12.8、NumPy 2.4.6、Pandas 2.3.3、SciPy 1.16.3。
  • 数据检查:26 个特征数组,共 0.933 GiB;全部可读取、非空且无 NaN/Inf;三组数据的 5 折划分完整。
  • 发布模型检查:重新评估发布 fold-0 模型,7 个模态对与随模型发布的 test.csv 最大 R@1 差异为 0.0001。

fold 0 重训:留出测试集

模态对本次重训 R@1发布 R@1绝对差异复现检查
H&E ↔ mIF(ORION)0.76080.78340.0226通过
H&E ↔ RNA(HEST)0.18530.19170.0064通过
H&E ↔ 文本(TCGA)0.32400.32030.0037通过
mIF ↔ RNA(虚拟,ORION)0.13580.13520.0006通过
mIF ↔ 文本(合成,ORION)0.09780.09870.0009通过
文本 ↔ RNA(虚拟,TCGA)0.09990.10000.0001通过
文本 ↔ mIF(MIPHEI,TCGA)0.04840.04910.0007通过

5 折重训:最终 ens-es 规则

模态对本次 5 折 R@1发布 R@1绝对差异复现检查
H&E ↔ mIF(ORION)0.79670.80100.0042通过
H&E ↔ RNA(HEST)0.20210.20300.0009通过
H&E ↔ 文本(TCGA)0.32310.32320.0001通过
mIF ↔ RNA(虚拟,ORION)0.14140.14140.0000通过
mIF ↔ 文本(合成,ORION)0.08850.08870.0001通过
文本 ↔ RNA(虚拟,TCGA)0.09660.09530.0013通过
文本 ↔ mIF(MIPHEI,TCGA)0.04640.04650.0001通过

所有 fold-0 和 5 折对比均落在发布代码预定义的容差内。最终还生成并独立加载验证了 models/repro_fold0/model.pt、models/repro_release/model.pt 和三张 final_cv_*_repro.csv。本次执行的是特征级复现;没有执行可选的 RAW=1 原始输入编码器检查。

主要发现

  1. UNI2-h 是最好的冻结锚点。在 mIF、RNA、文本三种训练配对上都没有被显著超过;GigaPath 接近(RNA 差 0.035),CONCH 在 H&E↔mIF 上低 0.155。MedVTok 当锚点也更差(H&E↔RNA 0.131 对 0.192)。
  2. 多编码器后期融合是最大的单项提升。RNA 用 4 个编码器、文本用 3 个,H&E↔RNA +0.037、H&E↔文本 +0.062,4 个涌现配对也全部提升(5/5 折)。拼接(早期融合)和同一编码器多种子平均都达不到这个效果,说明这些编码器是互补的。
  3. 联合训练要只动 H&E 一侧。从头训练共享的 H&E 头会让 H&E↔mIF 变好,但涌现配对损失 26–74%。冻结所有模态头、只训练零初始化的残差适配器,H&E↔mIF +0.10,涌现配对完全不变。
  4. MedVTok 作为适配器的额外输入有效,作为锚点无效。额外输入使 H&E↔mIF +0.015、H&E↔文本 +0.016。换成同尺寸的 UNI2 随机投影就没有提升,说明增益来自 MedVTok 的信息而不是参数量。
  5. 第二阶段的早停不稳定,3 个种子平均解决了这个问题。验证曲线在 100 步后基本是平的,单次早停选中的步数在 100–900 之间波动,同一设置重跑 H&E↔mIF 可以差 0.05。3 个早停适配器取平均后,H&E↔文本比单种子再 +0.015(5/5 折,p=0.02),也是三种规则里几何平均最高的。
  6. 线性头比 MLP 头更适合 RNA 和文本。训练配对持平,涌现配对 +5%;mIF 保留 MLP 头。
  7. 用虚拟配对直接训练不如走锚点的涌现路线。文本↔蛋白在真实 mIF 上 0.596 对 0.678(AUROC)。所以虚拟数据只用作测试,从不进入训练。
  8. 实例级的涌现对齐仍然弱。mIF↔RNA 0.141 是随机水平的 14 倍,但比训练配对低一个数量级;概念级对齐(AUROC 0.6–0.7)更可靠。

编码器选择

模态最终使用依据(5 折配对检验)
H&EUNI2-h + MedVTok(只进适配器)UNI2 在所有训练配对上不被显著超过;MedVTok 额外输入 mIF +0.015、文本 +0.016
mIFVirTues(16 标记)+ MLP 头从头训练的 ConvNeXt-T 在 H&E↔mIF 上高 0.03,但 VirTues 的跨模态迁移好得多(mIF↔markers 0.66 对 0.48),且不绑定固定标记面板
RNAhvg + Tahoe-x1 + SE-600M + AIDO.Cell,各一个线性头单个基础模型最多 +0.016;4 个融合 +0.037,接近 10 个融合(+0.044)
文本KEEP + BiomedCLIP + Qwen3-Emb-0.6B,各一个线性头KEEP 单个最好(0.278);3 个融合 0.299,接近 5 个融合(0.303)

虚拟模态(只用于评估)

每种虚拟模态先做校准:在有真实数据的同一批样本上,用虚拟数据替换真实数据,看配对结果是否接近。

虚拟模态校准(真实 → 虚拟,同一批样本)结论
STPath 虚拟 RNAHEST H&E↔RNA 0.148 → 0.126;STPath 未见过的样本 0.086 → 0.080可用
GPT 合成描述TCGA H&E↔文本 0.219 → 0.162(约 0.75 倍)可用,偏保守
MIPHEI 虚拟 mIFORION 未见过的测试图块:配对准确率 0.92 → 0.55(约 0.6 倍)可用
GigaTIME 虚拟 mIFORION H&E↔mIF 0.644 → 0.038不可用,已弃用

局限

使用方法

运行环境:.venv/bin/python -I,需要 GPU。所有输出都是 L2 归一化的 (N, 1536) 向量,相似度就是点积。

from embed import Embedder
E = Embedder("models/ej_ad_mv")                 # 发布版模型

z_he  = E.he(images)                            # H&E 图块:PIL 图像或 (N,H,W,3) uint8;约 0.5 µm/px,112–166 µm 视野
z_txt = E.text(["Tumor cells with ...", ...])
z_rna = E.rna(counts, genes, zscore="train")    # 原始计数(spots × 基因)+ HGNC 基因名;新数据集可用 zscore="self"
z_mif = E.mif(tiles, slide)                     # (N,16,H,W) mIF 图块,通道顺序 = embed.MIF_MARKERS,8 位强度;附每个图块的切片 ID

sim = z_he @ z_rna.T                            # 跨模态相似度
# 已有特征时:E.he_from_feats(uni2, medvtok)、E.mif_from_feats(virtues)、E.rna_from_feats({...})、E.text_from_feats({...})

接口验证(53_embed_check.py)

从原始像素、字符串和计数矩阵出发,用 embed.py 重新计算特征,和训练时缓存的特征逐项比较;再用 fold 0 模型在留出测试集上做端到端检索。

检查结果
UNI2-h、MedVTok(ORION、PathGen、HEST 图像)余弦中位数 1.0000,最低 ≥ 0.9997
KEEP、BiomedCLIP、Qwen3(TCGA 文本)中位数 1.0000 / 1.0000 / 0.9998(BiomedCLIP 个别 0.93,bf16 批次差异)
hvg、AIDO.Cell / Tahoe-x1、SE-600M(HEST)1.0000 / 0.991、0.994(后两者按官方做法随机采样基因)
VirTues(全部 3,187 个 ORION 图块)中位数 1.0000,最低 1.0000
端到端 R@1:原始输入 vs 缓存特征mIF 0.792 / 0.792 · RNA 0.194 / 0.194 · 文本 0.335 / 0.336

文件

路径内容
embed.py推理接口(Embedder、Bind4)
52_final_model.py最终模型训练:cv(选择规则)、fold0、release
53_embed_check.py原始输入验证,结果在 results/embed_check.csv
models/ej_ad_mv/发布版模型:model.pt(77 MB,含标准化统计量)、meta.json、验证曲线
models/ej_ad_mv_fold0/fold 0 模型及其留出测试结果 test.csv
results/final_cv_*.csv5 折 × 3 种子的选择规则实验
RESULTS.md全部实验的完整记录(01_–53_)