#!/usr/bin/env python """HyperView main Hugging Face Space geometry demo.""" from __future__ import annotations import os import re from collections import Counter from pathlib import Path from datasets import load_dataset from PIL import Image, ImageOps import hyperview as hv SPACE_HOST = "0.0.0.0" SPACE_PORT = 7860 DATASET_NAME = "inat24_tiny_geometry_showcase" HF_DATASET = "evendrow/inat24_tiny" HF_SPLIT = "train" SAMPLE_SEED = 42 TARGET_SUPERCATEGORY_COUNTS = { "plants": 50, "insects": 50, "birds": 42, "arachnids": 36, "amphibians": 30, "reptiles": 26, "fungi": 26, "mammals": 20, "fish": 10, "mollusks": 10, } SAMPLE_COUNT = sum(TARGET_SUPERCATEGORY_COUNTS.values()) IMAGE_MAX_SIZE = (768, 768) EMBEDDING_LAYOUTS = [ { "name": "CLIP", "provider": "embed-anything", "model": "openai/clip-vit-base-patch32", "layouts": ["euclidean:3d", "spherical"], }, { "name": "HyCoCLIP", "provider": "hyper-models", "model": "hycoclip-vit-s", "layouts": ["poincare"], }, ] METADATA_FIELDS = ( "common_name", "id", "width", "height", "license", "rights_holder", "date", "latitude", "longitude", "location_uncertainty", "category_id", "supercategory", "kingdom", "phylum", "class", "order", "family", "genus", "specific_epithet", ) def media_root() -> Path: root = Path(os.environ.get("HYPERVIEW_MEDIA_DIR", "./demo_data/media")) path = root / DATASET_NAME path.mkdir(parents=True, exist_ok=True) return path def safe_sample_id(row: dict, index: int) -> str: raw_id = row.get("id", index) normalized = re.sub(r"[^A-Za-z0-9_.-]+", "_", str(raw_id)).strip("_") return f"inat24_{normalized}" def species_name(row: dict, features) -> str: label = row.get("label") if label is None: return "unknown" return features["label"].int2str(label) def save_image(row: dict, destination: Path) -> None: if destination.exists(): return image = row["image"] if not isinstance(image, Image.Image): raise TypeError(f"Expected a PIL image, got {type(image)!r}") image = ImageOps.exif_transpose(image).convert("RGB") image.thumbnail(IMAGE_MAX_SIZE, Image.Resampling.LANCZOS) image.save(destination, format="JPEG", quality=90, optimize=True) def existing_label_counts(dataset: hv.Dataset) -> Counter[str]: return Counter(sample.label for sample in dataset.samples if sample.label) def target_reached(counts: Counter[str]) -> bool: return all( counts[group] >= quota for group, quota in TARGET_SUPERCATEGORY_COUNTS.items() ) def add_inat24_samples(dataset: hv.Dataset) -> None: counts = existing_label_counts(dataset) if target_reached(counts): print(f"Dataset already has the target stratified sample ({len(dataset)} samples).") return existing_ids = {sample.id for sample in dataset.samples} print( f"Building a stratified {SAMPLE_COUNT}-sample iNat24 Tiny subset from {HF_DATASET}...", flush=True, ) print(f"Current counts: {dict(counts)}", flush=True) source = load_dataset(HF_DATASET, split=HF_SPLIT) source = source.shuffle(seed=SAMPLE_SEED) root = media_root() for index, row in enumerate(source): group = row.get("supercategory") if group not in TARGET_SUPERCATEGORY_COUNTS: continue if counts[group] >= TARGET_SUPERCATEGORY_COUNTS[group]: continue sample_id = safe_sample_id(row, index) if sample_id in existing_ids: continue image_path = root / f"{sample_id}.jpg" save_image(row, image_path) metadata = {field: row.get(field) for field in METADATA_FIELDS} metadata["scientific_name"] = species_name(row, source.features) metadata["source_dataset"] = HF_DATASET metadata["sample_strategy"] = "stratified_by_inat24_supercategory" dataset.add_image( str(image_path), label=group, metadata=metadata, sample_id=sample_id, ) counts[group] += 1 existing_ids.add(sample_id) loaded = sum( min(counts[group], quota) for group, quota in TARGET_SUPERCATEGORY_COUNTS.items() ) if loaded == 1 or loaded % 25 == 0 or target_reached(counts): print(f"Loaded {loaded}/{SAMPLE_COUNT} samples: {dict(counts)}", flush=True) if target_reached(counts): break if not target_reached(counts): missing = { group: quota - counts[group] for group, quota in TARGET_SUPERCATEGORY_COUNTS.items() if counts[group] < quota } raise RuntimeError(f"Could not build the target iNat24 Tiny sample. Missing: {missing}.") def build_dataset() -> hv.Dataset: dataset = hv.Dataset(DATASET_NAME) add_inat24_samples(dataset) for embedding in EMBEDDING_LAYOUTS: print(f"Ensuring {embedding['name']} embeddings ({embedding['model']})...", flush=True) space_key = dataset.compute_embeddings( model=embedding["model"], provider=embedding["provider"], show_progress=True, ) for layout in embedding["layouts"]: print(f"Ensuring {embedding['name']} {layout} layout...", flush=True) dataset.compute_visualization(space_key=space_key, layout=layout) return dataset def main() -> None: dataset = build_dataset() print(f"Starting HyperView on {SPACE_HOST}:{SPACE_PORT}", flush=True) hv.launch(dataset, host=SPACE_HOST, port=SPACE_PORT, open_browser=False) if __name__ == "__main__": main()