diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000000000000000000000000000000000..b26008a509c804bff946b2be0739c59d804d48c9 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,9 @@ +__pycache__/ +*.pyc +.DS_Store +.env +.env.* +demo_data/datasets/ +demo_data/media/ +demo_data/openimages_cache/ +demo_data/providers.json diff --git a/.gitattributes b/.gitattributes index a6344aac8c09253b3b630fb776ae94478aa0275b..e87b82320d02c347a7267f25ffc0881c74b53bbc 100644 --- a/.gitattributes +++ b/.gitattributes @@ -33,3 +33,15 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text *.zip filter=lfs diff=lfs merge=lfs -text *.zst filter=lfs diff=lfs merge=lfs -text *tfevents* filter=lfs diff=lfs merge=lfs -text +demo_assets/images/01b9021aa05e6e46.jpg filter=lfs diff=lfs merge=lfs -text +demo_assets/images/34ec1592f40cdfaa.jpg filter=lfs diff=lfs merge=lfs -text +demo_assets/images/499cfd3e29e31662.jpg filter=lfs diff=lfs merge=lfs -text +demo_assets/images/4b00a3af27c5b2c6.jpg filter=lfs diff=lfs merge=lfs -text +demo_assets/images/92a7c03c939944a3.jpg filter=lfs diff=lfs merge=lfs -text +demo_assets/images/ab93a8b5592ce5bd.jpg filter=lfs diff=lfs merge=lfs -text +demo_assets/images/c97b0813480f1f26.jpg filter=lfs diff=lfs merge=lfs -text +demo_assets/images/d7bf42f6b20e96c2.jpg filter=lfs diff=lfs merge=lfs -text +demo_assets/images/dbe3012525cc3fec.jpg filter=lfs diff=lfs merge=lfs -text +demo_assets/images/ea39fa9dc50811b0.jpg filter=lfs diff=lfs merge=lfs -text +demo_assets/images/eeed1e944c331791.jpg filter=lfs diff=lfs merge=lfs -text +vendor/hyperview-0.6.2-py3-none-any.whl filter=lfs diff=lfs merge=lfs -text diff --git a/.hyperview/extensions/safety-readout/extension.toml b/.hyperview/extensions/safety-readout/extension.toml new file mode 100644 index 0000000000000000000000000000000000000000..9c018482c28b67d9674d8a7313598ca911e02d25 --- /dev/null +++ b/.hyperview/extensions/safety-readout/extension.toml @@ -0,0 +1,8 @@ +name = "safety-readout" +description = "Visual safety CLIP vs hyper3-clip moderation readout" + +[[panels]] +id = "safety-comparison" +title = "Safety Review Readout" +position = "right" +file = "panel.js" diff --git a/.hyperview/extensions/safety-readout/panel.js b/.hyperview/extensions/safety-readout/panel.js new file mode 100644 index 0000000000000000000000000000000000000000..31a7c9d7fbc9ebfa2f32c066d5c825958b921f15 --- /dev/null +++ b/.hyperview/extensions/safety-readout/panel.js @@ -0,0 +1,501 @@ +const sdk = globalThis.HyperViewPanelSDK; +if (!sdk) throw new Error("HyperViewPanelSDK is not available on window."); + +const { React, components, hooks } = sdk; +const { Panel, PanelToolbar, PanelToolbarButton } = components; +const { + usePanelSelection, + usePanelSamples, + usePanelCommands, + usePanelProps, +} = hooks; + +const colors = { + panelBg: "#0f172a", + cardBg: "#162032", + buttonBg: "#233047", + border: "#334155", + text: "#e5e7eb", + strongText: "#f8fafc", + mutedText: "#94a3b8", + bodyText: "#cbd5e1", + accent: "#38bdf8", + review: "#fbbf24", + safe: "#34d399", + error: "#fca5a5", +}; + +function normalizeModels(value) { + if (!Array.isArray(value)) return []; + return value + .map((model, index) => ({ + key: String(model.key || `model-${index}`), + displayName: String(model.displayName || model.display_name || model.key || `Model ${index + 1}`), + buttonLabel: String( + model.buttonLabel || model.button_label || `${model.displayName || model.key || "Model"} query`, + ), + layoutKey: model.layoutKey || model.layout_key || null, + })) + .filter((model) => model.layoutKey); +} + +function titleLabel(label) { + return String(label || "unlabeled") + .replaceAll("_", " ") + .toLowerCase() + .replace(/\b\w/g, (char) => char.toUpperCase()); +} + +function formatMetric(value) { + if (typeof value !== "number" || Number.isNaN(value)) return "-"; + return value.toFixed(3); +} + +function Button({ children, onClick, title, disabled }) { + return React.createElement( + "button", + { + type: "button", + onClick, + title, + disabled, + style: { + border: `1px solid ${colors.border}`, + background: colors.buttonBg, + color: colors.text, + borderRadius: 4, + padding: "8px 9px", + fontSize: 11, + lineHeight: 1.2, + cursor: disabled ? "default" : "pointer", + textAlign: "left", + opacity: disabled ? 0.65 : 1, + }, + }, + children, + ); +} + +function SectionTitle({ children }) { + return React.createElement( + "h3", + { + style: { + margin: 0, + color: colors.strongText, + fontSize: 13, + fontWeight: 700, + }, + }, + children, + ); +} + +function Hero({ bucketCounts }) { + return React.createElement( + "div", + { + style: { + border: `1px solid ${colors.border}`, + borderRadius: 6, + background: colors.cardBg, + padding: 12, + display: "flex", + flexDirection: "column", + gap: 8, + }, + }, + React.createElement( + "div", + { style: { color: colors.accent, fontSize: 11, fontWeight: 700, textTransform: "uppercase" } }, + "Marketplace upload triage", + ), + React.createElement( + "div", + { style: { color: colors.strongText, fontSize: 15, fontWeight: 800, lineHeight: 1.25 } }, + "Classify each new listing as safe or needs review before it goes live.", + ), + React.createElement( + "div", + { style: { color: colors.bodyText, fontSize: 12, lineHeight: 1.45 } }, + "This public demo uses harmless Open Images examples to stand in for a marketplace upload stream: normal listings should pass, regulated or risky objects should enter the review queue.", + ), + React.createElement( + "div", + { style: { display: "grid", gridTemplateColumns: "1fr 1fr", gap: 8 } }, + React.createElement(StatChip, { + label: "Safe", + value: String(bucketCounts?.safe ?? 60), + color: colors.safe, + }), + React.createElement(StatChip, { + label: "Needs review", + value: String(bucketCounts?.needs_review ?? 60), + color: colors.review, + }), + ), + ); +} + +function StatChip({ label, value, color }) { + return React.createElement( + "div", + { + style: { + border: `1px solid ${colors.border}`, + borderRadius: 4, + padding: "7px 8px", + background: "#101827", + }, + }, + React.createElement("div", { style: { color, fontSize: 16, fontWeight: 800 } }, value), + React.createElement("div", { style: { color: colors.mutedText, fontSize: 11 } }, label), + ); +} + +function ScenarioCard({ item, models, loadingKey, onSelectQuery }) { + const isReview = item.bucket === "needs_review"; + const chipColor = isReview ? colors.review : colors.safe; + const gridColumns = models.length > 1 ? "repeat(2, minmax(0, 1fr))" : "1fr"; + + return React.createElement( + "div", + { + style: { + border: `1px solid ${colors.border}`, + borderRadius: 6, + background: colors.cardBg, + padding: 10, + display: "flex", + flexDirection: "column", + gap: 8, + }, + }, + React.createElement( + "div", + { style: { display: "flex", alignItems: "center", justifyContent: "space-between", gap: 8 } }, + React.createElement( + "div", + { style: { display: "flex", alignItems: "center", gap: 8 } }, + React.createElement( + "div", + { + style: { + width: 22, + height: 22, + borderRadius: 4, + border: `1px solid ${colors.border}`, + display: "flex", + alignItems: "center", + justifyContent: "center", + color: colors.accent, + fontSize: 12, + fontWeight: 800, + }, + }, + item.step || "?", + ), + React.createElement( + "div", + { style: { color: colors.strongText, fontSize: 13, fontWeight: 800 } }, + item.title, + ), + ), + React.createElement( + "div", + { + style: { + border: `1px solid ${chipColor}`, + color: chipColor, + borderRadius: 4, + padding: "2px 5px", + fontSize: 10, + whiteSpace: "nowrap", + }, + }, + item.family, + ), + ), + React.createElement( + "div", + { + style: { + display: "grid", + gridTemplateColumns: "74px 1fr", + gap: 8, + color: colors.bodyText, + fontSize: 11, + lineHeight: 1.35, + }, + }, + React.createElement("div", { style: { color: colors.accent, fontWeight: 700 } }, "Decision"), + React.createElement("div", null, item.decision), + React.createElement("div", { style: { color: colors.accent, fontWeight: 700 } }, "Value"), + React.createElement("div", null, item.businessValue), + React.createElement("div", { style: { color: colors.accent, fontWeight: 700 } }, "Inspect"), + React.createElement("div", null, item.inspect), + ), + React.createElement( + "div", + { style: { color: colors.mutedText, fontSize: 10, lineHeight: 1.3 } }, + `Dataset labels: ${(item.labels || []).map(titleLabel).join(", ")}`, + ), + React.createElement( + "div", + { style: { display: "grid", gridTemplateColumns: gridColumns, gap: 6 } }, + models.map((model) => { + const choiceKey = `${item.queryId}:${model.key}`; + return React.createElement( + Button, + { + key: model.key, + onClick: () => onSelectQuery(item, model), + disabled: loadingKey === choiceKey, + title: `Show ${model.displayName} neighbors for this upload`, + }, + loadingKey === choiceKey ? "Loading..." : model.buttonLabel, + ); + }), + ), + ); +} + +function MetricTable({ metrics }) { + const rows = [ + ["Accuracy", "accuracy"], + ["AUROC", "auroc"], + ["AP, review class", "apReview"], + ["F1, review class", "f1Review"], + ["Review recall", "reviewRecall"], + ["Review precision", "reviewPrecision"], + ["Safe recall", "safeRecall"], + ]; + + return React.createElement( + "table", + { + style: { + width: "100%", + borderCollapse: "collapse", + color: colors.bodyText, + fontSize: 11, + }, + }, + React.createElement( + "thead", + null, + React.createElement( + "tr", + null, + ["Metric", "CLIP", "hyper3-clip"].map((header) => + React.createElement( + "th", + { + key: header, + style: { + padding: "6px 8px", + textAlign: header === "Metric" ? "left" : "right", + color: colors.strongText, + borderBottom: `1px solid ${colors.border}`, + }, + }, + header, + ), + ), + ), + ), + React.createElement( + "tbody", + null, + rows.map(([label, key]) => + React.createElement( + "tr", + { key }, + React.createElement("td", { style: { padding: "5px 8px" } }, label), + React.createElement( + "td", + { style: { padding: "5px 8px", textAlign: "right" } }, + formatMetric(metrics?.clip?.[key]), + ), + React.createElement( + "td", + { style: { padding: "5px 8px", textAlign: "right" } }, + formatMetric(metrics?.candidate?.[key]), + ), + ), + ), + ), + ); +} + +function Details({ title, children }) { + return React.createElement( + "details", + { + style: { + border: `1px solid ${colors.border}`, + borderRadius: 6, + background: colors.cardBg, + padding: 10, + }, + }, + React.createElement( + "summary", + { + style: { + color: colors.strongText, + fontSize: 12, + fontWeight: 700, + cursor: "pointer", + }, + }, + title, + ), + React.createElement( + "div", + { style: { marginTop: 8, display: "flex", flexDirection: "column", gap: 8 } }, + children, + ), + ); +} + +export default function SafetyComparisonPanel() { + const selection = usePanelSelection(); + const samplesState = usePanelSamples(); + const commands = usePanelCommands(); + const panelProps = usePanelProps(); + const didRequestInitialReset = React.useRef(false); + const [panelError, setPanelError] = React.useState(null); + const [loadingKey, setLoadingKey] = React.useState(null); + + const models = React.useMemo(() => normalizeModels(panelProps.models), [panelProps.models]); + const examples = Array.isArray(panelProps.examples) ? panelProps.examples : []; + const metrics = panelProps.metrics || {}; + const bucketCounts = panelProps.bucketCounts || {}; + + React.useEffect(() => { + if (!models.length) return undefined; + const resetKey = "openimages-safety-demo:initial-reset:v5"; + const storage = typeof window !== "undefined" ? window.sessionStorage : null; + if (didRequestInitialReset.current || storage?.getItem(resetKey) === "1") { + return undefined; + } + didRequestInitialReset.current = true; + + let cancelled = false; + const resetInitialState = async () => { + try { + if (commands.setLabelFilter) commands.setLabelFilter(null); + await commands.clearQueryContext({ persist: true }); + if (!cancelled) storage?.setItem(resetKey, "1"); + } catch (error) { + didRequestInitialReset.current = false; + if (!cancelled) console.warn("Could not reset Open Images safety demo state:", error); + } + }; + + const timers = [0, 900, 2200].map((delay) => window.setTimeout(resetInitialState, delay)); + return () => { + cancelled = true; + timers.forEach((timer) => window.clearTimeout(timer)); + }; + }, [commands, models.length]); + + const clearSelection = async () => { + if (commands.setLabelFilter) commands.setLabelFilter(null); + setPanelError(null); + await commands.clearQueryContext({ persist: true }); + }; + + const selectModelQuery = async (item, model) => { + const key = `${item.queryId}:${model.key}`; + setPanelError(null); + + if (!model.layoutKey) { + setPanelError(`${model.displayName} layout is not ready yet. Try again in a moment.`); + return; + } + + setLoadingKey(key); + try { + await commands.setActiveLayout(model.layoutKey); + await commands.showSimilar({ + sampleId: item.queryId, + layoutKey: model.layoutKey, + k: 10, + source: `openimages-safety-demo:${model.key}`, + focus: "samples", + }); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + setPanelError(`Could not select query: ${message}`); + } finally { + setLoadingKey(null); + } + }; + + return React.createElement( + Panel, + { className: "h-full" }, + React.createElement(PanelToolbar, { + items: [ + { id: "dataset", label: "Data", value: "Open Images" }, + { id: "samples", label: "Items", value: String(samplesState.totalSamples ?? "-") }, + { id: "selected", label: "Selected", value: String(selection.selectedIds?.length ?? 0) }, + ], + actions: React.createElement(PanelToolbarButton, { onClick: clearSelection }, "Reset"), + }), + React.createElement( + "div", + { + style: { + height: "100%", + overflow: "auto", + padding: 12, + display: "flex", + flexDirection: "column", + gap: 12, + background: colors.panelBg, + }, + }, + React.createElement(Hero, { bucketCounts }), + React.createElement( + "section", + { style: { display: "flex", flexDirection: "column", gap: 8 } }, + React.createElement(SectionTitle, null, "Three upload decisions"), + examples.length && models.length + ? examples.map((item) => + React.createElement(ScenarioCard, { + key: item.id, + item, + models, + loadingKey, + onSelectQuery: selectModelQuery, + }), + ) + : React.createElement( + "div", + { style: { color: colors.bodyText, fontSize: 12, lineHeight: 1.45 } }, + "Demo scenarios are not configured.", + ), + ), + React.createElement( + Details, + { title: "Benchmark details" }, + React.createElement( + "div", + { style: { color: colors.bodyText, fontSize: 11, lineHeight: 1.4 } }, + `${metrics.dataset || "Open Images proxy"}: ${metrics.classBalance || ""}. ${metrics.readout || ""}`, + ), + React.createElement(MetricTable, { metrics }), + ), + panelError + ? React.createElement( + "div", + { style: { color: colors.error, fontSize: 11, lineHeight: 1.35 } }, + panelError, + ) + : null, + ), + ); +} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..c49afeacc5cced4ad686b036f3e1a2a9138df4e1 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,62 @@ +FROM python:3.11-slim + +RUN apt-get update && apt-get install -y --no-install-recommends \ + build-essential \ + curl \ + libssl-dev \ + pkg-config \ + && rm -rf /var/lib/apt/lists/* + +RUN useradd -m -u 1000 user +USER user + +ENV HOME=/home/user \ + PATH=/home/user/.local/bin:$PATH \ + HF_HOME=/home/user/.cache/huggingface \ + PYTHONUNBUFFERED=1 \ + PIP_NO_CACHE_DIR=1 + +WORKDIR $HOME/app + +RUN pip install --upgrade pip + +ARG HYPER_MODELS_VERSION=0.3.0 + +# Install CPU-only PyTorch first so the Space does not pull the default CUDA bundle. +RUN pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu +COPY --chown=user vendor/hyperview-*.whl /tmp/ +RUN echo "Installing vendored HyperView wheel" \ + && pip install /tmp/hyperview-*.whl \ + && python - <<'PY' +import inspect +import hyperview as hv + +print("hyperview", hv.__version__, inspect.signature(hv.launch)) +assert hasattr(hv.ui, "Samples"), "HyperView build must support explicit Samples panels" +PY +RUN pip install \ + "hyper-models[ml]==${HYPER_MODELS_VERSION}" \ + "datasets>=4.5.0" \ + "Pillow>=12.0.0" \ + "timm>=1.0.0" \ + "transformers>=5.0.0,<6.0.0" \ + "safetensors>=0.4.0" \ + "pyyaml>=6.0.0" \ + "sentencepiece>=0.2.0" \ + "protobuf>=4.25.0" + +COPY --chown=user . . + +ENV HYPERVIEW_HOST=0.0.0.0 \ + HYPERVIEW_PORT=7860 \ + HYPERVIEW_WORKSPACE_ID=visual-safety-content-clip-hyper3clip \ + HYPERVIEW_DATASETS_DIR=/home/user/.cache/hyperview/datasets \ + HYPERVIEW_MEDIA_DIR=/home/user/.cache/hyperview/media \ + SAFETY_ASSET_REPO_TYPE=space + +EXPOSE 7860 + +HEALTHCHECK --interval=30s --timeout=10s --start-period=600s --retries=3 \ + CMD curl -f http://localhost:7860/__hyperview__/health || exit 1 + +CMD ["python", "demo.py"] diff --git a/README.md b/README.md index d1bda7bb8ad60b205a97ed3a0046192ca276c733..fd45266385818228508405398b55e22b29196b16 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,72 @@ --- title: HyperView Visual Safety -emoji: 🚀 -colorFrom: blue -colorTo: yellow +emoji: 🛡️ +colorFrom: yellow +colorTo: gray sdk: docker +app_port: 7860 pinned: false --- -Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference +# HyperView - Open Images Visual Safety Demo + +This demo shows a marketplace-style visual moderation workflow without showing +explicit NSFW material. + +It loads a small curated Open Images V7 validation subset from the Space assets +and builds the HyperView dataset at startup with two buckets: + +- **Safe**: ordinary marketplace/public-image objects such as clothing, shoes, + furniture, toys, books, fruit, laptops, and mobile phones. +- **Needs review**: public-displayable but policy-relevant objects such as + alcohol, cigarettes, knives, and firearms-related labels. + +HyperView computes embeddings and opens two pinned maps at startup: + +- CLIP ViT-B/32 in a Euclidean 2D layout +- hyper3-clip `hyper3-clip-v0.5` from `hyper-models` in a Poincare 2D layout + +The right-hand panel includes the measured 120-image zero-shot smoke test: +CLIP is stronger overall on this first proxy, while hyper3-clip catches slightly +more review-class items at the cost of more false positives. + +Run locally from the HyperView repo: + +```bash +uv run python hyperview-spaces/spaces/visual-safety-content-clip-hyper3clip/demo.py +``` + +Useful overrides: + +```bash +HYPERVIEW_PORT=6265 SAFETY_SAMPLES_PER_BUCKET=40 \ + uv run python hyperview-spaces/spaces/visual-safety-content-clip-hyper3clip/demo.py +``` + +## Dataset And Rights + +The demo uses a checked-in public Open Images V7 validation subset under +`demo_assets/`: + +- Dataset: https://storage.googleapis.com/openimages/web/index.html +- Images are loaded through Hugging Face Hub asset resolution when the Space + runs on Hugging Face. +- Individual source licenses are preserved in sample metadata. + +This is a public demo proxy for marketplace moderation triage, not a claim that +either model is a production safety classifier. + +## Deploy Source + +This folder is intended to deploy to `mnm-matin/HyperView-Visual-Safety` from +the `hyperview-spaces` deployment repository. The org Space +`hyper3labs/HyperView-Visual-Safety` is kept commit-synced but paused. + +hyper3-clip weights are loaded through the `hyper-models` catalog entry for the +gated `hyper3labs/hyper3-clip-v0.5` model repository at runtime. The Space needs +an `HF_TOKEN` secret with access to that model. + +If that secret is missing, the Space starts in a clearly labeled fallback mode: +the hyper3-clip panel reuses the CLIP layout and the readout shows a runtime +warning. Set `HYPERVIEW_ALLOW_CANDIDATE_FALLBACK=0` to make missing hyper3-clip +access fail loudly instead. diff --git a/demo.py b/demo.py new file mode 100644 index 0000000000000000000000000000000000000000..d1bd705779ed8055cf47a0bd91ad6aec0aa4055a --- /dev/null +++ b/demo.py @@ -0,0 +1,399 @@ +#!/usr/bin/env python +"""Open Images visual safety moderation demo for CLIP vs hyper3-clip.""" + +from __future__ import annotations + +import json +import os +from collections import Counter, defaultdict +from pathlib import Path +from typing import Any + +from huggingface_hub import hf_hub_download +import hyperview as hv +from hyperview.core.sample 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", "6262")) +WORKSPACE_ID = os.environ.get("HYPERVIEW_WORKSPACE_ID", "visual-safety-content-clip-hyper3clip") +DATASET_NAME = os.environ.get("HYPERVIEW_DATASET_NAME", "openimages_visual_safety_marketplace_triage_assets_v1") +EXTENSION_DIR = SPACE_DIR / ".hyperview" / "extensions" / "safety-readout" +SAMPLES_PER_BUCKET = int(os.environ.get("SAFETY_SAMPLES_PER_BUCKET", "60")) +ASSET_MANIFEST_PATH = os.environ.get("SAFETY_ASSET_MANIFEST", "demo_assets/manifest.json") +ASSET_REPO_ID = os.environ.get("SAFETY_ASSET_REPO_ID") or os.environ.get("SPACE_ID") +ASSET_REPO_TYPE = os.environ.get("SAFETY_ASSET_REPO_TYPE", "space") +ASSET_REVISION = os.environ.get("SAFETY_ASSET_REVISION") or None +ASSET_LOCAL_ROOT = Path(os.environ.get("SAFETY_ASSET_LOCAL_ROOT", str(SPACE_DIR))) + +DEMO_SCENARIOS = ( + { + "labels": ("Knife", "Kitchen knife"), + "title": "Kitchen knife upload", + "step": "1", + "decision": "Route to policy review", + "business_value": "Catches listings that may be allowed in some contexts but need marketplace policy checks before broad distribution.", + "inspect": "A useful model should pull nearby knives/tools into the same neighborhood instead of mixing them with ordinary kitchenware.", + }, + { + "labels": ("Beer", "Wine", "Alcoholic beverage"), + "title": "Alcohol listing", + "step": "2", + "decision": "Restrict or age-gate", + "business_value": "Separates regulated goods from normal shopping content so the queue can apply the correct country and age policy.", + "inspect": "Look for alcohol examples grouped together, not scattered across safe food or glassware listings.", + }, + { + "labels": ("Shoe", "Clothing", "Dress", "Toy", "Chair"), + "title": "Normal seller upload", + "step": "3", + "decision": "Approve without review", + "business_value": "Avoids false positives that slow down legitimate sellers and create unnecessary moderator load.", + "inspect": "A useful model keeps ordinary listings away from the needs-review neighborhood.", + }, +) + +SMOKE_METRICS = { + "dataset": "Open Images V7 validation safety proxy", + "nImages": 120, + "classBalance": "60 safe / 60 needs review", + "clip": { + "accuracy": 0.758, + "auroc": 0.865, + "apReview": 0.870, + "f1Review": 0.768, + "reviewRecall": 0.800, + "reviewPrecision": 0.738, + "safeRecall": 0.717, + }, + "candidate": { + "accuracy": 0.725, + "auroc": 0.839, + "apReview": 0.812, + "f1Review": 0.752, + "reviewRecall": 0.833, + "reviewPrecision": 0.685, + "safeRecall": 0.617, + }, + "readout": ( + "CLIP is stronger overall on the first zero-shot smoke test. hyper3-clip catches slightly more " + "review items, which is useful for moderation triage but creates more false positives." + ), +} + +MODEL_SPECS = [ + { + "key": "clip", + "display_name": os.environ.get("SAFETY_BASELINE_DISPLAY_NAME", "CLIP-B/32"), + "button_label": os.environ.get("SAFETY_BASELINE_BUTTON_LABEL", "Inspect with CLIP"), + "provider": os.environ.get("SAFETY_BASELINE_PROVIDER", "embed-anything"), + "model": os.environ.get("SAFETY_BASELINE_MODEL", "openai/clip-vit-base-patch32"), + "layout": os.environ.get("SAFETY_BASELINE_LAYOUT", "euclidean:2d"), + "geometry": os.environ.get("SAFETY_BASELINE_GEOMETRY", "euclidean"), + "layout_dimension": int(os.environ.get("SAFETY_BASELINE_LAYOUT_DIMENSION", "2")), + "metric": os.environ.get("SAFETY_BASELINE_METRIC", "cosine"), + "panel_title": os.environ.get("SAFETY_BASELINE_PANEL_TITLE", "CLIP-B/32 - Safety Review Map"), + }, + { + "key": "candidate", + "display_name": os.environ.get("SAFETY_CANDIDATE_DISPLAY_NAME", "hyper3-clip"), + "button_label": os.environ.get("SAFETY_CANDIDATE_BUTTON_LABEL", "Inspect with hyper3-clip"), + "provider": os.environ.get("SAFETY_CANDIDATE_PROVIDER", "hyper-models"), + "model": os.environ.get("SAFETY_CANDIDATE_MODEL", "hyper3-clip-v0.5"), + "layout": os.environ.get("SAFETY_CANDIDATE_LAYOUT", "poincare:2d"), + "geometry": os.environ.get("SAFETY_CANDIDATE_GEOMETRY", "poincare"), + "layout_dimension": int(os.environ.get("SAFETY_CANDIDATE_LAYOUT_DIMENSION", "2")), + "metric": os.environ.get("SAFETY_CANDIDATE_METRIC", "cosine"), + "panel_title": os.environ.get("SAFETY_CANDIDATE_PANEL_TITLE", "hyper3-clip - Safety Review Map"), + }, +] + + +def resolve_asset(relative_path: str) -> Path: + if ASSET_REPO_ID: + return Path( + hf_hub_download( + repo_id=ASSET_REPO_ID, + repo_type=ASSET_REPO_TYPE, + revision=ASSET_REVISION, + filename=relative_path, + ) + ) + + local_path = ASSET_LOCAL_ROOT / relative_path + if not local_path.exists(): + raise FileNotFoundError( + f"Asset '{relative_path}' was not found locally and SAFETY_ASSET_REPO_ID/SPACE_ID is unset." + ) + return local_path + + +def safe_sample_id(record: dict[str, Any]) -> str: + return f"openimages_{record['index']:03d}_{record['bucket']}_{record['image_id']}" + + +def choose_records() -> list[dict[str, Any]]: + manifest_path = resolve_asset(ASSET_MANIFEST_PATH) + manifest = json.loads(manifest_path.read_text(encoding="utf-8")) + records: list[dict[str, Any]] = [] + for item in manifest.get("records", []): + bucket = item["bucket"] + if sum(1 for record in records if record["bucket"] == bucket) >= SAMPLES_PER_BUCKET: + continue + image_path = resolve_asset(item["asset_path"]) + records.append( + { + "index": len(records), + "image_id": item["image_id"], + "bucket": bucket, + "label": item["label"], + "labels": item["labels"], + "path": image_path, + "source_url": item["source_url"], + "license": item.get("license", ""), + "title": item.get("title", ""), + } + ) + if all( + sum(1 for record in records if record["bucket"] == bucket_name) >= SAMPLES_PER_BUCKET + for bucket_name in ("needs_review", "safe") + ): + break + + if not records: + raise RuntimeError("No Open Images records could be prepared.") + + records = order_records_for_demo(records) + for index, record in enumerate(records): + record["index"] = index + counts = Counter(record["bucket"] for record in records) + print(f"Prepared Open Images safety records: {dict(counts)}", flush=True) + source = f"Hugging Face {ASSET_REPO_TYPE} '{ASSET_REPO_ID}'" if ASSET_REPO_ID else "local demo_assets" + print(f"Loaded visual-safety assets from {source}.", flush=True) + return records + + +def order_records_for_demo(records: list[dict[str, Any]]) -> list[dict[str, Any]]: + """Put landing-page-friendly examples first in the Samples panel.""" + used: set[str] = set() + ordered: list[dict[str, Any]] = [] + + def append_unique(items: list[dict[str, Any]]) -> None: + for item in items: + if item["image_id"] in used: + continue + used.add(item["image_id"]) + ordered.append(item) + + by_label: dict[str, list[dict[str, Any]]] = defaultdict(list) + for record in records: + by_label[record["label"]].append(record) + + for scenario in DEMO_SCENARIOS: + record = next( + ( + candidate + for label in scenario["labels"] + for candidate in by_label.get(label, []) + if candidate["image_id"] not in used + ), + None, + ) + if record is None: + continue + append_unique([record]) + + append_unique(sorted( + (record for record in records if record["bucket"] == "safe" and record["image_id"] not in used), + key=lambda record: (record["label"], record["image_id"]), + )) + append_unique([record for record in records if record["bucket"] == "needs_review" and record["image_id"] not in used]) + append_unique([record for record in records if record["image_id"] not in used]) + + return ordered + + +def add_safety_samples(dataset: hv.Dataset) -> list[dict[str, Any]]: + existing_ids = {sample.id for sample in dataset.samples} + records = choose_records() + samples: list[Sample] = [] + existing_selected_ids = set() + + for record in records: + sample_id = safe_sample_id(record) + existing_selected_ids.add(sample_id) + metadata = { + "policy_bucket": record["bucket"], + "open_images_labels": record["labels"], + "primary_label": record["label"], + "source_dataset": "Open Images V7 validation", + "source_url": record["source_url"], + "license": record.get("license", ""), + "title": record.get("title", ""), + "business_use_case": "marketplace listing moderation triage", + "display_order": record["index"], + } + + samples.append( + Sample( + id=sample_id, + filepath=str(record["path"]), + label=record["bucket"], + metadata=metadata, + ) + ) + + added = len(existing_selected_ids - existing_ids) + updated = len(existing_selected_ids & existing_ids) + dataset.add_samples(samples, skip_existing=False) + print(f"Prepared Open Images safety samples ({added} added, {updated} updated).", flush=True) + return records + + +def ensure_layouts(dataset: hv.Dataset) -> dict[str, str]: + layouts: dict[str, str] = {} + for spec in MODEL_SPECS: + print(f"Ensuring {spec['display_name']} embeddings...", flush=True) + space_key = dataset.compute_embeddings( + model=spec["model"], + provider=spec["provider"], + batch_size=32, + show_progress=True, + ) + print(f"Ensuring {spec['display_name']} layout...", flush=True) + layouts[spec["key"]] = dataset.compute_visualization( + space_key=space_key, + layout=spec["layout"], + n_neighbors=20, + min_dist=0.08, + metric=spec["metric"], + ) + return layouts + + +def build_dataset() -> tuple[hv.Dataset, dict[str, str], list[dict[str, Any]]]: + dataset = hv.Dataset(DATASET_NAME) + records = add_safety_samples(dataset) + layouts = ensure_layouts(dataset) + return dataset, layouts, records + + +def model_panel_props(layouts: dict[str, str]) -> list[dict[str, Any]]: + show_baseline = os.environ.get("SAFETY_SHOW_BASELINE_BUTTONS", "").lower() in {"1", "true", "yes"} + props = [] + for spec in MODEL_SPECS: + if spec["key"] == "clip" and not show_baseline: + continue + props.append( + { + "key": spec["key"], + "displayName": spec["display_name"], + "buttonLabel": spec["button_label"], + "layoutKey": layouts[spec["key"]], + } + ) + return props + + +def build_examples(records: list[dict[str, Any]]) -> list[dict[str, Any]]: + by_label: dict[str, dict[str, Any]] = {} + for record in records: + by_label.setdefault(record["label"], record) + + examples = [] + for scenario in DEMO_SCENARIOS: + record = next((by_label.get(label) for label in scenario["labels"] if label in by_label), None) + if record is None: + continue + bucket = record["bucket"] + examples.append( + { + "id": record["image_id"], + "step": scenario["step"], + "title": scenario["title"], + "family": "Needs review" if bucket == "needs_review" else "Safe listing", + "decision": scenario["decision"], + "businessValue": scenario["business_value"], + "inspect": scenario["inspect"], + "queryId": safe_sample_id(record), + "queryLabel": record["label"], + "bucket": bucket, + "labels": record["labels"], + "sourceUrl": record["source_url"], + } + ) + return examples + + +def build_demo_view(dataset: hv.Dataset, layouts: dict[str, str], records: list[dict[str, Any]]) -> hv.ui.View: + primary_spec = next(spec for spec in MODEL_SPECS if spec["key"] == "candidate") + samples_panel = hv.ui.Samples( + id="safety-samples", + title="Samples", + position="center", + layout=hv.ui.PanelLayout(min_height=420), + ) + primary_scatter = hv.ui.Scatter( + id="hyper3-clip-safety-map-bottom", + title=primary_spec["panel_title"], + position="bottom", + reference_panel_id="safety-samples", + direction="below", + layout_key=layouts[primary_spec["key"]], + geometry=primary_spec["geometry"], + layout_dimension=primary_spec["layout_dimension"], + layout=hv.ui.PanelLayout(height=280, min_height=220), + ) + readout_panel = hv.ui.ExtensionPanel( + id="visual-safety-readout", + extension="safety-readout", + panel="safety-comparison", + title="Safety triage", + reference_panel_id="safety-samples", + direction="right", + props={ + "models": model_panel_props(layouts), + "examples": build_examples(records), + "metrics": SMOKE_METRICS, + "bucketCounts": dict(Counter(record["bucket"] for record in records)), + }, + layout=hv.ui.PanelLayout(width=520, min_width=420), + ) + return hv.ui.View( + samples_panel, + readout_panel, + primary_scatter, + ) + + +def launch_demo(dataset: hv.Dataset, layouts: dict[str, str], records: list[dict[str, Any]]) -> hv.Session: + session = hv.launch( + dataset, + host=SPACE_HOST, + port=SPACE_PORT, + open_browser=False, + workspace_id=WORKSPACE_ID, + block=False, + ) + print("Installing Open Images visual-safety demo extension...", flush=True) + session.ui.add_extension(EXTENSION_DIR, workspace_id=WORKSPACE_ID) + print("Applying Open Images visual-safety triage demo view...", flush=True) + session.ui.apply_view(build_demo_view(dataset, layouts, records), workspace_id=WORKSPACE_ID) + session.ui.set_active_layout(layouts["candidate"], workspace_id=WORKSPACE_ID) + session.ui.set_selection([], workspace_id=WORKSPACE_ID) + print(f"\nHyperView Open Images visual-safety demo is running at {session.url}", flush=True) + return session + + +def main() -> None: + dataset, layouts, records = build_dataset() + print("Layouts:", flush=True) + for spec in MODEL_SPECS: + print(f" {spec['display_name']}: {layouts[spec['key']]}", flush=True) + session = launch_demo(dataset, layouts, records) + session.wait() + + +if __name__ == "__main__": + main() diff --git a/demo_assets/images/01b9021aa05e6e46.jpg b/demo_assets/images/01b9021aa05e6e46.jpg new file mode 100644 index 0000000000000000000000000000000000000000..95d48b1566adf3056ddd6a9750f1e23422b7568c --- /dev/null +++ b/demo_assets/images/01b9021aa05e6e46.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fba941662774fd4413fd889c131c8ceab2bb2316e36256777ac26aef8f38751b +size 181820 diff --git a/demo_assets/images/0565bcccb1266f62.jpg b/demo_assets/images/0565bcccb1266f62.jpg new file mode 100644 index 0000000000000000000000000000000000000000..90f32db17dfac122506399b8f93abe02c5594e7b Binary files /dev/null and b/demo_assets/images/0565bcccb1266f62.jpg differ diff --git a/demo_assets/images/05f4f97b3833086e.jpg b/demo_assets/images/05f4f97b3833086e.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3240aa4bbec8b7b94a6356dcf7ba5a0a8dd3a28d Binary files /dev/null and b/demo_assets/images/05f4f97b3833086e.jpg differ diff --git a/demo_assets/images/06a449c6ef03c172.jpg b/demo_assets/images/06a449c6ef03c172.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d047ace4651406e98b44666a9b456f8242be1662 Binary files /dev/null and b/demo_assets/images/06a449c6ef03c172.jpg differ diff --git a/demo_assets/images/07de9510e802a400.jpg b/demo_assets/images/07de9510e802a400.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cf29de53f7fb59f70420d5760fbefe32960df354 Binary files /dev/null and b/demo_assets/images/07de9510e802a400.jpg differ diff --git a/demo_assets/images/084a9d12a2a486dc.jpg b/demo_assets/images/084a9d12a2a486dc.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3e966902a14d886b73e667109126e7889abb9bea Binary files /dev/null and b/demo_assets/images/084a9d12a2a486dc.jpg differ diff --git a/demo_assets/images/09b96636ea4f4ce9.jpg b/demo_assets/images/09b96636ea4f4ce9.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6116157bc1369b4c4f921f729a830eb11f818587 Binary files /dev/null and b/demo_assets/images/09b96636ea4f4ce9.jpg differ diff --git a/demo_assets/images/0ba3f8b8a3a2e93c.jpg b/demo_assets/images/0ba3f8b8a3a2e93c.jpg new file mode 100644 index 0000000000000000000000000000000000000000..295b92a263d638936db370975e170c23f2ec9a75 Binary files /dev/null and b/demo_assets/images/0ba3f8b8a3a2e93c.jpg differ diff --git a/demo_assets/images/0c4b629e801e8181.jpg b/demo_assets/images/0c4b629e801e8181.jpg new file mode 100644 index 0000000000000000000000000000000000000000..283584a923f32c43733fcd821e1c4990b4d3e1f1 Binary files /dev/null and b/demo_assets/images/0c4b629e801e8181.jpg differ diff --git a/demo_assets/images/11cd71943afb477e.jpg b/demo_assets/images/11cd71943afb477e.jpg new file mode 100644 index 0000000000000000000000000000000000000000..aa61d5ddbc31170503a998b07e3742186cc31fc1 Binary files /dev/null and b/demo_assets/images/11cd71943afb477e.jpg differ diff --git a/demo_assets/images/120d233407f1d14c.jpg b/demo_assets/images/120d233407f1d14c.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df3016062a0ce1b26b5a81f9b126d095deafb49d Binary files /dev/null and b/demo_assets/images/120d233407f1d14c.jpg differ diff --git a/demo_assets/images/1228bfe2f3dc2d29.jpg b/demo_assets/images/1228bfe2f3dc2d29.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f29810f3edebe04be07f9b4e405a8bf99a8f4046 Binary files /dev/null and b/demo_assets/images/1228bfe2f3dc2d29.jpg differ diff --git a/demo_assets/images/12b06cbeaa8b634a.jpg b/demo_assets/images/12b06cbeaa8b634a.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ab4d110e890b093ff2f6b6342285290a7664a044 Binary files /dev/null and b/demo_assets/images/12b06cbeaa8b634a.jpg differ diff --git a/demo_assets/images/14d45a56a0fe95bf.jpg b/demo_assets/images/14d45a56a0fe95bf.jpg new file mode 100644 index 0000000000000000000000000000000000000000..40d27a42e12958f76a42cd30efdd3b76751eb219 Binary files /dev/null and b/demo_assets/images/14d45a56a0fe95bf.jpg differ diff --git a/demo_assets/images/1519b2618048f525.jpg b/demo_assets/images/1519b2618048f525.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a09ae2e99ee39f74783a4eabd29af399298e0ec3 Binary files /dev/null and b/demo_assets/images/1519b2618048f525.jpg differ diff --git a/demo_assets/images/15cc8c6a07fd3f0f.jpg b/demo_assets/images/15cc8c6a07fd3f0f.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ccae3a2c2772d8e6614bd8f7d47803e7402656b6 Binary files /dev/null and b/demo_assets/images/15cc8c6a07fd3f0f.jpg differ diff --git a/demo_assets/images/178f262c9f18c8ba.jpg b/demo_assets/images/178f262c9f18c8ba.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2b6c78daac8d674ce1f15d74eb5323b69fd09d2c Binary files /dev/null and b/demo_assets/images/178f262c9f18c8ba.jpg differ diff --git a/demo_assets/images/1a9d5f7cc9a88a1d.jpg b/demo_assets/images/1a9d5f7cc9a88a1d.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f4575baab6bbe95366e72349b5fc29ea91c91eae Binary files /dev/null and b/demo_assets/images/1a9d5f7cc9a88a1d.jpg differ diff --git a/demo_assets/images/1de9f211102093d0.jpg b/demo_assets/images/1de9f211102093d0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..00a7c80a62de309601f456d663231cb651da7568 Binary files /dev/null and b/demo_assets/images/1de9f211102093d0.jpg differ diff --git a/demo_assets/images/20d46de74f618aef.jpg b/demo_assets/images/20d46de74f618aef.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1514ae206c988d2f40f0b2f907a6045803a8baeb Binary files /dev/null and b/demo_assets/images/20d46de74f618aef.jpg differ diff --git a/demo_assets/images/21d68297ff292660.jpg b/demo_assets/images/21d68297ff292660.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e667fa0edd260e9d188c72918a1e0ecc9e211033 Binary files /dev/null and b/demo_assets/images/21d68297ff292660.jpg differ diff --git a/demo_assets/images/2c87374e8d2f3a34.jpg b/demo_assets/images/2c87374e8d2f3a34.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fb3c0797b447d0a2ef5400f94372dec9e54e0b76 Binary files /dev/null and b/demo_assets/images/2c87374e8d2f3a34.jpg differ diff --git a/demo_assets/images/318c91bd306e52e1.jpg b/demo_assets/images/318c91bd306e52e1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f3f0f2783bdd80b378fea72696b61b80df681048 Binary files /dev/null and b/demo_assets/images/318c91bd306e52e1.jpg differ diff --git a/demo_assets/images/318e12be63daa7bb.jpg b/demo_assets/images/318e12be63daa7bb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..792ed77d2f20a48b5764c74b897bc84a1a79c7ca Binary files /dev/null and b/demo_assets/images/318e12be63daa7bb.jpg differ diff --git a/demo_assets/images/32255e4104d8f9b7.jpg b/demo_assets/images/32255e4104d8f9b7.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7acc10b591739f0b2dbacbd06bb7bc4c21529017 Binary files /dev/null and b/demo_assets/images/32255e4104d8f9b7.jpg differ diff --git a/demo_assets/images/33969a398effdb29.jpg b/demo_assets/images/33969a398effdb29.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9c60f17f56d4c94dd3db7565c822cf0d216e35b4 Binary files /dev/null and b/demo_assets/images/33969a398effdb29.jpg differ diff --git a/demo_assets/images/33ac3bd2015c44b2.jpg b/demo_assets/images/33ac3bd2015c44b2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d0091d5736edf4f8d671b5360156ce5135eea875 Binary files /dev/null and b/demo_assets/images/33ac3bd2015c44b2.jpg differ diff --git a/demo_assets/images/34ec1592f40cdfaa.jpg b/demo_assets/images/34ec1592f40cdfaa.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1a1304396e12fc68206092398d944ece867e5ffd --- /dev/null +++ b/demo_assets/images/34ec1592f40cdfaa.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:053b0f767fcc3ef6b03a44ea75111c47f983b6bb4db61b81f6ed19a82b425a97 +size 101291 diff --git a/demo_assets/images/3722904d5b45c676.jpg b/demo_assets/images/3722904d5b45c676.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8ab7d77b476064ce0919ae85c0fdf45f23e72ac7 Binary files /dev/null and b/demo_assets/images/3722904d5b45c676.jpg differ diff --git a/demo_assets/images/3ba5380490084697.jpg b/demo_assets/images/3ba5380490084697.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8126c9494cbb36b6aa4bc84fbf587fe370e3126c Binary files /dev/null and b/demo_assets/images/3ba5380490084697.jpg differ diff --git a/demo_assets/images/3d0d7ec99241aec7.jpg b/demo_assets/images/3d0d7ec99241aec7.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d0a27165b02b759b9a530e9ad3ba9a8289e20c3c Binary files /dev/null and b/demo_assets/images/3d0d7ec99241aec7.jpg differ diff --git a/demo_assets/images/419e1902dcac2d77.jpg b/demo_assets/images/419e1902dcac2d77.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0e8604304895b2e0feac1f4bc905e89da51337bf Binary files /dev/null and b/demo_assets/images/419e1902dcac2d77.jpg differ diff --git a/demo_assets/images/41bf39cbdf4b0a05.jpg b/demo_assets/images/41bf39cbdf4b0a05.jpg new file mode 100644 index 0000000000000000000000000000000000000000..35cbc726457c436e65b03c58f3a423b3267b144f Binary files /dev/null and b/demo_assets/images/41bf39cbdf4b0a05.jpg differ diff --git a/demo_assets/images/43040be867118184.jpg b/demo_assets/images/43040be867118184.jpg new file mode 100644 index 0000000000000000000000000000000000000000..40d0b14cb76dd695476427565cd7b79dbea49419 Binary files /dev/null and b/demo_assets/images/43040be867118184.jpg differ diff --git a/demo_assets/images/474d23651d5ca02a.jpg b/demo_assets/images/474d23651d5ca02a.jpg new file mode 100644 index 0000000000000000000000000000000000000000..649370ff712228e256c34e638645c75c0a54f5ca Binary files /dev/null and b/demo_assets/images/474d23651d5ca02a.jpg differ diff --git a/demo_assets/images/477ab6b26dd5a667.jpg b/demo_assets/images/477ab6b26dd5a667.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a068c8ef88889fb1600ead61301d49655a1705d2 Binary files /dev/null and b/demo_assets/images/477ab6b26dd5a667.jpg differ diff --git a/demo_assets/images/483ade136f9e676d.jpg b/demo_assets/images/483ade136f9e676d.jpg new file mode 100644 index 0000000000000000000000000000000000000000..42f69569cddcbba5408cdfc499c05ed0c8c57143 Binary files /dev/null and b/demo_assets/images/483ade136f9e676d.jpg differ diff --git a/demo_assets/images/48e7aacdb6423790.jpg b/demo_assets/images/48e7aacdb6423790.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5c88fe05c55f4053abe596a1bccf5c3f76d88d47 Binary files /dev/null and b/demo_assets/images/48e7aacdb6423790.jpg differ diff --git a/demo_assets/images/499cfd3e29e31662.jpg b/demo_assets/images/499cfd3e29e31662.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8a8ce83c4780fdfb8ec36a397f8382d1037a6c5b --- /dev/null +++ b/demo_assets/images/499cfd3e29e31662.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a37dcda34674bf21e94599166bfe9892cf9d34553217b351dbfa76f518cf338d +size 133346 diff --git a/demo_assets/images/4af30ade5ff3deb1.jpg b/demo_assets/images/4af30ade5ff3deb1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..545e7a76e1e1a7aedd5410424f1d47656e0baaf3 Binary files /dev/null and b/demo_assets/images/4af30ade5ff3deb1.jpg differ diff --git a/demo_assets/images/4b00a3af27c5b2c6.jpg b/demo_assets/images/4b00a3af27c5b2c6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..48cfedc100e8dcc7982d4dae6de682d9b05718cc --- /dev/null +++ b/demo_assets/images/4b00a3af27c5b2c6.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca61ae3e37973ca3971fc9f07587340f7bfd2c18ddc6563adfd9fa6f709fab9a +size 175344 diff --git a/demo_assets/images/4cc6516b9be3d77d.jpg b/demo_assets/images/4cc6516b9be3d77d.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d742cd8799eabef3ad506b70fb2d3999c9db7fd5 Binary files /dev/null and b/demo_assets/images/4cc6516b9be3d77d.jpg differ diff --git a/demo_assets/images/4d5a6b0ed65de97e.jpg b/demo_assets/images/4d5a6b0ed65de97e.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5cc93468449b90257e988258583a738a21d1328c Binary files /dev/null and b/demo_assets/images/4d5a6b0ed65de97e.jpg differ diff --git a/demo_assets/images/4d6d17f9ed60e02b.jpg b/demo_assets/images/4d6d17f9ed60e02b.jpg new file mode 100644 index 0000000000000000000000000000000000000000..240808e25a32fc71b7a2b21f8f849aa1506d1936 Binary files /dev/null and b/demo_assets/images/4d6d17f9ed60e02b.jpg differ diff --git a/demo_assets/images/4ebc2c7d8668ac37.jpg b/demo_assets/images/4ebc2c7d8668ac37.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d55fa3a638cc06d1d63767dca28697800bca1050 Binary files /dev/null and b/demo_assets/images/4ebc2c7d8668ac37.jpg differ diff --git a/demo_assets/images/5303c16d17b5cd88.jpg b/demo_assets/images/5303c16d17b5cd88.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ebd704cccd48e937000d6e1c393e6b87ecdf9fe6 Binary files /dev/null and b/demo_assets/images/5303c16d17b5cd88.jpg differ diff --git a/demo_assets/images/532862997932dcaa.jpg b/demo_assets/images/532862997932dcaa.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d13decbe28541b7195e1627aa9a1e5471a7fcd89 Binary files /dev/null and b/demo_assets/images/532862997932dcaa.jpg differ diff --git a/demo_assets/images/560df95288a192ac.jpg b/demo_assets/images/560df95288a192ac.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fde3d9c26849d6bc6d306133ba8d4058df7dad75 Binary files /dev/null and b/demo_assets/images/560df95288a192ac.jpg differ diff --git a/demo_assets/images/56405a17c0ea8857.jpg b/demo_assets/images/56405a17c0ea8857.jpg new file mode 100644 index 0000000000000000000000000000000000000000..295f7498886f7a2d32620eb69d735c872fdec5f8 Binary files /dev/null and b/demo_assets/images/56405a17c0ea8857.jpg differ diff --git a/demo_assets/images/58edc439809229e6.jpg b/demo_assets/images/58edc439809229e6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2b726dc777382d4a5fb14a3868885f7c0764b450 Binary files /dev/null and b/demo_assets/images/58edc439809229e6.jpg differ diff --git a/demo_assets/images/597d876ab0fa3ccd.jpg b/demo_assets/images/597d876ab0fa3ccd.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0b8bc039ceb379a2ebdb0421855dcbe78e9976d9 Binary files /dev/null and b/demo_assets/images/597d876ab0fa3ccd.jpg differ diff --git a/demo_assets/images/5b11689076a3cc49.jpg b/demo_assets/images/5b11689076a3cc49.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3e5bda7de56b7d6144bce9f4285f98f3a1cb936f Binary files /dev/null and b/demo_assets/images/5b11689076a3cc49.jpg differ diff --git a/demo_assets/images/5c5fecfb048b7a1c.jpg b/demo_assets/images/5c5fecfb048b7a1c.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eafd896a84c4636cb5dfc52604e47b24946397cb Binary files /dev/null and b/demo_assets/images/5c5fecfb048b7a1c.jpg differ diff --git a/demo_assets/images/5f1e938cac4f3753.jpg b/demo_assets/images/5f1e938cac4f3753.jpg new file mode 100644 index 0000000000000000000000000000000000000000..29eedc5aa3ae05c731cbdddc26510b4d3b631f41 Binary files /dev/null and b/demo_assets/images/5f1e938cac4f3753.jpg differ diff --git a/demo_assets/images/5fd250e28fbd65d9.jpg b/demo_assets/images/5fd250e28fbd65d9.jpg new file mode 100644 index 0000000000000000000000000000000000000000..679bd08db3e267f5e6654df60ab76d3d3f811bdd Binary files /dev/null and b/demo_assets/images/5fd250e28fbd65d9.jpg differ diff --git a/demo_assets/images/6280218c3acff468.jpg b/demo_assets/images/6280218c3acff468.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fd5d84e65f624eaff7bef8ad497561d5b66d1ee9 Binary files /dev/null and b/demo_assets/images/6280218c3acff468.jpg differ diff --git a/demo_assets/images/65b3916a657492ed.jpg b/demo_assets/images/65b3916a657492ed.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d40ff6731a1ac63b447a1e0b150f5ca869abf868 Binary files /dev/null and b/demo_assets/images/65b3916a657492ed.jpg differ diff --git a/demo_assets/images/69248ebbbea5aa0c.jpg b/demo_assets/images/69248ebbbea5aa0c.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c3a83672efe3c1fb5714da6253b1d4efb7184f11 Binary files /dev/null and b/demo_assets/images/69248ebbbea5aa0c.jpg differ diff --git a/demo_assets/images/69a83a4f4fe1f3d3.jpg b/demo_assets/images/69a83a4f4fe1f3d3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f794e131ac3b33726aa7a6a4cd04689f9b645982 Binary files /dev/null and b/demo_assets/images/69a83a4f4fe1f3d3.jpg differ diff --git a/demo_assets/images/6c1af88ce6699fbb.jpg b/demo_assets/images/6c1af88ce6699fbb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1970113f027701634a1106cd5d1a6bdc84ea8fb6 Binary files /dev/null and b/demo_assets/images/6c1af88ce6699fbb.jpg differ diff --git a/demo_assets/images/6e86e224c7e36481.jpg b/demo_assets/images/6e86e224c7e36481.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b8c63d038ad2b3b90826f82b3e83d73e8e038f0c Binary files /dev/null and b/demo_assets/images/6e86e224c7e36481.jpg differ diff --git a/demo_assets/images/73455ef936cf1a3c.jpg b/demo_assets/images/73455ef936cf1a3c.jpg new file mode 100644 index 0000000000000000000000000000000000000000..17b3c71374c629126f2eddcf649634b717d1bd46 Binary files /dev/null and b/demo_assets/images/73455ef936cf1a3c.jpg differ diff --git a/demo_assets/images/85225a4395d8a415.jpg b/demo_assets/images/85225a4395d8a415.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c3163631db784d5c6b2757db943c43e29a822b09 Binary files /dev/null and b/demo_assets/images/85225a4395d8a415.jpg differ diff --git a/demo_assets/images/86426acf5270f5d4.jpg b/demo_assets/images/86426acf5270f5d4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..555992406e0ebaaeb90334788761523590d01f32 Binary files /dev/null and b/demo_assets/images/86426acf5270f5d4.jpg differ diff --git a/demo_assets/images/8ae3bac7967df4b7.jpg b/demo_assets/images/8ae3bac7967df4b7.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b50edfe57e934739bba93be79fcbb586976f323d Binary files /dev/null and b/demo_assets/images/8ae3bac7967df4b7.jpg differ diff --git a/demo_assets/images/8b829507f4c988c5.jpg b/demo_assets/images/8b829507f4c988c5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d8923c5f6f3a6d894fdd07aeddb6bb458d8c1a0c Binary files /dev/null and b/demo_assets/images/8b829507f4c988c5.jpg differ diff --git a/demo_assets/images/8fdbacd880af6412.jpg b/demo_assets/images/8fdbacd880af6412.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4a7e36672ac89722ea250e3cef9a804649785d16 Binary files /dev/null and b/demo_assets/images/8fdbacd880af6412.jpg differ diff --git a/demo_assets/images/92a7c03c939944a3.jpg b/demo_assets/images/92a7c03c939944a3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d1868c6ea958e7e2f772854d4edb19971c1eb35e --- /dev/null +++ b/demo_assets/images/92a7c03c939944a3.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7fb0d41db7b107071a5066f7da21bde0a61932e9ad2ccd833cb6c19eb06f0e1f +size 127498 diff --git a/demo_assets/images/979b85df44a4c688.jpg b/demo_assets/images/979b85df44a4c688.jpg new file mode 100644 index 0000000000000000000000000000000000000000..041ee4edad0eb8412fff07c3bda9f424f86d921d Binary files /dev/null and b/demo_assets/images/979b85df44a4c688.jpg differ diff --git a/demo_assets/images/97be0fd4d7d12a18.jpg b/demo_assets/images/97be0fd4d7d12a18.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0b6aad0e79451b807791a3286804e571551b1e83 Binary files /dev/null and b/demo_assets/images/97be0fd4d7d12a18.jpg differ diff --git a/demo_assets/images/98e6698057654eff.jpg b/demo_assets/images/98e6698057654eff.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3a6907b32f9544d137ffc6e22dcd75760cc4f19e Binary files /dev/null and b/demo_assets/images/98e6698057654eff.jpg differ diff --git a/demo_assets/images/9e2e2c64173578bc.jpg b/demo_assets/images/9e2e2c64173578bc.jpg new file mode 100644 index 0000000000000000000000000000000000000000..43b9adf3e6f1df45b081d866c991742e64916d88 Binary files /dev/null and b/demo_assets/images/9e2e2c64173578bc.jpg differ diff --git a/demo_assets/images/9e5bdee6bdc47b7b.jpg b/demo_assets/images/9e5bdee6bdc47b7b.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b4cb47aa7acf429d6b0d66f056593754aa9734f0 Binary files /dev/null and b/demo_assets/images/9e5bdee6bdc47b7b.jpg differ diff --git a/demo_assets/images/a1119d540ba829e4.jpg b/demo_assets/images/a1119d540ba829e4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f7e8416915e6a585f9f69c0f35443a29bab3881c Binary files /dev/null and b/demo_assets/images/a1119d540ba829e4.jpg differ diff --git a/demo_assets/images/a1cc464404c4a5a3.jpg b/demo_assets/images/a1cc464404c4a5a3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c8a4eadd210af63a5975f73ff05478aef38c5a58 Binary files /dev/null and b/demo_assets/images/a1cc464404c4a5a3.jpg differ diff --git a/demo_assets/images/a670c7bde1b25fbe.jpg b/demo_assets/images/a670c7bde1b25fbe.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f345e71ca9bc4e180e521f2a9a0f14eb0dfaf29c Binary files /dev/null and b/demo_assets/images/a670c7bde1b25fbe.jpg differ diff --git a/demo_assets/images/a6e26ac77fdf81e0.jpg b/demo_assets/images/a6e26ac77fdf81e0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9497db761211f5a0f3490ea54acb6fb1c890a8b5 Binary files /dev/null and b/demo_assets/images/a6e26ac77fdf81e0.jpg differ diff --git a/demo_assets/images/a81e73b6a73798a8.jpg b/demo_assets/images/a81e73b6a73798a8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d5f7ccfea50d2906bc5a5c3f1406e6fc3f91ec03 Binary files /dev/null and b/demo_assets/images/a81e73b6a73798a8.jpg differ diff --git a/demo_assets/images/aaa12411c2d6378d.jpg b/demo_assets/images/aaa12411c2d6378d.jpg new file mode 100644 index 0000000000000000000000000000000000000000..36a4f09a45be4f873111c8f7840395c417715915 Binary files /dev/null and b/demo_assets/images/aaa12411c2d6378d.jpg differ diff --git a/demo_assets/images/ab93a8b5592ce5bd.jpg b/demo_assets/images/ab93a8b5592ce5bd.jpg new file mode 100644 index 0000000000000000000000000000000000000000..da3c0b21395206fe095c27cadae217310f516543 --- /dev/null +++ b/demo_assets/images/ab93a8b5592ce5bd.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4ce762c53061ca0d8830758cba39a6cc782763cd941476b5b9a018b5a754b40d +size 134865 diff --git a/demo_assets/images/ad8a5f8704a897c7.jpg b/demo_assets/images/ad8a5f8704a897c7.jpg new file mode 100644 index 0000000000000000000000000000000000000000..11c1912f9af093c98ea2c6703814304942ad7c72 Binary files /dev/null and b/demo_assets/images/ad8a5f8704a897c7.jpg differ diff --git a/demo_assets/images/adf267f15c51f106.jpg b/demo_assets/images/adf267f15c51f106.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ba89901bd63fa22cb519a95050b8b75436d95c98 Binary files /dev/null and b/demo_assets/images/adf267f15c51f106.jpg differ diff --git a/demo_assets/images/b053b1f12641af60.jpg b/demo_assets/images/b053b1f12641af60.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8fcf56ba85c45ac8448baf499e51ba1f1c886f35 Binary files /dev/null and b/demo_assets/images/b053b1f12641af60.jpg differ diff --git a/demo_assets/images/b0b4407a9ec06def.jpg b/demo_assets/images/b0b4407a9ec06def.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f2386c0ef5c8270d6428593c1b3afe8f3164957c Binary files /dev/null and b/demo_assets/images/b0b4407a9ec06def.jpg differ diff --git a/demo_assets/images/b14f752e43df1621.jpg b/demo_assets/images/b14f752e43df1621.jpg new file mode 100644 index 0000000000000000000000000000000000000000..380949da5faf06b263ccea119d3c2ef25501add9 Binary files /dev/null and b/demo_assets/images/b14f752e43df1621.jpg differ diff --git a/demo_assets/images/b1dcd860e0597d4d.jpg b/demo_assets/images/b1dcd860e0597d4d.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dfc4fbad6740f174bef8ec9c492f23254ffbb6a5 Binary files /dev/null and b/demo_assets/images/b1dcd860e0597d4d.jpg differ diff --git a/demo_assets/images/b5bbb96eefd779eb.jpg b/demo_assets/images/b5bbb96eefd779eb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..84f86509136d3a7aa4c867ee522ba6663c5f5e90 Binary files /dev/null and b/demo_assets/images/b5bbb96eefd779eb.jpg differ diff --git a/demo_assets/images/b8841ca549d2f150.jpg b/demo_assets/images/b8841ca549d2f150.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dfe587532354ed4a52c361add323351a154fb030 Binary files /dev/null and b/demo_assets/images/b8841ca549d2f150.jpg differ diff --git a/demo_assets/images/b9f587f8925e9f16.jpg b/demo_assets/images/b9f587f8925e9f16.jpg new file mode 100644 index 0000000000000000000000000000000000000000..533ddc4509e26e162a107ead3d29ab6b8c18bb14 Binary files /dev/null and b/demo_assets/images/b9f587f8925e9f16.jpg differ diff --git a/demo_assets/images/bafd801621510353.jpg b/demo_assets/images/bafd801621510353.jpg new file mode 100644 index 0000000000000000000000000000000000000000..33e0ea691f741093593f4d4a06c98015cb37675e Binary files /dev/null and b/demo_assets/images/bafd801621510353.jpg differ diff --git a/demo_assets/images/bccaa2217560c7c3.jpg b/demo_assets/images/bccaa2217560c7c3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..efc4c700dd778f67480a2b934dc6886d6c82520e Binary files /dev/null and b/demo_assets/images/bccaa2217560c7c3.jpg differ diff --git a/demo_assets/images/bde24144940e4c70.jpg b/demo_assets/images/bde24144940e4c70.jpg new file mode 100644 index 0000000000000000000000000000000000000000..30d951761862d00249129c07f1164ccb90fcd3a0 Binary files /dev/null and b/demo_assets/images/bde24144940e4c70.jpg differ diff --git a/demo_assets/images/c244850cf9fc19e5.jpg b/demo_assets/images/c244850cf9fc19e5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..658fd4dde0aafc410fe547d698aec1ae267c5801 Binary files /dev/null and b/demo_assets/images/c244850cf9fc19e5.jpg differ diff --git a/demo_assets/images/c2c19be58ed7280b.jpg b/demo_assets/images/c2c19be58ed7280b.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1652993867e08819321dc8f1e44d150a6e329c06 Binary files /dev/null and b/demo_assets/images/c2c19be58ed7280b.jpg differ diff --git a/demo_assets/images/c3a6ece44b0d93f6.jpg b/demo_assets/images/c3a6ece44b0d93f6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..603e1a59ac57a48192face6a6837da978672b260 Binary files /dev/null and b/demo_assets/images/c3a6ece44b0d93f6.jpg differ diff --git a/demo_assets/images/c55c4cc3caf27f42.jpg b/demo_assets/images/c55c4cc3caf27f42.jpg new file mode 100644 index 0000000000000000000000000000000000000000..11a89ab0ffb4a6a429a7b841533d5a9fd848dc5e Binary files /dev/null and b/demo_assets/images/c55c4cc3caf27f42.jpg differ diff --git a/demo_assets/images/c97b0813480f1f26.jpg b/demo_assets/images/c97b0813480f1f26.jpg new file mode 100644 index 0000000000000000000000000000000000000000..64933010c386e00f0678f2c378ff6e3f4430736d --- /dev/null +++ b/demo_assets/images/c97b0813480f1f26.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:88b40cbf426919c0a7f08a22f8a40ec0102a87c2452eb049d55e66aab4f1b82a +size 130474 diff --git a/demo_assets/images/ca7f1c22d5781c58.jpg b/demo_assets/images/ca7f1c22d5781c58.jpg new file mode 100644 index 0000000000000000000000000000000000000000..caa3beb3ff56789f59dea88a6af3effed7516058 Binary files /dev/null and b/demo_assets/images/ca7f1c22d5781c58.jpg differ diff --git a/demo_assets/images/ca93d2be9f233fe5.jpg b/demo_assets/images/ca93d2be9f233fe5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d5d2ce609cab1f744c00305f8e86602cdd471a2f Binary files /dev/null and b/demo_assets/images/ca93d2be9f233fe5.jpg differ diff --git a/demo_assets/images/cb3f53fbf104bd9a.jpg b/demo_assets/images/cb3f53fbf104bd9a.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0db7c2149052ce5c23ed8397dc9e3d4dd483ecc3 Binary files /dev/null and b/demo_assets/images/cb3f53fbf104bd9a.jpg differ diff --git a/demo_assets/images/ccd1baf21b64d13a.jpg b/demo_assets/images/ccd1baf21b64d13a.jpg new file mode 100644 index 0000000000000000000000000000000000000000..678713919949e29a22de66f17ae2021d617e3f84 Binary files /dev/null and b/demo_assets/images/ccd1baf21b64d13a.jpg differ diff --git a/demo_assets/images/ce1f66c25b26ac2e.jpg b/demo_assets/images/ce1f66c25b26ac2e.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a062272f92217961129759b57af6050c397ee14c Binary files /dev/null and b/demo_assets/images/ce1f66c25b26ac2e.jpg differ diff --git a/demo_assets/images/d5c269edcbabbab6.jpg b/demo_assets/images/d5c269edcbabbab6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..79193a86eaeabfad1b2021dae566768f3cdcd465 Binary files /dev/null and b/demo_assets/images/d5c269edcbabbab6.jpg differ diff --git a/demo_assets/images/d7bf42f6b20e96c2.jpg b/demo_assets/images/d7bf42f6b20e96c2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..62a7b1e17e74e411cfb86bae4649e611b2410628 --- /dev/null +++ b/demo_assets/images/d7bf42f6b20e96c2.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:422820b9c1cf3bea8824597b74ed96e6b77b99c85c34174ad8ef1e265a725942 +size 113551 diff --git a/demo_assets/images/dac097118d6cf5c5.jpg b/demo_assets/images/dac097118d6cf5c5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4a11e9b90ae812db2e62c546d77c78ed254fc031 Binary files /dev/null and b/demo_assets/images/dac097118d6cf5c5.jpg differ diff --git a/demo_assets/images/db096389b4d5654b.jpg b/demo_assets/images/db096389b4d5654b.jpg new file mode 100644 index 0000000000000000000000000000000000000000..61a952a22427a719c96075682322e4f14850005b Binary files /dev/null and b/demo_assets/images/db096389b4d5654b.jpg differ diff --git a/demo_assets/images/dbe3012525cc3fec.jpg b/demo_assets/images/dbe3012525cc3fec.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ca074cf22c4cd392bd386d1be395335bb7edb8c7 --- /dev/null +++ b/demo_assets/images/dbe3012525cc3fec.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e8a8f005159c761025db710ca06f6c466d907c8db9fcb6de420335692903d7dd +size 117671 diff --git a/demo_assets/images/dbece6c572cc3bb6.jpg b/demo_assets/images/dbece6c572cc3bb6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..104ad39ca8784e0032515494cdec44e5ff3c7992 Binary files /dev/null and b/demo_assets/images/dbece6c572cc3bb6.jpg differ diff --git a/demo_assets/images/df17e1a71723c206.jpg b/demo_assets/images/df17e1a71723c206.jpg new file mode 100644 index 0000000000000000000000000000000000000000..85cc6f1a04821281cb0b2272b75c7f0b60e3ae88 Binary files /dev/null and b/demo_assets/images/df17e1a71723c206.jpg differ diff --git a/demo_assets/images/e03db3c78623522b.jpg b/demo_assets/images/e03db3c78623522b.jpg new file mode 100644 index 0000000000000000000000000000000000000000..012653e0b5a63077acc387501546ca84a7975843 Binary files /dev/null and b/demo_assets/images/e03db3c78623522b.jpg differ diff --git a/demo_assets/images/e0c0a275bf9cdbff.jpg b/demo_assets/images/e0c0a275bf9cdbff.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9bfebd6c19f50371ba4c789104036a180a770fae Binary files /dev/null and b/demo_assets/images/e0c0a275bf9cdbff.jpg differ diff --git a/demo_assets/images/e1a367e16b4e07fb.jpg b/demo_assets/images/e1a367e16b4e07fb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d453a519fccca938c78a6f072050b3e1b5b4dfc5 Binary files /dev/null and b/demo_assets/images/e1a367e16b4e07fb.jpg differ diff --git a/demo_assets/images/e6b5ea0ae5f4ab86.jpg b/demo_assets/images/e6b5ea0ae5f4ab86.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d555e9e479865f6cb15c9465458de918f383a0d9 Binary files /dev/null and b/demo_assets/images/e6b5ea0ae5f4ab86.jpg differ diff --git a/demo_assets/images/ea39fa9dc50811b0.jpg b/demo_assets/images/ea39fa9dc50811b0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0a5532081ab174a0cbbca0a4dd21dc84a9f3a883 --- /dev/null +++ b/demo_assets/images/ea39fa9dc50811b0.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f4ec6a83181d246087b36a6e0e7d3cdb1f71a5d423ff765ea1b597036be6f2e4 +size 144725 diff --git a/demo_assets/images/ea3aaa899d45a51d.jpg b/demo_assets/images/ea3aaa899d45a51d.jpg new file mode 100644 index 0000000000000000000000000000000000000000..aed35db8fab0cc81b402c0daafb8307b80c163ef Binary files /dev/null and b/demo_assets/images/ea3aaa899d45a51d.jpg differ diff --git a/demo_assets/images/ec2f69aaaa3f927e.jpg b/demo_assets/images/ec2f69aaaa3f927e.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0a2138610d6e6c59f6cfcd0eb610296230671a6c Binary files /dev/null and b/demo_assets/images/ec2f69aaaa3f927e.jpg differ diff --git a/demo_assets/images/eeed1e944c331791.jpg b/demo_assets/images/eeed1e944c331791.jpg new file mode 100644 index 0000000000000000000000000000000000000000..baea908676f2d784310efe57b61f0f1594abad76 --- /dev/null +++ b/demo_assets/images/eeed1e944c331791.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1769a9fb30d4f8cbbc2b2905a7e7c606bc25f6617485ba1670f92e404a2b904 +size 101879 diff --git a/demo_assets/images/ef87214d8f124297.jpg b/demo_assets/images/ef87214d8f124297.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bfa9ce0ebd18bd914fad3138ca06e485b83cb311 Binary files /dev/null and b/demo_assets/images/ef87214d8f124297.jpg differ diff --git a/demo_assets/images/f4fac95f82bc410d.jpg b/demo_assets/images/f4fac95f82bc410d.jpg new file mode 100644 index 0000000000000000000000000000000000000000..29a6d21bb5ec8d0eaa72ed4ab6f6b6707544ae90 Binary files /dev/null and b/demo_assets/images/f4fac95f82bc410d.jpg differ diff --git a/demo_assets/images/fb214437fd81f122.jpg b/demo_assets/images/fb214437fd81f122.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7e8a7b3fbfa2f94bcb9fb200aa0a69fdcbc50f36 Binary files /dev/null and b/demo_assets/images/fb214437fd81f122.jpg differ diff --git a/demo_assets/manifest.json b/demo_assets/manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..5dd0ae38eb767261d4eaaa56a6c954472502a151 --- /dev/null +++ b/demo_assets/manifest.json @@ -0,0 +1,1589 @@ +{ + "dataset": "openimages_visual_safety_marketplace_triage_v2", + "records": [ + { + "index": 0, + "image_id": "e0c0a275bf9cdbff", + "asset_path": "demo_assets/images/e0c0a275bf9cdbff.jpg", + "bucket": "needs_review", + "label": "Knife", + "labels": [ + "Knife" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/e0c0a275bf9cdbff.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Carrots on Epicurean Cutting Board" + }, + { + "index": 1, + "image_id": "58edc439809229e6", + "asset_path": "demo_assets/images/58edc439809229e6.jpg", + "bucket": "needs_review", + "label": "Beer", + "labels": [ + "Beer" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/58edc439809229e6.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Paris: Spring 2011" + }, + { + "index": 2, + "image_id": "3722904d5b45c676", + "asset_path": "demo_assets/images/3722904d5b45c676.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing", + "Dress" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/3722904d5b45c676.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Merritt-Jones wedding reception" + }, + { + "index": 3, + "image_id": "c2c19be58ed7280b", + "asset_path": "demo_assets/images/c2c19be58ed7280b.jpg", + "bucket": "safe", + "label": "Apple", + "labels": [ + "Apple" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/c2c19be58ed7280b.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "two-oh-eight/three-sixty-five" + }, + { + "index": 4, + "image_id": "97be0fd4d7d12a18", + "asset_path": "demo_assets/images/97be0fd4d7d12a18.jpg", + "bucket": "safe", + "label": "Book", + "labels": [ + "Book" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/97be0fd4d7d12a18.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Old "45s"" + }, + { + "index": 5, + "image_id": "86426acf5270f5d4", + "asset_path": "demo_assets/images/86426acf5270f5d4.jpg", + "bucket": "safe", + "label": "Chair", + "labels": [ + "Chair", + "Table" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/86426acf5270f5d4.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Lobby" + }, + { + "index": 6, + "image_id": "aaa12411c2d6378d", + "asset_path": "demo_assets/images/aaa12411c2d6378d.jpg", + "bucket": "safe", + "label": "Chair", + "labels": [ + "Chair", + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/aaa12411c2d6378d.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Hematology lab staff" + }, + { + "index": 7, + "image_id": "05f4f97b3833086e", + "asset_path": "demo_assets/images/05f4f97b3833086e.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/05f4f97b3833086e.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "S.F. Wrestling World Championships" + }, + { + "index": 8, + "image_id": "084a9d12a2a486dc", + "asset_path": "demo_assets/images/084a9d12a2a486dc.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/084a9d12a2a486dc.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "1Minute - Baby Cheerios" + }, + { + "index": 9, + "image_id": "0ba3f8b8a3a2e93c", + "asset_path": "demo_assets/images/0ba3f8b8a3a2e93c.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/0ba3f8b8a3a2e93c.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "sugar" + }, + { + "index": 10, + "image_id": "11cd71943afb477e", + "asset_path": "demo_assets/images/11cd71943afb477e.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/11cd71943afb477e.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Selin Jessa" + }, + { + "index": 11, + "image_id": "318c91bd306e52e1", + "asset_path": "demo_assets/images/318c91bd306e52e1.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/318c91bd306e52e1.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Escobar shields his face from the cameras." + }, + { + "index": 12, + "image_id": "318e12be63daa7bb", + "asset_path": "demo_assets/images/318e12be63daa7bb.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/318e12be63daa7bb.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "_MG_6688" + }, + { + "index": 13, + "image_id": "32255e4104d8f9b7", + "asset_path": "demo_assets/images/32255e4104d8f9b7.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/32255e4104d8f9b7.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Steamy Kitchen Book Signing at Omnivore Books" + }, + { + "index": 14, + "image_id": "33969a398effdb29", + "asset_path": "demo_assets/images/33969a398effdb29.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/33969a398effdb29.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "IMG_9190" + }, + { + "index": 15, + "image_id": "34ec1592f40cdfaa", + "asset_path": "demo_assets/images/34ec1592f40cdfaa.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/34ec1592f40cdfaa.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Final adjustments" + }, + { + "index": 16, + "image_id": "477ab6b26dd5a667", + "asset_path": "demo_assets/images/477ab6b26dd5a667.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/477ab6b26dd5a667.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "TOM SYKES" + }, + { + "index": 17, + "image_id": "4d5a6b0ed65de97e", + "asset_path": "demo_assets/images/4d5a6b0ed65de97e.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/4d5a6b0ed65de97e.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "RockArt Gallery" + }, + { + "index": 18, + "image_id": "4d6d17f9ed60e02b", + "asset_path": "demo_assets/images/4d6d17f9ed60e02b.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/4d6d17f9ed60e02b.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Mount Vernon-Woodward Opera House (CORF)" + }, + { + "index": 19, + "image_id": "532862997932dcaa", + "asset_path": "demo_assets/images/532862997932dcaa.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/532862997932dcaa.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "My Experimental Long Hair" + }, + { + "index": 20, + "image_id": "85225a4395d8a415", + "asset_path": "demo_assets/images/85225a4395d8a415.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/85225a4395d8a415.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "I 1st assumed this was cops searching a car. No, it's the new tesla S on display :-) #roadmapconf" + }, + { + "index": 21, + "image_id": "8b829507f4c988c5", + "asset_path": "demo_assets/images/8b829507f4c988c5.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/8b829507f4c988c5.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "On the Ropes" + }, + { + "index": 22, + "image_id": "92a7c03c939944a3", + "asset_path": "demo_assets/images/92a7c03c939944a3.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/92a7c03c939944a3.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Untitled" + }, + { + "index": 23, + "image_id": "979b85df44a4c688", + "asset_path": "demo_assets/images/979b85df44a4c688.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/979b85df44a4c688.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "wasserp" + }, + { + "index": 24, + "image_id": "a670c7bde1b25fbe", + "asset_path": "demo_assets/images/a670c7bde1b25fbe.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/a670c7bde1b25fbe.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "sam streaking" + }, + { + "index": 25, + "image_id": "a81e73b6a73798a8", + "asset_path": "demo_assets/images/a81e73b6a73798a8.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/a81e73b6a73798a8.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "CRESTA" + }, + { + "index": 26, + "image_id": "adf267f15c51f106", + "asset_path": "demo_assets/images/adf267f15c51f106.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/adf267f15c51f106.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Makeup Design: Beauty & Glamour Makeup" + }, + { + "index": 27, + "image_id": "b9f587f8925e9f16", + "asset_path": "demo_assets/images/b9f587f8925e9f16.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/b9f587f8925e9f16.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Tattooed Two" + }, + { + "index": 28, + "image_id": "bccaa2217560c7c3", + "asset_path": "demo_assets/images/bccaa2217560c7c3.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/bccaa2217560c7c3.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Graduation Ceremony" + }, + { + "index": 29, + "image_id": "bde24144940e4c70", + "asset_path": "demo_assets/images/bde24144940e4c70.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/bde24144940e4c70.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Christmas Morning at Dad's" + }, + { + "index": 30, + "image_id": "dbe3012525cc3fec", + "asset_path": "demo_assets/images/dbe3012525cc3fec.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/dbe3012525cc3fec.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Columbia Cheerleader" + }, + { + "index": 31, + "image_id": "dbece6c572cc3bb6", + "asset_path": "demo_assets/images/dbece6c572cc3bb6.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/dbece6c572cc3bb6.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "i love to share" + }, + { + "index": 32, + "image_id": "e1a367e16b4e07fb", + "asset_path": "demo_assets/images/e1a367e16b4e07fb.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/e1a367e16b4e07fb.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Qiqi Aerials Class" + }, + { + "index": 33, + "image_id": "e6b5ea0ae5f4ab86", + "asset_path": "demo_assets/images/e6b5ea0ae5f4ab86.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/e6b5ea0ae5f4ab86.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "formation" + }, + { + "index": 34, + "image_id": "ec2f69aaaa3f927e", + "asset_path": "demo_assets/images/ec2f69aaaa3f927e.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/ec2f69aaaa3f927e.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Superman" + }, + { + "index": 35, + "image_id": "fb214437fd81f122", + "asset_path": "demo_assets/images/fb214437fd81f122.jpg", + "bucket": "safe", + "label": "Clothing", + "labels": [ + "Clothing" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/fb214437fd81f122.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "28\u00ba Sal\u00e3o Internacional do Autom\u00f3vel de S\u00e3o Paulo - 2014" + }, + { + "index": 36, + "image_id": "ef87214d8f124297", + "asset_path": "demo_assets/images/ef87214d8f124297.jpg", + "bucket": "safe", + "label": "Coffee cup", + "labels": [ + "Coffee cup" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/ef87214d8f124297.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Hitchhiker latte" + }, + { + "index": 37, + "image_id": "12b06cbeaa8b634a", + "asset_path": "demo_assets/images/12b06cbeaa8b634a.jpg", + "bucket": "safe", + "label": "Dress", + "labels": [ + "Dress" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/12b06cbeaa8b634a.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Barbie" + }, + { + "index": 38, + "image_id": "178f262c9f18c8ba", + "asset_path": "demo_assets/images/178f262c9f18c8ba.jpg", + "bucket": "safe", + "label": "Dress", + "labels": [ + "Dress" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/178f262c9f18c8ba.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Belle and the Beast" + }, + { + "index": 39, + "image_id": "499cfd3e29e31662", + "asset_path": "demo_assets/images/499cfd3e29e31662.jpg", + "bucket": "safe", + "label": "Dress", + "labels": [ + "Dress" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/499cfd3e29e31662.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Serena" + }, + { + "index": 40, + "image_id": "69a83a4f4fe1f3d3", + "asset_path": "demo_assets/images/69a83a4f4fe1f3d3.jpg", + "bucket": "safe", + "label": "Dress", + "labels": [ + "Dress" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/69a83a4f4fe1f3d3.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Raf Simons: Teenage Summercamp (Spring/Summer 1997)" + }, + { + "index": 41, + "image_id": "6e86e224c7e36481", + "asset_path": "demo_assets/images/6e86e224c7e36481.jpg", + "bucket": "safe", + "label": "Dress", + "labels": [ + "Dress" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/6e86e224c7e36481.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Prince Of Melbourne & Ya5SaRa" + }, + { + "index": 42, + "image_id": "ea3aaa899d45a51d", + "asset_path": "demo_assets/images/ea3aaa899d45a51d.jpg", + "bucket": "safe", + "label": "Dress", + "labels": [ + "Dress" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/ea3aaa899d45a51d.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Alexander McQueen Spring/Summer 1998" + }, + { + "index": 43, + "image_id": "9e5bdee6bdc47b7b", + "asset_path": "demo_assets/images/9e5bdee6bdc47b7b.jpg", + "bucket": "safe", + "label": "Flower", + "labels": [ + "Flower" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/9e5bdee6bdc47b7b.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "White orchid" + }, + { + "index": 44, + "image_id": "ab93a8b5592ce5bd", + "asset_path": "demo_assets/images/ab93a8b5592ce5bd.jpg", + "bucket": "safe", + "label": "Flower", + "labels": [ + "Flower" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/ab93a8b5592ce5bd.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "daisies with hat : pride parade, san francisco (2011)" + }, + { + "index": 45, + "image_id": "c244850cf9fc19e5", + "asset_path": "demo_assets/images/c244850cf9fc19e5.jpg", + "bucket": "safe", + "label": "Flower", + "labels": [ + "Flower" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/c244850cf9fc19e5.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Crocus - First Spring Flower" + }, + { + "index": 46, + "image_id": "c97b0813480f1f26", + "asset_path": "demo_assets/images/c97b0813480f1f26.jpg", + "bucket": "safe", + "label": "Flower", + "labels": [ + "Flower" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/c97b0813480f1f26.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "P1020313" + }, + { + "index": 47, + "image_id": "ca93d2be9f233fe5", + "asset_path": "demo_assets/images/ca93d2be9f233fe5.jpg", + "bucket": "safe", + "label": "Flower", + "labels": [ + "Flower" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/ca93d2be9f233fe5.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Hong Kong Flower" + }, + { + "index": 48, + "image_id": "df17e1a71723c206", + "asset_path": "demo_assets/images/df17e1a71723c206.jpg", + "bucket": "safe", + "label": "Flower", + "labels": [ + "Flower" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/df17e1a71723c206.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Iris" + }, + { + "index": 49, + "image_id": "eeed1e944c331791", + "asset_path": "demo_assets/images/eeed1e944c331791.jpg", + "bucket": "safe", + "label": "Flower", + "labels": [ + "Flower" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/eeed1e944c331791.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Lilacs" + }, + { + "index": 50, + "image_id": "597d876ab0fa3ccd", + "asset_path": "demo_assets/images/597d876ab0fa3ccd.jpg", + "bucket": "safe", + "label": "Footwear", + "labels": [ + "Footwear" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/597d876ab0fa3ccd.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "#newshoes #brunswickmustard #balletflats #shoes" + }, + { + "index": 51, + "image_id": "483ade136f9e676d", + "asset_path": "demo_assets/images/483ade136f9e676d.jpg", + "bucket": "safe", + "label": "Mobile phone", + "labels": [ + "Mobile phone" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/483ade136f9e676d.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "+- to jsou ty koordin\u00e1ty :)." + }, + { + "index": 52, + "image_id": "c55c4cc3caf27f42", + "asset_path": "demo_assets/images/c55c4cc3caf27f42.jpg", + "bucket": "safe", + "label": "Mobile phone", + "labels": [ + "Mobile phone" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/c55c4cc3caf27f42.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "FontBook App" + }, + { + "index": 53, + "image_id": "cb3f53fbf104bd9a", + "asset_path": "demo_assets/images/cb3f53fbf104bd9a.jpg", + "bucket": "safe", + "label": "Mobile phone", + "labels": [ + "Mobile phone" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/cb3f53fbf104bd9a.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Blackberry" + }, + { + "index": 54, + "image_id": "ad8a5f8704a897c7", + "asset_path": "demo_assets/images/ad8a5f8704a897c7.jpg", + "bucket": "safe", + "label": "Shirt", + "labels": [ + "Shirt" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/ad8a5f8704a897c7.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Simon Dingemans" + }, + { + "index": 55, + "image_id": "3d0d7ec99241aec7", + "asset_path": "demo_assets/images/3d0d7ec99241aec7.jpg", + "bucket": "safe", + "label": "Table", + "labels": [ + "Table" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/3d0d7ec99241aec7.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Jumbo Shrimp" + }, + { + "index": 56, + "image_id": "43040be867118184", + "asset_path": "demo_assets/images/43040be867118184.jpg", + "bucket": "safe", + "label": "Table", + "labels": [ + "Table" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/43040be867118184.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "CIMG0130" + }, + { + "index": 57, + "image_id": "ea39fa9dc50811b0", + "asset_path": "demo_assets/images/ea39fa9dc50811b0.jpg", + "bucket": "safe", + "label": "Table", + "labels": [ + "Table" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/ea39fa9dc50811b0.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Obama Victory Celebration" + }, + { + "index": 58, + "image_id": "33ac3bd2015c44b2", + "asset_path": "demo_assets/images/33ac3bd2015c44b2.jpg", + "bucket": "safe", + "label": "Toy", + "labels": [ + "Toy" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/33ac3bd2015c44b2.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Untitled" + }, + { + "index": 59, + "image_id": "4ebc2c7d8668ac37", + "asset_path": "demo_assets/images/4ebc2c7d8668ac37.jpg", + "bucket": "safe", + "label": "Toy", + "labels": [ + "Toy" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/4ebc2c7d8668ac37.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Ringleader" + }, + { + "index": 60, + "image_id": "5303c16d17b5cd88", + "asset_path": "demo_assets/images/5303c16d17b5cd88.jpg", + "bucket": "safe", + "label": "Toy", + "labels": [ + "Toy" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/5303c16d17b5cd88.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Toilet Museum, Ilsan Lake Park(1)(1)((2)" + }, + { + "index": 61, + "image_id": "d7bf42f6b20e96c2", + "asset_path": "demo_assets/images/d7bf42f6b20e96c2.jpg", + "bucket": "safe", + "label": "Toy", + "labels": [ + "Toy" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/d7bf42f6b20e96c2.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Atlanta Botanical Garden Holiday Trains" + }, + { + "index": 62, + "image_id": "8ae3bac7967df4b7", + "asset_path": "demo_assets/images/8ae3bac7967df4b7.jpg", + "bucket": "needs_review", + "label": "Weapon", + "labels": [ + "Clothing", + "Weapon" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/8ae3bac7967df4b7.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "043" + }, + { + "index": 63, + "image_id": "5c5fecfb048b7a1c", + "asset_path": "demo_assets/images/5c5fecfb048b7a1c.jpg", + "bucket": "needs_review", + "label": "Cigar", + "labels": [ + "Cigar" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/5c5fecfb048b7a1c.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Pre-dinner cigar" + }, + { + "index": 64, + "image_id": "d5c269edcbabbab6", + "asset_path": "demo_assets/images/d5c269edcbabbab6.jpg", + "bucket": "needs_review", + "label": "Wine", + "labels": [ + "Wine" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/d5c269edcbabbab6.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Thanksgiving Turkey November 08" + }, + { + "index": 65, + "image_id": "09b96636ea4f4ce9", + "asset_path": "demo_assets/images/09b96636ea4f4ce9.jpg", + "bucket": "needs_review", + "label": "Cigar", + "labels": [ + "Cigar" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/09b96636ea4f4ce9.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Nice little cigarbomb #cigar #cohiba #oliva #davidoff #4x4 #cigarlife #cigaraficionado #cigarians #cigarporn #cubancigar #cigarrprat #scm #swedishcigarmaffia #botl #sotl #stogie #cigarbomb" + }, + { + "index": 66, + "image_id": "73455ef936cf1a3c", + "asset_path": "demo_assets/images/73455ef936cf1a3c.jpg", + "bucket": "needs_review", + "label": "Knife", + "labels": [ + "Knife" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/73455ef936cf1a3c.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Chorizos Criollos" + }, + { + "index": 67, + "image_id": "c3a6ece44b0d93f6", + "asset_path": "demo_assets/images/c3a6ece44b0d93f6.jpg", + "bucket": "needs_review", + "label": "Beer", + "labels": [ + "Beer" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/c3a6ece44b0d93f6.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "la padrona di casa" + }, + { + "index": 68, + "image_id": "db096389b4d5654b", + "asset_path": "demo_assets/images/db096389b4d5654b.jpg", + "bucket": "needs_review", + "label": "Weapon", + "labels": [ + "Weapon" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/db096389b4d5654b.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Soldier takes aim" + }, + { + "index": 69, + "image_id": "65b3916a657492ed", + "asset_path": "demo_assets/images/65b3916a657492ed.jpg", + "bucket": "needs_review", + "label": "Beer", + "labels": [ + "Beer" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/65b3916a657492ed.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Vienna Goesser beer 1" + }, + { + "index": 70, + "image_id": "6280218c3acff468", + "asset_path": "demo_assets/images/6280218c3acff468.jpg", + "bucket": "needs_review", + "label": "Kitchen knife", + "labels": [ + "Kitchen knife", + "Knife" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/6280218c3acff468.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Cantaloupe" + }, + { + "index": 71, + "image_id": "3ba5380490084697", + "asset_path": "demo_assets/images/3ba5380490084697.jpg", + "bucket": "needs_review", + "label": "Beer", + "labels": [ + "Beer", + "Table", + "Wine" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/3ba5380490084697.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Leffe" + }, + { + "index": 72, + "image_id": "b14f752e43df1621", + "asset_path": "demo_assets/images/b14f752e43df1621.jpg", + "bucket": "needs_review", + "label": "Beer", + "labels": [ + "Beer", + "Clothing", + "Table" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/b14f752e43df1621.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Beer at altitude" + }, + { + "index": 73, + "image_id": "419e1902dcac2d77", + "asset_path": "demo_assets/images/419e1902dcac2d77.jpg", + "bucket": "needs_review", + "label": "Wine", + "labels": [ + "Wine" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/419e1902dcac2d77.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Jamon Iberico de Bellota" + }, + { + "index": 74, + "image_id": "8fdbacd880af6412", + "asset_path": "demo_assets/images/8fdbacd880af6412.jpg", + "bucket": "needs_review", + "label": "Beer", + "labels": [ + "Beer" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/8fdbacd880af6412.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Hertog Jan Weizener" + }, + { + "index": 75, + "image_id": "5fd250e28fbd65d9", + "asset_path": "demo_assets/images/5fd250e28fbd65d9.jpg", + "bucket": "needs_review", + "label": "Cigarette", + "labels": [ + "Cigarette" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/5fd250e28fbd65d9.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Dejar de fumar" + }, + { + "index": 76, + "image_id": "ce1f66c25b26ac2e", + "asset_path": "demo_assets/images/ce1f66c25b26ac2e.jpg", + "bucket": "needs_review", + "label": "Beer", + "labels": [ + "Beer" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/ce1f66c25b26ac2e.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Chilled beer mug" + }, + { + "index": 77, + "image_id": "a1119d540ba829e4", + "asset_path": "demo_assets/images/a1119d540ba829e4.jpg", + "bucket": "needs_review", + "label": "Beer", + "labels": [ + "Beer", + "Wine" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/a1119d540ba829e4.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Why?" + }, + { + "index": 78, + "image_id": "07de9510e802a400", + "asset_path": "demo_assets/images/07de9510e802a400.jpg", + "bucket": "needs_review", + "label": "Knife", + "labels": [ + "Knife" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/07de9510e802a400.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Lunch @grodan" + }, + { + "index": 79, + "image_id": "b5bbb96eefd779eb", + "asset_path": "demo_assets/images/b5bbb96eefd779eb.jpg", + "bucket": "needs_review", + "label": "Beer", + "labels": [ + "Beer" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/b5bbb96eefd779eb.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Czech lager at the Old Prague Restaurant" + }, + { + "index": 80, + "image_id": "b1dcd860e0597d4d", + "asset_path": "demo_assets/images/b1dcd860e0597d4d.jpg", + "bucket": "needs_review", + "label": "Weapon", + "labels": [ + "Weapon" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/b1dcd860e0597d4d.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "101010-F-3682S-037" + }, + { + "index": 81, + "image_id": "dac097118d6cf5c5", + "asset_path": "demo_assets/images/dac097118d6cf5c5.jpg", + "bucket": "needs_review", + "label": "Cigar", + "labels": [ + "Cigar" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/dac097118d6cf5c5.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "PADRON FAMILY RESERVE 50TH ANNIVERSARY MADURO" + }, + { + "index": 82, + "image_id": "21d68297ff292660", + "asset_path": "demo_assets/images/21d68297ff292660.jpg", + "bucket": "needs_review", + "label": "Wine", + "labels": [ + "Wine" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/21d68297ff292660.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Tabletop" + }, + { + "index": 83, + "image_id": "0c4b629e801e8181", + "asset_path": "demo_assets/images/0c4b629e801e8181.jpg", + "bucket": "needs_review", + "label": "Handgun", + "labels": [ + "Handgun" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/0c4b629e801e8181.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Double-Shotgun_Hunting-Guns-Firearms__IMG_5099" + }, + { + "index": 84, + "image_id": "a6e26ac77fdf81e0", + "asset_path": "demo_assets/images/a6e26ac77fdf81e0.jpg", + "bucket": "needs_review", + "label": "Knife", + "labels": [ + "Knife" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/a6e26ac77fdf81e0.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "DSC_2789" + }, + { + "index": 85, + "image_id": "1228bfe2f3dc2d29", + "asset_path": "demo_assets/images/1228bfe2f3dc2d29.jpg", + "bucket": "needs_review", + "label": "Knife", + "labels": [ + "Knife" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/1228bfe2f3dc2d29.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Made by Lance Ockenden" + }, + { + "index": 86, + "image_id": "a1cc464404c4a5a3", + "asset_path": "demo_assets/images/a1cc464404c4a5a3.jpg", + "bucket": "needs_review", + "label": "Wine", + "labels": [ + "Wine" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/a1cc464404c4a5a3.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "IMGP2393" + }, + { + "index": 87, + "image_id": "69248ebbbea5aa0c", + "asset_path": "demo_assets/images/69248ebbbea5aa0c.jpg", + "bucket": "needs_review", + "label": "Beer", + "labels": [ + "Beer", + "Table" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/69248ebbbea5aa0c.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Lovely day for a..." + }, + { + "index": 88, + "image_id": "06a449c6ef03c172", + "asset_path": "demo_assets/images/06a449c6ef03c172.jpg", + "bucket": "needs_review", + "label": "Alcoholic beverage", + "labels": [ + "Alcoholic beverage" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/06a449c6ef03c172.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Old Fashioned" + }, + { + "index": 89, + "image_id": "56405a17c0ea8857", + "asset_path": "demo_assets/images/56405a17c0ea8857.jpg", + "bucket": "needs_review", + "label": "Handgun", + "labels": [ + "Handgun" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/56405a17c0ea8857.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "MARUZEN New Ingram M11 GBB Wood grip" + }, + { + "index": 90, + "image_id": "6c1af88ce6699fbb", + "asset_path": "demo_assets/images/6c1af88ce6699fbb.jpg", + "bucket": "needs_review", + "label": "Wine", + "labels": [ + "Wine" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/6c1af88ce6699fbb.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "2010 Grand Bateau Rouge, Bordeaux" + }, + { + "index": 91, + "image_id": "1519b2618048f525", + "asset_path": "demo_assets/images/1519b2618048f525.jpg", + "bucket": "needs_review", + "label": "Weapon", + "labels": [ + "Clothing", + "Weapon" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/1519b2618048f525.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "eject" + }, + { + "index": 92, + "image_id": "9e2e2c64173578bc", + "asset_path": "demo_assets/images/9e2e2c64173578bc.jpg", + "bucket": "needs_review", + "label": "Handgun", + "labels": [ + "Handgun" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/9e2e2c64173578bc.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "AK and little brother" + }, + { + "index": 93, + "image_id": "48e7aacdb6423790", + "asset_path": "demo_assets/images/48e7aacdb6423790.jpg", + "bucket": "needs_review", + "label": "Wine", + "labels": [ + "Wine" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/48e7aacdb6423790.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "glass." + }, + { + "index": 94, + "image_id": "4af30ade5ff3deb1", + "asset_path": "demo_assets/images/4af30ade5ff3deb1.jpg", + "bucket": "needs_review", + "label": "Knife", + "labels": [ + "Knife" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/4af30ade5ff3deb1.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "2011-11-1 Bolo Knife" + }, + { + "index": 95, + "image_id": "120d233407f1d14c", + "asset_path": "demo_assets/images/120d233407f1d14c.jpg", + "bucket": "needs_review", + "label": "Beer", + "labels": [ + "Beer" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/120d233407f1d14c.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "aaahhh drinks!" + }, + { + "index": 96, + "image_id": "4b00a3af27c5b2c6", + "asset_path": "demo_assets/images/4b00a3af27c5b2c6.jpg", + "bucket": "needs_review", + "label": "Knife", + "labels": [ + "Knife" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/4b00a3af27c5b2c6.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Kershaw Crown" + }, + { + "index": 97, + "image_id": "b8841ca549d2f150", + "asset_path": "demo_assets/images/b8841ca549d2f150.jpg", + "bucket": "needs_review", + "label": "Beer", + "labels": [ + "Beer" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/b8841ca549d2f150.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Grendel's Den, 04-15-2012" + }, + { + "index": 98, + "image_id": "15cc8c6a07fd3f0f", + "asset_path": "demo_assets/images/15cc8c6a07fd3f0f.jpg", + "bucket": "needs_review", + "label": "Alcoholic beverage", + "labels": [ + "Alcoholic beverage", + "Beer" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/15cc8c6a07fd3f0f.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "\u304a\u8179\u7a7a\u304d\u3059\u304e\u3066\u30b3\u30b3\u306b\u3002\u30cf\u30ea\u30cd\u30ba\u30df\u30d3\u30fc\u30eb\u898b\u3064\u3051\u305f\u3002\u5929\u6e80\u6a4b\u3067\u306f\u98f2\u3081\u306a\u3044\u3002" + }, + { + "index": 99, + "image_id": "98e6698057654eff", + "asset_path": "demo_assets/images/98e6698057654eff.jpg", + "bucket": "needs_review", + "label": "Wine", + "labels": [ + "Wine" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/98e6698057654eff.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "diavola" + }, + { + "index": 100, + "image_id": "5f1e938cac4f3753", + "asset_path": "demo_assets/images/5f1e938cac4f3753.jpg", + "bucket": "needs_review", + "label": "Beer", + "labels": [ + "Beer" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/5f1e938cac4f3753.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "OKTOBER FEST 2012 TOKYO DOME" + }, + { + "index": 101, + "image_id": "e03db3c78623522b", + "asset_path": "demo_assets/images/e03db3c78623522b.jpg", + "bucket": "needs_review", + "label": "Wine", + "labels": [ + "Wine" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/e03db3c78623522b.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Because Australia." + }, + { + "index": 102, + "image_id": "ccd1baf21b64d13a", + "asset_path": "demo_assets/images/ccd1baf21b64d13a.jpg", + "bucket": "needs_review", + "label": "Wine", + "labels": [ + "Dress", + "Wine" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/ccd1baf21b64d13a.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "champagne- nails-new years eve" + }, + { + "index": 103, + "image_id": "1a9d5f7cc9a88a1d", + "asset_path": "demo_assets/images/1a9d5f7cc9a88a1d.jpg", + "bucket": "needs_review", + "label": "Beer", + "labels": [ + "Beer" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/1a9d5f7cc9a88a1d.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Photo" + }, + { + "index": 104, + "image_id": "b053b1f12641af60", + "asset_path": "demo_assets/images/b053b1f12641af60.jpg", + "bucket": "needs_review", + "label": "Wine", + "labels": [ + "Dress", + "Wine" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/b053b1f12641af60.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "IMG_2589" + }, + { + "index": 105, + "image_id": "474d23651d5ca02a", + "asset_path": "demo_assets/images/474d23651d5ca02a.jpg", + "bucket": "needs_review", + "label": "Knife", + "labels": [ + "Knife", + "Table" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/474d23651d5ca02a.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Parmesan and parsnip bread" + }, + { + "index": 106, + "image_id": "14d45a56a0fe95bf", + "asset_path": "demo_assets/images/14d45a56a0fe95bf.jpg", + "bucket": "needs_review", + "label": "Rifle", + "labels": [ + "Chair", + "Rifle" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/14d45a56a0fe95bf.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "FAL 01" + }, + { + "index": 107, + "image_id": "0565bcccb1266f62", + "asset_path": "demo_assets/images/0565bcccb1266f62.jpg", + "bucket": "needs_review", + "label": "Kitchen knife", + "labels": [ + "Kitchen knife", + "Knife", + "Table" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/0565bcccb1266f62.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Knives" + }, + { + "index": 108, + "image_id": "bafd801621510353", + "asset_path": "demo_assets/images/bafd801621510353.jpg", + "bucket": "needs_review", + "label": "Kitchen knife", + "labels": [ + "Kitchen knife", + "Knife" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/bafd801621510353.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Knives - couteau nogent" + }, + { + "index": 109, + "image_id": "01b9021aa05e6e46", + "asset_path": "demo_assets/images/01b9021aa05e6e46.jpg", + "bucket": "needs_review", + "label": "Knife", + "labels": [ + "Knife" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/01b9021aa05e6e46.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Steven Kelly Litespeed Folder" + }, + { + "index": 110, + "image_id": "1de9f211102093d0", + "asset_path": "demo_assets/images/1de9f211102093d0.jpg", + "bucket": "needs_review", + "label": "Kitchen knife", + "labels": [ + "Kitchen knife" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/1de9f211102093d0.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Southern Breakfast" + }, + { + "index": 111, + "image_id": "f4fac95f82bc410d", + "asset_path": "demo_assets/images/f4fac95f82bc410d.jpg", + "bucket": "needs_review", + "label": "Beer", + "labels": [ + "Beer" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/f4fac95f82bc410d.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Guinness" + }, + { + "index": 112, + "image_id": "2c87374e8d2f3a34", + "asset_path": "demo_assets/images/2c87374e8d2f3a34.jpg", + "bucket": "needs_review", + "label": "Beer", + "labels": [ + "Beer" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/2c87374e8d2f3a34.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "\u4e7e\u676f\u5f85\u3061 #beer" + }, + { + "index": 113, + "image_id": "560df95288a192ac", + "asset_path": "demo_assets/images/560df95288a192ac.jpg", + "bucket": "needs_review", + "label": "Wine", + "labels": [ + "Wine" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/560df95288a192ac.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Sakaya kurihara" + }, + { + "index": 114, + "image_id": "5b11689076a3cc49", + "asset_path": "demo_assets/images/5b11689076a3cc49.jpg", + "bucket": "needs_review", + "label": "Knife", + "labels": [ + "Knife" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/5b11689076a3cc49.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Larry Chew Ti Bolstered Carbon Fiber Spirograph Damascus Micro Cujo Liner Lock" + }, + { + "index": 115, + "image_id": "b0b4407a9ec06def", + "asset_path": "demo_assets/images/b0b4407a9ec06def.jpg", + "bucket": "needs_review", + "label": "Beer", + "labels": [ + "Beer", + "Clothing", + "Table" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/b0b4407a9ec06def.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Tatra - polnisches Bier. Mild und dann ein leicht herber Abgang. Kann man gut trinken." + }, + { + "index": 116, + "image_id": "41bf39cbdf4b0a05", + "asset_path": "demo_assets/images/41bf39cbdf4b0a05.jpg", + "bucket": "needs_review", + "label": "Knife", + "labels": [ + "Knife", + "Table" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/41bf39cbdf4b0a05.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "the knife, the spoon, the fork" + }, + { + "index": 117, + "image_id": "ca7f1c22d5781c58", + "asset_path": "demo_assets/images/ca7f1c22d5781c58.jpg", + "bucket": "needs_review", + "label": "Wine", + "labels": [ + "Table", + "Wine" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/ca7f1c22d5781c58.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "\u2014" + }, + { + "index": 118, + "image_id": "20d46de74f618aef", + "asset_path": "demo_assets/images/20d46de74f618aef.jpg", + "bucket": "needs_review", + "label": "Beer", + "labels": [ + "Beer" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/20d46de74f618aef.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "\u30de\u30b6\u30fc\u7267\u5834" + }, + { + "index": 119, + "image_id": "4cc6516b9be3d77d", + "asset_path": "demo_assets/images/4cc6516b9be3d77d.jpg", + "bucket": "needs_review", + "label": "Beer", + "labels": [ + "Beer" + ], + "source_url": "https://open-images-dataset.s3.amazonaws.com/validation/4cc6516b9be3d77d.jpg", + "license": "https://creativecommons.org/licenses/by/2.0/", + "title": "Innis and Gunn Highland Cask Beer Aged in Malt Whisky Casks" + } + ] +} diff --git a/vendor/hyperview-0.6.2-py3-none-any.whl b/vendor/hyperview-0.6.2-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..63a77ae13abc33940a00211ecb260f93b7a5a762 --- /dev/null +++ b/vendor/hyperview-0.6.2-py3-none-any.whl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5d86e74d2332e730f63e83f5ec16a97e33b7fef962b5a5183746a33a89e285a +size 774096