Download source/app.py from ARotting/pocket-jepa: direct link, hf CLI and curl.
- Browser
- Download file 2.79 kB
-
https://huggingface.co/ARotting/pocket-jepa/resolve/main/source/app.py
- Command line
-
hf download hf://ARotting/pocket-jepa/source/app.py
-
curl -L -o app.py https://huggingface.co/ARotting/pocket-jepa/resolve/main/source/app.py
2.79 kB
| from __future__ import annotations | |
| from pathlib import Path | |
| import gradio as gr | |
| import numpy as np | |
| import plotly.graph_objects as go | |
| import torch | |
| from model import JEncoder | |
| from plotly.subplots import make_subplots | |
| from safetensors.torch import load_file | |
| ARTIFACT_DIR = Path(__file__).resolve().parent / "artifacts" / "pocket-jepa" | |
| MODEL = JEncoder() | |
| MODEL.load_state_dict(load_file(ARTIFACT_DIR / "model.safetensors")) | |
| MODEL.eval() | |
| ATLAS = np.load(ARTIFACT_DIR / "j_space.npz") | |
| EMBEDDINGS = ATLAS["embeddings"] | |
| IMAGES = ATLAS["images"] | |
| LABELS = ATLAS["labels"] | |
| def explore(index: int, mask_size: int) -> tuple[go.Figure, dict]: | |
| index = int(index) % len(IMAGES) | |
| mask_size = int(mask_size) | |
| image = IMAGES[index].copy() | |
| masked = image.copy() | |
| start = (8 - mask_size) // 2 | |
| masked[start : start + mask_size, start : start + mask_size] = 0 | |
| with torch.inference_mode(): | |
| embedding = MODEL( | |
| torch.from_numpy(masked[None].astype(np.float32)) | |
| ).numpy()[0] | |
| embedding /= max(np.linalg.norm(embedding), 1e-8) | |
| distances = 1 - EMBEDDINGS @ embedding | |
| nearest = np.argsort(distances)[:5] | |
| panels = [image, masked, *IMAGES[nearest[:3]]] | |
| titles = [ | |
| f"Original: {LABELS[index]}", | |
| "Masked context", | |
| *[f"J-neighbor: {LABELS[item]}" for item in nearest[:3]], | |
| ] | |
| figure = make_subplots(rows=1, cols=5, subplot_titles=titles) | |
| for panel_index, (panel, title) in enumerate(zip(panels, titles, strict=True)): | |
| figure.add_trace( | |
| go.Heatmap( | |
| z=np.flipud(panel), | |
| colorscale="Viridis", | |
| showscale=False, | |
| name=title, | |
| ), | |
| row=1, | |
| col=panel_index + 1, | |
| ) | |
| figure.update_layout( | |
| title="Masked prediction in learned J-space", | |
| template="plotly_dark", | |
| height=310, | |
| margin=dict(t=70, b=20), | |
| ) | |
| return figure, { | |
| "query_label": int(LABELS[index]), | |
| "nearest_labels": LABELS[nearest].astype(int).tolist(), | |
| "cosine_distances": np.round(distances[nearest], 4).tolist(), | |
| } | |
| with gr.Blocks(title="Pocket JEPA") as demo: | |
| gr.Markdown( | |
| "# Pocket JEPA\n" | |
| "Hide the center of a digit and inspect the nearest complete images in " | |
| "the learned joint-embedding prediction space." | |
| ) | |
| with gr.Row(): | |
| index = gr.Slider(0, len(IMAGES) - 1, 0, step=1, label="Image") | |
| mask = gr.Slider(2, 5, 3, step=1, label="Center mask") | |
| run = gr.Button("Explore J-space", variant="primary") | |
| gallery = gr.Plot() | |
| metrics = gr.JSON() | |
| run.click(explore, [index, mask], [gallery, metrics]) | |
| demo.load(explore, [index, mask], [gallery, metrics]) | |
| if __name__ == "__main__": | |
| demo.launch() | |