如何用 Channel-Adaptive DINO 在 HPA-FoV 上运行蛋白质定位线性评估?
【免费下载链接】dinov2PyTorch code and models for the DINOv2 self-supervised learning method.项目地址: https://gitcode.com/GitHub_Trending/di/dinov2
这篇文档介绍如何基于 dinov2 仓库中的 Channel-Adaptive DINO(Bag of Channels 实现),在 HPA-FoV 数据集上完成一次蛋白质定位(protein localization)线性评估:加载预训练 teacher 权重,冻结骨干网络,在最后一组 transformer 块输出上训练一个线性分类器,并用mean_per_class_multilabel_f1指标在验证集上打分。适用前提是:你在 Linux 环境、使用 PyTorch 2.0 与 xFormers 0.0.18,并且能提交单节点多 GPU 任务(评估入口是基于 submitit 的 SLURM launcher)。
先明确两点边界,均来自 Channel-Adaptive DINO 文档:
- 本仓库只包含 Bag of Channel(
--bag-of-channels)通道自适应实现,不包含论文中的 Hierarchical attention 方案; - 代码与模型权重仅供研究用途(CC-BY-NC 代码许可、FAIR Non-Commercial Research 模型许可),不得用于临床目的。
安装环境与依赖
评估代码复用 DINOv2 的主环境。按 README 的说明,用 conda 或 pip 二选一:
# 推荐 conda env create -f conda.yaml conda activate dinov2# 或使用 pip pip install -r requirements.txtChannel-Adaptive DINO 在 DINOv2 依赖之外还需要两个额外包,文档明确列出:
pip install pandas tifffile另外,运行训练与评估命令时dinov2包必须在 Python 搜索路径中,文档要求直接在仓库根目录用PYTHONPATH=.前缀执行命令(评估命令实际使用PYTHONPATH=.:dinov2/data)。
准备 HPA-FoV 数据集
数据集 root 目录需要包含两个 CSV 文件和一个整幅图像目录:
whole_images_512_train.csvwhole_images_512_test.csv- 图像目录:文档写作
new_512_whole_images,而数据集加载代码 hpafov.py 中读取的目录名是512_whole_images。两处文档存在出入,以实际代码解析逻辑为准组织你的目录,避免加载时抛出FileNotFoundError。
加载代码的行为要点(都定义在 hpafov.py):
HPAFoV:split=TRAIN读whole_images_512_train.csv,HPAFoV:split=VAL读whole_images_512_test.csv;mode=PROTEIN_LOCALIZATION时标签为 25 个亚细胞定位类别(nucleoplasm、plasma membrane、cytosol 等)的 one-hot 多标签向量,没有任何定位标签的样本会被跳过;- 通道数为 4(每个样本按通道
[0, 1, 2, 3]组织),图像按 CSV 中file列的文件名查找,找不到.png时会回退尝试.tiff后缀。
获取 Channel-Adaptive DINO 的 teacher 权重
线性评估需要 teacher 权重文件,有两条路径:
路径 A:使用官方预训练权重。文档说明可在 torchhub 上下载在 Extended CHAMMI 数据集(五个细胞显微图像数据集的组合)上训练的权重;对应的 hub 入口是 backbones.py 中的channel_adaptive_dino_vitl16(in_channels=1、channel_adaptive=True)。
路径 B:在 HPA-FoV 上自训。文档给出的示例是在 4 个 A100-80GB 节点(32 卡)的 SLURM 集群上用 submitit 提交训练,配置为 vitl16_boc_hpafov.yaml,约需 2 天:
PYTHONPATH=. python dinov2/run/train/train.py \ --nodes 4 \ --config-file dinov2/configs/train/cell_dino/vitl16_boc_hpafov.yaml \ --output-dir <PATH/TO/OUTPUT/DIR> \ train.dataset_path=HPAFoV:split=TRAIN:root=<PATH/TO/DATASET>:wildcard=SEPARATE_CHANNELS其中<PATH/TO/OUTPUT/DIR>替换为你的训练输出目录,<PATH/TO/DATASET>替换为上面的数据集 root。训练代码每 12500 次迭代会把 teacher 权重存到输出目录的eval文件夹中供评估使用。
无论哪条路径,最终你都需要一个本地.pth文件传给后面的--pretrained-weights。
运行蛋白质定位线性评估
在仓库根目录执行(<PATH/TO/OUTPUT/DIR>与<PATH/TO/DATASET>替换为实际路径;training_359999是文档示例中的 checkpoint 目录名,替换为你实际的迭代目录):
PYTHONPATH=.:dinov2/data python dinov2/run/eval/cell_dino/linear.py \ --config-file dinov2/configs/eval/cell_dino/vitl16_channel_adaptive_pretrain.yaml \ --pretrained-weights <PATH/TO/OUTPUT/DIR>/eval/training_359999/teacher_checkpoint.pth \ --output-dir <PATH/TO/OUTPUT/DIR>/eval/training_359999/linear \ --train-dataset HPAFoV:split=TRAIN:mode=PROTEIN_LOCALIZATION:root=<PATH/TO/DATASET> \ --val-dataset HPAFoV:split=VAL:mode=PROTEIN_LOCALIZATION:root=<PATH/TO/DATASET> \ --val-metric-type mean_per_class_multilabel_f1 \ --loss-type binary_cross_entropy \ --bag-of-channels \ --crop-size 384 \ --n-last-blocks 4 \ --batch-size 32 \ --epoch-length 145 \ --epochs 30 \ --avgpool \各关键参数在 评估入口 与 linear 评估实现 中的含义:
| 参数 | 用途 |
|---|---|
--config-file | 模型配置,vitl16_channel_adaptive_pretrain.yaml 指定vit_large、patch_size: 16、in_chans: 1、channel_adaptive: true的 student/teacher |
--bag-of-channels | 启用 Bag of Channels 通道自适应策略:单通道骨干 + 对每通道分别编码(代码中会拼接 patch token 的均值池化输出) |
--loss-type binary_cross_entropy | 多标签蛋白定位使用BCEWithLogitsLoss,而非默认的CrossEntropyLoss |
--val-metric-type mean_per_class_multilabel_f1 | 验证集指标,适配 25 类多标签 one-hot 标签 |
--crop-size 384 | 训练与评估的裁剪尺寸(默认值即为 384) |
--n-last-blocks 4 | 线性分类器取骨干最后 4 个块的 class token 拼接作为输入 |
--avgpool | 在 CLS token 之外追加 patch token 的均值池化 |
--batch-size 32 | 每 GPU 批大小 |
--epoch-length 145/--epochs 30 | 每个 epoch 的迭代数与总 epoch 数(均为脚本默认值) |
实现上有两个值得知道的默认行为:优化器是 AdamW +CosineAnnealingLR(另一种调度器是--scheduler one_cycle);学习率与 weight decay 是网格搜索,默认--learning-rates有 16 个值、--weight_decays为[0.0, 0.0001, 1e-5],即会同时训练多组线性分类器并在验证集上选出 best classifier。脚本默认会从已有 checkpoint 恢复,需要从头重跑时加--no-resume。
验证评估结果
评估在验证集上按迭代周期打分,结果以 JSON 追加写入--output-dir下的results_eval_linear.json,日志中会输出每个分类器的指标行(-- Classifier: ...)与选中的best classifier。判断评估是否正常完成,看两处:
- 输出目录生成了
results_eval_linear.json,且其中记录的验证指标基于mean_per_class_multilabel_f1; - 日志最后输出了 best classifier 及其对应指标,训练达到
epochs × epoch_length的总迭代数。
文档没有给出固定的分数预期值,因此不要以某个固定 F1 数值作为成功标准;如需对照论文数值,以文档 Evaluation 一节提供的复现表格为参考。
限制与注意事项
- 该仓库只实现了 Bag of Channel 通道自适应策略,不含 Hierarchical attention;
- 评估入口依赖 submitit/SLURM 单节点任务提交,没有集群环境时这条命令无法直接运行;
- 训练示例要求 4 节点共 32 张 A100-80GB 且约 2 天,若显存或算力不足,可改用路径 A 的预训练权重做线性评估;
- 代码与权重仅可用于研究用途,不可用于医疗诊断等临床场景。
【免费下载链接】dinov2PyTorch code and models for the DINOv2 self-supervised learning method.项目地址: https://gitcode.com/GitHub_Trending/di/dinov2
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考