把 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 CRC | H&E – mIF(16 个标记) | 3,187 图块 · 约 40 名病人 | 训练 + 测试 |
| HEST-1k Visium | H&E – RNA(14,802 基因) | 9,484 spots · 57 项研究 · 16 器官 | 训练 + 测试 |
| TCGA / PathGen-1.6M | H&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 的特征。
z = normalise(Σ normalise(head_e(x_e)))。H&E = UNI2 + mean_s A_s([UNI2, c·MedVTok])。损失是三种配对损失之和加上对 UNI2 相似度结构的蒸馏(λ=1),学习率 1e-4,1000 步,按验证集三种 R@1 的几何平均早停。用 3 个随机种子各训练一个适配器,取平均。models/ej_ad_mv/,用 fold 0 的 train + test 训练(ORION 3,000 图块、HEST 8,938 spots、TCGA 5,615 条文本),fold 0 的 val 用于早停。它没有自己的测试集,预期性能就是下面的 5 折交叉验证结果。| 配对 | 类型 | 数据集 | R@1 | R@10 | 配对准确率 |
|---|---|---|---|---|---|
| H&E ↔ mIF | 训练 | ORION | 0.801 ± 0.043 | 0.991 | 0.942 |
| H&E ↔ RNA | 训练 | HEST | 0.203 ± 0.033 | 0.625 | 0.258 |
| H&E ↔ 文本 | 训练 | TCGA | 0.323 ± 0.007 | 0.813 | 0.347 |
| mIF ↔ RNA(虚拟) | 涌现 | ORION | 0.141 ± 0.007 | 0.657 | 0.194 |
| mIF ↔ 文本(合成) | 涌现 | ORION | 0.089 ± 0.008 | 0.491 | 0.104 |
| 文本 ↔ RNA(虚拟) | 涌现 | TCGA | 0.095 ± 0.006 | 0.436 | 0.100 |
| 文本 ↔ mIF(MIPHEI 虚拟) | 涌现 | TCGA | 0.046 ± 0.005 | 0.271 | 0.051 |
| H&E ↔ RNA | 外部 | DLPFC(脑) | 0.012 | 0.112 | 0.012 |
随机水平:R@1 0.01,R@10 0.10,配对准确率 0.01。涌现配对的一侧是虚拟或合成数据,这些数据本身有误差,所以数值偏保守。DLPFC 是第一阶段(E)的结果;第二阶段不改变 RNA 侧。
| 阶段 | mIF↔RNA(虚拟) | mIF↔文本(合成) | 文本↔RNA(虚拟) | 文本↔mIF(虚拟) |
|---|---|---|---|---|
| 单编码器,单独训练(S4) | 0.122 | 0.076 | 0.069 | 0.038 |
| 单编码器,联合微调所有头(J8) | 0.122 | 0.073 | 0.065 | 0.035 |
| 多编码器融合(E) | 0.141 | 0.089 | 0.095 | 0.046 |
| 融合 + 联合微调 mIF 头(EJ-frz) | 0.134 | 0.087 | 0.095 | 0.042 |
| 最终:只训练 H&E 适配器 | 0.141 | 0.089 | 0.095 | 0.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)。test.csv 最大 R@1 差异为 0.0001。| 模态对 | 本次重训 R@1 | 发布 R@1 | 绝对差异 | 复现检查 |
|---|---|---|---|---|
| H&E ↔ mIF(ORION) | 0.7608 | 0.7834 | 0.0226 | 通过 |
| H&E ↔ RNA(HEST) | 0.1853 | 0.1917 | 0.0064 | 通过 |
| H&E ↔ 文本(TCGA) | 0.3240 | 0.3203 | 0.0037 | 通过 |
| mIF ↔ RNA(虚拟,ORION) | 0.1358 | 0.1352 | 0.0006 | 通过 |
| mIF ↔ 文本(合成,ORION) | 0.0978 | 0.0987 | 0.0009 | 通过 |
| 文本 ↔ RNA(虚拟,TCGA) | 0.0999 | 0.1000 | 0.0001 | 通过 |
| 文本 ↔ mIF(MIPHEI,TCGA) | 0.0484 | 0.0491 | 0.0007 | 通过 |
ens-es 规则| 模态对 | 本次 5 折 R@1 | 发布 R@1 | 绝对差异 | 复现检查 |
|---|---|---|---|---|
| H&E ↔ mIF(ORION) | 0.7967 | 0.8010 | 0.0042 | 通过 |
| H&E ↔ RNA(HEST) | 0.2021 | 0.2030 | 0.0009 | 通过 |
| H&E ↔ 文本(TCGA) | 0.3231 | 0.3232 | 0.0001 | 通过 |
| mIF ↔ RNA(虚拟,ORION) | 0.1414 | 0.1414 | 0.0000 | 通过 |
| mIF ↔ 文本(合成,ORION) | 0.0885 | 0.0887 | 0.0001 | 通过 |
| 文本 ↔ RNA(虚拟,TCGA) | 0.0966 | 0.0953 | 0.0013 | 通过 |
| 文本 ↔ mIF(MIPHEI,TCGA) | 0.0464 | 0.0465 | 0.0001 | 通过 |
所有 fold-0 和 5 折对比均落在发布代码预定义的容差内。最终还生成并独立加载验证了 models/repro_fold0/model.pt、models/repro_release/model.pt 和三张 final_cv_*_repro.csv。本次执行的是特征级复现;没有执行可选的 RAW=1 原始输入编码器检查。
| 模态 | 最终使用 | 依据(5 折配对检验) |
|---|---|---|
| H&E | UNI2-h + MedVTok(只进适配器) | UNI2 在所有训练配对上不被显著超过;MedVTok 额外输入 mIF +0.015、文本 +0.016 |
| mIF | VirTues(16 标记)+ MLP 头 | 从头训练的 ConvNeXt-T 在 H&E↔mIF 上高 0.03,但 VirTues 的跨模态迁移好得多(mIF↔markers 0.66 对 0.48),且不绑定固定标记面板 |
| RNA | hvg + 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 虚拟 RNA | HEST H&E↔RNA 0.148 → 0.126;STPath 未见过的样本 0.086 → 0.080 | 可用 |
| GPT 合成描述 | TCGA H&E↔文本 0.219 → 0.162(约 0.75 倍) | 可用,偏保守 |
| MIPHEI 虚拟 mIF | ORION 未见过的测试图块:配对准确率 0.92 → 0.55(约 0.6 倍) | 可用 |
| GigaTIME 虚拟 mIF | ORION H&E↔mIF 0.644 → 0.038 | 不可用,已弃用 |
zscore="self"(外部测试就是这样做的)。运行环境:.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_*.csv | 5 折 × 3 种子的选择规则实验 |
RESULTS.md | 全部实验的完整记录(01_–53_) |