【论文复现】CoFailMed:从零复现医学图像分割的共享失败审计,含完整代码流程与科研绘图
论文:Different Models, Shared Failures: Auditing Frozen-Encoder Pools for Medical Segmentation 。本文依据随附的 47 页论文及
CoFailMed-main.zip编写,论文首页标注为 NeurIPS 2026 Evaluations and Datasets Track,arXiv:2610.41790v1,2026-10-30。本文提供两条可衔接的路线:① 使用作者公开的逐样本 Dice,CPU 重算论文统计;② 获取原始数据和预训练权重,从特征提取、训练到推理、审计和出图。随文科研统计图来自公开数据的重新计算;最后的定性案例图是明确标注来源的原论文图。本次交付未下载原始医学影像、未执行 GPU 训练,也未生成新的临床图像预测结果。
关键词: 医学图像分割、模型多样性、共享失败、冻结编码器、DINOv2、模型池、有效规模、可复现科研。
文章目录
- 【论文复现】CoFailMed:从零复现医学图像分割的共享失败审计,含完整代码流程与科研绘图
-
- 一、这篇论文到底研究什么?
- 二、先分清三种"复现完成"
-
- [2.1 统计复现:无需 GPU,最先完成](#2.1 统计复现:无需 GPU,最先完成)
- [2.2 训练复现:需要原始数据、权重与计算资源](#2.2 训练复现:需要原始数据、权重与计算资源)
- [2.3 图像级复现:需要真实影像、GT 与预测](#2.3 图像级复现:需要真实影像、GT 与预测)
- 三、代码结构与推荐阅读顺序
- [四、路线A:从零完成 CPU 统计复现](#四、路线A:从零完成 CPU 统计复现)
-
- [4.1 创建独立环境](#4.1 创建独立环境)
- [4.2 理解官方核心命令](#4.2 理解官方核心命令)
- [4.3 成功后先看什么?](#4.3 成功后先看什么?)
- 五、把论文的统计口径讲清楚
-
- [5.1 逐病例 Dice,而不是只保留平均 Dice](#5.1 逐病例 Dice,而不是只保留平均 Dice)
- [5.2 质量过滤按 bundle 执行](#5.2 质量过滤按 bundle 执行)
- [5.3 连续 Dice 相关性与 Δ](#5.3 连续 Dice 相关性与 Δ)
- [5.4 失败阈值与有效规模](#5.4 失败阈值与有效规模)
- [5.5 置信区间不能随意换重采样单位](#5.5 置信区间不能随意换重采样单位)
- [5.6 模型池选择使用另一条 P33 规则](#5.6 模型池选择使用另一条 P33 规则)
- 六、路线B:准备原始数据与训练环境
-
- [6.1 为训练另建环境](#6.1 为训练另建环境)
- [6.2 下载入口与目录](#6.2 下载入口与目录)
- [6.3 主任务的目标与划分](#6.3 主任务的目标与划分)
- [6.4 预处理必须沿用代码](#6.4 预处理必须沿用代码)
- [七、从一个 cell 跑通,到完整220个分割头](#七、从一个 cell 跑通,到完整220个分割头)
-
- [7.1 第一步:生成输入清单](#7.1 第一步:生成输入清单)
- [7.2 第二步:特征缓存+4个种子训练](#7.2 第二步:特征缓存+4个种子训练)
- [7.3 第三步:检查输出,不要盲目重启](#7.3 第三步:检查输出,不要盲目重启)
- [7.4 第四步:使用随文调度器跑完整网格](#7.4 第四步:使用随文调度器跑完整网格)
- 八、对自己训练出的结果进行审计
-
- [8.1 汇总完整主实验的220个trace](#8.1 汇总完整主实验的220个trace)
- [8.2 跑 trace 版相关性与P33统计](#8.2 跑 trace 版相关性与P33统计)
- [8.3 对自己结果运行模型池选择](#8.3 对自己结果运行模型池选择)
- 九、从主实验扩展到论文对照与附录
-
- [9.1 所有公开扩展统计:优先直接重算](#9.1 所有公开扩展统计:优先直接重算)
- [9.2 17编码器层级实验与held-out任务](#9.2 17编码器层级实验与held-out任务)
- [9.3 UNet-skip readout](#9.3 UNet-skip readout)
- [9.4 全参数微调与随机初始化](#9.4 全参数微调与随机初始化)
- [9.5 nnU-Net:必须使用case-identical holdout](#9.5 nnU-Net:必须使用case-identical holdout)
- [9.6 医疗编码器、逐rater和AMOS](#9.6 医疗编码器、逐rater和AMOS)
- 十、科研图如何制作与核验?
-
- [10.1 本文提供哪些图?](#10.1 本文提供哪些图?)
- [10.2 原论文定性图如何使用?](#10.2 原论文定性图如何使用?)
- [10.3 层级与训练控制的补充科研图](#10.3 层级与训练控制的补充科研图)
- [10.4 训练后绘制自己的真实分割图](#10.4 训练后绘制自己的真实分割图)
- 十一、常见报错与数值对不上的原因
-
- [11.1 `No module named fmpool` 或 `analysis`](#11.1
No module named fmpool或analysis) - [11.2 `FMPOOL_DINOV2_REVISION must pin ...`](#11.2
FMPOOL_DINOV2_REVISION must pin ...) - [11.3 manifest/cache/encoder哈希不一致](#11.3 manifest/cache/encoder哈希不一致)
- [11.4 为什么运行完整网格前就提示目录存在?](#11.4 为什么运行完整网格前就提示目录存在?)
- [11.5 OOM或缓存太大](#11.5 OOM或缓存太大)
- [11.6 数值小幅漂移](#11.6 数值小幅漂移)
- [11.7 有效规模不等于论文值](#11.7 有效规模不等于论文值)
- [11.8 图像导入CSDN后不显示](#11.8 图像导入CSDN后不显示)
- [11.1 `No module named fmpool` 或 `analysis`](#11.1
- 十二、复现验收与可直接使用的结论
- 参考资料与引用
一、这篇论文到底研究什么?
假设我们给同一张医学影像使用 4 个模型。模型名字各不相同,并不意味着它们能够相互弥补错误:它们可能恰好在同一批困难病例上同时失效。
CoFailMed 关注的就是这种共享失败。它不是提出一个新的分割网络,也不是证明某个集成方案一定提高 Dice,而是建立一套审计流程,检查:
- 共享同一预训练权重的不同分割头,是否在相同病例上表现相似?
- 同一家族不同 checkpoint,与跨家族模型相比是否仍有更强依赖?
- 名义上包含 4 个成员的模型池,在失败依赖下,相当于多少个独立成员?
- 微调使"组间相关性差距"变小,是否意味着失败依赖真的减弱?
主实验包含 11 个编码器 × 5 个任务 × 4 个分割头种子 = 220 个训练头。按"任务+编码器"计算,共 55 个 cell;每个 cell 只提取一次冻结特征,供 4 个种子复用。

图1:依据论文第3~4节和实际训练代码重绘的方法流程。每个统计结论都建立在病例顺序严格对齐的逐样本评分上。
二、先分清三种"复现完成"
2.1 统计复现:无需 GPU,最先完成
输入是作者发布的 data/*.npz 和元数据,输出包括相关性、置信区间、有效模型池规模、选择频率、消融与扩展实验统计。它复现的是已发布预测评分的计算结果。
这条路线无需下载原图或模型权重,适合先验证环境、理解指标,再决定是否投入训练。
2.2 训练复现:需要原始数据、权重与计算资源
输入是上游数据集、固定划分和模型权重;输出是特征缓存、分割头 checkpoint、逐样本 Dice 及运行记录。之后再对自己产生的结果运行统计。
主实验使用 Python 3.10 / CUDA 12.4 / PyTorch 2.6.0。原论文记载训练使用共享集群的 7 张 A100-SXM4-80GB;这不是最低硬件要求,也不能直接换算成个人显卡运行时间。本文不承诺某张显卡的显存或耗时。
2.3 图像级复现:需要真实影像、GT 与预测
仅有 Dice 不能还原分割掩码,因此不能凭评分包"生成自己的分割可视化"。像素错误重叠的统计值 可以使用发布的 pixel_overlap.npz 重算;新的空间错误示例必须在真实预测产生后绘制。
另外,公开包未包含 Phikon 输出,论文中依赖 Phikon 的完整医疗编码器池结果无法仅凭该压缩包精确重算。不要把缺少 Phikon 的子集当作论文完整医疗模型池。
三、代码结构与推荐阅读顺序
解压随文复现包后,目录关系如下:
text
CoFailMed复现/
├── CoFailMed-main/ # 用户提供的原始代码,保持不变
│ ├── README.md
│ ├── REPRODUCING.md # 论文结果与命令的对应关系
│ ├── scores.py # 评分加载、病例对齐、质量过滤
│ ├── correlation.py
│ ├── effective_size.py
│ ├── pool_selection.py
│ ├── sensitivity.py
│ ├── diagnostics.py
│ ├── extensions.py
│ ├── data/ # 已发布评分,不含原始影像
│ ├── reference_results/ # 作者参考CSV,只用于核验
│ └── code/
│ ├── configs/encoder_sources.json
│ ├── data/splits/ # 论文固定划分
│ ├── src/fmpool/ # 数据加载、编码器、解码头
│ ├── scripts/ # 训练、推理、统计入口
│ └── stats/analysis/
└── 交付/
├── CSDN_CoFailMed从零复现.md
├── README_使用说明.md
├── requirements-figures.txt
├── scripts/ # 本文新增的执行与绘图工具
├── results/ # 本次真实计算的CSV与核验记录
└── figures/ # PNG/SVG图片与来源清单
建议先读根目录 README.md 与 REPRODUCING.md,再读 code/README.md,最后按具体阶段定位代码。不要直接运行 table_generation/ 期待生成整篇论文;这些生成器依赖原研究工作区的结果树,且作者说明部分终稿排版经过手工调整。
四、路线A:从零完成 CPU 统计复现
4.1 创建独立环境
统计脚本支持 Python 3.10~3.12。以下以已安装 Python 3.12 为例,进入解压后的 交付 目录。
Windows PowerShell:
powershell
py -3.12 -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements-figures.txt
.\.venv\Scripts\python.exe scripts/reproduce_cpu.py --repo ../CoFailMed-main --full
.\.venv\Scripts\python.exe scripts/plot_figures.py --repo ../CoFailMed-main
Linux / WSL:
bash
python3.12 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements-figures.txt
python scripts/reproduce_cpu.py --repo ../CoFailMed-main --full
python scripts/plot_figures.py --repo ../CoFailMed-main
requirements-figures.txt 固定 NumPy 1.26.4、SciPy 1.15.3 和 Matplotlib 3.10.8。前两个版本来自原仓库的统计环境;Matplotlib 是本文绘图所需的新增依赖。
reproduce_cpu.py 会依次做四件事:
- 检查原仓库
MANIFEST.sha256中的公开评分、元数据与参考文件; - 执行作者的
unittest; - 调用官方脚本重算结果;
- 将生成的 CSV 与作者参考 CSV 对比,写入
results/verification.json。
参考 CSV 只用于最后对比,不会充当统计计算的输入 。不带 --full 时只执行 7 组核心统计;--full 增加扩展与附录,共 27 组分析命令。
脚本按命令和文件哈希保存完成记录。重复调用会跳过内容未变的已完成输出,避免重新计算;只有明确需要重算时才使用 --force。
4.2 理解官方核心命令
如果不使用本文的封装脚本,可以在 CoFailMed-main 根目录手动执行:
bash
mkdir -p results
# 主实验、checkpoint层级、ViT对照、训练对照的点估计
python correlation.py --analysis all --output results/correlations.csv
# 论文Table 2:主置信区间+层次重采样敏感性
python correlation.py --analysis primary --bootstrap 2000 --hierarchical \
--output results/primary_intervals.csv
# 单独重算case-bootstrap敏感性,尤其用于比较ACDC/BraTS
python correlation.py --analysis primary --bootstrap 2000 --unit case \
--output results/primary_case_intervals.csv
# 论文主口径:各训练配方自己的pooled P33
OPENBLAS_NUM_THREADS=1 OMP_NUM_THREADS=1 \
python effective_size.py --bootstrap 2000 --output results/effective_size.csv
# 固定阈值0.85是另一项敏感性分析
python effective_size.py --analysis fixed --output results/fixed_threshold.csv
python pool_selection.py --output results/pool_selection.csv
python sensitivity.py --analysis all --output results/sensitivity.csv
这里的环境变量前缀是 Bash 写法。PowerShell 需要先分别设置:
powershell
$env:OPENBLAS_NUM_THREADS = '1'
$env:OMP_NUM_THREADS = '1'
python effective_size.py --bootstrap 2000 --output results/effective_size.csv
4.3 成功后先看什么?
首先确认 results/logs/tests.log 以 OK 结束;然后查看 verification.json 中各个 job 的 errors 是否为空。
本次发现原仓库的一个清单测试在Windows上直接比较 / 与 \ 路径字符串而失败。附加入口 scripts/run_tests.py 只在Windows内存中将该测试的相对路径输出改为 as_posix(),保留完整文件列表与SHA核验,不改原文件、不跳过测试。原始失败记录保存在 results/logs/tests_original_windows.log。
主实验预期的"相关性差距 Δ / 四成员有效规模"分别是:
- Kvasir:0.265 / 1.559;
- ACDC LV:0.317 / 1.645;
- BraTS foreground:0.340 / 1.828;
- RIGA Cup:0.557 / 2.420;
- RIGA Disc:0.640 / 2.918。
这组值对应论文 Table 2 与 Table E.1(b),不能把 Δ 当作 Dice 提升,也不能把有效规模当作实际训练了多少个模型。
五、把论文的统计口径讲清楚
5.1 逐病例 Dice,而不是只保留平均 Dice
二值预测集合为 P P P,真实前景为 G G G:
Dice ( P , G ) = 2 ∣ P ∩ G ∣ ∣ P ∣ + ∣ G ∣ . \operatorname{Dice}(P,G)=\frac{2|P\cap G|}{|P|+|G|}. Dice(P,G)=∣P∣+∣G∣2∣P∩G∣.
预测由 sigmoid(logit) > 0.5 得到,使用最后一轮权重,Dice 不加平滑项。当预测和 GT 同时为空时记为 1;只有一方为空时记为 0。
每一个模型头都必须在同一批病例、同一顺序上产生一个向量:
d i = ( d i 1 , ... , d i N ) . \mathbf d_i=(d_{i1},\ldots,d_{iN}). di=(di1,...,diN).
把所有模型的这些向量叠起来,才是后续审计需要的 [成员数, 病例数] 矩阵。相同长度并不代表病例已经对齐,必须检查 test_ids / case_ids。
5.2 质量过滤按 bundle 执行
bundle 指"checkpoint+封装器+归一化+特征提取路径"。先对同一个 bundle 的 4 个头和全部病例取平均 Dice,均值不低于 0.30 才保留该 bundle 的全部 4 个头。
它不是逐病例删除低分,也不是仅保留 4 个头里分数最高的那个。主实验过滤后,Kvasir 和两个 RIGA 任务保留 11 个 bundle;ACDC 和 BraTS 保留 10 个,删除的都是 ResNet-18。
5.3 连续 Dice 相关性与 Δ
对两个模型头的逐病例 Dice 计算 Pearson 相关性,再在指定模型对分组内求均值:
Δ = r ‾ s a m e / r e l e a s e − r ‾ c r o s s . \Delta=\overline r_{\mathrm{same/release}}-\overline r_{\mathrm{cross}}. Δ=rsame/release−rcross.
主分组 same/release 包含:① 同一 bundle 的不同 seed;② DINOv2-B 与 DINOv2-S,因为它们属于同一发布及配方。其余模型对进入 cross-bundle。
因此,主实验的 cross-bundle 不能直接替换成"跨家族"。17 编码器的层级实验又将"共享 checkpoint""同家族不同 checkpoint""跨家族"分开,参考组与主实验不同。

图2:由公开逐病例 Dice 重算。每个编码器对应连续4个种子;灰色表示未通过0.30质量过滤。顺序与文字标签在绘图脚本中固定。图中块结构说明相关性,但不能仅凭热图判断因果来源。

图3:左侧同时展示两组的绝对相关性;右侧给出Δ与主95%区间。ACDC/BraTS按患者重采样,其余按图像重采样,B=2000。
5.4 失败阈值与有效规模
对于一个任务,先在过滤后保留的全部"模型头×病例"Dice 上计算33百分位阈值 τ \tau τ,再定义:
F i n = 1 d i n \< τ . F_{in}=\mathbb 1d_{in}\<\\tau. Fin=1din\<τ.
同一个任务/配方下,共用一个 pooled P33;不是每个模型分别算自己的 P33,也不是固定用 Dice=0.85。
设模型池有 M M M 个成员,失败指示变量的平均两两相关性为 ρ ‾ f a i l \overline\rho_{\mathrm{fail}} ρfail:
M e f f = M 1 + ( M − 1 ) ρ ‾ f a i l . M_{\mathrm{eff}}=\frac{M}{1+(M-1)\overline\rho_{\mathrm{fail}}}. Meff=1+(M−1)ρfailM.
主实验枚举的是 4 个不同 bundle、每个 bundle 选一个头 的池。保留11个bundle时共有 ( 11 4 ) 4 4 = 84480 \binom{11}{4}4^4=84480 (411)44=84480 个候选池;保留10个时为53760个。
每个池内的每个成员至少需要5次失败和5次通过;还要检查分母有效性。RIGA Disc 并非所有候选池都符合支持条件,必须报告支持数,不能把不支持的池填成零。
计算顺序尤其关键:先逐池计算 M e f f M_{\mathrm{eff}} Meff,再对有效池求平均。把全体池的平均相关性代入公式,会因非线性而得到不同的量。论文另提供 exact-covariance 统计,本文主图使用主报告的 equicorrelation 统计。

图4:阈值和bundle集合在bootstrap中固定,重采样时重新检查支持条件。有效规模是特定阈值下的方差等价摘要,不是临床安全保证,也不是实际模型数。
5.5 置信区间不能随意换重采样单位
ACDC/BraTS 的多个切片来自同一个患者。主置信区间抽的是患者,并将该患者所有切片一起带入;将切片当成独立样本通常会得到更窄的区间。
Table 2 主Δ区间使用随机种子0、2000次重采样。--unit case 是独立报告的敏感性分析。--hierarchical 得到的层次重采样分位数描述观察到的模型面板,不能当作对未来所有模型家族的总体置信区间。
5.6 模型池选择使用另一条 P33 规则
对每个任务进行200次50%/50%的校准/评估划分;ACDC/BraTS按患者划分,其他任务按图像或已规定的单位划分。
仅在校准部分:按0.30均值门槛筛bundle,选出每个encoder family最好的单个头,再选排名最高的4个家族代表。ACDC/BraTS的排序均值按患者等权重。
此时阈值是校准部分最优功能头的逐病例Dice P33,不是全模型pooled P33,也不是患者均值的P33。选好模型和阈值后固定到评估集,不能再看评估结果重选。

图5:7个任务,每个200次划分。横线为逐任务exact binomial区间;U表示不支持的划分。它们保留在总分母中,但不计为低有效规模。
论文合计为 910/1400=65.0% 。其中61次不支持;只看支持划分为 910/1339≈68.0%。不能只写"约65%的模型无效",也不能把这些固定队列上的重复划分当作1400个独立临床实验。
六、路线B:准备原始数据与训练环境
6.1 为训练另建环境
以下训练命令以 Linux / WSL Bash 为准,在 CoFailMed-main 根目录执行。路径中的 /data/cofailmed_raw 是你实际存放数据的位置,需要修改。
bash
conda create -n cofailmed-train python=3.10 -y
conda activate cofailmed-train
python -m pip install -r code/requirements-training.txt
python -m pip install -r code/requirements-pinned.txt
export PYTHONPATH="$PWD/code/src:$PWD/code/stats:$PWD/code/scripts"
export FMPOOL_DATA_ROOT=/data/cofailmed_raw
export CUBLAS_WORKSPACE_CONFIG=:4096:8
export FMPOOL_DINOV2_REVISION=7764ea0f912e53c92e82eb78a2a1631e92725fc8
python -c 'import torch, torchvision; print(torch.__version__, torchvision.__version__, torch.version.cuda, torch.cuda.is_available())'
python -m pip freeze > environment-training.txt
nvidia-smi > gpu-environment.txt
固定文件记录的是直接依赖,并不是完整的传递依赖锁文件。论文匹配目标是 torch 2.6.0、torchvision 0.21.0、CUDA 12.4;版本号正确还不够,必须确认安装的确实是所需CUDA构建 。若 torch.cuda.is_available() 为 False,先检查驱动与安装构建,不要直接启动55个cell。
不要混用 AMOS 的依赖环境;它的要求中 torch 等版本与主训练不同。Windows 可用本文 Python 调度器做路径适配;nnU-Net 和 Bash worker 更适合在 Linux / WSL 环境执行。本文没有将GPU训练标记为本地测试通过。
6.2 下载入口与目录
数据访问按上游要求申请和下载;本文不提供绕过注册的数据镜像。以下入口来自随附仓库 data/README.md:
- Kvasir-SEG:Simula。
- ACDC:官方挑战数据。
- BraTS 2024 GLI:Synapse。
- RIGA+:Zenodo 6325549。
- ISIC-2018:官方挑战数据。
- MSD:Medical Segmentation Decathlon。
整理成:
text
/data/cofailmed_raw/
├── Kvasir-SEG/
│ ├── images/<id>.jpg
│ └── masks/<id>.jpg
├── ACDC/
│ ├── Images/patientNNN_frameYY.nii.gz
│ └── Masks/patientNNN_frameYY_gt.nii.gz
├── brats2024_gli/
│ ├── training/training_data1_v2/<subject>/<subject>-t2f.nii.gz
│ └── additional/training_data_additional/<subject>/...
├── RIGA/RIGAPlus/
│ ├── *_train.csv、*_test.csv
│ ├── RIGA/<source>/<subdir>/imageN.tif
│ └── RIGA-mask/<source>/<subdir>/imageN-1.tif ... imageN-6.tif
├── ISIC2018_official/
├── Task04_Hippocampus/
├── Task09_Spleen/
└── Task02_Heart/
BraTS 需要完整数据文件,示例树只展示FLAIR文件路径。不要只下载示例文件后认为已满足loader检查。
6.3 主任务的目标与划分
Kvasir: 息肉二值分割,官方880/120划分,官方validation在本文用作测试。测试120张图。主实验保持默认划分;仅在内容分组敏感性实验设置 FMPOOL_KVASIR_SPLIT=grouped_v2。
ACDC LV: 标签3为左心室,使用ED/ES中LV阳性切片。官方训练患者001~100,测试患者101~150;测试为50名患者的977张切片。需要把原官方training/testing中的影像和标签整理为上面的扁平目录。
BraTS FG: 使用2D FLAIR,标签是 seg > 0,包括术腔等所有已标注前景,不能套用传统WT标签定义。按患者80/20划分,同一患者各session不跨集合;每个session最多取10张合格的高前景切片。测试3365张切片、146名患者、339个session。不要重新随机划分替代提交的JSON。
RIGA Cup / Disc: 每图6名标注者;cup取值128、disc取值≥128,至少4名标注者一致才记前景。训练为BinRushed+MESSIDOR,测试为Magrabia,两个任务各95张测试图。不要把多数投票阈值改为3,也不要直接拿单一rater当GT。
6.4 预处理必须沿用代码
ACDC/BraTS 按 NiBabel 读出的原生第三轴切片,不先做affine重定向、裁剪、补边或强度窗处理。单切片对包括背景在内的全部像素做min--max,缩放到0,255并截断成uint8,常数切片置零,再复制为3通道。
所有输入统一224×224:图像bilinear、align_corners=False、不做antialiasing;主掩码使用nearest。Kvasir/ISIC在特征提取阶段直接用float32缩放,不加入额外uint8往返;RIGA/ACDC/BraTS/MSD由loader缩放并保存uint8。
最后使用各编码器自己的归一化,不能把所有模型一律改成ImageNet归一化。nearest-exact 属于单独的掩码对齐敏感性,不要默默替换主流程。
七、从一个 cell 跑通,到完整220个分割头
7.1 第一步:生成输入清单
以 RIGA Cup+DINOv2-B 为例,在仓库根目录执行:
bash
mkdir -p inputs/riga_cup
python code/scripts/make_input_manifest.py \
--task riga_cup --fm dinov2_vitb14 \
--repository facebookresearch/dinov2 \
--revision 7764ea0f912e53c92e82eb78a2a1631e92725fc8 \
--out inputs/riga_cup/dinov2_vitb14.json
这个JSON记录原始文件、split文件及编码器FP32状态哈希。脚本会加载权重,因此这一步也需要网络或可用的本地权重缓存。
code/configs/encoder_sources.json 给出了11个主编码器的来源、记录的revision和 fp32_state_sha256。DINOv2按固定commit加载;其他部分loader仍从hub当前文件加载,所以写入一个revision字符串不代表下载过程已经固定 。必须将实际加载的 state_sha256 与参考哈希对比。本文 train_grid.py 在训练前会执行这个比较,不一致就停止。
7.2 第二步:特征缓存+4个种子训练
bash
export FMPOOL_CACHE_ROOT="$PWD/cache_primary"
bash code/scripts/run_frozen_cell.sh \
riga_cup dinov2_vitb14 \
inputs/riga_cup/dinov2_vitb14.json \
runs_primary/riga_cup__dinov2_vitb14
该脚本会先提取特征,再按42、43、44、45依次训练头。输出路径:
text
cache_primary/riga_cup/dinov2_vitb14/
├── manifest.json
├── train.pt
└── test.pt
runs_primary/riga_cup__dinov2_vitb14/
├── status
├── launch.txt
├── extract.log
├── seed_42.log ... seed_45.log
├── checkpoints/riga_cup/dinov2_vitb14/seed_42.pt ...
└── per_case_dice/riga_cup/dinov2_vitb14/seed_42.json ...
训练配置必须保持:FP32;关闭TF32和AMP;Adam学习率1e-3;BCEWithLogitsLoss;30轮;batch=16;最后一轮评估。不要按测试Dice选best checkpoint,不要额外加入增强、余弦调度、Dice loss或weight decay。
train_head_cached.py 中的核心操作是:
python
head = LinearSegHead(in_dim, num_classes=1, out_size=(224, 224))
optimizer = torch.optim.Adam(head.parameters(), lr=1e-3)
criterion = torch.nn.BCEWithLogitsLoss()
# 这里只展示核心逻辑;实际运行必须调用官方trainer以保留确定性与溯源检查。
logits = head(frozen_features.float())
loss = criterion(logits, masks.float().unsqueeze(1))
LinearSegHead 本体只有1×1卷积与bilinear上采样。主流程不是UNet decoder;UNet-skip属于另一个对照。
7.3 第三步:检查输出,不要盲目重启
确认cell的 status 为 completed,4个seed各有JSON与checkpoint;日志无NaN/Inf错误。逐样本JSON包含 task、fm、seed、test_ids、per_case_dice、运行身份、缓存哈希和头权重哈希。
原脚本拒绝覆盖现有运行目录。这是保留实验记录的机制;如果中断,先看已有日志和产物,再选择新的运行目录,不要简单删除全部缓存重跑。
缓存近似占用可按 N × C × h × w × 4 N\times C\times h\times w\times4 N×C×h×w×4 字节估算。例如DINOv2-B的16×16×768 FP32特征,每1000张约750 MiB,仅计算特征,不含mask、序列化和其他模型。先检查RAM和磁盘,再扩展到完整网格。
7.4 第四步:使用随文调度器跑完整网格
进入 交付 目录,并继续使用训练环境:
bash
# 先跑1个cell,确认目录、下载与显存均正常
python scripts/train_grid.py \
--repo ../CoFailMed-main \
--data-root /data/cofailmed_raw \
--work /data/cofailmed_run01 \
--tasks riga_cup --encoders dinov2_vitb14
# 已验证的完成cell会跳过;继续补齐完整55个cell
python scripts/train_grid.py \
--repo ../CoFailMed-main \
--data-root /data/cofailmed_raw \
--work /data/cofailmed_run01
调度器按cell顺序运行,不会自动占用所有GPU。它调用官方manifest、特征提取和cached trainer,固定论文主配方;完成记录绑定输入来源及输出文件哈希。
如果出现中断的部分cell,脚本保留现场并停止,要求先检查。它不把部分产物当作成功,也不假装支持恢复某一轮optimizer状态。确需重试时,用新的工作目录或人工归档失败cell;如果复用特征缓存,仍由官方缓存验证检查是否匹配。
只想CPU测试训练入口时可加 --device cpu --num-workers 0;这与第4节的纯统计复现不同,仍然需要原始数据和权重,也不承诺训练速度。
八、对自己训练出的结果进行审计
8.1 汇总完整主实验的220个trace
在 交付 目录执行:
bash
python scripts/merge_traces.py \
--cells /data/cofailmed_run01/cells \
--out /data/cofailmed_analysis01
它检查55个完成cell、4个种子、任务与编码器身份、分数范围,以及每个任务的测试ID顺序,之后复制到:
text
/data/cofailmed_analysis01/per_case_dice/<task>/<fm>/seed_<S>.json
这一步是复制,不移动或改写原运行产物。只有一个cell时尚不足以得到论文的完整跨编码器统计,不要用缺失网格计算"论文主结果"。
8.2 跑 trace 版相关性与P33统计
回到 CoFailMed-main 根目录,设置好 PYTHONPATH:
bash
export PYTHONPATH="$PWD/code/src:$PWD/code/stats:$PWD/code/scripts"
# 写within_cross/、m_eff/等;其中m_eff默认固定阈值0.85
python code/scripts/compute_all.py \
--results-root /data/cofailmed_analysis01
# 主P33结果必须额外运行这个模块
python -m analysis.effective_size \
--traces-root /data/cofailmed_analysis01 \
--stats-root /data/cofailmed_analysis01 \
--output-dir /data/cofailmed_analysis01/p33_audit \
--bootstrap-b 2000
这里显式设置 --stats-root,因为上一条命令默认把 m_eff/ 写到results-root,而P33模块默认会到另一个 stats/ 子目录查找。照抄路径但忽略这个默认值,会出现"已经生成却找不到结果"的问题。
主输出包括 p33_audit/metrics.json、effective_size_table.md 和运行记录。训练trace版与根目录NPZ版的输入接口不同,不能把新训练的JSON直接传给 correlation.py --data-dir;后者需要发布评分包的schema。
8.3 对自己结果运行模型池选择
只有5个主任务时,要明确限制任务:
bash
python -m analysis.pool_selection \
--results-root /data/cofailmed_analysis01 \
--tasks kvasir acdc_lv brats_wt riga_cup riga_disc \
--split-count 200 \
--output /data/cofailmed_analysis01/selection_primary.json \
--table /data/cofailmed_analysis01/selection_primary.md
python -m analysis.pool_low_meff \
--selection /data/cofailmed_analysis01/selection_primary.json \
--results-root /data/cofailmed_analysis01 \
--output /data/cofailmed_analysis01/selection_low_primary.json
该结果是5任务受限范围,不能写成7任务的910/1400复现。完整7任务还需训练ISIC-2018、MSD Hippocampus的11编码器×4头,并按 code/README.md 要求放到 per_case_dice_heldout_11fm/,再去掉 --tasks 限制。
九、从主实验扩展到论文对照与附录
9.1 所有公开扩展统计:优先直接重算
随文 --full 已覆盖公开标量结果。手动命令如下,均从仓库根目录执行:
bash
python control_comparisons.py --analysis all --bootstrap 2000 \
--output results/control_comparisons.csv
python correlation.py --analysis controls --bootstrap 2000 \
--output results/control_intervals.csv
for a in mask_align per_rater kvasir_grouped medical_encoders amos heldout pixel_overlap; do
python extensions.py --analysis "$a" --bootstrap 2000 --output "results/$a.csv"
done
for a in bundle_dice failure_metrics failure_intervals calibration item_difficulty \
tau_sweep vit_diagnostic checkpoints unet_nine pipeline_metrics hierarchy; do
python diagnostics.py --analysis "$a" --intervals --output "results/$a.csv"
done
主Table 2对应 primary_intervals.csv,Figure 3层级对应 correlations.csv 的 expanded17/ 行,Figure 5训练对照对应 control_intervals.csv,Figure 6对应 effective_size.csv 与 pool_selection.csv。像素重叠对应 pixel_overlap.csv,AMOS对应 amos.csv。更细的表格映射以原仓库 REPRODUCING.md 为准。
9.2 17编码器层级实验与held-out任务
额外6个编码器为 resnet34 resnet101 convnext_small convnext_base dinov2_vitl14 clip_vitb32,与主11个构成17编码器面板。它们可调用相同的manifest、特征提取和训练入口;DINOv2-L沿用相同固定hub commit。
原包的 encoder_sources.json 不包含这6项的完整来源哈希。其他新增checkpoint按论文Table B.1和实际loader获取后,需要记录实际的仓库revision和FP32状态哈希。不要为填齐配置而编造revision,也不要把当前hub下载当成原研究权重已经逐字节一致。
held-out任务为 isic2018 msd_hippocampus msd_spleen msd_heart。ISIC使用官方2594/1000训练/测试划分;MSD使用提交的volume级split JSON,不自行重抽。ISIC在本研究中按图像评估,已知患者ID存在跨划分重叠,不能描述为严格患者独立测试。
9.3 UNet-skip readout
需要另建multiscale输入清单,不能复用单尺度manifest。例如:
bash
python code/scripts/make_input_manifest.py \
--task riga_cup --fm dinov2_vitb14 \
--repository facebookresearch/dinov2 \
--revision 7764ea0f912e53c92e82eb78a2a1631e92725fc8 \
--multiscale --out inputs/riga_cup/dinov2_vitb14_multiscale.json
for seed in 42 43 44 45; do
python code/scripts/train_head_unet_skip.py \
--task riga_cup --fm dinov2_vitb14 --seed "$seed" \
--input-manifest inputs/riga_cup/dinov2_vitb14_multiscale.json \
--out runs/unet/per_case_dice \
--checkpoint-dir runs/unet/checkpoints/riga_cup/dinov2_vitb14 \
--epochs 30 --batch-size 16
done
其余编码器使用对应multiscale manifest。比较时还要区分11-bundle和9-bundle汇总口径,参照 unet_nine.csv 以及论文附录G.1,不混用不同集合。
9.4 全参数微调与随机初始化
bash
for lr in 1e-4 1e-5; do
for seed in 42 43 44 45; do
python code/scripts/train_adapted.py \
--regime full_ft --encoder-lr "$lr" \
--task riga_cup --fm dinov2_vitb14 --seed "$seed" \
--input-manifest inputs/riga_cup/dinov2_vitb14.json \
--epochs 30 --batch-size 16 --out "runs/ft/lr$lr"
done
done
这是一个编码器示例;论文对RIGA Cup和Kvasir使用同样11个主编码器,两个encoder学习率,头学习率仍为1e-3。官方split Kvasir应使用 runs/ft/kvasir_official/lr<ARM>;内容分组敏感性需要显式设置 FMPOOL_KVASIR_SPLIT=grouped_v2 并另存结果。
随机初始化控制使用 --regime rand_init,仅对 convnext_tiny resnet50、acdc_lv riga_cup、seed 42~49运行,不传 --encoder-lr。它不是"11个模型全部从头训练"的对照。

图6:来自真实公开对照评分的重计算。微调使Δ变小,仍可能使跨编码器绝对相关性升高。各配方使用各自P33,因此不同配方的失败事件难度不同,不能解释成同一个固定临床阈值下的失败率比较。
9.5 nnU-Net:必须使用case-identical holdout
先安装:
bash
python -m pip install -r code/requirements-3d-nnunet.txt
export nnUNet_raw="$PWD/nnunet/raw"
export nnUNet_preprocessed="$PWD/nnunet/preprocessed"
export nnUNet_results="$PWD/nnunet/results"
mkdir -p receipts inputs
python code/scripts/install_nnunet_seeded_trainers.py
RIGA Cup完整链路:
bash
python code/scripts/prepare_nnunet_data.py --task riga_cup --dataset-id 501
python code/scripts/prepare_nnunet_data.py --task riga_cup --dataset-id 501 \
--preprocess --preprocessing-evidence receipts/riga_cup.json
python code/scripts/make_nnunet_input_manifest.py --task riga_cup \
--raw-export "$nnUNet_raw/Dataset501_RIGACup" \
--receipt receipts/riga_cup.json \
--canonical-split code/data/splits/riga_cup_split.json \
--input-manifest inputs/nnunet_riga_cup.json
CASE_TASK=riga_cup RIGA_CASE_DATASET_ID=501 \
RIGA_CUP_INPUT_MANIFEST=inputs/nnunet_riga_cup.json \
RIGA_CUP_PREPROCESSING_EVIDENCE=receipts/riga_cup.json \
WORKER_ID=0 N_WORKERS=1 TRAINER_EPOCHS=100 \
bash code/scripts/run_nnunet_case_worker.sh worker
ACDC对应链路为:
bash
python code/scripts/prepare_nnunet_data.py --task acdc_lv --dataset-id 502 \
--split-json code/data/splits/acdc_lv_nnunet_official_split.json
python code/scripts/prepare_nnunet_data.py --task acdc_lv --dataset-id 502 \
--preprocess --preprocessing-evidence receipts/acdc_lv.json
python code/scripts/make_nnunet_input_manifest.py --task acdc_lv \
--raw-export "$nnUNet_raw/Dataset502_ACDCLV" \
--receipt receipts/acdc_lv.json \
--canonical-split code/data/splits/acdc_lv_nnunet_official_split.json \
--input-manifest inputs/nnunet_acdc_lv.json
CASE_TASK=acdc_lv ACDC_CASE_DATASET_ID=502 \
ACDC_LV_INPUT_MANIFEST=inputs/nnunet_acdc_lv.json \
ACDC_LV_PREPROCESSING_EVIDENCE=receipts/acdc_lv.json \
WORKER_ID=0 N_WORKERS=1 TRAINER_EPOCHS=100 \
bash code/scripts/run_nnunet_case_worker.sh worker
RIGA使用2D,ACDC使用3d_fullres;每任务5 folds×seed 13/37,共10个成员。论文报告100轮case-identical配置,不是worker中另有的1000轮 companion。RIGA导出与训练统一用501,避免脚本默认551与已导出501不一致。
所有fold仍评估固定holdout,不能退回fold validation。下面对上述默认输出重算无平滑Dice并汇总:
bash
python code/scripts/rescore_nnunet_primary_dice.py \
--traces-dir results/nnunet/nnunet_case_riga_2d_100ep \
--cells-dir results/nnunet/nnunet_case_riga_2d_100ep \
--labels-dir "$nnUNet_raw/Dataset501_RIGACup/labelsTs" \
--out-dir results/nnunet/riga_primary_traces
python code/scripts/compute_nnunet_case_identical.py \
--input-dir results/nnunet/riga_primary_traces --trainer-epochs 100 \
--out results/nnunet/riga_primary_summary.json
python code/scripts/rescore_nnunet_primary_dice.py \
--traces-dir results/nnunet/nnunet_case_acdc_3d_100ep \
--cells-dir results/nnunet/nnunet_case_acdc_3d_100ep \
--labels-dir "$nnUNet_raw/Dataset502_ACDCLV/labelsTs" \
--out-dir results/nnunet/acdc_primary_traces
python code/scripts/compute_nnunet_case_identical.py \
--input-dir results/nnunet/acdc_primary_traces --trainer-epochs 100 \
--out results/nnunet/acdc_primary_summary.json
如果设置了 NNUNET_OUT_ROOT 或 EXP_NAME,相应修改输入路径。几何尺寸、spacing、origin和direction必须一致。
相关性与平均Dice使用10个成员;有效规模只使用seed=13的5-fold池。不要拿十成员池直接对照论文报告的五成员有效规模。
9.6 医疗编码器、逐rater和AMOS
医疗编码器扩展为 retfound_vitl16 phikon rad_dino biomedparse,任务是RIGA Cup/Disc和Kvasir。按原说明复制一份代码,再用 code/medenc_overlay/encoders.py 替换副本中的encoder实现,设置 FMPOOL_MEDENC_ASSET_ROOT;权重放在 <root>/models/<fm>/,BiomedParse-v1源码放在 <root>/upstream/BiomedParse-v1。它不是可以在原主实验目录无记录地覆盖的通用升级。RAD-DINO仍需固定DINOv2 hub revision。
逐rater实验需真实RIGA的6份mask,对同一批头重新计分,入口为 python -m analysis.rater_sensitivity inference,之后运行 analyze。输出文件不允许覆盖,具体参数见 code/README.md。
AMOS是额外的native-3D比较,不是把五个主任务改成3D训练。使用独立环境 code/requirements-amos-evaluation.txt,MRSegmentator和TotalSegmentator产生真实预测;设置 COFAILMED_AMOS_EVALUATOR 指向MRSegmentator的 evaluation/。依次使用 code/stats/amos/evaluate_masks.py、finalize_organs.py、code/stats/recompute_amos.py。公开评分包已含CT/MRI各60个volume的评分,可先用 extensions.py --analysis amos --bootstrap 2000 重算统计。
这些扩展的权重与影像并未随包公开,因此公开标量重计算与新的完整训练/推理应分别记录完成状态。
十、科研图如何制作与核验?
10.1 本文提供哪些图?
- 图1:从数据、冻结特征到审计的流程示意;
- 图2:五任务相关性热图;
- 图3:绝对相关性及Δ的主95%区间;
- 图4:失败依赖与有效规模;
- 图5:校准选择后的低有效规模频率;
- 图6:Frozen/FT比较,避免只看Δ;
- 图7:错误掩码重叠统计与区间;
- 图8:来源明确的原论文空间案例图。
- 图9:17编码器checkpoint层级与点估计差距;
- 图10:readout、微调、随机初始化和nnU-Net控制。
图1~7、9~10导出300 DPI PNG与可编辑SVG;图8保持原始PNG。绘图脚本读取 results/ 与原始评分,不读取参考CSV作为绘图数据 。图2另导出数值矩阵至 results/plot_data/。全部图片来源记录在 figures/figure_sources.json。

图7:从作者公开的像素错误重叠评分重算。错误掩码为预测与GT的XOR;主统计对双方错误掩码都为空的情况记1,同时公开CSV还提供排除这种情况的conditional敏感性。ACDC的图示区间使用患者聚类版本。
10.2 原论文定性图如何使用?

图8:原样引用 CoFailMed 仓库 assets/shared_failures.png,对应论文Figure 4。RIGA Cup与BraTS FG示例比较共享DINOv2-B checkpoint的4个头与不同bundle。橙色表示FP,蓝色表示FN,深浅表示错误重复的成员数,绿色标识参考边界。此图来自原论文,不能写成"我们重新训练得到的可视化"。
原仓库代码为Apache-2.0,但图像crop、数据和模型保留各自上游条款;代码许可证不会重新授权医学图像。公开发表文章时保留作者/数据集归属,结合实际发表用途核对原仓库 data/README.md 的条款。
10.3 层级与训练控制的补充科研图

图9:三种相关性层级及同家族不同checkpoint相对跨家族的差距,展示点估计。质量过滤后的K可能小于17。这里的参考组是跨家族,不能直接与主实验Δ混为同一统计量。

图10:各任务实际运行的控制分支及95%区间,右侧列出平均Dice。缺失分支不补值;nnU-Net行比较同fold/不同fold,随机初始化行比较同backbone/不同backbone,分组与主实验不同。各分支保留的模型集合也可能不同,不能作同一模型池的因果比较。
10.4 训练后绘制自己的真实分割图
先对一个已训练cell重放预测;在 CoFailMed-main 根目录:
bash
python code/scripts/evaluate_error_masks.py \
--source "$PWD" \
--cell /data/cofailmed_run01/cells/riga_cup__dinov2_vitb14 \
--cache-root /data/cofailmed_run01/cache \
--task riga_cup --fm dinov2_vitb14 \
--data-root "$FMPOOL_DATA_ROOT" \
--out /data/cofailmed_overlap01/raw/local/out
官方重放脚本核验checkpoint、cache、run identity和逐病例Dice,成功后产生 cell_receipt.json 及 seed_42.npz 等文件。传 --data-root 才能尝试保存 panel_images.npz;若receipt记录了 panel_images_error,先解决真实影像加载问题。
然后进入 交付,调用本文脚本:
bash
python scripts/plot_segmentation.py \
--cell-dir /data/cofailmed_overlap01/raw/local/out/riga_cup__dinov2_vitb14 \
--out figures/my_riga_cup_dinov2b --max-cases 3
输出为真实影像、GT、4个seed的TP/FP/FN叠加图,颜色为绿/橙/蓝;没有真实预测时不会捏造示例图。该入口在本次交付中完成语法与接口检查,尚未用新的医学预测运行。
要得到跨bundle空间统计,需要对所有目标cell执行重放,再使用 analyze_pixel_overlap.py。示例:
bash
python code/scripts/analyze_pixel_overlap.py \
--raw /data/cofailmed_overlap01/raw \
--traces /data/cofailmed_analysis01/per_case_dice \
--primary-wc /data/cofailmed_analysis01/within_cross \
--out /data/cofailmed_overlap01 \
--tasks riga_cup riga_disc kvasir acdc_lv --suffix _run
非空 --suffix 表示只输出表格;原作者完整案例panel路径还需要BraTS和真实原图,不能用上述单cell输出冒充整套Figure 4复现。
十一、常见报错与数值对不上的原因
11.1 No module named fmpool 或 analysis
从仓库根目录设置 PYTHONPATH。Linux使用冒号分隔,PowerShell使用分号:
powershell
$env:PYTHONPATH = "$PWD\code\src;$PWD\code\stats;$PWD\code\scripts"
11.2 FMPOOL_DINOV2_REVISION must pin ...
设置完整40位commit,不要填 main。train_grid.py 自动读取主配置中的该commit。
11.3 manifest/cache/encoder哈希不一致
先检查是否更换了权重、数据、split、源码或预处理开关。manifest记录的是实际文件和状态,不是一个可以删除验证字段后忽略的形式文件。代码或数据改变时,建立新清单和新缓存目录。
原仓库说明部分split文件的发布版更改了provenance文本,ID列表未变,但整体文件哈希与原运行记录可能不同;不能据此自行修改split ID或关闭验证。
11.4 为什么运行完整网格前就提示目录存在?
官方frozen wrapper和本文调度器都保留已有产物。已完成cell可校验后跳过;部分失败cell需要先看日志,决定归档或使用新目录,避免把两次运行混成一次。
11.5 OOM或缓存太大
先判断发生在encoder提特征、头训练、RAM载入还是磁盘写入。顺序跑cell、管理缓存和限制worker通常更有帮助。主trainer对epochs/batch有配方保护;使用 --non-primary 降低batch或改轮数属于偏离主实验,需要明确标注,不能仍声称严格复现主配置。
11.6 数值小幅漂移
先排查数据ID、权重状态、预处理、精度、seed、最终轮权重、Dice空mask规则,再比较运行时。训练代码调用了 torch.use_deterministic_algorithms(..., warn_only=True),会警告而不是强制拒绝所有非确定性操作,因此同seed不保证跨硬件逐位一致。
原仓库记载抽样CPU重放Kvasir ResNet-18与DeiT-B时949/960个Dice相同,最大差3.5e-4;这是作者的抽样训练验证,不是本文在当前机器重新训练的结果。
11.7 有效规模不等于论文值
依次检查:是否把固定0.85当成P33;是否每个模型各算阈值;是否用Dice相关性代替失败相关性;是否逐池计算后求平均;是否过滤到相同bundle;是否检查每成员至少5失败/5通过;是否将不支持池填成了0。
11.8 图像导入CSDN后不显示
本地Markdown使用相对路径便于打包。CSDN服务器不能读取本机 figures/,发布时在Markdown编辑器中上传10张PNG,再把对应图片链接替换成CSDN返回的地址。正文公式使用 $...$ / $$...$$,代码块保留语言标记;如果 [TOC] 未自动生成目录,可在编辑器中替换为其支持的目录标记。
十二、复现验收与可直接使用的结论
统计复现应满足:原始评分校验通过;官方测试通过;每组CSV与参考输出在规定浮点容差内一致;图片与CSV来源对应;未公开部分没有被补成虚构数值。本次具体运行记录见随文 本次复现验证.md 和 results/verification.json。
训练复现还应保留数据获取版本、原始文件哈希、split ID、权重状态哈希、完整环境、4个种子、全部病例评分、checkpoint和日志。固定任务上的真实新训练结果应单独与公开结果比较,不能复用评分包结果充当自己训练的输出。
可以在文章中这样概括论文发现:
在本文评估的冻结编码器与线性分割头协议下,共享checkpoint的不同头在逐病例表现及空间错误上具有较强依赖;来自不同编码器的四成员池,在任务各自pooled P33阈值下,平均有效规模约为1.56~2.92。更丰富的readout或微调可缩小same/release与cross-bundle的相关性差距,但该差距不能单独代表绝对失败依赖降低。模型池报告应同时给出分割质量、绝对相关性、阈值定义、支持条件及有效规模。
这些结论针对所观察的模型、队列、readout和阈值,不能扩大为"所有医学大模型都缺乏多样性",也不能仅凭本研究推出新的模型集成在临床上可靠。
参考资料与引用
- Choi E., Kim K., Lee H.-J., Kim N.-J. Different Models, Shared Failures: Auditing Frozen-Encoder Pools for Medical Segmentation. 用户提供论文,arXiv:2610.41790v1;正文第3~6节,附录B~J。
- CoFailMed代码仓库。本文以用户提供的ZIP版本为实际依据。
- 原仓库
README.md、REPRODUCING.md、code/README.md、data/README.md、code/configs/encoder_sources.json。
bibtex
@inproceedings{choi2026cofailmed,
title = {Different Models, Shared Failures: Auditing Frozen-Encoder Pools for Medical Segmentation},
author = {Choi, Eunseob and Kim, Kyeonghun and Lee, Hyuk-Jae and Kim, Nam-Joon},
booktitle = {Advances in Neural Information Processing Systems},
year = {2026},
note = {NeurIPS 2026 Evaluations and Datasets Track},
url = {https://openreview.net/forum?id=sgt45cOBtI}
}