Bing Yan commited on
Commit ·
1e4169d
1
Parent(s): 7fcacad
Add image examples to From Image tabs
Browse files- Add demo_renders/ (LFS-tracked) with 96 pre-rendered example images
for all CV and TPD mechanisms
- Add example dropdown + gallery preview to CV and TPD "From Image" tabs
- Users can select a mechanism, preview expected outputs, and load
physical images as input with pre-filled scan rates / heating rates
Made-with: Cursor
This view is limited to 50 files because it contains too many changes. See raw diff
- .gitattributes +1 -0
- app.py +156 -0
- demo_renders/ec_Ads_11mVs_physical.png +3 -0
- demo_renders/ec_Ads_244mVs_physical.png +3 -0
- demo_renders/ec_Ads_4025mVs_physical.png +3 -0
- demo_renders/ec_Ads_classification.png +3 -0
- demo_renders/ec_Ads_concentration.png +3 -0
- demo_renders/ec_Ads_posteriors.png +3 -0
- demo_renders/ec_Ads_reconstruction.png +3 -0
- demo_renders/ec_BV_11mVs_physical.png +3 -0
- demo_renders/ec_BV_244_conc_arrows.png +3 -0
- demo_renders/ec_BV_244_single_cls.png +3 -0
- demo_renders/ec_BV_244_single_conc.png +3 -0
- demo_renders/ec_BV_244_single_recon.png +3 -0
- demo_renders/ec_BV_244_single_table.png +3 -0
- demo_renders/ec_BV_244mVs_physical.png +3 -0
- demo_renders/ec_BV_3scan_cls.png +3 -0
- demo_renders/ec_BV_3scan_conc.png +3 -0
- demo_renders/ec_BV_3scan_conc_arrows.png +3 -0
- demo_renders/ec_BV_3scan_table.png +3 -0
- demo_renders/ec_BV_4025mVs_physical.png +3 -0
- demo_renders/ec_BV_as_MHC_posteriors.png +3 -0
- demo_renders/ec_BV_as_MHC_reconstruction.png +3 -0
- demo_renders/ec_BV_classification.png +3 -0
- demo_renders/ec_BV_concentration.png +3 -0
- demo_renders/ec_BV_phys_classification.png +3 -0
- demo_renders/ec_BV_phys_reconstruction.png +3 -0
- demo_renders/ec_BV_posteriors.png +3 -0
- demo_renders/ec_BV_reconstruction.png +3 -0
- demo_renders/ec_EC_10mVs_physical.png +3 -0
- demo_renders/ec_EC_127mVs_physical.png +3 -0
- demo_renders/ec_EC_7638mVs_physical.png +3 -0
- demo_renders/ec_EC_classification.png +3 -0
- demo_renders/ec_EC_concentration.png +3 -0
- demo_renders/ec_EC_posteriors.png +3 -0
- demo_renders/ec_EC_reconstruction.png +3 -0
- demo_renders/ec_LH_10000mVs_physical.png +3 -0
- demo_renders/ec_LH_10mVs_physical.png +3 -0
- demo_renders/ec_LH_668mVs_physical.png +3 -0
- demo_renders/ec_LH_classification.png +3 -0
- demo_renders/ec_LH_concentration.png +3 -0
- demo_renders/ec_LH_posteriors.png +3 -0
- demo_renders/ec_LH_reconstruction.png +3 -0
- demo_renders/ec_MHC_11mVs_physical.png +3 -0
- demo_renders/ec_MHC_244mVs_physical.png +3 -0
- demo_renders/ec_MHC_4025mVs_physical.png +3 -0
- demo_renders/ec_MHC_classification.png +3 -0
- demo_renders/ec_MHC_concentration.png +3 -0
- demo_renders/ec_MHC_posteriors.png +3 -0
- demo_renders/ec_MHC_reconstruction.png +3 -0
.gitattributes
CHANGED
|
@@ -33,3 +33,4 @@ 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 |
+
demo_renders/*.png filter=lfs diff=lfs merge=lfs -text
|
app.py
CHANGED
|
@@ -36,6 +36,7 @@ from plotting import (
|
|
| 36 |
# ---------------------------------------------------------------------------
|
| 37 |
REPO_ROOT = Path(__file__).resolve().parent
|
| 38 |
DEMO_DIR = REPO_ROOT / "demo_data"
|
|
|
|
| 39 |
|
| 40 |
EC_CHECKPOINT = REPO_ROOT / "checkpoints" / "ec_best.pt"
|
| 41 |
TPD_CHECKPOINT = REPO_ROOT / "checkpoints" / "tpd_best.pt"
|
|
@@ -86,6 +87,75 @@ def _discover_examples():
|
|
| 86 |
CV_EXAMPLES, TPD_EXAMPLES = _discover_examples()
|
| 87 |
|
| 88 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 89 |
def _load_cv_example(example_name):
|
| 90 |
"""Return (files, scan_rates, E0, T, A, C, D, n) for the chosen CV example."""
|
| 91 |
if not example_name or example_name not in CV_EXAMPLES:
|
|
@@ -790,6 +860,24 @@ def build_app():
|
|
| 790 |
"Axis bounds are **auto-detected** via OCR — "
|
| 791 |
"override in Advanced if needed."
|
| 792 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 793 |
cv_img_files = gr.File(
|
| 794 |
label="Plot images (one per scan rate)",
|
| 795 |
file_count="multiple",
|
|
@@ -860,6 +948,31 @@ def build_app():
|
|
| 860 |
inputs=[cv_img_mech_dd, cv_img_state],
|
| 861 |
outputs=[cv_img_posteriors, cv_img_param_table, cv_img_recon, cv_img_conc],
|
| 862 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 863 |
|
| 864 |
# =================================================================
|
| 865 |
# Tab 2: TPD Analysis
|
|
@@ -940,6 +1053,24 @@ def build_app():
|
|
| 940 |
"Axis bounds are **auto-detected** via OCR — "
|
| 941 |
"override in Advanced if needed."
|
| 942 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 943 |
tpd_img_files = gr.File(
|
| 944 |
label="Plot images (one per heating rate)",
|
| 945 |
file_count="multiple",
|
|
@@ -997,6 +1128,31 @@ def build_app():
|
|
| 997 |
inputs=[tpd_img_mech_dd, tpd_img_state],
|
| 998 |
outputs=[tpd_img_posteriors, tpd_img_param_table, tpd_img_recon],
|
| 999 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1000 |
|
| 1001 |
# =================================================================
|
| 1002 |
# Tab 3: About
|
|
|
|
| 36 |
# ---------------------------------------------------------------------------
|
| 37 |
REPO_ROOT = Path(__file__).resolve().parent
|
| 38 |
DEMO_DIR = REPO_ROOT / "demo_data"
|
| 39 |
+
DEMO_RENDERS = REPO_ROOT / "demo_renders"
|
| 40 |
|
| 41 |
EC_CHECKPOINT = REPO_ROOT / "checkpoints" / "ec_best.pt"
|
| 42 |
TPD_CHECKPOINT = REPO_ROOT / "checkpoints" / "tpd_best.pt"
|
|
|
|
| 87 |
CV_EXAMPLES, TPD_EXAMPLES = _discover_examples()
|
| 88 |
|
| 89 |
|
| 90 |
+
def _discover_image_examples():
|
| 91 |
+
"""Build image example catalogs from demo_renders/ directory."""
|
| 92 |
+
import re
|
| 93 |
+
cv_img_examples = {}
|
| 94 |
+
tpd_img_examples = {}
|
| 95 |
+
cv_output_renders = {}
|
| 96 |
+
tpd_output_renders = {}
|
| 97 |
+
|
| 98 |
+
if not DEMO_RENDERS.is_dir():
|
| 99 |
+
return cv_img_examples, tpd_img_examples, cv_output_renders, tpd_output_renders
|
| 100 |
+
|
| 101 |
+
for p in sorted(DEMO_RENDERS.glob("ec_*_physical.png")):
|
| 102 |
+
m = re.match(r"ec_(\w+?)_(\d+)mVs_physical\.png", p.name)
|
| 103 |
+
if not m:
|
| 104 |
+
continue
|
| 105 |
+
mech, rate_mVs = m.group(1), int(m.group(2))
|
| 106 |
+
rate_Vs = rate_mVs / 1000.0
|
| 107 |
+
cv_img_examples.setdefault(mech, []).append((str(p), rate_Vs))
|
| 108 |
+
|
| 109 |
+
for p in sorted(DEMO_RENDERS.glob("tpd_*_physical.png")):
|
| 110 |
+
m = re.match(r"tpd_(\w+?)_(\d+)_physical\.png", p.name)
|
| 111 |
+
if not m:
|
| 112 |
+
continue
|
| 113 |
+
mech, idx = m.group(1), m.group(2)
|
| 114 |
+
tpd_img_examples.setdefault(mech, []).append((str(p), idx))
|
| 115 |
+
|
| 116 |
+
for mech in cv_img_examples:
|
| 117 |
+
renders = {}
|
| 118 |
+
for suffix in ["classification", "posteriors", "reconstruction", "concentration"]:
|
| 119 |
+
rp = DEMO_RENDERS / f"ec_{mech}_{suffix}.png"
|
| 120 |
+
if rp.exists():
|
| 121 |
+
renders[suffix] = str(rp)
|
| 122 |
+
if renders:
|
| 123 |
+
cv_output_renders[mech] = renders
|
| 124 |
+
|
| 125 |
+
for mech in tpd_img_examples:
|
| 126 |
+
renders = {}
|
| 127 |
+
for suffix in ["classification", "posteriors", "reconstruction"]:
|
| 128 |
+
rp = DEMO_RENDERS / f"tpd_{mech}_{suffix}.png"
|
| 129 |
+
if rp.exists():
|
| 130 |
+
renders[suffix] = str(rp)
|
| 131 |
+
if renders:
|
| 132 |
+
tpd_output_renders[mech] = renders
|
| 133 |
+
|
| 134 |
+
return cv_img_examples, tpd_img_examples, cv_output_renders, tpd_output_renders
|
| 135 |
+
|
| 136 |
+
|
| 137 |
+
(CV_IMG_EXAMPLES, TPD_IMG_EXAMPLES,
|
| 138 |
+
CV_OUTPUT_RENDERS, TPD_OUTPUT_RENDERS) = _discover_image_examples()
|
| 139 |
+
|
| 140 |
+
|
| 141 |
+
def _load_cv_image_example(mech_name):
|
| 142 |
+
"""Return (files, scan_rates_str) for a CV image example."""
|
| 143 |
+
if not mech_name or mech_name not in CV_IMG_EXAMPLES:
|
| 144 |
+
return [gr.update()] * 2
|
| 145 |
+
entries = CV_IMG_EXAMPLES[mech_name]
|
| 146 |
+
files = [e[0] for e in entries]
|
| 147 |
+
rates_str = ", ".join(f"{e[1]}" for e in entries)
|
| 148 |
+
return files, rates_str
|
| 149 |
+
|
| 150 |
+
|
| 151 |
+
def _load_tpd_image_example(mech_name):
|
| 152 |
+
"""Return (image_path, heating_rate_str) for a TPD image example."""
|
| 153 |
+
if not mech_name or mech_name not in TPD_IMG_EXAMPLES:
|
| 154 |
+
return [gr.update()] * 2
|
| 155 |
+
entries = TPD_IMG_EXAMPLES[mech_name]
|
| 156 |
+
return entries[0][0], entries[0][1]
|
| 157 |
+
|
| 158 |
+
|
| 159 |
def _load_cv_example(example_name):
|
| 160 |
"""Return (files, scan_rates, E0, T, A, C, D, n) for the chosen CV example."""
|
| 161 |
if not example_name or example_name not in CV_EXAMPLES:
|
|
|
|
| 860 |
"Axis bounds are **auto-detected** via OCR — "
|
| 861 |
"override in Advanced if needed."
|
| 862 |
)
|
| 863 |
+
if CV_IMG_EXAMPLES:
|
| 864 |
+
with gr.Accordion("Try an example (click to load)", open=True):
|
| 865 |
+
with gr.Row():
|
| 866 |
+
cv_img_example_dd = gr.Dropdown(
|
| 867 |
+
label="Select mechanism",
|
| 868 |
+
choices=list(CV_IMG_EXAMPLES.keys()),
|
| 869 |
+
value=None,
|
| 870 |
+
interactive=True,
|
| 871 |
+
scale=3,
|
| 872 |
+
)
|
| 873 |
+
cv_img_example_btn = gr.Button(
|
| 874 |
+
"Load Example", variant="secondary", scale=1,
|
| 875 |
+
)
|
| 876 |
+
cv_img_example_gallery = gr.Gallery(
|
| 877 |
+
label="Example output (classification → posteriors → reconstruction)",
|
| 878 |
+
columns=3, height=220, object_fit="contain",
|
| 879 |
+
interactive=False,
|
| 880 |
+
)
|
| 881 |
cv_img_files = gr.File(
|
| 882 |
label="Plot images (one per scan rate)",
|
| 883 |
file_count="multiple",
|
|
|
|
| 948 |
inputs=[cv_img_mech_dd, cv_img_state],
|
| 949 |
outputs=[cv_img_posteriors, cv_img_param_table, cv_img_recon, cv_img_conc],
|
| 950 |
)
|
| 951 |
+
if CV_IMG_EXAMPLES:
|
| 952 |
+
def _on_cv_img_example_select(mech_name):
|
| 953 |
+
files, rates = _load_cv_image_example(mech_name)
|
| 954 |
+
renders = CV_OUTPUT_RENDERS.get(mech_name, {})
|
| 955 |
+
gallery_imgs = [
|
| 956 |
+
renders[k] for k in
|
| 957 |
+
["classification", "posteriors", "reconstruction"]
|
| 958 |
+
if k in renders
|
| 959 |
+
]
|
| 960 |
+
return files, rates, gallery_imgs
|
| 961 |
+
|
| 962 |
+
cv_img_example_btn.click(
|
| 963 |
+
_on_cv_img_example_select,
|
| 964 |
+
inputs=[cv_img_example_dd],
|
| 965 |
+
outputs=[cv_img_files, cv_img_scan_rate, cv_img_example_gallery],
|
| 966 |
+
)
|
| 967 |
+
cv_img_example_dd.change(
|
| 968 |
+
lambda m: [
|
| 969 |
+
CV_OUTPUT_RENDERS.get(m, {}).get(k)
|
| 970 |
+
for k in ["classification", "posteriors", "reconstruction"]
|
| 971 |
+
if CV_OUTPUT_RENDERS.get(m, {}).get(k)
|
| 972 |
+
],
|
| 973 |
+
inputs=[cv_img_example_dd],
|
| 974 |
+
outputs=[cv_img_example_gallery],
|
| 975 |
+
)
|
| 976 |
|
| 977 |
# =================================================================
|
| 978 |
# Tab 2: TPD Analysis
|
|
|
|
| 1053 |
"Axis bounds are **auto-detected** via OCR — "
|
| 1054 |
"override in Advanced if needed."
|
| 1055 |
)
|
| 1056 |
+
if TPD_IMG_EXAMPLES:
|
| 1057 |
+
with gr.Accordion("Try an example (click to load)", open=True):
|
| 1058 |
+
with gr.Row():
|
| 1059 |
+
tpd_img_example_dd = gr.Dropdown(
|
| 1060 |
+
label="Select mechanism",
|
| 1061 |
+
choices=list(TPD_IMG_EXAMPLES.keys()),
|
| 1062 |
+
value=None,
|
| 1063 |
+
interactive=True,
|
| 1064 |
+
scale=3,
|
| 1065 |
+
)
|
| 1066 |
+
tpd_img_example_btn = gr.Button(
|
| 1067 |
+
"Load Example", variant="secondary", scale=1,
|
| 1068 |
+
)
|
| 1069 |
+
tpd_img_example_gallery = gr.Gallery(
|
| 1070 |
+
label="Example output (classification → posteriors → reconstruction)",
|
| 1071 |
+
columns=3, height=220, object_fit="contain",
|
| 1072 |
+
interactive=False,
|
| 1073 |
+
)
|
| 1074 |
tpd_img_files = gr.File(
|
| 1075 |
label="Plot images (one per heating rate)",
|
| 1076 |
file_count="multiple",
|
|
|
|
| 1128 |
inputs=[tpd_img_mech_dd, tpd_img_state],
|
| 1129 |
outputs=[tpd_img_posteriors, tpd_img_param_table, tpd_img_recon],
|
| 1130 |
)
|
| 1131 |
+
if TPD_IMG_EXAMPLES:
|
| 1132 |
+
def _on_tpd_img_example_select(mech_name):
|
| 1133 |
+
files, betas = _load_tpd_image_example(mech_name)
|
| 1134 |
+
renders = TPD_OUTPUT_RENDERS.get(mech_name, {})
|
| 1135 |
+
gallery_imgs = [
|
| 1136 |
+
renders[k] for k in
|
| 1137 |
+
["classification", "posteriors", "reconstruction"]
|
| 1138 |
+
if k in renders
|
| 1139 |
+
]
|
| 1140 |
+
return files, betas, gallery_imgs
|
| 1141 |
+
|
| 1142 |
+
tpd_img_example_btn.click(
|
| 1143 |
+
_on_tpd_img_example_select,
|
| 1144 |
+
inputs=[tpd_img_example_dd],
|
| 1145 |
+
outputs=[tpd_img_files, tpd_img_betas, tpd_img_example_gallery],
|
| 1146 |
+
)
|
| 1147 |
+
tpd_img_example_dd.change(
|
| 1148 |
+
lambda m: [
|
| 1149 |
+
TPD_OUTPUT_RENDERS.get(m, {}).get(k)
|
| 1150 |
+
for k in ["classification", "posteriors", "reconstruction"]
|
| 1151 |
+
if TPD_OUTPUT_RENDERS.get(m, {}).get(k)
|
| 1152 |
+
],
|
| 1153 |
+
inputs=[tpd_img_example_dd],
|
| 1154 |
+
outputs=[tpd_img_example_gallery],
|
| 1155 |
+
)
|
| 1156 |
|
| 1157 |
# =================================================================
|
| 1158 |
# Tab 3: About
|
demo_renders/ec_Ads_11mVs_physical.png
ADDED
|
Git LFS Details
|
demo_renders/ec_Ads_244mVs_physical.png
ADDED
|
Git LFS Details
|
demo_renders/ec_Ads_4025mVs_physical.png
ADDED
|
Git LFS Details
|
demo_renders/ec_Ads_classification.png
ADDED
|
Git LFS Details
|
demo_renders/ec_Ads_concentration.png
ADDED
|
Git LFS Details
|
demo_renders/ec_Ads_posteriors.png
ADDED
|
Git LFS Details
|
demo_renders/ec_Ads_reconstruction.png
ADDED
|
Git LFS Details
|
demo_renders/ec_BV_11mVs_physical.png
ADDED
|
Git LFS Details
|
demo_renders/ec_BV_244_conc_arrows.png
ADDED
|
Git LFS Details
|
demo_renders/ec_BV_244_single_cls.png
ADDED
|
Git LFS Details
|
demo_renders/ec_BV_244_single_conc.png
ADDED
|
Git LFS Details
|
demo_renders/ec_BV_244_single_recon.png
ADDED
|
Git LFS Details
|
demo_renders/ec_BV_244_single_table.png
ADDED
|
Git LFS Details
|
demo_renders/ec_BV_244mVs_physical.png
ADDED
|
Git LFS Details
|
demo_renders/ec_BV_3scan_cls.png
ADDED
|
Git LFS Details
|
demo_renders/ec_BV_3scan_conc.png
ADDED
|
Git LFS Details
|
demo_renders/ec_BV_3scan_conc_arrows.png
ADDED
|
Git LFS Details
|
demo_renders/ec_BV_3scan_table.png
ADDED
|
Git LFS Details
|
demo_renders/ec_BV_4025mVs_physical.png
ADDED
|
Git LFS Details
|
demo_renders/ec_BV_as_MHC_posteriors.png
ADDED
|
Git LFS Details
|
demo_renders/ec_BV_as_MHC_reconstruction.png
ADDED
|
Git LFS Details
|
demo_renders/ec_BV_classification.png
ADDED
|
Git LFS Details
|
demo_renders/ec_BV_concentration.png
ADDED
|
Git LFS Details
|
demo_renders/ec_BV_phys_classification.png
ADDED
|
Git LFS Details
|
demo_renders/ec_BV_phys_reconstruction.png
ADDED
|
Git LFS Details
|
demo_renders/ec_BV_posteriors.png
ADDED
|
Git LFS Details
|
demo_renders/ec_BV_reconstruction.png
ADDED
|
Git LFS Details
|
demo_renders/ec_EC_10mVs_physical.png
ADDED
|
Git LFS Details
|
demo_renders/ec_EC_127mVs_physical.png
ADDED
|
Git LFS Details
|
demo_renders/ec_EC_7638mVs_physical.png
ADDED
|
Git LFS Details
|
demo_renders/ec_EC_classification.png
ADDED
|
Git LFS Details
|
demo_renders/ec_EC_concentration.png
ADDED
|
Git LFS Details
|
demo_renders/ec_EC_posteriors.png
ADDED
|
Git LFS Details
|
demo_renders/ec_EC_reconstruction.png
ADDED
|
Git LFS Details
|
demo_renders/ec_LH_10000mVs_physical.png
ADDED
|
Git LFS Details
|
demo_renders/ec_LH_10mVs_physical.png
ADDED
|
Git LFS Details
|
demo_renders/ec_LH_668mVs_physical.png
ADDED
|
Git LFS Details
|
demo_renders/ec_LH_classification.png
ADDED
|
Git LFS Details
|
demo_renders/ec_LH_concentration.png
ADDED
|
Git LFS Details
|
demo_renders/ec_LH_posteriors.png
ADDED
|
Git LFS Details
|
demo_renders/ec_LH_reconstruction.png
ADDED
|
Git LFS Details
|
demo_renders/ec_MHC_11mVs_physical.png
ADDED
|
Git LFS Details
|
demo_renders/ec_MHC_244mVs_physical.png
ADDED
|
Git LFS Details
|
demo_renders/ec_MHC_4025mVs_physical.png
ADDED
|
Git LFS Details
|
demo_renders/ec_MHC_classification.png
ADDED
|
Git LFS Details
|
demo_renders/ec_MHC_concentration.png
ADDED
|
Git LFS Details
|
demo_renders/ec_MHC_posteriors.png
ADDED
|
Git LFS Details
|
demo_renders/ec_MHC_reconstruction.png
ADDED
|
Git LFS Details
|