File size: 1,987 Bytes
1ca3ad9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/usr/bin/env python3
"""HEST-1K for reference timm pathology FMs (UNI/UNI2/gigapath/Virchow2).
run_hest_3way와 동일 프로토콜: 224px, ImageNet norm, CLS 임베딩, PCA256+ridge, 9 task 평균 Pearson.
(참조모델 CRC/BACH/HCC와 동일하게 CLS만 사용 — Virchow2도 CLS 1280.)
"""
import argparse, os, sys
import torch
from torchvision import transforms

ROOT = os.environ.get("OPENPATH_ROOT", os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
BENCH = os.environ.get("HEST_BENCH_ROOT", f"{ROOT}/data/eva/hest_bench")
ALL = ["IDC", "PRAD", "PAAD", "SKCM", "COAD", "READ", "CCRCC", "LUNG", "LYMPH_IDC"]
eval_tf = transforms.Compose([
    transforms.Resize(224), transforms.CenterCrop(224), transforms.ToTensor(),
    transforms.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)),
])


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("--backbone", required=True, choices=["uni", "uni2", "gigapath", "virchow2"])
    ap.add_argument("--exp-code", required=True)
    ap.add_argument("tasks", nargs="*")
    args = ap.parse_args()

    sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
    import openpath_eva_backbone as B
    fn = {"uni": B.build_uni, "uni2": B.build_uni2,
          "gigapath": B.build_gigapath, "virchow2": B.build_virchow2}[args.backbone]
    model = fn().cuda().eval()

    from hest.bench import benchmark
    tasks = args.tasks or ALL
    print(f"[hest-ref] backbone={args.backbone} exp={args.exp_code} tasks={tasks}", flush=True)
    dataset_perfs, perf_per_enc = benchmark(
        model, eval_tf, torch.float32,
        exp_code=args.exp_code, datasets=tasks, bench_data_root=BENCH,
        embed_dataroot=os.environ.get("HEST_EMBED_ROOT", f"eval/ST_data_emb_{args.exp_code}"),
        dimreduce="PCA", latent_dim=256, method="ridge", normalize=True,
    )
    print(f"=== HEST per-encoder avg Pearson [{args.exp_code}] ===", perf_per_enc, flush=True)


if __name__ == "__main__":
    main()