File size: 3,535 Bytes
8e932ab
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/bin/bash
# Phase 1+2+3 launcher — run inside a tmux session on the VM.
# Usage:
#   tmux new -s fundus2
#   bash launch_v2_v3.sh 2>&1 | tee v2_v3_run.log
set -e
cd ~/fundus_project
source ~/.venv/bin/activate

mkdir -p final_experiments_v2 final_experiments_v3 weights_v2 weights_v3 gradcam_v2

echo "=================================================================="
echo "Phase 1.1 — group-aware split builder (perceptual hashing)"
echo "=================================================================="
python comparison_experiment/build_grouped_split.py \
    --original-dir "Database/Original_Dataset" \
    --augmented-dir "Database/Augmented_Dataset" \
    --output holdout_split_augmented.json \
    --hamming-threshold 8 \
    --n-folds 5

echo "=================================================================="
echo "Phase 1.2 — v2 training (6 CNNs/CLIP w/ CLAHE + RandAug + Sampler + MixUp + TTA)"
echo "=================================================================="
python comparison_experiment/run_v2_experiments.py \
    --manifest holdout_split_augmented.json \
    --out-dir final_experiments_v2 \
    --weights-dir weights_v2 \
    --epochs 60 \
    --folds 5 \
    --batch-size 32 \
    --workers 4 \
    --patience 12 \
    --skip-cv

# (Skip CV in first pass to keep total wall < 18h; CV happens on best models in Phase 3.)

echo "=================================================================="
echo "Phase 2 — Foundation backbones (DINOv2, Swin, RETFound)"
echo "=================================================================="
# RETFound weights gated on HuggingFace; skip unless a non-empty file exists locally.
FM_MODELS="dinov2_l swin_b"
if [ -s weights_retfound.pth ]; then
    echo "RETFound weights found, including in run."
    FM_MODELS="$FM_MODELS retfound"
else
    echo "RETFound weights missing or empty -> skipping RETFound (HF gated)."
fi

python comparison_experiment/run_foundation_models.py \
    --manifest holdout_split_augmented.json \
    --out-dir final_experiments_v3 \
    --weights-dir weights_v3 \
    --retfound-weights weights_retfound.pth \
    --models $FM_MODELS \
    --batch-size 24 \
    --workers 4 \
    --lp-epochs 20 \
    --ft-epochs 15 \
    --patience 8

echo "=================================================================="
echo "Phase 3 — Ensemble + extended statistics"
echo "=================================================================="
# Combine v2 + v3 predictions in one directory
mkdir -p final_experiments_all
cp final_experiments_v2/*_test_preds.json final_experiments_all/ 2>/dev/null || true
cp final_experiments_v2/*_test.json       final_experiments_all/ 2>/dev/null || true
cp final_experiments_v3/*_test_preds.json final_experiments_all/ 2>/dev/null || true
cp final_experiments_v3/*_test.json       final_experiments_all/ 2>/dev/null || true

python comparison_experiment/ensemble_and_stats.py \
    --results-dir final_experiments_all \
    --out final_experiments_all/ensemble_report.json

echo "=================================================================="
echo "Phase 1.3 — Grad-CAM v2 (best model)"
echo "=================================================================="
python comparison_experiment/generate_all_gradcam.py \
    --manifest holdout_split_augmented.json \
    --weights-dir weights_v2 \
    --out-dir gradcam_v2 || echo "GradCAM optional step failed; continuing"

echo "All done. Outputs:"
ls -la final_experiments_v2 final_experiments_v3 final_experiments_all gradcam_v2 2>/dev/null