taejoon89/openpath
118
1#!/usr/bin/env bash2# Patch 분류 벤치(pcam/crc/bach)를 kaiko-eva로 frozen-encoder linear probe.3# 참조 FM과 OpenPath를 동일 프로토콜로 비교.4# model: openpath|openmidnight|phikon|uni|uni2|gigapath|virchow25# bench: pcam|crc|bach6# 사용: [GPU=0] [N_RUNS=5] bash eval/run_patch_eval.sh <model> <bench> [weights]7# openpath는 weights(teacher_checkpoint.pth) 필수. eva·timm·데이터셋은 사전 설치/다운로드 필요.8set -u9R="${OPENPATH_ROOT:-$(cd "$(dirname "$0")/.." && pwd)}" # repo 루트(eval/의 상위)10cd "$R"11export PYTHONPATH="$R/OpenPath:$R/eval" # dinov2(OpenPath/) + backbone(eval/)12export CUDA_VISIBLE_DEVICES="${GPU:-0}" # eva는 단일 GPU 권장13export N_RUNS="${N_RUNS:-5}"14export ACCELERATOR=gpu NUM_DEVICES=1 OPENPATH_WEIGHTS="${3:-none}"15export PREDICT_BATCH_SIZE="${PREDICT_BATCH_SIZE:-512}" BATCH_SIZE="${BATCH_SIZE:-4096}" N_DATA_WORKERS="${N_DATA_WORKERS:-8}"16model="$1"; bench="$2"17 18case "$model" in19 openpath) export BACKBONE_FN=openpath_eva_backbone.build_openpath IN_FEATURES=1536 ;;20 openmidnight) export BACKBONE_FN=openpath_eva_backbone.build_openmidnight IN_FEATURES=1536 ;;21 phikon) export BACKBONE_FN=openpath_eva_backbone.build_phikon IN_FEATURES=1024 ;;22 uni) export BACKBONE_FN=openpath_eva_backbone.build_uni IN_FEATURES=1024 ;;23 uni2) export BACKBONE_FN=openpath_eva_backbone.build_uni2 IN_FEATURES=1536 ;;24 gigapath) export BACKBONE_FN=openpath_eva_backbone.build_gigapath IN_FEATURES=1536 ;;25 virchow2) export BACKBONE_FN=openpath_eva_backbone.build_virchow2 IN_FEATURES=1280 ;;26 *) echo "unknown model $model (openpath|openmidnight|phikon|uni|uni2|gigapath|virchow2)"; exit 1 ;;27esac28export MODEL_NAME="${MODEL_NAME:-$model}"29 30case "$bench" in31 pcam) cfg=eval/eva_configs/patch_camelyon.yaml; export DATA_ROOT="$R/data/eva/pcam_h5" DOWNLOAD_DATA="${DL:-true}" ;;32 crc) cfg=eval/eva_configs/crc.yaml; export DATA_ROOT="$R/data/eva/crc" DOWNLOAD_DATA=false ;;33 bach) cfg=eval/eva_configs/bach.yaml; export DATA_ROOT="$R/data/eva/bach" DOWNLOAD_DATA="${DL:-false}" ;;34 *) echo "unknown bench $bench (pcam|crc|bach)"; exit 1 ;;35esac36 37# eva predict_fit는 임베딩 출력폴더가 있으면 거부 → 매 실행 전 정리(fresh 추출).38# eva 임베딩 폴더명은 데이터셋명: pcam→patch_camelyon.39evadir="$bench"; [ "$bench" = pcam ] && evadir=patch_camelyon40rm -rf "$R/data/embeddings/$MODEL_NAME/$evadir" 2>/dev/null41 42echo "=== EVAL $model × $bench | IN=$IN_FEATURES N_RUNS=$N_RUNS GPU=$CUDA_VISIBLE_DEVICES DATA_ROOT=$DATA_ROOT DL=$DOWNLOAD_DATA | $(date) ==="43eva predict_fit --config "$cfg"44echo "=== DONE $model × $bench | $(date) ==="45 