#!/usr/bin/env python """VisA manufacturing reference-retrieval demo for CLIP vs Hyper3-CLIP.""" from __future__ import annotations import io import json import os import re import time import urllib.parse import urllib.request from collections import Counter from pathlib import Path from typing import Any from PIL import Image, ImageOps import hyperview as hv from hyperview.core.dataset import Sample SPACE_DIR = Path(__file__).resolve().parent SPACE_HOST = os.environ.get("HYPERVIEW_HOST", "127.0.0.1") SPACE_PORT = int(os.environ.get("HYPERVIEW_PORT", "6265")) WORKSPACE_ID = os.environ.get("HYPERVIEW_WORKSPACE_ID", "manufacturing-visa-reference-clip-hyper3clip") DATASET_NAME = os.environ.get("HYPERVIEW_DATASET_NAME", "visa_manufacturing_reference_clip_hyper3clip") EXTENSION_DIR = SPACE_DIR / ".hyperview" / "extensions" / "manufacturing-readout" SAMPLES_PER_CATEGORY = int(os.environ.get("VISA_SAMPLES_PER_CATEGORY", "4")) TRAIN_FRACTION = float(os.environ.get("VISA_TRAIN_FRACTION", "0.5")) IMAGE_MAX_SIZE = (640, 640) FORCE_SAMPLE_REFRESH = os.environ.get("HYPERVIEW_VISA_FORCE_REFRESH", "").lower() in { "1", "true", "yes", } ALLOW_CANDIDATE_FALLBACK = os.environ.get("HYPERVIEW_ALLOW_CANDIDATE_FALLBACK", "1").lower() in { "1", "true", "yes", } RUNTIME_WARNINGS: list[str] = [] VISA_CATEGORIES = ( "candle", "capsules", "cashew", "chewinggum", "fryum", "macaroni1", "macaroni2", "pcb1", "pcb2", "pcb3", "pcb4", "pipe_fryum", ) FAMILY_BY_CATEGORY = { "candle": "molded_goods", "capsules": "packaged_consumer_goods", "cashew": "food_processing", "chewinggum": "packaged_consumer_goods", "fryum": "food_processing", "pipe_fryum": "food_processing", "macaroni1": "pasta_line", "macaroni2": "pasta_line", "pcb1": "pcb_assembly", "pcb2": "pcb_assembly", "pcb3": "pcb_assembly", "pcb4": "pcb_assembly", } PREFERRED_EXAMPLES = [ ("fryum", "food-processing variant"), ("macaroni2", "pasta line benchmark win"), ("candle", "molded goods line"), ("pipe_fryum", "food-processing line"), ] MODEL_SPECS = [ { "key": "clip", "display_name": os.environ.get("VISA_BASELINE_DISPLAY_NAME", "CLIP"), "button_label": os.environ.get("VISA_BASELINE_BUTTON_LABEL", "Show CLIP neighbors"), "provider": os.environ.get("VISA_BASELINE_PROVIDER", "embed-anything"), "model": os.environ.get("VISA_BASELINE_MODEL", "openai/clip-vit-base-patch32"), "layout": os.environ.get("VISA_BASELINE_LAYOUT", "euclidean:2d"), "geometry": os.environ.get("VISA_BASELINE_GEOMETRY", "euclidean"), "layout_dimension": int(os.environ.get("VISA_BASELINE_LAYOUT_DIMENSION", "2")), "metric": os.environ.get("VISA_BASELINE_METRIC", "cosine"), "panel_title": os.environ.get("VISA_BASELINE_PANEL_TITLE", "CLIP - Inspection Reference Map"), }, { "key": "candidate", "display_name": os.environ.get("VISA_CANDIDATE_DISPLAY_NAME", "Hyper3-CLIP"), "button_label": os.environ.get("VISA_CANDIDATE_BUTTON_LABEL", "Show Hyper3 neighbors"), "provider": os.environ.get("VISA_CANDIDATE_PROVIDER", "hyper-models"), "model": os.environ.get("VISA_CANDIDATE_MODEL", "hyper3-clip-v0.5"), "layout": os.environ.get("VISA_CANDIDATE_LAYOUT", "poincare:2d"), "geometry": os.environ.get("VISA_CANDIDATE_GEOMETRY", "poincare"), "layout_dimension": int(os.environ.get("VISA_CANDIDATE_LAYOUT_DIMENSION", "2")), "metric": os.environ.get("VISA_CANDIDATE_METRIC", "cosine"), "panel_title": os.environ.get("VISA_CANDIDATE_PANEL_TITLE", "Hyper3-CLIP - Inspection Reference Map"), }, ] def media_root() -> Path: root = Path(os.environ.get("HYPERVIEW_MEDIA_DIR", str(SPACE_DIR / "demo_data" / "media"))) path = root / DATASET_NAME path.mkdir(parents=True, exist_ok=True) return path def safe_sample_id(category: str, split_name: str, index: int, label: int) -> str: raw = f"visa_{category}_{split_name}_{index:04d}_label{label}" return re.sub(r"[^A-Za-z0-9_.-]+", "_", raw).strip("_")[:96] def readable(value: str) -> str: return value.replace("_", " ").replace("-", " ").title() def fetch_rows(split: str, count: int) -> list[dict[str, Any]]: params = urllib.parse.urlencode( { "dataset": "BrachioLab/visa", "config": "default", "split": split, "offset": 0, "length": min(count, 100), } ) url = f"https://datasets-server.huggingface.co/rows?{params}" last_error: Exception | None = None for attempt in range(1, 5): try: with urllib.request.urlopen(url, timeout=60) as response: payload = json.loads(response.read().decode("utf-8")) break except Exception as exc: last_error = exc if attempt == 4: raise time.sleep(1.5 * attempt) else: raise RuntimeError(f"Could not fetch VisA split {split}") from last_error rows = [item["row"] for item in payload["rows"]] if len(rows) < count: raise RuntimeError(f"Split {split} returned {len(rows)} rows for requested count {count}") return rows[:count] def local_records(category: str, split_type: str, count: int) -> list[dict[str, Any]]: records = [] prefix = f"visa_{category}_{category}.{split_type}_" pattern = re.compile(rf"^{re.escape(prefix)}(?P\d+)_label(?P