faceless-void commited on
Commit
4db9215
·
verified ·
1 Parent(s): e37b7d2

Upload folder using huggingface_hub

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +96 -0
  2. README.md +21 -5
  3. app.py +387 -0
  4. gallery/images/BCI_HER2_0_00013_test_0_gen_er.png +3 -0
  5. gallery/images/BCI_HER2_0_00013_test_0_gen_her2.png +3 -0
  6. gallery/images/BCI_HER2_0_00013_test_0_gen_ki67.png +3 -0
  7. gallery/images/BCI_HER2_0_00013_test_0_gen_pr.png +3 -0
  8. gallery/images/BCI_HER2_0_00013_test_0_gt.png +3 -0
  9. gallery/images/BCI_HER2_0_00013_test_0_he.png +3 -0
  10. gallery/images/BCI_HER2_0_00198_test_0_gen_er.png +3 -0
  11. gallery/images/BCI_HER2_0_00198_test_0_gen_her2.png +3 -0
  12. gallery/images/BCI_HER2_0_00198_test_0_gen_ki67.png +3 -0
  13. gallery/images/BCI_HER2_0_00198_test_0_gen_pr.png +3 -0
  14. gallery/images/BCI_HER2_0_00198_test_0_gt.png +3 -0
  15. gallery/images/BCI_HER2_0_00198_test_0_he.png +3 -0
  16. gallery/images/BCI_HER2_1+_00276_test_1+_gen_er.png +3 -0
  17. gallery/images/BCI_HER2_1+_00276_test_1+_gen_her2.png +3 -0
  18. gallery/images/BCI_HER2_1+_00276_test_1+_gen_ki67.png +3 -0
  19. gallery/images/BCI_HER2_1+_00276_test_1+_gen_pr.png +3 -0
  20. gallery/images/BCI_HER2_1+_00276_test_1+_gt.png +3 -0
  21. gallery/images/BCI_HER2_1+_00276_test_1+_he.png +3 -0
  22. gallery/images/BCI_HER2_1+_00791_test_1+_gen_er.png +3 -0
  23. gallery/images/BCI_HER2_1+_00791_test_1+_gen_her2.png +3 -0
  24. gallery/images/BCI_HER2_1+_00791_test_1+_gen_ki67.png +3 -0
  25. gallery/images/BCI_HER2_1+_00791_test_1+_gen_pr.png +3 -0
  26. gallery/images/BCI_HER2_1+_00791_test_1+_gt.png +3 -0
  27. gallery/images/BCI_HER2_1+_00791_test_1+_he.png +3 -0
  28. gallery/images/BCI_HER2_2+_00259_test_2+_gen_er.png +3 -0
  29. gallery/images/BCI_HER2_2+_00259_test_2+_gen_her2.png +3 -0
  30. gallery/images/BCI_HER2_2+_00259_test_2+_gen_ki67.png +3 -0
  31. gallery/images/BCI_HER2_2+_00259_test_2+_gen_pr.png +3 -0
  32. gallery/images/BCI_HER2_2+_00259_test_2+_gt.png +3 -0
  33. gallery/images/BCI_HER2_2+_00259_test_2+_he.png +3 -0
  34. gallery/images/BCI_HER2_2+_00293_test_2+_gen_er.png +3 -0
  35. gallery/images/BCI_HER2_2+_00293_test_2+_gen_her2.png +3 -0
  36. gallery/images/BCI_HER2_2+_00293_test_2+_gen_ki67.png +3 -0
  37. gallery/images/BCI_HER2_2+_00293_test_2+_gen_pr.png +3 -0
  38. gallery/images/BCI_HER2_2+_00293_test_2+_gt.png +3 -0
  39. gallery/images/BCI_HER2_2+_00293_test_2+_he.png +3 -0
  40. gallery/images/BCI_HER2_3+_00220_test_3+_gen_er.png +3 -0
  41. gallery/images/BCI_HER2_3+_00220_test_3+_gen_her2.png +3 -0
  42. gallery/images/BCI_HER2_3+_00220_test_3+_gen_ki67.png +3 -0
  43. gallery/images/BCI_HER2_3+_00220_test_3+_gen_pr.png +3 -0
  44. gallery/images/BCI_HER2_3+_00220_test_3+_gt.png +3 -0
  45. gallery/images/BCI_HER2_3+_00220_test_3+_he.png +3 -0
  46. gallery/images/BCI_HER2_3+_00277_test_3+_gen_er.png +3 -0
  47. gallery/images/BCI_HER2_3+_00277_test_3+_gen_her2.png +3 -0
  48. gallery/images/BCI_HER2_3+_00277_test_3+_gen_ki67.png +3 -0
  49. gallery/images/BCI_HER2_3+_00277_test_3+_gen_pr.png +3 -0
  50. gallery/images/BCI_HER2_3+_00277_test_3+_gt.png +3 -0
.gitattributes CHANGED
@@ -33,3 +33,99 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ gallery/images/BCI_HER2_0_00013_test_0_gen_er.png filter=lfs diff=lfs merge=lfs -text
37
+ gallery/images/BCI_HER2_0_00013_test_0_gen_her2.png filter=lfs diff=lfs merge=lfs -text
38
+ gallery/images/BCI_HER2_0_00013_test_0_gen_ki67.png filter=lfs diff=lfs merge=lfs -text
39
+ gallery/images/BCI_HER2_0_00013_test_0_gen_pr.png filter=lfs diff=lfs merge=lfs -text
40
+ gallery/images/BCI_HER2_0_00013_test_0_gt.png filter=lfs diff=lfs merge=lfs -text
41
+ gallery/images/BCI_HER2_0_00013_test_0_he.png filter=lfs diff=lfs merge=lfs -text
42
+ gallery/images/BCI_HER2_0_00198_test_0_gen_er.png filter=lfs diff=lfs merge=lfs -text
43
+ gallery/images/BCI_HER2_0_00198_test_0_gen_her2.png filter=lfs diff=lfs merge=lfs -text
44
+ gallery/images/BCI_HER2_0_00198_test_0_gen_ki67.png filter=lfs diff=lfs merge=lfs -text
45
+ gallery/images/BCI_HER2_0_00198_test_0_gen_pr.png filter=lfs diff=lfs merge=lfs -text
46
+ gallery/images/BCI_HER2_0_00198_test_0_gt.png filter=lfs diff=lfs merge=lfs -text
47
+ gallery/images/BCI_HER2_0_00198_test_0_he.png filter=lfs diff=lfs merge=lfs -text
48
+ gallery/images/BCI_HER2_1+_00276_test_1+_gen_er.png filter=lfs diff=lfs merge=lfs -text
49
+ gallery/images/BCI_HER2_1+_00276_test_1+_gen_her2.png filter=lfs diff=lfs merge=lfs -text
50
+ gallery/images/BCI_HER2_1+_00276_test_1+_gen_ki67.png filter=lfs diff=lfs merge=lfs -text
51
+ gallery/images/BCI_HER2_1+_00276_test_1+_gen_pr.png filter=lfs diff=lfs merge=lfs -text
52
+ gallery/images/BCI_HER2_1+_00276_test_1+_gt.png filter=lfs diff=lfs merge=lfs -text
53
+ gallery/images/BCI_HER2_1+_00276_test_1+_he.png filter=lfs diff=lfs merge=lfs -text
54
+ gallery/images/BCI_HER2_1+_00791_test_1+_gen_er.png filter=lfs diff=lfs merge=lfs -text
55
+ gallery/images/BCI_HER2_1+_00791_test_1+_gen_her2.png filter=lfs diff=lfs merge=lfs -text
56
+ gallery/images/BCI_HER2_1+_00791_test_1+_gen_ki67.png filter=lfs diff=lfs merge=lfs -text
57
+ gallery/images/BCI_HER2_1+_00791_test_1+_gen_pr.png filter=lfs diff=lfs merge=lfs -text
58
+ gallery/images/BCI_HER2_1+_00791_test_1+_gt.png filter=lfs diff=lfs merge=lfs -text
59
+ gallery/images/BCI_HER2_1+_00791_test_1+_he.png filter=lfs diff=lfs merge=lfs -text
60
+ gallery/images/BCI_HER2_2+_00259_test_2+_gen_er.png filter=lfs diff=lfs merge=lfs -text
61
+ gallery/images/BCI_HER2_2+_00259_test_2+_gen_her2.png filter=lfs diff=lfs merge=lfs -text
62
+ gallery/images/BCI_HER2_2+_00259_test_2+_gen_ki67.png filter=lfs diff=lfs merge=lfs -text
63
+ gallery/images/BCI_HER2_2+_00259_test_2+_gen_pr.png filter=lfs diff=lfs merge=lfs -text
64
+ gallery/images/BCI_HER2_2+_00259_test_2+_gt.png filter=lfs diff=lfs merge=lfs -text
65
+ gallery/images/BCI_HER2_2+_00259_test_2+_he.png filter=lfs diff=lfs merge=lfs -text
66
+ gallery/images/BCI_HER2_2+_00293_test_2+_gen_er.png filter=lfs diff=lfs merge=lfs -text
67
+ gallery/images/BCI_HER2_2+_00293_test_2+_gen_her2.png filter=lfs diff=lfs merge=lfs -text
68
+ gallery/images/BCI_HER2_2+_00293_test_2+_gen_ki67.png filter=lfs diff=lfs merge=lfs -text
69
+ gallery/images/BCI_HER2_2+_00293_test_2+_gen_pr.png filter=lfs diff=lfs merge=lfs -text
70
+ gallery/images/BCI_HER2_2+_00293_test_2+_gt.png filter=lfs diff=lfs merge=lfs -text
71
+ gallery/images/BCI_HER2_2+_00293_test_2+_he.png filter=lfs diff=lfs merge=lfs -text
72
+ gallery/images/BCI_HER2_3+_00220_test_3+_gen_er.png filter=lfs diff=lfs merge=lfs -text
73
+ gallery/images/BCI_HER2_3+_00220_test_3+_gen_her2.png filter=lfs diff=lfs merge=lfs -text
74
+ gallery/images/BCI_HER2_3+_00220_test_3+_gen_ki67.png filter=lfs diff=lfs merge=lfs -text
75
+ gallery/images/BCI_HER2_3+_00220_test_3+_gen_pr.png filter=lfs diff=lfs merge=lfs -text
76
+ gallery/images/BCI_HER2_3+_00220_test_3+_gt.png filter=lfs diff=lfs merge=lfs -text
77
+ gallery/images/BCI_HER2_3+_00220_test_3+_he.png filter=lfs diff=lfs merge=lfs -text
78
+ gallery/images/BCI_HER2_3+_00277_test_3+_gen_er.png filter=lfs diff=lfs merge=lfs -text
79
+ gallery/images/BCI_HER2_3+_00277_test_3+_gen_her2.png filter=lfs diff=lfs merge=lfs -text
80
+ gallery/images/BCI_HER2_3+_00277_test_3+_gen_ki67.png filter=lfs diff=lfs merge=lfs -text
81
+ gallery/images/BCI_HER2_3+_00277_test_3+_gen_pr.png filter=lfs diff=lfs merge=lfs -text
82
+ gallery/images/BCI_HER2_3+_00277_test_3+_gt.png filter=lfs diff=lfs merge=lfs -text
83
+ gallery/images/BCI_HER2_3+_00277_test_3+_he.png filter=lfs diff=lfs merge=lfs -text
84
+ gallery/images/MIST_ER_35M2101733_7_3_gen_er.png filter=lfs diff=lfs merge=lfs -text
85
+ gallery/images/MIST_ER_35M2101733_7_3_gen_her2.png filter=lfs diff=lfs merge=lfs -text
86
+ gallery/images/MIST_ER_35M2101733_7_3_gen_ki67.png filter=lfs diff=lfs merge=lfs -text
87
+ gallery/images/MIST_ER_35M2101733_7_3_gen_pr.png filter=lfs diff=lfs merge=lfs -text
88
+ gallery/images/MIST_ER_35M2101733_7_3_gt.png filter=lfs diff=lfs merge=lfs -text
89
+ gallery/images/MIST_ER_35M2101733_7_3_he.png filter=lfs diff=lfs merge=lfs -text
90
+ gallery/images/MIST_ER_40M2101566_28_8_gen_er.png filter=lfs diff=lfs merge=lfs -text
91
+ gallery/images/MIST_ER_40M2101566_28_8_gen_her2.png filter=lfs diff=lfs merge=lfs -text
92
+ gallery/images/MIST_ER_40M2101566_28_8_gen_ki67.png filter=lfs diff=lfs merge=lfs -text
93
+ gallery/images/MIST_ER_40M2101566_28_8_gen_pr.png filter=lfs diff=lfs merge=lfs -text
94
+ gallery/images/MIST_ER_40M2101566_28_8_gt.png filter=lfs diff=lfs merge=lfs -text
95
+ gallery/images/MIST_ER_40M2101566_28_8_he.png filter=lfs diff=lfs merge=lfs -text
96
+ gallery/images/MIST_HER2_19M2102438_35_28_gen_er.png filter=lfs diff=lfs merge=lfs -text
97
+ gallery/images/MIST_HER2_19M2102438_35_28_gen_her2.png filter=lfs diff=lfs merge=lfs -text
98
+ gallery/images/MIST_HER2_19M2102438_35_28_gen_ki67.png filter=lfs diff=lfs merge=lfs -text
99
+ gallery/images/MIST_HER2_19M2102438_35_28_gen_pr.png filter=lfs diff=lfs merge=lfs -text
100
+ gallery/images/MIST_HER2_19M2102438_35_28_gt.png filter=lfs diff=lfs merge=lfs -text
101
+ gallery/images/MIST_HER2_19M2102438_35_28_he.png filter=lfs diff=lfs merge=lfs -text
102
+ gallery/images/MIST_HER2_67M2100642_15_18_gen_er.png filter=lfs diff=lfs merge=lfs -text
103
+ gallery/images/MIST_HER2_67M2100642_15_18_gen_her2.png filter=lfs diff=lfs merge=lfs -text
104
+ gallery/images/MIST_HER2_67M2100642_15_18_gen_ki67.png filter=lfs diff=lfs merge=lfs -text
105
+ gallery/images/MIST_HER2_67M2100642_15_18_gen_pr.png filter=lfs diff=lfs merge=lfs -text
106
+ gallery/images/MIST_HER2_67M2100642_15_18_gt.png filter=lfs diff=lfs merge=lfs -text
107
+ gallery/images/MIST_HER2_67M2100642_15_18_he.png filter=lfs diff=lfs merge=lfs -text
108
+ gallery/images/MIST_Ki67_10M2102916_10_20_gen_er.png filter=lfs diff=lfs merge=lfs -text
109
+ gallery/images/MIST_Ki67_10M2102916_10_20_gen_her2.png filter=lfs diff=lfs merge=lfs -text
110
+ gallery/images/MIST_Ki67_10M2102916_10_20_gen_ki67.png filter=lfs diff=lfs merge=lfs -text
111
+ gallery/images/MIST_Ki67_10M2102916_10_20_gen_pr.png filter=lfs diff=lfs merge=lfs -text
112
+ gallery/images/MIST_Ki67_10M2102916_10_20_gt.png filter=lfs diff=lfs merge=lfs -text
113
+ gallery/images/MIST_Ki67_10M2102916_10_20_he.png filter=lfs diff=lfs merge=lfs -text
114
+ gallery/images/MIST_Ki67_80M2100377_14_29_gen_er.png filter=lfs diff=lfs merge=lfs -text
115
+ gallery/images/MIST_Ki67_80M2100377_14_29_gen_her2.png filter=lfs diff=lfs merge=lfs -text
116
+ gallery/images/MIST_Ki67_80M2100377_14_29_gen_ki67.png filter=lfs diff=lfs merge=lfs -text
117
+ gallery/images/MIST_Ki67_80M2100377_14_29_gen_pr.png filter=lfs diff=lfs merge=lfs -text
118
+ gallery/images/MIST_Ki67_80M2100377_14_29_gt.png filter=lfs diff=lfs merge=lfs -text
119
+ gallery/images/MIST_Ki67_80M2100377_14_29_he.png filter=lfs diff=lfs merge=lfs -text
120
+ gallery/images/MIST_PR_17M2102569_15_14_gen_er.png filter=lfs diff=lfs merge=lfs -text
121
+ gallery/images/MIST_PR_17M2102569_15_14_gen_her2.png filter=lfs diff=lfs merge=lfs -text
122
+ gallery/images/MIST_PR_17M2102569_15_14_gen_ki67.png filter=lfs diff=lfs merge=lfs -text
123
+ gallery/images/MIST_PR_17M2102569_15_14_gen_pr.png filter=lfs diff=lfs merge=lfs -text
124
+ gallery/images/MIST_PR_17M2102569_15_14_gt.png filter=lfs diff=lfs merge=lfs -text
125
+ gallery/images/MIST_PR_17M2102569_15_14_he.png filter=lfs diff=lfs merge=lfs -text
126
+ gallery/images/MIST_PR_28M2101987_14_22_gen_er.png filter=lfs diff=lfs merge=lfs -text
127
+ gallery/images/MIST_PR_28M2101987_14_22_gen_her2.png filter=lfs diff=lfs merge=lfs -text
128
+ gallery/images/MIST_PR_28M2101987_14_22_gen_ki67.png filter=lfs diff=lfs merge=lfs -text
129
+ gallery/images/MIST_PR_28M2101987_14_22_gen_pr.png filter=lfs diff=lfs merge=lfs -text
130
+ gallery/images/MIST_PR_28M2101987_14_22_gt.png filter=lfs diff=lfs merge=lfs -text
131
+ gallery/images/MIST_PR_28M2101987_14_22_he.png filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -1,12 +1,28 @@
1
  ---
2
- title: UNIStainNet
3
- emoji: 👁
4
- colorFrom: yellow
5
  colorTo: purple
6
  sdk: gradio
7
- sdk_version: 6.10.0
8
  app_file: app.py
9
  pinned: false
 
 
10
  ---
11
 
12
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: UNIStainNet - Virtual IHC Staining
3
+ emoji: 🔬
4
+ colorFrom: blue
5
  colorTo: purple
6
  sdk: gradio
7
+ sdk_version: "6.10.0"
8
  app_file: app.py
9
  pinned: false
10
+ license: mit
11
+ hardware: cpu-basic
12
  ---
13
 
14
+ # UNIStainNet: Foundation-Model-Guided Virtual Staining
15
+
16
+ Virtual staining of H&E histopathology images to IHC (HER2, Ki67, ER, PR) using a single unified 42M-parameter SPADE-UNet conditioned on dense spatial tokens from a frozen UNI pathology foundation model.
17
+
18
+ ## Features
19
+ - **Upload** an H&E image and generate IHC stains in real-time
20
+ - **Cross-stain comparison**: Generate all 4 stains from a single input
21
+ - **Gallery**: Browse pre-computed examples (no GPU needed)
22
+
23
+ ## Architecture
24
+ | Component | Details |
25
+ |-----------|---------|
26
+ | Generator | SPADE-UNet with UNI spatial conditioning + FiLM stain embeddings |
27
+ | UNI Features | 4x4 sub-crop tiling → UNI ViT-L/16 → 32x32 spatial tokens (1024-dim) |
28
+ | Parameters | 42M (generator), UNI frozen (303M) |
app.py ADDED
@@ -0,0 +1,387 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ UNIStainNet Interactive Demo — Hugging Face Spaces (ZeroGPU)
4
+
5
+ Virtual staining of H&E histopathology images to IHC (HER2, Ki67, ER, PR).
6
+ Uses @spaces.GPU for on-demand GPU allocation on ZeroGPU.
7
+ """
8
+
9
+ import json
10
+ import os
11
+ import time
12
+ from pathlib import Path
13
+
14
+ import gradio as gr
15
+ import numpy as np
16
+ import torch
17
+
18
+ # ZeroGPU support: use @spaces.GPU if available, otherwise no-op
19
+ try:
20
+ import spaces
21
+ GPU_AVAILABLE = torch.cuda.is_available()
22
+ except ImportError:
23
+ spaces = None
24
+ GPU_AVAILABLE = torch.cuda.is_available()
25
+
26
+
27
+ def _gpu_decorator(duration=60):
28
+ """Apply @spaces.GPU if available, otherwise return identity decorator."""
29
+ if spaces is not None and hasattr(spaces, "GPU"):
30
+ return spaces.GPU(duration=duration)
31
+ return lambda fn: fn
32
+ import torch.nn.functional as F
33
+ import torchvision.transforms as T
34
+ import torchvision.transforms.functional as TF
35
+ from PIL import Image
36
+ from huggingface_hub import hf_hub_download
37
+
38
+ from src.models.trainer import UNIStainNetTrainer
39
+ from src.data.mist_dataset import STAIN_TO_LABEL, LABEL_TO_STAIN
40
+
41
+ # ── Constants ────────────────────────────────────────────────────────
42
+ STAIN_NAMES = ["HER2", "Ki67", "ER", "PR"]
43
+ GALLERY_DIR = Path(__file__).parent / "gallery"
44
+ TARGET_SIZE = 512
45
+
46
+ # Model repo where checkpoint is stored (uploaded separately)
47
+ MODEL_REPO = os.environ.get("MODEL_REPO", "faceless-void/UNIStainNet")
48
+ CHECKPOINT_FILENAME = "mist_multistain_last.ckpt"
49
+
50
+ # ── Global model cache (loaded lazily on GPU request) ────────────────
51
+ _model_cache = {"model": None, "uni_model": None, "spatial_pool_size": 32}
52
+
53
+
54
+ def _get_checkpoint_path():
55
+ """Download checkpoint from HF Hub if not local."""
56
+ local_path = Path(__file__).parent / "checkpoints" / CHECKPOINT_FILENAME
57
+ if local_path.exists():
58
+ return str(local_path)
59
+ # Download from HF model repo
60
+ return hf_hub_download(repo_id=MODEL_REPO, filename=CHECKPOINT_FILENAME)
61
+
62
+
63
+ def _load_models():
64
+ """Load UNIStainNet + UNI (called inside @spaces.GPU function)."""
65
+ if _model_cache["model"] is None:
66
+ import timm
67
+
68
+ ckpt_path = _get_checkpoint_path()
69
+ print(f"Loading UNIStainNet from {ckpt_path} ...")
70
+ model = UNIStainNetTrainer.load_from_checkpoint(ckpt_path, strict=False)
71
+ model = model.cuda().eval()
72
+ _model_cache["model"] = model
73
+ _model_cache["spatial_pool_size"] = getattr(
74
+ model.hparams, "uni_spatial_size", 32
75
+ )
76
+ print(" Generator loaded")
77
+
78
+ print("Loading UNI ViT-L/16 ...")
79
+ uni_model = timm.create_model(
80
+ "hf-hub:MahmoodLab/uni",
81
+ pretrained=True,
82
+ init_values=1e-5,
83
+ dynamic_img_size=True,
84
+ )
85
+ uni_model = uni_model.cuda().eval()
86
+ _model_cache["uni_model"] = uni_model
87
+ print(" UNI loaded")
88
+ else:
89
+ # Models already loaded — move to current GPU device
90
+ _model_cache["model"] = _model_cache["model"].cuda()
91
+ _model_cache["uni_model"] = _model_cache["uni_model"].cuda()
92
+
93
+ return _model_cache["model"], _model_cache["uni_model"], _model_cache["spatial_pool_size"]
94
+
95
+
96
+ # ── Preprocessing helpers ────────────────────────────────────────────
97
+
98
+ def preprocess_he(pil_image, target_size=TARGET_SIZE):
99
+ """Center-crop and resize H&E to target_size x target_size."""
100
+ w, h = pil_image.size
101
+ short = min(w, h)
102
+ left = (w - short) // 2
103
+ top = (h - short) // 2
104
+ pil_image = pil_image.crop((left, top, left + short, top + short))
105
+ if short != target_size:
106
+ pil_image = pil_image.resize((target_size, target_size), Image.BICUBIC)
107
+ return pil_image
108
+
109
+
110
+ def pil_to_tensor(pil_image):
111
+ """PIL → [1, 3, H, W] in [-1, 1]."""
112
+ t = TF.to_tensor(pil_image)
113
+ t = TF.normalize(t, [0.5] * 3, [0.5] * 3)
114
+ return t.unsqueeze(0)
115
+
116
+
117
+ def tensor_to_pil(tensor):
118
+ """[1, 3, H, W] in [-1, 1] → PIL."""
119
+ t = ((tensor[0].cpu() + 1) / 2).clamp(0, 1)
120
+ return TF.to_pil_image(t)
121
+
122
+
123
+ def extract_uni_features(uni_model, he_tensor_01, spatial_pool_size=32):
124
+ """Extract UNI spatial features from H&E crop ([1,3,H,W] in [0,1])."""
125
+ uni_transform = T.Normalize(
126
+ mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]
127
+ )
128
+ B = he_tensor_01.shape[0]
129
+ num_crops = 4
130
+ patches_per_side = 14
131
+ crop_h = he_tensor_01.shape[2] // num_crops
132
+ crop_w = he_tensor_01.shape[3] // num_crops
133
+
134
+ sub_crops = []
135
+ for i in range(num_crops):
136
+ for j in range(num_crops):
137
+ sub = he_tensor_01[
138
+ :, :, i * crop_h : (i + 1) * crop_h, j * crop_w : (j + 1) * crop_w
139
+ ]
140
+ sub = F.interpolate(sub, size=(224, 224), mode="bicubic", align_corners=False)
141
+ sub = torch.stack([uni_transform(s) for s in sub])
142
+ sub_crops.append(sub)
143
+
144
+ all_crops = torch.stack(sub_crops, dim=1).reshape(B * 16, 3, 224, 224).cuda()
145
+
146
+ with torch.no_grad():
147
+ all_feats = uni_model.forward_features(all_crops)
148
+ patch_tokens = all_feats[:, 1:, :]
149
+
150
+ patch_tokens = patch_tokens.reshape(
151
+ B, num_crops, num_crops, patches_per_side, patches_per_side, 1024
152
+ )
153
+ full_size = num_crops * patches_per_side
154
+ full_grid = patch_tokens.permute(0, 1, 3, 2, 4, 5).reshape(
155
+ B, full_size, full_size, 1024
156
+ )
157
+
158
+ S = spatial_pool_size
159
+ if S < full_size:
160
+ grid_bchw = full_grid.permute(0, 3, 1, 2)
161
+ pooled = F.adaptive_avg_pool2d(grid_bchw, S)
162
+ result = pooled.permute(0, 2, 3, 1)
163
+ else:
164
+ result = full_grid
165
+
166
+ return result.reshape(B, S * S, 1024)
167
+
168
+
169
+ # ── GPU-accelerated inference functions ──────────────────────────────
170
+
171
+ @_gpu_decorator(duration=60)
172
+ def generate_single_stain(image, stain, guidance_scale):
173
+ """Generate a single IHC stain from an H&E image (GPU)."""
174
+ if image is None:
175
+ return None, "No image uploaded"
176
+
177
+ t0 = time.time()
178
+ model, uni_model, spatial_pool_size = _load_models()
179
+
180
+ he_pil = preprocess_he(image)
181
+ he_tensor = pil_to_tensor(he_pil).cuda()
182
+ he_01 = ((he_tensor + 1) / 2).clamp(0, 1)
183
+
184
+ uni_feats = extract_uni_features(uni_model, he_01, spatial_pool_size).cuda()
185
+ label = STAIN_TO_LABEL[stain]
186
+ labels = torch.tensor([label], device="cuda", dtype=torch.long)
187
+
188
+ with torch.no_grad():
189
+ gen = model.generate(he_tensor, uni_feats, labels, guidance_scale=guidance_scale)
190
+
191
+ result = tensor_to_pil(gen)
192
+ elapsed = time.time() - t0
193
+ return result, f"{elapsed:.2f}s"
194
+
195
+
196
+ @_gpu_decorator(duration=120)
197
+ def generate_all_stains(image, guidance_scale):
198
+ """Generate all 4 IHC stains from one H&E image (GPU)."""
199
+ if image is None:
200
+ return None, None, None, None, None, "No image uploaded"
201
+
202
+ t0 = time.time()
203
+ model, uni_model, spatial_pool_size = _load_models()
204
+
205
+ he_pil = preprocess_he(image)
206
+ he_tensor = pil_to_tensor(he_pil).cuda()
207
+ he_01 = ((he_tensor + 1) / 2).clamp(0, 1)
208
+
209
+ uni_feats = extract_uni_features(uni_model, he_01, spatial_pool_size).cuda()
210
+
211
+ results = {}
212
+ for stain in STAIN_NAMES:
213
+ label = STAIN_TO_LABEL[stain]
214
+ labels = torch.tensor([label], device="cuda", dtype=torch.long)
215
+ with torch.no_grad():
216
+ gen = model.generate(
217
+ he_tensor, uni_feats, labels, guidance_scale=guidance_scale
218
+ )
219
+ results[stain] = tensor_to_pil(gen)
220
+
221
+ elapsed = time.time() - t0
222
+ return (
223
+ he_pil,
224
+ results["HER2"],
225
+ results["Ki67"],
226
+ results["ER"],
227
+ results["PR"],
228
+ f"{elapsed:.2f}s",
229
+ )
230
+
231
+
232
+ # ── Gallery helpers ──────────────────────────────────────────────────
233
+
234
+ def load_gallery():
235
+ meta_path = GALLERY_DIR / "metadata.json"
236
+ if not meta_path.exists():
237
+ return None
238
+ with open(meta_path) as f:
239
+ return json.load(f)
240
+
241
+
242
+ def show_gallery(name, gallery):
243
+ if not name or not gallery or name not in gallery:
244
+ return None, None, None, None, None, None
245
+ entry = gallery[name]
246
+ base = GALLERY_DIR / "images"
247
+ he = Image.open(base / entry["he"]).convert("RGB") if "he" in entry else None
248
+ gt = Image.open(base / entry["gt"]).convert("RGB") if "gt" in entry else None
249
+ gen_her2 = Image.open(base / entry["gen_her2"]).convert("RGB") if "gen_her2" in entry else None
250
+ gen_ki67 = Image.open(base / entry["gen_ki67"]).convert("RGB") if "gen_ki67" in entry else None
251
+ gen_er = Image.open(base / entry["gen_er"]).convert("RGB") if "gen_er" in entry else None
252
+ gen_pr = Image.open(base / entry["gen_pr"]).convert("RGB") if "gen_pr" in entry else None
253
+ return he, gt, gen_her2, gen_ki67, gen_er, gen_pr
254
+
255
+
256
+ # ── Build Gradio App ─────────────────────────────────────────────────
257
+
258
+ gallery = load_gallery()
259
+ gallery_names = list(gallery.keys()) if gallery else []
260
+
261
+ with gr.Blocks(title="UNIStainNet — Virtual IHC Staining") as demo:
262
+ gr.Markdown(
263
+ """
264
+ # UNIStainNet: Foundation-Model-Guided Virtual Staining
265
+ **H&E → IHC (HER2, Ki67, ER, PR)** &nbsp;|&nbsp;
266
+ Single unified model &nbsp;|&nbsp; 42M parameters &nbsp;|&nbsp;
267
+ UNI spatial conditioning
268
+ """
269
+ )
270
+
271
+ # ── Tab 1: Single Stain ──────────────────────────────────────
272
+ with gr.Tab("Virtual Staining"):
273
+ with gr.Row():
274
+ with gr.Column(scale=1):
275
+ input_image = gr.Image(type="pil", label="Upload H&E Image", height=400)
276
+ stain_choice = gr.Radio(
277
+ choices=STAIN_NAMES, value="HER2", label="Target IHC Stain"
278
+ )
279
+ guidance_slider = gr.Slider(
280
+ minimum=1.0, maximum=3.0, step=0.1, value=1.0,
281
+ label="Guidance Scale (1.0 = no CFG)",
282
+ )
283
+ generate_btn = gr.Button("Generate", variant="primary")
284
+ gen_time = gr.Textbox(label="Time", interactive=False)
285
+ with gr.Column(scale=1):
286
+ output_image = gr.Image(type="pil", label="Generated IHC", height=400)
287
+
288
+ generate_btn.click(
289
+ fn=generate_single_stain,
290
+ inputs=[input_image, stain_choice, guidance_slider],
291
+ outputs=[output_image, gen_time],
292
+ )
293
+
294
+ # ── Tab 2: Cross-Stain ───────────────────────────────────────
295
+ with gr.Tab("Cross-Stain Comparison"):
296
+ gr.Markdown(
297
+ "Generate **all 4 IHC stains** from a single H&E input. "
298
+ "Demonstrates the unified multi-stain capability."
299
+ )
300
+ with gr.Row():
301
+ cross_input = gr.Image(type="pil", label="Upload H&E Image", height=350)
302
+ cross_guidance = gr.Slider(
303
+ minimum=1.0, maximum=3.0, step=0.1, value=1.0,
304
+ label="Guidance Scale",
305
+ )
306
+ cross_btn = gr.Button("Generate All Stains", variant="primary")
307
+ cross_time = gr.Textbox(label="Time", interactive=False)
308
+
309
+ with gr.Row():
310
+ cross_he_out = gr.Image(type="pil", label="H&E Input", height=300)
311
+ cross_her2 = gr.Image(type="pil", label="HER2", height=300)
312
+ cross_ki67 = gr.Image(type="pil", label="Ki67", height=300)
313
+ cross_er = gr.Image(type="pil", label="ER", height=300)
314
+ cross_pr = gr.Image(type="pil", label="PR", height=300)
315
+
316
+ cross_btn.click(
317
+ fn=generate_all_stains,
318
+ inputs=[cross_input, cross_guidance],
319
+ outputs=[cross_he_out, cross_her2, cross_ki67, cross_er, cross_pr, cross_time],
320
+ )
321
+
322
+ # ── Tab 3: Gallery ───────────────────────────────────────────
323
+ with gr.Tab("Gallery"):
324
+ if not gallery_names:
325
+ gr.Markdown("No pre-computed gallery available.")
326
+ else:
327
+ gr.Markdown(
328
+ "Pre-computed examples — no GPU required. "
329
+ "Select an example to view the H&E input and generated IHC stains."
330
+ )
331
+ gallery_dropdown = gr.Dropdown(
332
+ choices=gallery_names,
333
+ value=gallery_names[0] if gallery_names else None,
334
+ label="Select Example",
335
+ )
336
+ with gr.Row():
337
+ gal_he = gr.Image(type="pil", label="H&E Input", height=300)
338
+ gal_gt = gr.Image(type="pil", label="Ground Truth IHC", height=300)
339
+ with gr.Row():
340
+ gal_her2 = gr.Image(type="pil", label="Generated HER2", height=300)
341
+ gal_ki67 = gr.Image(type="pil", label="Generated Ki67", height=300)
342
+ gal_er = gr.Image(type="pil", label="Generated ER", height=300)
343
+ gal_pr = gr.Image(type="pil", label="Generated PR", height=300)
344
+
345
+ gallery_dropdown.change(
346
+ fn=lambda name: show_gallery(name, gallery),
347
+ inputs=[gallery_dropdown],
348
+ outputs=[gal_he, gal_gt, gal_her2, gal_ki67, gal_er, gal_pr],
349
+ )
350
+
351
+ # ── Tab 4: About ─────────────────────────────────────────────
352
+ with gr.Tab("About"):
353
+ gr.Markdown(
354
+ """
355
+ ## UNIStainNet
356
+
357
+ A SPADE-UNet generator conditioned on dense spatial tokens from a frozen
358
+ [UNI](https://github.com/mahmoodlab/UNI) pathology foundation model (ViT-L/16).
359
+
360
+ **Key features:**
361
+ - Dense UNI spatial conditioning (32x32 = 1,024 tokens)
362
+ - Misalignment-aware loss suite for consecutive-section training pairs
363
+ - Single unified model serves 4 IHC markers (HER2, Ki67, ER, PR)
364
+ - 42M generator parameters, single forward pass inference
365
+
366
+ ### Architecture
367
+
368
+ | Component | Details |
369
+ |-----------|---------|
370
+ | Generator | SPADE-UNet with UNI spatial conditioning + FiLM stain embeddings |
371
+ | Discriminator | Multi-scale PatchGAN (512 + 256) with spectral norm |
372
+ | UNI Features | 4x4 sub-crop tiling → UNI ViT-L/16 → 32x32 spatial tokens |
373
+ | Parameters | 42M (generator), UNI frozen (303M) |
374
+
375
+ ### Results (MIST, unified model)
376
+
377
+ | Stain | FID ↓ | KID×1k ↓ | Pearson-R ↑ | DAB KL ↓ |
378
+ |-------|-------|-----------|-------------|----------|
379
+ | HER2 | 34.5 | 2.2 | 0.929 | 0.166 |
380
+ | Ki67 | 27.2 | 1.8 | 0.927 | 0.119 |
381
+ | ER | 29.2 | 1.8 | 0.949 | 0.182 |
382
+ | PR | 29.0 | 1.1 | 0.943 | 0.171 |
383
+ """
384
+ )
385
+
386
+ if __name__ == "__main__":
387
+ demo.launch(theme=gr.themes.Soft())
gallery/images/BCI_HER2_0_00013_test_0_gen_er.png ADDED

Git LFS Details

  • SHA256: dc789fa197425c49b7143d09cc64ce779a8f2ab90d02f74e458184c4ba869dca
  • Pointer size: 131 Bytes
  • Size of remote file: 521 kB
gallery/images/BCI_HER2_0_00013_test_0_gen_her2.png ADDED

Git LFS Details

  • SHA256: 57c0fd8ffda5493549c298837eaa047628b1438883e54217bf5bca159ecd5987
  • Pointer size: 131 Bytes
  • Size of remote file: 519 kB
gallery/images/BCI_HER2_0_00013_test_0_gen_ki67.png ADDED

Git LFS Details

  • SHA256: a8e223fc1af2edf7b59e0d819726dac78fffc9e8acd493fbfca7b23cf1cb9bab
  • Pointer size: 131 Bytes
  • Size of remote file: 501 kB
gallery/images/BCI_HER2_0_00013_test_0_gen_pr.png ADDED

Git LFS Details

  • SHA256: d7f58670da43960e877b49db11836fd0f9707f23d462f17eae73b10751c7545b
  • Pointer size: 131 Bytes
  • Size of remote file: 499 kB
gallery/images/BCI_HER2_0_00013_test_0_gt.png ADDED

Git LFS Details

  • SHA256: a6d161935ea85422f14cfa9a0a358fc2ae7489e9ea1b52deb28cdd6bb23d59e2
  • Pointer size: 131 Bytes
  • Size of remote file: 502 kB
gallery/images/BCI_HER2_0_00013_test_0_he.png ADDED

Git LFS Details

  • SHA256: 69687a14b1a4c2269283376c2d537ee46642a46f95c73f0d331a2308c147aa8c
  • Pointer size: 131 Bytes
  • Size of remote file: 562 kB
gallery/images/BCI_HER2_0_00198_test_0_gen_er.png ADDED

Git LFS Details

  • SHA256: d9678827b6612a91c8eab8a21b309ea5ef1e34e50c7c1c28d64919860adeaaa5
  • Pointer size: 131 Bytes
  • Size of remote file: 283 kB
gallery/images/BCI_HER2_0_00198_test_0_gen_her2.png ADDED

Git LFS Details

  • SHA256: a8d29e119978a5543d1b6dcf1068e28ea869cf71d184d6601251aeabadf14cb1
  • Pointer size: 131 Bytes
  • Size of remote file: 289 kB
gallery/images/BCI_HER2_0_00198_test_0_gen_ki67.png ADDED

Git LFS Details

  • SHA256: bd8ae812c7e61e9e8376526f9b2438ba5cfb7e8b322882ca5b17435bab1fb361
  • Pointer size: 131 Bytes
  • Size of remote file: 274 kB
gallery/images/BCI_HER2_0_00198_test_0_gen_pr.png ADDED

Git LFS Details

  • SHA256: 8e008512f7b111fdbeba4850c400a9cf5ba0286c878dae0a7755375affacd561
  • Pointer size: 131 Bytes
  • Size of remote file: 290 kB
gallery/images/BCI_HER2_0_00198_test_0_gt.png ADDED

Git LFS Details

  • SHA256: 38ffc41a62699b2cf736cfbce735104f91cb3984414b54b7a9284fbb6876befb
  • Pointer size: 131 Bytes
  • Size of remote file: 244 kB
gallery/images/BCI_HER2_0_00198_test_0_he.png ADDED

Git LFS Details

  • SHA256: dd6fb1f6cbc7b9c32fe17fb7541e85168aa6161690f36b7c4c8a78f8a13e464e
  • Pointer size: 131 Bytes
  • Size of remote file: 302 kB
gallery/images/BCI_HER2_1+_00276_test_1+_gen_er.png ADDED

Git LFS Details

  • SHA256: c94ede19f468234baf4d730a790de1880f4c1d32bedfb96038b559244cdfe05b
  • Pointer size: 131 Bytes
  • Size of remote file: 481 kB
gallery/images/BCI_HER2_1+_00276_test_1+_gen_her2.png ADDED

Git LFS Details

  • SHA256: ec91a421bdee47bac2c61efe98a4b7c26a68e8318501ab7845ce2b275682f622
  • Pointer size: 131 Bytes
  • Size of remote file: 500 kB
gallery/images/BCI_HER2_1+_00276_test_1+_gen_ki67.png ADDED

Git LFS Details

  • SHA256: c5d01b80e336fd66650eb331a4a2d19c21ebc66d64aa23f012ad47f33c2e9a8e
  • Pointer size: 131 Bytes
  • Size of remote file: 494 kB
gallery/images/BCI_HER2_1+_00276_test_1+_gen_pr.png ADDED

Git LFS Details

  • SHA256: f7f2de3f3776824258817ec744a0943b0119a4c2931f7e3883cb157af2f7a9e6
  • Pointer size: 131 Bytes
  • Size of remote file: 430 kB
gallery/images/BCI_HER2_1+_00276_test_1+_gt.png ADDED

Git LFS Details

  • SHA256: f42edca3b23a7880ca67d4dec49efc8e04b0474f2b9933b224893306c9ead690
  • Pointer size: 131 Bytes
  • Size of remote file: 418 kB
gallery/images/BCI_HER2_1+_00276_test_1+_he.png ADDED

Git LFS Details

  • SHA256: 50868fff527ff0d2773a2b0e570a833f16ccada880cea2416b6ee2e1d646f16f
  • Pointer size: 131 Bytes
  • Size of remote file: 539 kB
gallery/images/BCI_HER2_1+_00791_test_1+_gen_er.png ADDED

Git LFS Details

  • SHA256: 9d7010b47a0efd3c5a0a9dd41dfb363fb36fa0d3d0aa7f94bc905e46decef2fd
  • Pointer size: 131 Bytes
  • Size of remote file: 490 kB
gallery/images/BCI_HER2_1+_00791_test_1+_gen_her2.png ADDED

Git LFS Details

  • SHA256: 1b4d42a453a446925da699587173d9fb4a8f723be35b65315b9fd08dfb437489
  • Pointer size: 131 Bytes
  • Size of remote file: 496 kB
gallery/images/BCI_HER2_1+_00791_test_1+_gen_ki67.png ADDED

Git LFS Details

  • SHA256: 02b57becf88737f53d75f98a82c8223895253f9703e2e6b6fc1fddbcfe712558
  • Pointer size: 131 Bytes
  • Size of remote file: 485 kB
gallery/images/BCI_HER2_1+_00791_test_1+_gen_pr.png ADDED

Git LFS Details

  • SHA256: 83662375fb4d3984d06240578cfedfd9c423cad53abb3a834a1abbd5fd5d39cd
  • Pointer size: 131 Bytes
  • Size of remote file: 456 kB
gallery/images/BCI_HER2_1+_00791_test_1+_gt.png ADDED

Git LFS Details

  • SHA256: 9de571b040f68a8075457e591194ec965057cefded78a331d780aad92e0a91b7
  • Pointer size: 131 Bytes
  • Size of remote file: 465 kB
gallery/images/BCI_HER2_1+_00791_test_1+_he.png ADDED

Git LFS Details

  • SHA256: 4c5b181b97abfadc0f5407b4bcd629b2ebbe73e20401abc70f33441b35cea914
  • Pointer size: 131 Bytes
  • Size of remote file: 570 kB
gallery/images/BCI_HER2_2+_00259_test_2+_gen_er.png ADDED

Git LFS Details

  • SHA256: 969fdbaba07d7da7e041f43ca87d62702b62ed37e0de8ded38c8c678534adfbe
  • Pointer size: 131 Bytes
  • Size of remote file: 447 kB
gallery/images/BCI_HER2_2+_00259_test_2+_gen_her2.png ADDED

Git LFS Details

  • SHA256: ec43b658c02834878de5b23171b8a046aabcdc993f2dfde5ed50a187e53e47f1
  • Pointer size: 131 Bytes
  • Size of remote file: 455 kB
gallery/images/BCI_HER2_2+_00259_test_2+_gen_ki67.png ADDED

Git LFS Details

  • SHA256: a53cdb569ac5722d91d16d58a760f84d2209034cb32299629f76b1ae02d57d11
  • Pointer size: 131 Bytes
  • Size of remote file: 455 kB
gallery/images/BCI_HER2_2+_00259_test_2+_gen_pr.png ADDED

Git LFS Details

  • SHA256: 91b892c18687414106685daa03682bdcdfc6ce38fa52a4fe1349e6bc4c35d1a5
  • Pointer size: 131 Bytes
  • Size of remote file: 425 kB
gallery/images/BCI_HER2_2+_00259_test_2+_gt.png ADDED

Git LFS Details

  • SHA256: 8ed9c7407ddeb12ca2e91a753b80b16740fc1528a76f776b45905bf233d5d465
  • Pointer size: 131 Bytes
  • Size of remote file: 426 kB
gallery/images/BCI_HER2_2+_00259_test_2+_he.png ADDED

Git LFS Details

  • SHA256: b9244bad717ddb156ad2b27166820bef4d8e7e18480076985ec0191fdff8767b
  • Pointer size: 131 Bytes
  • Size of remote file: 515 kB
gallery/images/BCI_HER2_2+_00293_test_2+_gen_er.png ADDED

Git LFS Details

  • SHA256: c3c4a3689bde21544f9e4405215508eee5417f612b3f6153e84503a1c7a2d684
  • Pointer size: 131 Bytes
  • Size of remote file: 501 kB
gallery/images/BCI_HER2_2+_00293_test_2+_gen_her2.png ADDED

Git LFS Details

  • SHA256: 7baaffd3656d5c1f6200a8054dee201a211889d5f5c95dc8b8ed09c155da3218
  • Pointer size: 131 Bytes
  • Size of remote file: 469 kB
gallery/images/BCI_HER2_2+_00293_test_2+_gen_ki67.png ADDED

Git LFS Details

  • SHA256: 9323d4924d59b0387c5324d8223201326a4cc470a28d6660182b1c59e547a4c5
  • Pointer size: 131 Bytes
  • Size of remote file: 459 kB
gallery/images/BCI_HER2_2+_00293_test_2+_gen_pr.png ADDED

Git LFS Details

  • SHA256: 3e44ded8eb730b8dae1eb9c7cc51f5b9efc07131a6cf268f4552f85094b19af3
  • Pointer size: 131 Bytes
  • Size of remote file: 445 kB
gallery/images/BCI_HER2_2+_00293_test_2+_gt.png ADDED

Git LFS Details

  • SHA256: 6ac2b306b50b1eb945c46dfa1a47909cdf4bb93b81f659d0090a080ea7a3663a
  • Pointer size: 131 Bytes
  • Size of remote file: 476 kB
gallery/images/BCI_HER2_2+_00293_test_2+_he.png ADDED

Git LFS Details

  • SHA256: afab90825ca78657d59802893887726befb8ffa66f348f550b12ab020fa6202e
  • Pointer size: 131 Bytes
  • Size of remote file: 540 kB
gallery/images/BCI_HER2_3+_00220_test_3+_gen_er.png ADDED

Git LFS Details

  • SHA256: 139bcccf67267f052eea9ca5b04aefeee13d135d54be3f865b34d470edb64e53
  • Pointer size: 131 Bytes
  • Size of remote file: 529 kB
gallery/images/BCI_HER2_3+_00220_test_3+_gen_her2.png ADDED

Git LFS Details

  • SHA256: 306ef597f5ce18501e0498af2ec0282f8578d844d680b44532aa3620d5e0cbf3
  • Pointer size: 131 Bytes
  • Size of remote file: 530 kB
gallery/images/BCI_HER2_3+_00220_test_3+_gen_ki67.png ADDED

Git LFS Details

  • SHA256: b61bda4b3e2f149a8e4c9ca88f42e91fe34dbe9e2cdd47bb29b36ee3fe8d40d1
  • Pointer size: 131 Bytes
  • Size of remote file: 517 kB
gallery/images/BCI_HER2_3+_00220_test_3+_gen_pr.png ADDED

Git LFS Details

  • SHA256: e3918decb0c055332cd490e478e207ccdd2a32480a1c0ee3bb68f8718ab5a1d3
  • Pointer size: 131 Bytes
  • Size of remote file: 503 kB
gallery/images/BCI_HER2_3+_00220_test_3+_gt.png ADDED

Git LFS Details

  • SHA256: 1e1c374e468a8739e9369d6d5123d96ee54d2bdb5582553a3356adb58ccb91ed
  • Pointer size: 131 Bytes
  • Size of remote file: 461 kB
gallery/images/BCI_HER2_3+_00220_test_3+_he.png ADDED

Git LFS Details

  • SHA256: eefa14a632fb7629cd4fa29431f2f376325858cd5c0ed763a9ecf05ff6581965
  • Pointer size: 131 Bytes
  • Size of remote file: 562 kB
gallery/images/BCI_HER2_3+_00277_test_3+_gen_er.png ADDED

Git LFS Details

  • SHA256: cb891640988f393c3d237049a21892d8b693f366458c041f32c07b328a9b7729
  • Pointer size: 131 Bytes
  • Size of remote file: 574 kB
gallery/images/BCI_HER2_3+_00277_test_3+_gen_her2.png ADDED

Git LFS Details

  • SHA256: 74d5e1774b08a110ab48c7355a87094be61f1200faa5251e25a9e3c185dd407e
  • Pointer size: 131 Bytes
  • Size of remote file: 575 kB
gallery/images/BCI_HER2_3+_00277_test_3+_gen_ki67.png ADDED

Git LFS Details

  • SHA256: e4623157751e69b12b78c994b0e8cc6f03a57c47e1c9638d870b7db0bc2450fe
  • Pointer size: 131 Bytes
  • Size of remote file: 565 kB
gallery/images/BCI_HER2_3+_00277_test_3+_gen_pr.png ADDED

Git LFS Details

  • SHA256: 418a0805d44a33ae41330a8c8a0fc40420a421d28b140680dbe41731a7167950
  • Pointer size: 131 Bytes
  • Size of remote file: 554 kB
gallery/images/BCI_HER2_3+_00277_test_3+_gt.png ADDED

Git LFS Details

  • SHA256: 45f2757b9fa0e2b427c40ee10a00a5c4101d4eb824dc1bbd50e193d690f29641
  • Pointer size: 131 Bytes
  • Size of remote file: 468 kB