SMSD75 commited on
Commit
cd24b4a
·
verified ·
1 Parent(s): 8c578bf

Update SynthScope Space from the GitHub repository

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .env.example +17 -0
  2. .gitattributes +5 -0
  3. .github/ISSUE_TEMPLATE/bug_report.yml +39 -0
  4. .github/ISSUE_TEMPLATE/config.yml +5 -0
  5. .github/ISSUE_TEMPLATE/feature_request.yml +27 -0
  6. .github/PULL_REQUEST_TEMPLATE.md +24 -0
  7. .github/workflows/ci.yml +58 -0
  8. .gitignore +32 -0
  9. AGENTS.md +5 -0
  10. CITATION.cff +24 -0
  11. CODE_OF_CONDUCT.md +33 -0
  12. CONTRIBUTING.md +71 -0
  13. Dockerfile +21 -0
  14. LEADERBOARD.md +36 -0
  15. LICENSE +201 -0
  16. LICENSES.md +65 -0
  17. README.md +16 -4
  18. TRENDING.md +84 -0
  19. _synthscope_env.py +19 -0
  20. accelerate_config.yaml +19 -0
  21. agid/__init__.py +13 -0
  22. agid/__main__.py +5 -0
  23. benchmark/README.md +82 -0
  24. benchmark/aggregate_results.py +102 -0
  25. benchmark/bench_eval.py +305 -0
  26. benchmark/bench_eval_video.py +181 -0
  27. benchmark/datasets_util.py +99 -0
  28. benchmark/download_dataset.py +60 -0
  29. benchmark/evaluate.py +191 -0
  30. benchmark/generator_bench.py +208 -0
  31. benchmark/generator_runs/_test_qwen/RESULTS.md +19 -0
  32. benchmark/generator_runs/_test_qwen/manifest.json +29 -0
  33. benchmark/generator_runs/_test_qwen/results.json +145 -0
  34. benchmark/generator_runs/flux2_klein_4b/RESULTS.md +20 -0
  35. benchmark/generator_runs/flux2_klein_4b/manifest.json +611 -0
  36. benchmark/generator_runs/flux2_klein_4b/results.json +156 -0
  37. benchmark/generator_runs/flux2_klein_9b/RESULTS.md +20 -0
  38. benchmark/generator_runs/flux2_klein_9b/manifest.json +611 -0
  39. benchmark/generator_runs/flux2_klein_9b/results.json +156 -0
  40. benchmark/generator_runs/qwen_image_2_1/RESULTS.md +20 -0
  41. benchmark/generator_runs/qwen_image_2_1/manifest.json +611 -0
  42. benchmark/generator_runs/qwen_image_2_1/results.json +156 -0
  43. benchmark/generator_runs/reference/manifest.json +609 -0
  44. benchmark/leaderboard.py +160 -0
  45. benchmark/schema.json +41 -0
  46. benchmark/seed_reference_results.py +70 -0
  47. benchmark/submissions/aide.json +22 -0
  48. benchmark/submissions/clip.json +22 -0
  49. benchmark/submissions/cnn.json +22 -0
  50. benchmark/submissions/co_spy_official.json +22 -0
.env.example ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # SynthScope secrets template — copy to `.env` (gitignored) and fill in.
2
+ # The backend auto-loads `.env` at startup (interface/backend/config.py:_load_dotenv).
3
+ # Real shell env vars / secrets-manager values OVERRIDE this file.
4
+
5
+ # SOTA image-generator API keys (for the "SOTA vs Detectors" demo). Each is optional;
6
+ # a generator is greyed-out in the UI if its key is unset.
7
+ GEMINI_API_KEY= # Nano Banana (Gemini 2.5 Flash Image) -> aistudio.google.com/apikey
8
+ OPENAI_API_KEY= # GPT Image (gpt-image-1) -> platform.openai.com/api-keys
9
+ XAI_API_KEY= # Grok (grok-2-image) -> console.x.ai
10
+ FAL_KEY= # FLUX img2img via fal.ai -> fal.ai/dashboard/keys
11
+
12
+ # Ideogram 4.0 runs LOCALLY (open-weight) — no paid API key. HF_TOKEN is only needed ONCE to
13
+ # download the license-gated weights (accept the license at hf.co/ideogram-ai/ideogram-4-nf4-diffusers).
14
+ HF_TOKEN= # free Hugging Face token, for gated open-weight downloads
15
+
16
+ # Optional path overrides (defaults assume the cn023 node layout)
17
+ # SYNTHSCOPE_CKPT_DIR=/hddstore/ssalehi/SynthScope/checkpoints
.gitattributes CHANGED
@@ -33,3 +33,8 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ docs/images/datasets.jpg filter=lfs diff=lfs merge=lfs -text
37
+ docs/images/detect.jpg filter=lfs diff=lfs merge=lfs -text
38
+ docs/images/genbench.jpg filter=lfs diff=lfs merge=lfs -text
39
+ docs/images/generator.jpg filter=lfs diff=lfs merge=lfs -text
40
+ docs/images/leaderboard.jpg filter=lfs diff=lfs merge=lfs -text
.github/ISSUE_TEMPLATE/bug_report.yml ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: Bug report
2
+ description: Something doesn't work as expected
3
+ labels: ["bug"]
4
+ body:
5
+ - type: textarea
6
+ id: what-happened
7
+ attributes:
8
+ label: What happened?
9
+ description: A clear description of the bug, including the full error/traceback.
10
+ placeholder: Paste the traceback here.
11
+ validations:
12
+ required: true
13
+ - type: textarea
14
+ id: repro
15
+ attributes:
16
+ label: How to reproduce
17
+ description: The exact command or minimal code snippet (model, dataset, overrides).
18
+ placeholder: |
19
+ bash experiments/aide.sh
20
+ # or
21
+ import synthscope; synthscope.load("fat_former").predict("x.png")
22
+ render: shell
23
+ validations:
24
+ required: true
25
+ - type: input
26
+ id: model
27
+ attributes:
28
+ label: Detector / dataset
29
+ description: Which `model_type` and/or dataset config is involved?
30
+ - type: textarea
31
+ id: env
32
+ attributes:
33
+ label: Environment
34
+ description: OS, Python, PyTorch + CUDA versions, GPU, and `synthscope` / commit hash.
35
+ placeholder: |
36
+ python -c "import torch, synthscope; print(synthscope.__version__, torch.__version__, torch.version.cuda)"
37
+ render: shell
38
+ validations:
39
+ required: true
.github/ISSUE_TEMPLATE/config.yml ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ blank_issues_enabled: true
2
+ contact_links:
3
+ - name: Questions & discussion
4
+ url: https://github.com/SMSD75/SynthScope/discussions
5
+ about: Ask usage questions, share results, or propose ideas before opening an issue.
.github/ISSUE_TEMPLATE/feature_request.yml ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: Feature request / new detector or dataset
2
+ description: Propose a new detector, dataset, or capability
3
+ labels: ["enhancement"]
4
+ body:
5
+ - type: dropdown
6
+ id: kind
7
+ attributes:
8
+ label: Type
9
+ options:
10
+ - New detector (method)
11
+ - New dataset / benchmark
12
+ - API / usability
13
+ - Other
14
+ validations:
15
+ required: true
16
+ - type: textarea
17
+ id: proposal
18
+ attributes:
19
+ label: What would you like?
20
+ description: Describe the method/dataset/feature. For a new detector, link the paper and official repo.
21
+ validations:
22
+ required: true
23
+ - type: textarea
24
+ id: value
25
+ attributes:
26
+ label: Why is it useful?
27
+ description: What does it add to the benchmark (e.g. a generator family or modality not yet covered)?
.github/PULL_REQUEST_TEMPLATE.md ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!-- Thanks for contributing to SynthScope! -->
2
+
3
+ ## Summary
4
+ <!-- What does this PR do and why? -->
5
+
6
+ ## Type of change
7
+ - [ ] New detector (`model_type`)
8
+ - [ ] New dataset / benchmark
9
+ - [ ] Bug fix
10
+ - [ ] Docs
11
+ - [ ] Other
12
+
13
+ ## Checklist
14
+ - [ ] Ran the affected experiment/eval and pasted the resulting `Test Metrics` below.
15
+ - [ ] For a new detector: added a `models/<modality>/<name>/` folder with a method `README.md`,
16
+ `conf/model/...` + `conf/trainer/...` groups, an `experiments/*.sh` recipe, and (if it can
17
+ run from the API) a registry entry in `interface/backend/registry.py`.
18
+ - [ ] `ruff check .` passes and `python -m compileall` is clean.
19
+ - [ ] Updated the reproduction table / docs if results changed.
20
+
21
+ ## Results
22
+ <!-- Paste the relevant logged metrics so reviewers can see the numbers reproduce. -->
23
+ ```
24
+ ```
.github/workflows/ci.yml ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ workflow_dispatch:
8
+
9
+ # Lightweight, always-green-on-day-one checks. We deliberately do NOT build the heavy model
10
+ # stack (torch + large backbones + dataset downloads) on GitHub runners; functional smoke tests
11
+ # run on a GPU machine. See tests/ for the local smoke suite.
12
+ jobs:
13
+ compile:
14
+ name: Byte-compile (syntax)
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+ - uses: actions/setup-python@v5
19
+ with:
20
+ python-version: "3.11"
21
+ - name: Compile all Python sources
22
+ run: python -m compileall -q synthscope synthscope interface models benchmark *.py
23
+
24
+ leaderboard:
25
+ name: Benchmark submissions + leaderboard
26
+ runs-on: ubuntu-latest
27
+ steps:
28
+ - uses: actions/checkout@v4
29
+ - uses: actions/setup-python@v5
30
+ with:
31
+ python-version: "3.11"
32
+ # Pure-stdlib check: validates every submissions/*.json and that LEADERBOARD.md is current.
33
+ - run: python benchmark/leaderboard.py --check
34
+
35
+ lint:
36
+ name: Ruff (errors only)
37
+ runs-on: ubuntu-latest
38
+ steps:
39
+ - uses: actions/checkout@v4
40
+ - uses: actions/setup-python@v5
41
+ with:
42
+ python-version: "3.11"
43
+ - run: pip install "ruff>=0.4"
44
+ # Lint the maintained library surface (config + ignores in pyproject.toml [tool.ruff]).
45
+ # Repo-wide syntax is covered by the byte-compile job above.
46
+ - run: ruff check synthscope synthscope
47
+
48
+ package:
49
+ name: Build + metadata check
50
+ runs-on: ubuntu-latest
51
+ steps:
52
+ - uses: actions/checkout@v4
53
+ - uses: actions/setup-python@v5
54
+ with:
55
+ python-version: "3.11"
56
+ - run: pip install "build>=1" "twine>=5"
57
+ - run: python -m build
58
+ - run: twine check dist/*
.gitignore ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.png
2
+ *.pth
3
+ .cursor
4
+ __pycache__
5
+ wandb/
6
+ *.log
7
+ .codex
8
+ .vscode
9
+ outputs/
10
+ .cache/
11
+ .claude/
12
+ # packaging / tooling artifacts
13
+ build/
14
+ dist/
15
+ *.egg-info/
16
+ .ruff_cache/
17
+ .pytest_cache/
18
+
19
+ # Secrets — never commit; use .env.example as the template
20
+ .env
21
+ .env.local
22
+ .env.*.local
23
+
24
+ # Large shared HF/torch cache (node-local downloads)
25
+ .cache_shared/
26
+
27
+ # arXiv trending candidates (regenerated daily by fetch_arxiv_trending.py)
28
+ repro/trending_arxiv_candidates.json
29
+
30
+ # generator benchmark runs: keep manifest/results/RESULTS.md, not the (large) image sets
31
+ benchmark/generator_runs/*/real/
32
+ benchmark/generator_runs/*/fake/
AGENTS.md ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ # Codex Project Rules
2
+
3
+ - For this SynthScope project, always run Python/project commands inside the `SynthScope` conda environment, for example:
4
+ `/home/ssalehi/miniconda3/bin/conda run -n SynthScope <command>`.
5
+ - For this SynthScope project, discuss the intended approach and changes first. Only apply file/code changes after the user explicitly asks to run or make the changes.
CITATION.cff ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ cff-version: 1.2.0
2
+ message: "If you use SynthScope in your research, please cite it."
3
+ title: "SynthScope: A Unified Library and Benchmark for AI-Generated Image and Video Detection"
4
+ abstract: >-
5
+ SynthScope re-implements a range of state-of-the-art AI-generated (synthetic) image and video
6
+ detectors behind a single configuration system, training loop, datasets, transforms, and
7
+ metrics, so that different methods can be trained and benchmarked under identical conditions,
8
+ with results reported per generator/source.
9
+ type: software
10
+ authors:
11
+ # TODO(maintainer): verify the author name(s) and affiliation, and add ORCID(s).
12
+ - family-names: "Salehi Dehnavi"
13
+ given-names: "Seyed"
14
+ email: "s.salehidehnavi@uva.nl"
15
+ affiliation: "University of Amsterdam"
16
+ repository-code: "https://github.com/SMSD75/SynthScope"
17
+ url: "https://github.com/SMSD75/SynthScope"
18
+ license: Apache-2.0
19
+ version: "0.1.0"
20
+ keywords:
21
+ - AI-generated image detection
22
+ - synthetic media detection
23
+ - deepfake detection
24
+ - benchmark
CODE_OF_CONDUCT.md ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Contributor Code of Conduct
2
+
3
+ ## Our pledge
4
+
5
+ We as members, contributors, and maintainers pledge to make participation in the SynthScope community a
6
+ harassment-free experience for everyone, regardless of age, body size, visible or invisible
7
+ disability, ethnicity, sex characteristics, gender identity and expression, level of experience,
8
+ education, socio-economic status, nationality, personal appearance, race, religion, or sexual
9
+ identity and orientation.
10
+
11
+ ## Our standards
12
+
13
+ Examples of behavior that contributes to a positive environment:
14
+
15
+ - Being respectful of differing opinions, viewpoints, and experiences.
16
+ - Giving and gracefully accepting constructive feedback.
17
+ - Focusing on what is best for the community and the science.
18
+
19
+ Unacceptable behavior includes harassment, insulting or derogatory comments, personal or political
20
+ attacks, publishing others' private information, and other conduct that could reasonably be
21
+ considered inappropriate in a professional setting.
22
+
23
+ ## Enforcement
24
+
25
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the project
26
+ maintainers at **s.salehidehnavi@uva.nl**. All complaints will be reviewed and investigated
27
+ promptly and fairly. Maintainers are responsible for clarifying and enforcing these standards and
28
+ may take any action they deem appropriate, up to and including a temporary or permanent ban.
29
+
30
+ ## Attribution
31
+
32
+ This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org),
33
+ version 2.1.
CONTRIBUTING.md ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Contributing to SynthScope
2
+
3
+ Thanks for your interest! SynthScope aims to be the **unified, reproducible benchmark** for
4
+ AI-generated image & video detection. The most valuable contributions are **new detectors**,
5
+ **new datasets/generators**, and **independently reproduced results**.
6
+
7
+ ## Getting set up
8
+
9
+ ```bash
10
+ git clone https://github.com/SMSD75/SynthScope.git
11
+ cd SynthScope
12
+ pip install -e ".[dev]" # editable install + contributor tooling
13
+ # PyTorch: install the build matching your CUDA from https://pytorch.org if needed.
14
+ # Some detectors also need OpenAI CLIP: pip install git+https://github.com/openai/CLIP.git
15
+ ```
16
+
17
+ Before opening a PR:
18
+
19
+ ```bash
20
+ ruff check synthscope # lint the library surface (errors only; see pyproject [tool.ruff])
21
+ python -m compileall synthscope interface models *.py
22
+ pytest tests/ -k smoke # where data/weights are available
23
+ ```
24
+
25
+ ## Adding a new detector
26
+
27
+ The framework is model-agnostic: the trainer only needs a `compute_loss(batch)` method, where a
28
+ batch is `(image, label, folder_id)` and `folder_id` is the generator/source used for
29
+ per-generator metrics. To add a method `foo`:
30
+
31
+ 1. **Model** — create `models/<image|video>/foo/foo.py` with an `nn.Module` exposing
32
+ `compute_loss(batch) -> {"loss": ..., "outputs": ...}`. Add a short method `README.md`.
33
+ 2. **Dispatch** — register `model_type=foo` in `SynthScopeModelTrainer._build_model` (`trainer.py`).
34
+ 3. **Config** — add `conf/model/<modality>/foo.yaml` and `conf/trainer/<modality>/foo.yaml`.
35
+ 4. **Recipe** — add `experiments/<modality>/foo.sh` with the env vars + launch command.
36
+ 5. **(Optional) API/demo** — add a `ModelSpec` to `interface/backend/registry.py` so the detector
37
+ is runnable via `synthscope.load("foo")`, the CLI, and the web demo (preprocessing, checkpoint +
38
+ any official-weights remap, and the forward → P(fake) convention).
39
+ 6. **Results** — run it and paste the logged `Test Metrics` in the PR. New numbers should trace to
40
+ a real run, never be estimated (see the reproduction table convention in the README).
41
+
42
+ ## Adding a dataset
43
+
44
+ Add a `dataset` class + data module in `dataset.py` (auto-download → common `real`/`fake` layout)
45
+ and a `conf/dataset/<modality>/<name>.yaml`. Keep paths overridable via config/env — no hard-coded
46
+ absolute paths.
47
+
48
+ ## Submitting a benchmark result
49
+
50
+ Add one JSON file under [`benchmark/submissions/`](benchmark/submissions/) (see
51
+ [`benchmark/schema.json`](benchmark/schema.json) and the protocol in
52
+ [`benchmark/README.md`](benchmark/README.md)). Prefer `verified` results produced by
53
+ `benchmark/evaluate.py`; for `external` numbers, set `source`. Regenerate and commit the table:
54
+
55
+ ```bash
56
+ python benchmark/evaluate.py --model <key> --track <track> --data <root> --out benchmark/submissions/<key>.json
57
+ python benchmark/leaderboard.py # updates LEADERBOARD.md
58
+ python benchmark/leaderboard.py --check # what CI runs
59
+ ```
60
+
61
+ ## Style
62
+
63
+ - Match the surrounding code; keep imports and helper/class definitions at module top level.
64
+ - Keep changes focused; one detector/dataset/fix per PR.
65
+ - Be honest about faithfulness: if a re-implementation diverges from the paper, document it (as the
66
+ reproduction notes already do).
67
+
68
+ ## Reporting bugs / proposing features
69
+
70
+ Use the issue templates. For questions, open a Discussion. By contributing you agree your work is
71
+ licensed under the project's [Apache-2.0 license](LICENSE).
Dockerfile ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # SynthScope web page as a Hugging Face Docker Space (CPU hardware, e.g. "CPU Upgrade": 8 vCPU, 32 GB).
2
+ # Build context = the repository root (push_space.py copies this file to the root of the Space repo).
3
+ FROM python:3.11-slim
4
+
5
+ RUN apt-get update && apt-get install -y --no-install-recommends git ffmpeg libgl1 libglib2.0-0 \
6
+ && rm -rf /var/lib/apt/lists/*
7
+ # Spaces run the container as user 1000
8
+ RUN useradd -m -u 1000 user
9
+ USER user
10
+ ENV HOME=/home/user PATH=/home/user/.local/bin:$PATH PYTHONUNBUFFERED=1 \
11
+ SYNTHSCOPE_CKPT_DIR=/home/user/ckpts SYNTHSCOPE_CACHE_DIR=/home/user/cache HF_HOME=/home/user/cache/hf \
12
+ SYNTHSCOPE_MAX_UPLOAD_MB=20 SYNTHSCOPE_MAX_RESIDENT_MODELS=2 XFORMERS_DISABLED=1
13
+ WORKDIR /home/user/app
14
+
15
+ # CPU-only PyTorch first (much smaller than the CUDA build), then SynthScope with the web extras
16
+ RUN pip install --no-cache-dir --user torch torchvision --index-url https://download.pytorch.org/whl/cpu
17
+ COPY --chown=user . .
18
+ RUN pip install --no-cache-dir --user -e ".[web]" "git+https://github.com/openai/CLIP.git"
19
+
20
+ EXPOSE 7860
21
+ CMD ["bash", "deploy/hf-space/start.sh"]
LEADERBOARD.md ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # SynthScope Leaderboard (v1)
2
+
3
+ _Auto-generated by `benchmark/leaderboard.py` — do not edit by hand._ See [benchmark/README.md](benchmark/README.md) for the protocol and how to submit.
4
+
5
+ This is the **standardized, versioned** table: a few tracks with a fixed protocol that anyone can submit to. The web page's **Leaderboard** tab is broader (every paper benchmark, 30+ groups) and the repo supports many more datasets, which download and organize themselves: see [docs/BENCHMARKS.md](docs/BENCHMARKS.md).
6
+
7
+ Metrics are percentages. **mAP** = mean AP over generators. Each track is ranked by its primary metric (in bold).
8
+
9
+ ## ForenSynths — image (ProGAN-trained, cross-generator)
10
+
11
+ | Rank | Method | Eval | Acc | **mAP** | AP | AUROC | Verified | Notes |
12
+ | --- | --- | --- | --- | --- | --- | --- | --- | --- |
13
+ | 1 | FatFormer | official-weights | 98.39 | 99.70 | — | — | ✓ | ForenSynths-8 subset; official released weights |
14
+ | 2 | CO-SPY (official weights) | official-weights | 95.12 | 98.71 | — | — | ✓ | ForenSynths-8; vendored official architecture |
15
+ | 3 | UnivFD / CLIP | frozen-probe | — | 97.20 | — | 97.00 | ✓ | ForenSynths; frozen CLIP ViT-L/14 probe (ProGAN) |
16
+ | 4 | CO-SPY (from scratch) | from-scratch | — | 96.98 | — | 96.79 | ✓ | ForenSynths; SynthScope re-implementation trained on ProGAN |
17
+ | 5 | CNNDetection | from-scratch | — | 96.80 | — | 96.60 | ✓ | ForenSynths; ResNet-50 fine-tune (ProGAN) |
18
+ | 6 | DINOv2 probe | frozen-probe | — | 95.03 | — | 94.86 | ✓ | ForenSynths; frozen DINOv2 ViT-L/14 probe |
19
+ | 7 | SAFE | from-scratch | — | 94.13 | — | 93.68 | ✓ | ForenSynths; trained from scratch |
20
+ | 8 | AIDE | official-weights | — | 92.08 | — | — | ✓ | ForenSynths-8; mAP reproduces, acc@0.5 miscalibrated (single-view vs official 5-view DCT) |
21
+ | 9 | NPR | official-weights | 91.83 | 87.09 | — | — | ✓ | ForenSynths-8; official ProGAN weights |
22
+
23
+ ## GenImage SD-v1.4 — image
24
+
25
+ | Rank | Method | Eval | Acc | mAP | AP | **AUROC** | Verified | Notes |
26
+ | --- | --- | --- | --- | --- | --- | --- | --- | --- |
27
+ | 1 | VIB-Net | from-scratch | — | 99.33 | — | 99.33 | ✓ | GenImage SD-v1.4 single real/fake pool (mAP == AUROC by construction) |
28
+ | 2 | SPAI (official weights) | official-weights | — | — | 94.01 | 98.45 | ✓ | GenImage SD-v1.4; vendored official architecture, fixed-res 2x2x224 |
29
+ | 3 | SPAI (from scratch) | from-scratch | — | — | — | 97.66 | ✓ | DMID Latent-Diffusion vs COCO; SynthScope fixed-resolution variant |
30
+
31
+ ## GenVideo-Val — video
32
+
33
+ | Rank | Method | Eval | Acc | mAP | **AP** | AUROC | Verified | Notes |
34
+ | --- | --- | --- | --- | --- | --- | --- | --- | --- |
35
+ | 1 | ReStraV | frozen-probe | — | — | 96.67 | 97.06 | ✓ | Frozen DINOv2 trajectory geometry + MLP |
36
+ | 2 | D3 | training-free | — | — | 95.60 | 93.60 | ✓ | Training-free frozen CLIP 2nd-order trajectory |
LICENSE ADDED
@@ -0,0 +1,201 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or Derivative
95
+ Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work, excluding
103
+ those notices that do not pertain to any part of the Derivative
104
+ Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright 2026 Seyed Salehi Dehnavi and the SynthScope contributors
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
LICENSES.md ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Licenses and attribution
2
+
3
+ The **SynthScope framework** — the training/eval pipeline, the unified config system, the dataset
4
+ modules, the metrics/transform/logging stack, the `synthscope` Python API, and the web interface — is
5
+ released under the **Apache License 2.0** (see [LICENSE](LICENSE)).
6
+
7
+ SynthScope **re-implements** a range of published detectors and, for a few methods, **vendors** the
8
+ authors' original network code so their released weights can be loaded faithfully. Those
9
+ third-party components, and every **pretrained checkpoint / backbone** SynthScope loads, remain under
10
+ **their original licenses**. SynthScope does not relicense them.
11
+
12
+ > ⚠️ **Before redistributing any model weights** (e.g. via a public model zoo / Hugging Face Hub),
13
+ > confirm that the upstream license permits redistribution and your intended use. Several
14
+ > AI-generated-image-detection paper repos and some pretrained backbones are **research- or
15
+ > non-commercial-only**, and some weights are **gated** (require accepting an upstream license).
16
+ > The table below is a starting point — verify each entry against its source. (`⚠ verify` = please
17
+ > confirm and fill in from the official repo before relying on it.)
18
+
19
+ ## Detectors
20
+
21
+ | `model_type` | Method (venue) | Upstream code | Code license | Released weights SynthScope can load | Weights license |
22
+ | --- | --- | --- | --- | --- | --- |
23
+ | `cnn` | CNNDetection (CVPR'20) | PeterWang512/CNNDetection | ⚠ verify | ProGAN-trained (SynthScope-trained here) | ⚠ verify |
24
+ | `clip` | UnivFD (CVPR'23) | WisconsinAIVision/UniversalFakeDetect | ⚠ verify | — (SynthScope-trained probe) | n/a |
25
+ | `npr` | NPR (CVPR'24) | chuangchuangtan/NPR-DeepfakeDetection | ⚠ verify | **official** ProGAN weights | ⚠ verify |
26
+ | `fat_former` | FatFormer (CVPR'24) | Michel-liu/FatFormer (verify) | ⚠ verify | **official** weights | ⚠ verify |
27
+ | `aide` | AIDE (ICLR'25) | ⚠ verify (official repo) | ⚠ verify | **official** weights | ⚠ verify |
28
+ | `co_spy` | CO-SPY (CVPR'25) | ⚠ verify (official repo) | ⚠ verify | **official** weights | ⚠ verify |
29
+ | `spai` | SPAI (CVPR'25) | mever-team/spai (verify) | ⚠ verify | **official** weights | ⚠ verify |
30
+ | `vib_net` | VIB-Net (CVPR'25) | ⚠ verify (official repo) | ⚠ verify | — (SynthScope-trained) | n/a |
31
+ | `safe` | SAFE (KDD'25) | ⚠ verify (official repo) | ⚠ verify | — (SynthScope-trained) | n/a |
32
+ | `pgc` | PGC | ⚠ verify (official repo) | ⚠ verify | — (SynthScope-trained) | n/a |
33
+ | `cure` | CuRe (arXiv 2609.14316) | manic-cui/CuRe | Apache-2.0 (repo `LICENSE`) | **official** 25 MB adapter (`cure_adapter.pt`, loads as `cure.pth`) | Apache-2.0 (shipped in the repo; verify before redistributing) |
34
+ | `dinov2` | DINOv2 probe | facebookresearch/dinov2 | Apache-2.0 (verify) | DINOv2 backbone | Apache-2.0 (verify) |
35
+ | `dinov3` | DINOv3 probe | facebookresearch/dinov3 | DINOv3 License (gated) | DINOv3 backbone | **gated** — DINOv3 License |
36
+ | `adapted_dino` | Adapter-tuned DINOv2 (SynthScope) | this repo | Apache-2.0 | — (SynthScope-trained) | n/a |
37
+ | `d3` | D3 (ICCV'25) | ⚠ verify (official repo) | ⚠ verify | training-free (no weights) | n/a |
38
+ | `restrav` | ReStraV | ⚠ verify (official repo) | ⚠ verify | — (SynthScope-trained) | n/a |
39
+ | `stall` | STALL (CVPR'26) | ⚠ verify (official repo) | ⚠ verify | training-free; needs DINOv3 backbone | gated (DINOv3) |
40
+
41
+ ## Backbones / foundation models (downloaded on first use)
42
+
43
+ | Backbone | Used by | License |
44
+ | --- | --- | --- |
45
+ | OpenAI CLIP (ViT-L/14) | `clip`, `fat_former`, `d3` | MIT (verify) |
46
+ | OpenCLIP (ConvNeXt-XXL, LAION) | `aide` | code MIT; weights per LAION / model card (verify) |
47
+ | DINOv2 (ViT-L/14, ViT-S/14) | `dinov2`, `adapted_dino`, `restrav` | Apache-2.0 (verify) |
48
+ | DINOv3 (ViT-L/16) | `dinov3`, `stall` | **gated** — DINOv3 License (non-commercial; accept upstream) |
49
+ | SigLIP | `co_spy` | Apache-2.0 (verify) |
50
+ | MFM ViT-B/16 | `spai` | ⚠ verify |
51
+ | Stable Diffusion VAE | `co_spy` | CreativeML Open RAIL-M (verify) |
52
+ | Perception Encoder Core L/14-336 (`facebook/PE-Core-L14-336`) | `cure` | Apache-2.0 (Meta); `official_arch.py` vendors the CuRe/Meta backbone code — see its header |
53
+
54
+ ## Datasets
55
+
56
+ The dataset auto-downloaders fetch third-party datasets (GenImage, ForenSynths/CNNDetection,
57
+ AIGIBench, Co-Spy-Bench, DiTFake, UniversalFakeDetect, GenVideo, …). Each dataset is governed by
58
+ its **own** terms / license at the source; SynthScope only automates retrieval and restructuring. Review
59
+ and comply with each dataset's terms before use or redistribution.
60
+
61
+ ---
62
+
63
+ *This file is a good-faith attribution map, not legal advice. Maintainers: replace every `⚠ verify`
64
+ with the confirmed upstream repository URL and license before publishing a model zoo or any
65
+ redistributed weights.*
README.md CHANGED
@@ -1,10 +1,22 @@
1
  ---
2
  title: SynthScope
3
- emoji: 📚
4
- colorFrom: blue
5
- colorTo: red
6
  sdk: docker
 
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
1
  ---
2
  title: SynthScope
3
+ emoji: 🔎
4
+ colorFrom: indigo
5
+ colorTo: blue
6
  sdk: docker
7
+ app_port: 7860
8
  pinned: false
9
+ license: apache-2.0
10
+ short_description: Is this image AI-generated? Compare published detectors.
11
  ---
12
 
13
+ # SynthScope
14
+
15
+ Check whether an image or video is AI-generated with published detectors, see what each detector looks at, and compare how
16
+ they hold up against today's image generators. This Space runs on CPU: a detector takes a few seconds per image.
17
+
18
+ Code, benchmarks and documentation: **https://github.com/SMSD75/SynthScope**
19
+
20
+ Each detector and its weights keep the license chosen by their authors (see the repository's `LICENSES.md`); this demo is
21
+ free and non-commercial. If you are an author and would like your method removed or credited differently, please open an
22
+ issue on GitHub.
TRENDING.md ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 📈 What's Trending — AI-generated content detection
2
+
3
+ *High-quality recent papers for image & video AIGC detection. High-quality = (1) a solid public GitHub repository, and (2) strong results versus previous methods. Auto-refreshed daily. Last updated: 2026-10-10.*
4
+
5
+ Entries marked _in SynthScope_ are integrated in this repo; the rest are tracked, with the reason an integration is pending noted in their _Results_ line. See [docs/ADD_DETECTOR.md](docs/ADD_DETECTOR.md) for how a paper is integrated and reproduced.
6
+
7
+ ## Image detectors
8
+ - **[CuRe: Learning Continuous Source Responses for Generalizable AI-Generated Image Detection](https://github.com/manic-cui/CuRe)** (manic-cui · arXiv · 2026) — [code](https://github.com/manic-cui/CuRe) · _in SynthScope: `cure`_
9
+ Reframes backbone adaptation as regressing real-generated MIXING RATIOS instead of binary classification (finer supervision), with a compact source-response subspace that suppresses nuisance variation/shortcut cues. Frozen Perception-Encoder (PE-Core L/14-336) backbone + LoRA + subspace + linear head; the 25 MB adapter ships in the repo and infer.py scores a single image.
10
+ _Results: 89.7% average balanced accuracy over ten public benchmarks, +5.2 pts over the second-best method, robust to common degradations (paper). [Integrated in SynthScope as `cure` (merged to main 2026-10-03): SynthScope's class is identical to the official model (395/395 state-dict tensors, logit diff 4.8e-6, 0 verdict flips). SynthScope-protocol results with the official adapter: UFD-8 93.9 / ForenSynths-13 82.0 / GenImage-8 85.2 balanced acc (SD-v1.4, its training set, 99.7). AIGIBench REPRODUCED: on the paper's own 20 full-image-synthesis subsets (full test data) the port scores 92.85 balanced acc / 97.48 AUROC vs the paper's 92.8 / 97.5, every subset within 0.10 pt (per-subset mean abs diff 0.03; the paper excludes the 5 face-swap subsets, which is why all 25 gives 85.95). Still unconfirmed: UnivFD (aggregation unspecified), AIGCDetect (data only on cn023, not run), and 7 of the paper's 10 benchmarks (not in SynthScope).]_
11
+ - **[PGC: Peak-Guided Calibration for AI-Generated Image Detection](https://github.com/xiaoyu6868/PGC)** (Zhou et al. · 2026) — [code](https://github.com/xiaoyu6868/PGC) · _in SynthScope: `pgc`_
12
+ LoRA-tuned DINOv2 RGB stream + a YCbCr-quantization-residual CNN, fused by a peak-guided (log-sum-exp) calibration. Strong cross-generator transfer.
13
+ _Results: ForenSynths 96.25 mAP / GenImage 100 mAP (official weights)._
14
+ - **[PROBE: Probing Generative Space for Generalizable AIGI Detection](https://github.com/Amamiya-C/PROBE-AIGI-Detection)** (arXiv · 2026) — [code](https://github.com/Amamiya-C/PROBE-AIGI-Detection) · _in SynthScope: `probe`_
15
+ Boosts cross-generator generalization by augmenting training with images sampled from probed generative-space variations; the detector is a fine-tuned DINOv2 (sliding-patch) classifier. Released weights on ModelScope.
16
+ _Results: PROBE-DINOv2 93.9% avg balanced-acc over 7 benchmarks (paper). SynthScope reproduces the official weights: GenImage 98.54 / Synthbuster 99.27 / UFD 95.95 mAP (mAUROC 96-99). [Integration on branch trending/probe, under review.]_
17
+ - **[DiCoME: Divide-and-Conquer Multi-View Evidential Learning for Deepfake Detection](https://github.com/kxl0825/DiCoME)** (arXiv · 2026) — [code](https://github.com/kxl0825/DiCoME)
18
+ Disentangles semantic vs structural-artifact views and fuses them with evidential learning to counter the 'semantic masking effect'. Released checkpoint (HF).
19
+ _Results: SOTA cross-dataset deepfake generalization (DeepfakeBench protocol). [face-deepfake domain; SynthScope lacks those datasets locally — integration pending data.]_
20
+ - **[Images as Tables: In-Context AIGI Detection with TabPFN](https://github.com/jpwalter30/Towards-Generalizable-Detection-of-AI-Generated-Images)** (arXiv · 2026) — [code](https://github.com/jpwalter30/Towards-Generalizable-Detection-of-AI-Generated-Images)
21
+ Frozen DINOv3 CLS feature -> PCA(500) -> TabPFN in-context tabular classification; strong few-shot/low-data generalization with no task-specific training.
22
+ _Results: Generalizable detection in the low-data regime (few labeled examples per new generator). [integration pending: in-context TabPFN paradigm — a clean SynthScope forward->logit needs the released fitted TabPFN+PCA+labeled-support-set checkpoint baked in (GDrive), plus an external version-sensitive tabpfn dependency; a different paradigm from the trained-detector template, and the headline is a low-data/few-shot niche (multi-multi acc 0.8765 / AUROC 0.9501 @625 samples) rather than full-data SOTA. Verified repo 2026-06-20: weights on GDrive, frozen DINOv3->PCA(500)->TabPFN.]_
23
+ - **[Co-Spy: Fusing Semantic and Artifact Cues for Synthetic Image Detection](https://github.com/Megum1/Co-Spy)** (Cheng et al. · CVPR · 2025) — [code](https://github.com/Megum1/Co-Spy) · _in SynthScope: `co_spy`_
24
+ Adaptive fusion of a SigLIP semantic stream and an SD-VAE artifact-residual stream.
25
+ _Results: Co-Spy-Bench ~96 mAP; SynthScope retrain reaches 96.6 (beats released weights on that bench)._
26
+ - **[SAFE: High-Frequency Artifact Detector with Targeted Augmentation](https://github.com/Ouxiang-Li/SAFE)** (Ouxiang Li et al. · KDD · 2025) — [code](https://github.com/Ouxiang-Li/SAFE) · _in SynthScope: `safe`_
27
+ Lightweight DWT high-frequency artifact detector with a carefully designed augmentation recipe.
28
+ _Results: SynthScope-trained reproduction (served): ForenSynths-8 97.79 / UFD-8 98.44 / GenImage-8 99.51 / DiTFake 99.96 mAP — beats the official checkpoint on GenImage._
29
+ - **[AIDE: ConvNeXt Semantic + Low-Level DCT/SRM Cues](https://arxiv.org/abs/2406.19435)** (Yan et al. · ICLR · 2025) — [arXiv](https://arxiv.org/abs/2406.19435) · _in SynthScope: `aide`_
30
+ Fuses ConvNeXt semantic features with low-level DCT/SRM frequency cues; native-resolution preprocessing.
31
+ _Results: GenImage 97.12 mAP / AIGCDetect 97.94 mAP (official weights)._
32
+ - **[SPAI: Spectral AI-Image Detection (any-resolution)](https://github.com/mever-team/spai)** (Karageorgiou et al. · CVPR · 2025) — [code](https://github.com/mever-team/spai) · _in SynthScope: `spai`_
33
+ Spectral Reconstruction Similarity + Spectral Context Attention; detects at native/arbitrary resolution.
34
+ _Results: SynthScope serves the official weights at native resolution (the faithful any-res path): GenImage 94.22 / Synthbuster 96.75 mAP — reproduces & beats the vendored-official 91.33._
35
+ - **[FatFormer: Forgery-Aware Adaptive Transformer](https://github.com/Michel-liu/FatFormer)** (Liu et al. · CVPR · 2024) — [code](https://github.com/Michel-liu/FatFormer) · _in SynthScope: `fat_former`_
36
+ Frozen CLIP + forgery-aware adapters + learnable text-prompt context.
37
+ _Results: ForenSynths-8 99.7 mAP (official weights)._
38
+ - **[NPR: Neighboring-Pixel Relationships](https://github.com/chuangchuangtan/NPR-DeepfakeDetection)** (Tan et al. · CVPR · 2024) — [code](https://github.com/chuangchuangtan/NPR-DeepfakeDetection) · _in SynthScope: `npr`_
39
+ Small ResNet on neighboring-pixel residuals that expose generator up-sampling artifacts.
40
+ _Results: GANGen 96.49 mAP / DiffusionForensics 99.4 mAP (official weights)._
41
+ - **[UnivFD / CLIP: Towards Universal Fake Image Detectors](https://github.com/WisconsinAIVision/UniversalFakeDetect)** (Ojha et al. · CVPR · 2023) — [code](https://github.com/WisconsinAIVision/UniversalFakeDetect) · _in SynthScope: `clip`_
42
+ Linear probe on frozen CLIP ViT-L/14 features — a simple, strong cross-generator baseline.
43
+ _Results: UniversalFakeDetect 95.66 mAP; SynthScope-trained 96.44._
44
+ - **[MoE-JEPA: Unifying Semantic Priors and High-Frequency Traces (V-JEPA for synthetic image forensics)](https://github.com/ALCOR-Lab-DIAG/MoE-JEPA)** (ALCOR-Lab-DIAG · ECCV'26 Workshop (AI for Multimedia Forensics) · 2026) — [code](https://github.com/ALCOR-Lab-DIAG/MoE-JEPA)
45
+ Frozen V-JEPA 2 ViT-L backbone with a Residual Mixture-of-Experts injected into the last blocks, a Bayar-conv noise branch and Gated-Attention MIL pooling; uses JEPA 'world understanding' as a semantic prior.
46
+ _Results: 95.54% acc / 94.21 F1 on SID-Set (300K images), outperforming much larger models (paper). [integration pending (assessed 2026-10-02): the authors' trained weights are NOT linked (only the frozen V-JEPA 2 backbone is downloaded separately) and there is no single-image inference entrypoint; can only be retrained. Re-checked 2026-10-05: unchanged.]_
47
+ - **[RAID: Towards Robust AI-Generated Image Detection with Bit-Reversed Images](https://github.com/renxi-seu/RAID)** (renxi-seu · arXiv · 2026) — [code](https://github.com/renxi-seu/RAID)
48
+ Detects via bit-planes: a bit-reversed image, gradient-based patch selection and a small convolutional classifier, with a theoretical analysis; ~100x faster than counterparts.
49
+ _Results: Claims to outperform existing methods on 40+ benchmarks across cross-generator, cross-dataset and zero-shot settings (paper; README gives no numbers). [integration pending (assessed 2026-10-02): the SD-v1.4-trained weights are only shared via Baidu Cloud (not fetchable programmatically), and the README leaves the architecture and patch-score aggregation unspecified; revisit if a direct weight link appears. Re-checked 2026-10-05: unchanged.]_
50
+ - **[Fleet: Few Shots Lead Effective AI-generated Image Detection](https://github.com/ICTMCG/Fleet)** (ICTMCG · arXiv · 2026) — [code](https://github.com/ICTMCG/Fleet)
51
+ Dynamic few-shot adaptation: 'constrained routing correction' redirects novel AI samples away from non-AI-dominated routes in decoupled subspaces (DINOv3 backbone), so the detector adapts to rapidly-evolving/commercial generators from a handful of labeled examples. Introduces the Treasure benchmark (64 generators, 360k images, 20 closed-source commercial engines).
52
+ _Results: On a modern generator (Doubao Seedream 4.0), 20.4% -> 73.1% with only 10-shot adaptation, where static SOTA collapses (paper). Repo now live with code (re-listed 2026-10-03; it had been pruned 2026-07-04 while an empty placeholder). [integration pending (assessed 2026-10-03): not a single-checkpoint detector — the Hugging Face repo wangjiaan/Fleet holds NINE per-target-generator few-shot adapted models (ADM, FLUX.2, GPT4O, HunyuanImage-3.0, NextStep, Qwen-Image, StarGAN, wan2.5, ...; 1.3 GB each), the generic stage-1 base is only on Baidu Pan, inference requires few-shot support data per target generator, and the Treasure benchmark is gated. No clean forward->logit that represents the method; revisit if a generic checkpoint appears on HF.]_
53
+
54
+ ## Video detectors
55
+ - **[D3: Disentangled Detail Dynamics (training-free)](https://github.com/Zig-HS/D3)** (Zheng et al. · ICCV · 2025) — [code](https://github.com/Zig-HS/D3) · _in SynthScope: `d3`_
56
+ Training-free: 2nd-order std of frozen per-frame features as the score.
57
+ _Results: GenVideo-Val ~98 mAP (paper). SynthScope faithful protocol (X-CLIP-B/16 + 10% edge-crop): AUROC 95.95 / acc 91.7 (the paper's mAP isn't comparable on SynthScope's 10000:56 real:fake pool — AUROC is the robust metric)._
58
+ - **[ReStraV: Representation-Trajectory Geometry](https://github.com/ChristianInterno/ReStraV)** (Internò et al. · 2025) — [code](https://github.com/ChristianInterno/ReStraV) · _in SynthScope: `restrav`_
59
+ Frozen DINOv2 trajectory-geometry features + a standardized MLP head.
60
+ _Results: GenVidBench Main ~93; SynthScope 92.7 mAP._
61
+ - **[STALL: Spatio-Temporal whitened Log-Likelihoods (training-free)](https://github.com/OmerBenHayun/STALL)** (Ben Hayun et al. · CVPR · 2026) — [code](https://github.com/OmerBenHayun/STALL) · _in SynthScope: `stall`_
62
+ Training-free spatial + temporal whitened-Gaussian log-likelihoods vs a real-video calibration.
63
+ _Results: GenVideo-Val ~0.80 AUC (paper); SynthScope AUROC 83.5._
64
+ - **[ATSS: Anomalous Temporal Self-Similarity for AI-Generated Video Detection](https://github.com/hwang-cs-ime/ATSS)** (Wang et al. (hwang-cs-ime) · arXiv · 2026) — [code](https://github.com/hwang-cs-ime/ATSS)
65
+ Multimodal detector that exploits anomalous temporal self-similarity fingerprints across frames of AI-generated video. Inference code + a pretrained checkpoint (best.pt) are released; the data sampling/extraction pipeline is still being cleaned for release.
66
+ _Results: Claims SOTA in AP/AUC/ACC over GenVideo, EvalCrafter, VideoPhy, and VidProM vs prior methods (e.g. DeMamba). Repo live 2026-06-21 with code+weights; per-generator numbers not yet in the README. [integration pending: the released checkpoint's forward() consumes PRECOMPUTED multimodal temporal-self-similarity tensors (sim_img/sim_txt/sim_cross, BLIP2-based), not raw video — and the feature-extraction/data-sampling front-end that produces them is 'still being cleaned for release (coming soon)'. SynthScope feeds raw video clips, so there is no faithful way to run ATSS until that pipeline is published; will revisit when released. Re-checked 2026-10-05: unchanged.]_
67
+ - **[G2VD: Generalizable AI-Generated Video Detection via Counterfactual Intervention and Causal Disentanglement](https://github.com/DMOSCAR-98/G2VD)** (Du et al. (dumeng98) · arXiv · 2026) — [code](https://github.com/DMOSCAR-98/G2VD)
68
+ Counterfactual-intervention + causal-disentanglement detector: a training-time CFIPipeline synthesizes controlled counterfactual samples (VAEs + frequency/pixel alignment), and a causal-disentanglement classifier with two domain-anchored branches and an HSIC independence constraint isolates the generalizable artifact signal from domain-specific content.
69
+ _Results: GenVidBench cross-domain: >90% accuracy / AUC ~0.95 using only 10% of the training data (paper). Repo live 2026-07-07 (CLIP/XCLIP/DeMamba backbones — the same family as SynthScope's D3). [integration pending (re-checked 2026-10-05): repo moved from dumeng98/G2VD (now 404) to DMOSCAR-98/G2VD; checkpoints are still NOT released ('not stored in this repository', MODEL_ZOO.md lists no links) and the CFIPipeline VAE-pool is part of the staged pipeline. Revisit when checkpoints appear.]_
70
+ - **[RIFT: Mind the Rift - Cross-Scale Coupling Mismatch for AI-Generated Video Detection](https://github.com/Litsay/RIFT)** (Litsay · arXiv (submitted ACM MM'26) · 2026) — [code](https://github.com/Litsay/RIFT)
71
+ Treats a cross-scale coupling mismatch between macro temporal dynamics (differential geometry / persistent homology on frozen DINOv2 features) and micro residuals (steganalytic filtering + RAFT motion) as the forensic signal, scored by a coupling-divergence module.
72
+ _Results: Own benchmark: 99.22% acc / 99.33 F1 / 99.96 AUC, 97.87% leave-one-generator-out (paper; no head-to-head against named prior detectors in the abstract, so not directly comparable). [integration pending (assessed 2026-10-02): trained weights are 'released upon acceptance' (not available), and it needs DINOv2 + RAFT features over ~120K training videos. Re-checked 2026-10-05: unchanged.]_
73
+
74
+ ## Benchmarks & curated lists
75
+ - [GenImage: million-scale real-vs-fake benchmark](https://github.com/GenImage-Dataset/GenImage) — ImageNet-1k reals + ~equal synthetic from diverse generators.
76
+ - [AIGIBench: robustness/generalization benchmark (23 fake subsets)](https://github.com/HorizonTEL/AIGIBench) — Multi-source generalization, degradation robustness, augmentation sensitivity, preprocessing impact.
77
+ - [AI-GenBench: temporal (GAN→diffusion) generalization benchmark](https://github.com/MI-BioLab/AI-GenBench) — Incremental, historically-ordered training to test generalization to new generators (Verimedia @ IJCNN 2025).
78
+ - [GenVidBench: 6M AI-generated video detection benchmark](https://arxiv.org/abs/2501.11340) — Large-scale benchmark for AI-generated video detection.
79
+ - [DeepfakeBench: comprehensive deepfake-detection benchmark](https://github.com/SCLBD/DeepfakeBench) — Unified benchmark across many deepfake datasets/detectors.
80
+ - [Awesome-AIGC-Image-Video-Detection (curated list)](https://github.com/ant-research/Awesome-AIGC-Image-Video-Detection) — Continuously-updated collection of image + video AIGC-detection papers and code.
81
+ - [Awesome-Comprehensive-Deepfake-Detection (curated list)](https://github.com/qiqitao77/Awesome-Comprehensive-Deepfake-Detection) — Broad survey-style index of deepfake-detection research and repos.
82
+
83
+ ---
84
+ *Auto-generated from `interface/backend/trending.json` by `repro/generate_trending_readme.py` — edit the JSON, not this file.*
_synthscope_env.py ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Backward compatibility for the pre-rename ``AGID_*`` environment variables.
2
+
3
+ The project was renamed from AGID to SynthScope; every setting is now ``SYNTHSCOPE_<NAME>``. Old launch scripts that still
4
+ export ``AGID_<NAME>`` keep working: importing this module copies each such variable to its new name unless the new
5
+ name is already set. Dependency-free and idempotent, so any entry point can ``import _synthscope_env`` first.
6
+ """
7
+ import os
8
+
9
+ LEGACY_PREFIX = "AGID_"
10
+ PREFIX = "SYNTHSCOPE_"
11
+
12
+
13
+ def apply_legacy_env() -> None:
14
+ for key, value in list(os.environ.items()):
15
+ if key.startswith(LEGACY_PREFIX):
16
+ os.environ.setdefault(PREFIX + key[len(LEGACY_PREFIX):], value)
17
+
18
+
19
+ apply_legacy_env()
accelerate_config.yaml ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ compute_environment: LOCAL_MACHINE
2
+ distributed_type: DEEPSPEED
3
+ mixed_precision: "no"
4
+ num_machines: 1
5
+ num_processes: 4 # number of GPUs
6
+ machine_rank: 0
7
+ main_training_function: main
8
+ rdzv_backend: static
9
+ same_network: true
10
+ use_cpu: false
11
+
12
+ deepspeed_config:
13
+ deepspeed_multinode_launcher: standard
14
+ gradient_accumulation_steps: 1
15
+ gradient_clipping: 1.0
16
+ offload_optimizer_device: none
17
+ offload_param_device: none
18
+ zero3_init_flag: false
19
+ zero_stage: 2
agid/__init__.py ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Deprecated alias of :mod:`synthscope` (the project was renamed from AGID to SynthScope).
2
+
3
+ ``import agid`` keeps working and returns the very same module object, so ``agid.load(...)``,
4
+ ``from agid.api import Detector`` and ``python -m agid`` behave exactly as before.
5
+ """
6
+ import sys
7
+
8
+ import synthscope
9
+ from synthscope import api, cli, hub
10
+
11
+ sys.modules[__name__] = synthscope
12
+ for _name, _mod in (("api", api), ("cli", cli), ("hub", hub)):
13
+ sys.modules[f"{__name__}.{_name}"] = _mod
agid/__main__.py ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ """``python -m agid`` -> same as ``python -m synthscope`` (deprecated alias)."""
2
+ from synthscope.cli import main
3
+
4
+ if __name__ == "__main__":
5
+ raise SystemExit(main())
benchmark/README.md ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # SynthScope Benchmark & Leaderboard (v1)
2
+
3
+ > Looking for the full setup guide (datasets, paper reproduction, generator benchmarks, run times)? See [`docs/BENCHMARKS.md`](../docs/BENCHMARKS.md).
4
+ > This page covers the standardized, versioned submission track.
5
+
6
+ A standardized, **versioned** evaluation protocol for AI-generated image & video detection, so that
7
+ methods are comparable under identical data, metrics, and scoring. The leaderboard is generated
8
+ from the submission files in [`submissions/`](submissions/) — see [LEADERBOARD.md](../LEADERBOARD.md).
9
+
10
+ > **Why:** every detection paper ships its own repo, data format, and metric conventions, which
11
+ > makes cross-method comparison unreliable. SynthScope fixes the protocol once and evaluates every
12
+ > detector through the same pipeline.
13
+
14
+ ## Tracks (v1)
15
+
16
+ | Track id | Modality | Test set | Train signal | Primary metric |
17
+ | --- | --- | --- | --- | --- |
18
+ | `forensynths` | image | ForenSynths real/fake, scored **per generator** | ProGAN-trained (cross-generator generalization) | **mAP** (mean AP over generators) |
19
+ | `genimage-sdv1.4` | image | GenImage SD-v1.4 real/fake | in-distribution diffusion | **AUROC** |
20
+ | `genvideo-val` | video | GenVideo validation split | mixed | **AP** |
21
+
22
+ **These three tracks are only the start.** The repo supports 13 image and 8 video benchmark datasets (see the table in the
23
+ [README](../README.md#-benchmarks)), and the web page's Leaderboard tab already compares detectors on 30+ benchmark groups.
24
+ A dataset becomes a standardized track once its protocol (test set, grouping, metric) is fixed, so results stay comparable;
25
+ adding one means a schema entry, an `evaluate.py` track and verified submissions, described in
26
+ [`docs/BENCHMARKS.md`](../docs/BENCHMARKS.md). The datasets themselves download and organize themselves.
27
+
28
+ Metrics are reported in **%**. `mAP` = mean Average Precision over generators; `AUROC`/`AP` use the
29
+ detector's native fake-probability; `Acc` = mean balanced accuracy (mean of real- and fake-accuracy)
30
+ over generators at threshold 0.5.
31
+
32
+ ## Protocol rules
33
+
34
+ 1. **No test-set training or tuning.** Thresholds/calibration must be fixed before evaluation.
35
+ 2. **Report per generator, then average.** A track's headline number is the unweighted mean over
36
+ generators (not a pooled number), which measures generalization rather than rewarding a few
37
+ large generators.
38
+ 3. **Declare provenance** via `evaluation`: `official-weights`, `from-scratch`, `frozen-probe`,
39
+ `training-free`, or `external` (numbers produced outside SynthScope).
40
+ 4. **Verified numbers trace to a run.** `verified: true` means the result came from a logged SynthScope
41
+ evaluation (set `source` to the log/run path). Reference seed entries are transcribed from the
42
+ repo's reproduction table.
43
+
44
+ ## Data layout
45
+
46
+ The evaluator expects the SynthScope common layout — one directory per generator, each split into
47
+ `real/` and `fake/`:
48
+
49
+ ```
50
+ <benchmark_root>/
51
+ <generator_a>/real/*.png <generator_a>/fake/*.png
52
+ <generator_b>/real/*.png <generator_b>/fake/*.png
53
+ ```
54
+
55
+ A single pooled set is just one generator directory (or `<root>/real`, `<root>/fake`).
56
+
57
+ ## Evaluate a detector and produce a submission
58
+
59
+ ```bash
60
+ python benchmark/evaluate.py \
61
+ --model fat_former --track forensynths \
62
+ --data /path/to/forensynths_test \
63
+ --out benchmark/submissions/fat_former.json
64
+ ```
65
+
66
+ This loads the detector via the `synthscope` API, scores every image (batched), computes per-generator +
67
+ mean metrics, and writes a schema-valid submission JSON. Then regenerate the table:
68
+
69
+ ```bash
70
+ python benchmark/leaderboard.py # writes LEADERBOARD.md
71
+ python benchmark/leaderboard.py --check # CI: fail if LEADERBOARD.md is stale or a submission is invalid
72
+ ```
73
+
74
+ ## Submit a result (PR)
75
+
76
+ 1. Add one JSON file under `submissions/` (see [`schema.json`](schema.json) and existing entries).
77
+ 2. Run `python benchmark/leaderboard.py` and commit the updated `LEADERBOARD.md`.
78
+ 3. Open a PR. CI validates your submission and that the table is up to date. Prefer `verified`
79
+ results produced by `evaluate.py`; for `external` numbers, link the source.
80
+
81
+ Versioning: this is **v1**. Protocol-breaking changes bump to v2 and start a new leaderboard so old
82
+ numbers stay meaningful.
benchmark/aggregate_results.py ADDED
@@ -0,0 +1,102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Aggregate the self-recorded bench_eval results into a master reproduced-results table.
2
+
3
+ Reads every repro/bench_results/<tag>.json (latest run per tag), prints a compact summary, writes
4
+ repro/RESULTS_TABLE.md (model | weights | benchmark | n_gen | acc / mAP / mAUROC), and supports
5
+ computing a paper-matching subset mean from a run's per-generator dict:
6
+
7
+ python benchmark/aggregate_results.py # refresh RESULTS_TABLE.md
8
+ python benchmark/aggregate_results.py --subset fatformer_official_forensynths progan,stylegan,...
9
+ python benchmark/aggregate_results.py --detail npr_official_diffusionforensics
10
+ """
11
+ from __future__ import annotations
12
+
13
+ import argparse
14
+ import json
15
+ from pathlib import Path
16
+
17
+ REPRO = Path(__file__).resolve().parents[1] / "repro"
18
+ RESULTS_DIR = REPRO / "bench_results"
19
+
20
+
21
+ def load_runs() -> dict[str, dict]:
22
+ runs: dict[str, dict] = {}
23
+ for p in sorted(RESULTS_DIR.glob("*.json")):
24
+ if p.stem.startswith(("_validate", "_probe", "_detail")):
25
+ continue
26
+ try:
27
+ d = json.loads(p.read_text())
28
+ except Exception as e: # noqa: BLE001
29
+ print(f" skip {p.name}: {e}")
30
+ continue
31
+ tag = d.get("tag", p.stem)
32
+ if tag not in runs or d.get("date", "") >= runs[tag].get("date", ""):
33
+ runs[tag] = d
34
+ return runs
35
+
36
+
37
+ def weights_of(tag: str) -> str:
38
+ if "_official_" in tag:
39
+ return "official"
40
+ if "_synthscope_" in tag:
41
+ return "synthscope"
42
+ return "other"
43
+
44
+
45
+ def subset_mean(run: dict, gens: list[str]) -> dict:
46
+ pg = run.get("per_generator", {})
47
+ found = [g for g in gens if g in pg]
48
+ missing = [g for g in gens if g not in pg]
49
+ if not found:
50
+ return {"error": f"none of {gens} in {list(pg)}"}
51
+ def m(k):
52
+ return round(sum(pg[g][k] for g in found) / len(found), 2)
53
+ return {"n": len(found), "gens": found, "missing": missing,
54
+ "acc": m("acc"), "map": m("ap"), "mauroc": m("auroc")}
55
+
56
+
57
+ def main() -> int:
58
+ ap = argparse.ArgumentParser()
59
+ ap.add_argument("--subset", nargs=2, metavar=("TAG", "GENS"),
60
+ help="compute mean over a comma list of generators for one run tag")
61
+ ap.add_argument("--detail", metavar="TAG", help="print per-generator detail for one run tag")
62
+ args = ap.parse_args()
63
+ runs = load_runs()
64
+
65
+ if args.subset:
66
+ tag, gens = args.subset
67
+ if tag not in runs:
68
+ print(f"no run '{tag}'. have: {sorted(runs)}"); return 1
69
+ print(json.dumps(subset_mean(runs[tag], gens.split(",")), indent=2)); return 0
70
+
71
+ if args.detail:
72
+ if args.detail not in runs:
73
+ print(f"no run '{args.detail}'. have: {sorted(runs)}"); return 1
74
+ r = runs[args.detail]
75
+ print(f"# {args.detail} ({r['model']}, {r['benchmark']}, {r.get('n_generators')} gens) means={r['means']}")
76
+ for g, m in sorted(r["per_generator"].items()):
77
+ print(f" {g:32s} acc={m['acc']:6.2f} AP={m['ap']:6.2f} AUROC={m['auroc']:6.2f} "
78
+ f"(real={m['real_acc']:.1f} fake={m['fake_acc']:.1f})")
79
+ return 0
80
+
81
+ # default: master table
82
+ rows = []
83
+ for tag, r in sorted(runs.items()):
84
+ me = r.get("means", {})
85
+ rows.append((r.get("model", "?"), weights_of(tag), r.get("benchmark", "?"),
86
+ tag, r.get("n_generators", 0),
87
+ me.get("acc"), me.get("map"), me.get("mauroc")))
88
+ rows.sort(key=lambda x: (x[0], x[1], x[3]))
89
+ lines = ["# SynthScope reproduced benchmark results (auto-generated from repro/bench_results/)\n",
90
+ "| model | weights | benchmark | tag | n_gen | acc | mAP | mAUROC |",
91
+ "| --- | --- | --- | --- | --- | --- | --- | --- |"]
92
+ for model, w, bench, tag, n, acc, mp, au in rows:
93
+ lines.append(f"| {model} | {w} | {bench} | `{tag}` | {n} | {acc} | {mp} | {au} |")
94
+ out = REPRO / "RESULTS_TABLE.md"
95
+ out.write_text("\n".join(lines) + "\n")
96
+ print("\n".join(lines))
97
+ print(f"\nWrote {out} ({len(rows)} runs)")
98
+ return 0
99
+
100
+
101
+ if __name__ == "__main__":
102
+ raise SystemExit(main())
benchmark/bench_eval.py ADDED
@@ -0,0 +1,305 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Unified benchmark eval for SynthScope detectors — reproduce a paper's per-generator table.
2
+
3
+ Scores a detector over a benchmark's per-generator real/fake folders through the SAME verified
4
+ synthscope inference path the web app uses (engine + registry + per-model preprocessing + fake-prob),
5
+ computes per-generator + mean acc@0.5 / AP / AUROC, writes a JSON, and APPENDS a verified line to
6
+ ``repro/MASTER_RESULTS.jsonl`` so every reported number traces to this run + its job log.
7
+
8
+ python benchmark/bench_eval.py --model clip --benchmark forensynths \
9
+ --data /hddstore/ssalehi/SynthScope/CNNDetection/test --tag clip_synthscope_forensynths
10
+
11
+ # one step: download the dataset if needed (its built-in loader arranges it), pick the profile, evaluate
12
+ python benchmark/bench_eval.py --model npr --dataset commgen15 --root /data/CommGen15
13
+
14
+ Benchmark profiles encode each dataset's correct generator grouping + real-pairing:
15
+ forensynths CNNDetection/test per top-level generator; reals+fakes collected recursively
16
+ (handles progan/<class>/{0_real,1_fake} nesting)
17
+ ufd UniversalFakeDetect fakes per generator; reals paired Ojha-style
18
+ (guided->imagenet, ldm/glide/dalle->laion)
19
+ pergen freqnet/aigibench/ each <gen>/{0_real,1_fake}; optional shared --reals
20
+ cospybench/generic
21
+ pool GenImage/single-pool one group from <root>/{real,fake} or {0_real,1_fake}
22
+
23
+ Use --ckpt to override the checkpoint (official vs SynthScope-trained, for side-by-side runs).
24
+ """
25
+ from __future__ import annotations
26
+
27
+ import argparse
28
+ import datetime
29
+ import json
30
+ from pathlib import Path
31
+
32
+ import torch
33
+ from PIL import Image, ImageFile
34
+
35
+ import synthscope
36
+ from models.image.cure.preprocess import SRC_FORMAT_KEY
37
+ from datasets_util import ensure_dataset, find_eval_root
38
+
39
+ ImageFile.LOAD_TRUNCATED_IMAGES = True
40
+
41
+ IMAGE_EXTS = {".jpg", ".jpeg", ".png", ".webp", ".bmp", ".tif", ".tiff", ".JPEG"}
42
+ REAL_DIRNAMES = ("0_real", "real", "reals")
43
+ FAKE_DIRNAMES = ("1_fake", "fake", "fakes", "ai")
44
+ SHARED_REAL_DIRS = {"imagenet", "laion", "_real_pool", "real", "0_real", "reals"}
45
+ RESULTS_LOG = Path(__file__).resolve().parents[1] / "repro" / "MASTER_RESULTS.jsonl"
46
+ # Ojha UniversalFakeDetect real pairing (verified against the official dataset_paths.py).
47
+ UFD_REAL = {"guided": "imagenet"} # everything else -> laion
48
+ UFD_DEFAULT_REAL = "laion"
49
+
50
+
51
+ def _images(d: Path) -> list[Path]:
52
+ if not d or not d.is_dir():
53
+ return []
54
+ return sorted(p for p in d.rglob("*") if p.suffix.lower() in {e.lower() for e in IMAGE_EXTS})
55
+
56
+
57
+ def _collect(gen_dir: Path, dirnames: tuple[str, ...]) -> list[Path]:
58
+ """All images under any subdir of gen_dir whose name matches one of dirnames (any depth)."""
59
+ out: list[Path] = []
60
+ for name in dirnames:
61
+ for sub in gen_dir.rglob(name):
62
+ if sub.is_dir():
63
+ out += [p for p in sub.rglob("*") if p.suffix.lower() in {e.lower() for e in IMAGE_EXTS}]
64
+ # de-dup while keeping order
65
+ seen, uniq = set(), []
66
+ for p in out:
67
+ if p not in seen:
68
+ seen.add(p); uniq.append(p)
69
+ return sorted(uniq)
70
+
71
+
72
+ def discover(benchmark: str, root: Path, shared_reals: Path | None, select: set[str] | None):
73
+ """Return [(generator, real_paths, fake_paths)] for the benchmark."""
74
+ shared = _images(shared_reals) if shared_reals else []
75
+
76
+ if benchmark == "pool":
77
+ reals = _collect(root, REAL_DIRNAMES) or shared
78
+ fakes = _collect(root, FAKE_DIRNAMES)
79
+ return [("all", reals, fakes)] if reals and fakes else []
80
+
81
+ if benchmark == "ufd":
82
+ out = []
83
+ gens = sorted(p.name for p in root.iterdir() if p.is_dir() and p.name not in SHARED_REAL_DIRS)
84
+ for gen in gens:
85
+ if select and gen not in select:
86
+ continue
87
+ real_src = root / UFD_REAL.get(gen, UFD_DEFAULT_REAL)
88
+ reals = _collect(real_src, REAL_DIRNAMES)
89
+ fakes = _collect(root / gen, FAKE_DIRNAMES)
90
+ if reals and fakes:
91
+ out.append((gen, reals, fakes))
92
+ else:
93
+ print(f" skip {gen}: reals={len(reals)} fakes={len(fakes)}")
94
+ return out
95
+
96
+ if benchmark == "forensynths":
97
+ out = []
98
+ for gen_dir in sorted(p for p in root.iterdir() if p.is_dir()):
99
+ if select and gen_dir.name not in select:
100
+ continue
101
+ reals = _collect(gen_dir, REAL_DIRNAMES) or shared
102
+ fakes = _collect(gen_dir, FAKE_DIRNAMES)
103
+ if reals and fakes:
104
+ out.append((gen_dir.name, reals, fakes))
105
+ else:
106
+ print(f" skip {gen_dir.name}: reals={len(reals)} fakes={len(fakes)}")
107
+ return out
108
+
109
+ # pergen / generic: each top-level dir (excluding shared-real dirs) is a generator
110
+ out = []
111
+ for gen_dir in sorted(p for p in root.iterdir() if p.is_dir()):
112
+ if gen_dir.name in SHARED_REAL_DIRS and gen_dir.name != root.name:
113
+ continue
114
+ if select and gen_dir.name not in select:
115
+ continue
116
+ reals = _collect(gen_dir, REAL_DIRNAMES) or shared
117
+ fakes = _collect(gen_dir, FAKE_DIRNAMES)
118
+ if reals and fakes:
119
+ out.append((gen_dir.name, reals, fakes))
120
+ else:
121
+ print(f" skip {gen_dir.name}: reals={len(reals)} fakes={len(fakes)}")
122
+ return out
123
+
124
+
125
+ def native_res_transform(tf):
126
+ """Drop the up-scaling Resize/CenterCrop from a model's eval transform, keeping
127
+ ToTensor + Normalize, so images are scored at NATIVE resolution.
128
+
129
+ Some methods (e.g. NPR on GANGen-Detection/freqnet) detect up-sampling artifacts and
130
+ MUST NOT be fed a bilinearly up-scaled image — resizing a 128x128 GAN crop to 256x256
131
+ injects the exact artifact they key on, collapsing the real class. The official NPR
132
+ GANGen recipe runs with ``no_resize=True``; this reproduces it. Safe only when every
133
+ image in a per-generator batch shares one resolution (true for freqnet's per-gen sets),
134
+ since bench_eval stacks a batch into a single tensor."""
135
+ import torchvision.transforms as T
136
+ if not isinstance(tf, T.Compose):
137
+ return tf
138
+ kept = [t for t in tf.transforms if not isinstance(t, (T.Resize, T.CenterCrop))]
139
+ return T.Compose(kept)
140
+
141
+
142
+ @torch.no_grad()
143
+ def _open_rgb(path: Path) -> Image.Image:
144
+ """Open ``path`` as RGB, recording the source file format in ``img.info`` so format-aware eval
145
+ transforms (CuRe's PNG->JPEG96 step) see what the official loader sees."""
146
+ source = Image.open(path)
147
+ source_format = source.format
148
+ image = source.convert("RGB")
149
+ image.info[SRC_FORMAT_KEY] = source_format
150
+ return image
151
+
152
+
153
+ def score(det, model, spec, paths: list[Path], bs: int, transform=None) -> torch.Tensor:
154
+ device = det._engine.device
155
+ tf = transform if transform is not None else spec.transform
156
+ # Native-resolution specs (SPAI any-res) produce variable-size tensors that cannot be stacked,
157
+ # so they MUST be scored one image at a time.
158
+ if getattr(spec, "native_res", False):
159
+ bs = 1
160
+ probs = []
161
+ for i in range(0, len(paths), bs):
162
+ batch = []
163
+ for p in paths[i:i + bs]:
164
+ try:
165
+ batch.append(tf(_open_rgb(p)))
166
+ except Exception as e: # noqa: BLE001
167
+ print(f" bad image {p}: {e}")
168
+ if not batch:
169
+ continue
170
+ x = torch.stack(batch).to(device)
171
+ probs.append(det._engine._fake_prob(model, spec, x).detach().float().cpu())
172
+ return torch.cat(probs) if probs else torch.empty(0)
173
+
174
+
175
+ def metrics(fake_probs: torch.Tensor, labels: torch.Tensor) -> dict | None:
176
+ from torchmetrics.functional import auroc, average_precision
177
+ if labels.unique().numel() < 2:
178
+ return None
179
+ ap = float(average_precision(fake_probs, labels, task="binary")) * 100
180
+ au = float(auroc(fake_probs, labels, task="binary")) * 100
181
+ preds = (fake_probs >= 0.5).int()
182
+ real_acc = float((preds[labels == 0] == 0).float().mean()) * 100
183
+ fake_acc = float((preds[labels == 1] == 1).float().mean()) * 100
184
+ return {"ap": round(ap, 2), "auroc": round(au, 2),
185
+ "real_acc": round(real_acc, 2), "fake_acc": round(fake_acc, 2),
186
+ "acc": round((real_acc + fake_acc) / 2, 2)}
187
+
188
+
189
+ def main(argv=None) -> int:
190
+ ap = argparse.ArgumentParser()
191
+ ap.add_argument("-m", "--model", required=True, help="SynthScope detector key (see `synthscope list`)")
192
+ ap.add_argument("--benchmark", choices=["forensynths", "ufd", "pergen", "pool"],
193
+ help="how the folders are grouped (chosen automatically with --dataset)")
194
+ ap.add_argument("--data", help="benchmark root (not needed with --dataset)")
195
+ ap.add_argument("--dataset", help="a supported dataset (see `python benchmark/download_dataset.py --list`): downloads it "
196
+ "if missing, finds the folder to evaluate and the right --benchmark profile")
197
+ ap.add_argument("--root", help="with --dataset: where the dataset lives / should be downloaded (default: root_dir in its yaml)")
198
+ ap.add_argument("--no-download", action="store_true", help="with --dataset: fail instead of downloading missing data")
199
+ ap.add_argument("--dry-run", action="store_true", help="with --dataset: only show the resolved folder and profile")
200
+ ap.add_argument("--reals", default=None, help="shared real dir (pergen/forensynths fallback)")
201
+ ap.add_argument("--ckpt", default=None, help="checkpoint override (official vs SynthScope weights)")
202
+ ap.add_argument("--select", default=None, help="comma list: only these generators")
203
+ ap.add_argument("--limit", type=int, default=None, help="cap images per class per generator")
204
+ ap.add_argument("--bs", type=int, default=32)
205
+ ap.add_argument("--native-res", action="store_true",
206
+ help="score at native resolution (strip up-scaling Resize/CenterCrop); "
207
+ "for artifact-based methods like NPR on low-res GAN sets (freqnet)")
208
+ ap.add_argument("--device", default=None)
209
+ ap.add_argument("--tag", help="run tag (output filename + log); default <model>_<dataset>")
210
+ ap.add_argument("--out", default=None)
211
+ args = ap.parse_args(argv)
212
+
213
+ if args.dataset:
214
+ root = ensure_dataset(args.dataset, "image", args.root, download=not args.no_download and not args.dry_run)
215
+ eval_root, profile = find_eval_root(args.dataset, root)
216
+ args.data = args.data or str(eval_root)
217
+ args.benchmark = args.benchmark or profile
218
+ args.tag = args.tag or f"{args.model}_{args.dataset}"
219
+ print(f"[dataset] {args.dataset}: evaluating {args.data} with the '{args.benchmark}' profile", flush=True)
220
+ if args.dry_run:
221
+ return 0
222
+ if not (args.benchmark and args.data):
223
+ ap.error("give --dataset NAME, or both --benchmark and --data")
224
+ if not args.tag:
225
+ ap.error("--tag is required without --dataset")
226
+
227
+ load_kw = {}
228
+ if args.ckpt:
229
+ load_kw["checkpoint"] = args.ckpt
230
+ det = synthscope.load(args.model, device=args.device, **load_kw)
231
+ det._ensure_weights()
232
+ spec = det.spec
233
+ model = det._engine._get_model(spec)
234
+ eval_transform = native_res_transform(spec.transform) if args.native_res else spec.transform
235
+ if args.native_res:
236
+ print(f"[native-res] scoring at native resolution; transform={eval_transform}", flush=True)
237
+
238
+ root = Path(args.data).expanduser()
239
+ select = set(args.select.split(",")) if args.select else None
240
+ gens = discover(args.benchmark, root,
241
+ Path(args.reals).expanduser() if args.reals else None, select)
242
+ if not gens:
243
+ print(f"No generators with real+fake under {root} (benchmark={args.benchmark})")
244
+ return 1
245
+
246
+ print(f"=== bench_eval {args.tag} | model={args.model} ckpt={args.ckpt or 'registry-default'} "
247
+ f"| {args.benchmark} | {len(gens)} generators | device={det._engine.device} ===", flush=True)
248
+
249
+ per_gen, agg = {}, {"ap": [], "auroc": [], "acc": []}
250
+ for name, reals, fakes in gens:
251
+ if args.limit:
252
+ reals, fakes = reals[:args.limit], fakes[:args.limit]
253
+ labels = torch.tensor([0] * len(reals) + [1] * len(fakes))
254
+ print(f" {name}: {len(reals)} real + {len(fakes)} fake ...", flush=True)
255
+ probs = score(det, model, spec, reals + fakes, args.bs, transform=eval_transform)
256
+ if probs.numel() != labels.numel():
257
+ labels = labels[:probs.numel()]
258
+ m = metrics(probs, labels)
259
+ if m is None:
260
+ print(f" skip {name}: one class only")
261
+ continue
262
+ per_gen[name] = m
263
+ for k in agg:
264
+ agg[k].append(m[k])
265
+ print(f" {name}: acc={m['acc']} AP={m['ap']} AUROC={m['auroc']} "
266
+ f"(real_acc={m['real_acc']} fake_acc={m['fake_acc']})", flush=True)
267
+
268
+ if not per_gen:
269
+ print("No generator produced valid metrics.")
270
+ return 1
271
+
272
+ def mean(xs):
273
+ return round(sum(xs) / len(xs), 2)
274
+
275
+ means = {"acc": mean(agg["acc"]), "map": mean(agg["ap"]), "mauroc": mean(agg["auroc"])}
276
+ result = {
277
+ "tag": args.tag,
278
+ "model": args.model,
279
+ "ckpt": args.ckpt or "registry-default",
280
+ "benchmark": args.benchmark,
281
+ "data_root": str(root),
282
+ "n_generators": len(per_gen),
283
+ "means": means,
284
+ "per_generator": per_gen,
285
+ "date": datetime.datetime.now().isoformat(timespec="seconds"),
286
+ "synthscope_version": getattr(synthscope, "__version__", "?"),
287
+ }
288
+ out = Path(args.out).expanduser() if args.out else (
289
+ RESULTS_LOG.parent / "bench_results" / f"{args.tag}.json")
290
+ out.parent.mkdir(parents=True, exist_ok=True)
291
+ out.write_text(json.dumps(result, indent=2) + "\n")
292
+
293
+ RESULTS_LOG.parent.mkdir(parents=True, exist_ok=True)
294
+ with RESULTS_LOG.open("a") as f:
295
+ f.write(json.dumps({k: result[k] for k in
296
+ ("date", "tag", "model", "ckpt", "benchmark", "data_root",
297
+ "n_generators", "means")}) + "\n")
298
+
299
+ print(f"\n=== RESULT {args.tag}: mAP={means['map']} mAUROC={means['mauroc']} acc={means['acc']} "
300
+ f"over {len(per_gen)} generators -> {out} ===", flush=True)
301
+ return 0
302
+
303
+
304
+ if __name__ == "__main__":
305
+ raise SystemExit(main())
benchmark/bench_eval_video.py ADDED
@@ -0,0 +1,181 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Unified VIDEO benchmark eval for SynthScope video detectors (d3, restrav, stall).
2
+
3
+ Scores each video through the SAME verified synthscope engine path the web app uses
4
+ (engine.predict_video_clip -> native clip pipeline + per-model norm + fake-prob), computes
5
+ per-generator + mean acc@0.5 / AP / AUROC, and writes the SAME JSON schema as bench_eval.py
6
+ (repro/bench_results/<tag>.json + append repro/MASTER_RESULTS.jsonl) so the aggregator ingests it.
7
+
8
+ python benchmark/bench_eval_video.py --model d3 --benchmark genvideo \
9
+ --data /hddstore/ssalehi/SynthScope/d3_repro/genvideo_val/GenVideo-Val --limit 150 --tag d3_genvideo
10
+
11
+ Benchmark layouts:
12
+ genvideo <data>/Fake/<gen>/*.mp4 + <data>/Real/*.mp4 (shared real pool) [GenVideo-Val]
13
+ fakeonly <data>/<gen>/*.mp4 (all fake) + --reals DIR of real videos [EvalCrafter]
14
+ pergen <data>/<gen>/{0_real,1_fake}/*.mp4 [GenVidBench]
15
+ """
16
+ from __future__ import annotations
17
+
18
+ import argparse
19
+ import datetime
20
+ import json
21
+ import sys
22
+ from pathlib import Path
23
+
24
+ import torch
25
+
26
+ sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "interface"))
27
+ from backend.engine import get_engine # noqa: E402
28
+ from backend.registry import get_spec # noqa: E402
29
+
30
+ VIDEO_EXTS = {".mp4", ".avi", ".mov", ".mkv", ".webm", ".gif", ".m4v"}
31
+ REPRO = Path(__file__).resolve().parents[1] / "repro"
32
+ RESULTS_LOG = REPRO / "MASTER_RESULTS.jsonl"
33
+ REAL_DIRNAMES = ("0_real", "real", "reals", "Real")
34
+ FAKE_DIRNAMES = ("1_fake", "fake", "fakes", "Fake")
35
+
36
+
37
+ def _videos(d: Path) -> list[Path]:
38
+ if not d or not d.is_dir():
39
+ return []
40
+ return sorted(p for p in d.rglob("*") if p.suffix.lower() in VIDEO_EXTS)
41
+
42
+
43
+ def _find(parent: Path, names) -> Path | None:
44
+ for n in names:
45
+ if (parent / n).is_dir():
46
+ return parent / n
47
+ return None
48
+
49
+
50
+ def discover(benchmark: str, root: Path, shared_reals: Path | None, select):
51
+ shared = _videos(shared_reals) if shared_reals else []
52
+ out = []
53
+ if benchmark == "genvideo":
54
+ fake_root = _find(root, FAKE_DIRNAMES)
55
+ real_root = _find(root, REAL_DIRNAMES)
56
+ reals = _videos(real_root) or shared
57
+ gens = sorted(p for p in fake_root.iterdir() if p.is_dir()) if fake_root else []
58
+ for g in gens:
59
+ if select and g.name not in select:
60
+ continue
61
+ fk = _videos(g)
62
+ if fk and reals:
63
+ out.append((g.name, reals, fk))
64
+ return out
65
+ if benchmark == "fakeonly":
66
+ gens = sorted(p for p in root.iterdir() if p.is_dir())
67
+ for g in gens:
68
+ if select and g.name not in select:
69
+ continue
70
+ fk = _videos(g)
71
+ if fk and shared:
72
+ out.append((g.name, shared, fk))
73
+ return out
74
+ # pergen
75
+ for g in sorted(p for p in root.iterdir() if p.is_dir()):
76
+ if select and g.name not in select:
77
+ continue
78
+ reals = _videos(_find(g, REAL_DIRNAMES)) or shared
79
+ fakes = _videos(_find(g, FAKE_DIRNAMES))
80
+ if reals and fakes:
81
+ out.append((g.name, reals, fakes))
82
+ return out
83
+
84
+
85
+ def metrics(fake_probs: torch.Tensor, labels: torch.Tensor):
86
+ from torchmetrics.functional import auroc, average_precision
87
+ if labels.unique().numel() < 2:
88
+ return None
89
+ ap = float(average_precision(fake_probs, labels, task="binary")) * 100
90
+ au = float(auroc(fake_probs, labels, task="binary")) * 100
91
+ preds = (fake_probs >= 0.5).int()
92
+ real_acc = float((preds[labels == 0] == 0).float().mean()) * 100
93
+ fake_acc = float((preds[labels == 1] == 1).float().mean()) * 100
94
+ return {"ap": round(ap, 2), "auroc": round(au, 2), "real_acc": round(real_acc, 2),
95
+ "fake_acc": round(fake_acc, 2), "acc": round((real_acc + fake_acc) / 2, 2)}
96
+
97
+
98
+ @torch.no_grad()
99
+ def score_videos(engine, spec, paths):
100
+ probs = []
101
+ for p in paths:
102
+ try:
103
+ probs.append(engine.predict_video_clip(spec, str(p))["fake_probability"])
104
+ except Exception as e: # noqa: BLE001
105
+ print(f" bad video {p.name}: {e}")
106
+ return probs
107
+
108
+
109
+ def main(argv=None) -> int:
110
+ ap = argparse.ArgumentParser()
111
+ ap.add_argument("-m", "--model", required=True, choices=["d3", "restrav", "stall"])
112
+ ap.add_argument("--benchmark", required=True, choices=["genvideo", "fakeonly", "pergen"])
113
+ ap.add_argument("--data", required=True)
114
+ ap.add_argument("--reals", default=None)
115
+ ap.add_argument("--select", default=None)
116
+ ap.add_argument("--limit", type=int, default=None, help="cap videos per class per generator")
117
+ ap.add_argument("--tag", required=True)
118
+ ap.add_argument("--out", default=None)
119
+ args = ap.parse_args(argv)
120
+
121
+ engine = get_engine()
122
+ spec = get_spec(args.model)
123
+ engine._get_model(spec)
124
+ root = Path(args.data)
125
+ select = set(args.select.split(",")) if args.select else None
126
+ gens = discover(args.benchmark, root, Path(args.reals) if args.reals else None, select)
127
+ if not gens:
128
+ print(f"No generators with real+fake videos under {root} ({args.benchmark})")
129
+ return 1
130
+ print(f"=== bench_eval_video {args.tag} | {args.model} | {args.benchmark} | {len(gens)} gens "
131
+ f"| device={engine.device} ===", flush=True)
132
+
133
+ per_gen, agg = {}, {"ap": [], "auroc": [], "acc": []}
134
+ # score the shared real pool once if it is identical across generators
135
+ real_cache = {}
136
+ for name, reals, fakes in gens:
137
+ if args.limit:
138
+ reals, fakes = reals[:args.limit], fakes[:args.limit]
139
+ rk = (id(reals) if args.limit is None else None)
140
+ print(f" {name}: {len(reals)} real + {len(fakes)} fake ...", flush=True)
141
+ key = tuple(reals[:1]) + (len(reals),)
142
+ if key in real_cache:
143
+ rp = real_cache[key]
144
+ else:
145
+ rp = score_videos(engine, spec, reals)
146
+ real_cache[key] = rp
147
+ fp = score_videos(engine, spec, fakes)
148
+ probs = torch.tensor(rp + fp)
149
+ labels = torch.tensor([0] * len(rp) + [1] * len(fp))
150
+ m = metrics(probs, labels)
151
+ if m is None:
152
+ print(f" skip {name}: one class"); continue
153
+ per_gen[name] = m
154
+ for k in agg:
155
+ agg[k].append(m[k])
156
+ print(f" {name}: acc={m['acc']} AP={m['ap']} AUROC={m['auroc']}", flush=True)
157
+
158
+ if not per_gen:
159
+ print("No generator produced metrics."); return 1
160
+
161
+ def mean(xs):
162
+ return round(sum(xs) / len(xs), 2)
163
+ means = {"acc": mean(agg["acc"]), "map": mean(agg["ap"]), "mauroc": mean(agg["auroc"])}
164
+ result = {"tag": args.tag, "model": args.model, "ckpt": "registry-default",
165
+ "benchmark": f"video:{args.benchmark}", "data_root": str(root),
166
+ "n_generators": len(per_gen), "means": means, "per_generator": per_gen,
167
+ "date": datetime.datetime.now().isoformat(timespec="seconds"),
168
+ "synthscope_version": "video"}
169
+ out = Path(args.out) if args.out else (REPRO / "bench_results" / f"{args.tag}.json")
170
+ out.parent.mkdir(parents=True, exist_ok=True)
171
+ out.write_text(json.dumps(result, indent=2) + "\n")
172
+ with RESULTS_LOG.open("a") as f:
173
+ f.write(json.dumps({k: result[k] for k in
174
+ ("date", "tag", "model", "ckpt", "benchmark", "data_root", "n_generators", "means")}) + "\n")
175
+ print(f"\n=== RESULT {args.tag}: mAP={means['map']} mAUROC={means['mauroc']} acc={means['acc']} "
176
+ f"over {len(per_gen)} gens -> {out} ===", flush=True)
177
+ return 0
178
+
179
+
180
+ if __name__ == "__main__":
181
+ raise SystemExit(main())
benchmark/datasets_util.py ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Shared helpers for the benchmark scripts: download a dataset with its built-in loader and find where to evaluate it.
2
+
3
+ ``ensure_dataset`` composes the dataset's Hydra config (``conf/dataset/<modality>/<name>.yaml``), and, if the data is not
4
+ on disk yet, constructs its dataset module, whose loader (``prefetch: true``) downloads the data and restructures it into
5
+ ``<generator>/{0_real,1_fake}``. ``find_eval_root`` then locates the folder to evaluate and picks the ``bench_eval.py``
6
+ profile (forensynths / ufd / pergen / pool) from the layout.
7
+ """
8
+ import os
9
+ import sys
10
+ from pathlib import Path
11
+
12
+ ROOT = Path(__file__).resolve().parent.parent
13
+ sys.path.insert(0, str(ROOT))
14
+
15
+ IMAGE_EXT = {".jpg", ".jpeg", ".png", ".webp", ".bmp", ".tif", ".tiff"}
16
+ REAL_NAMES = {"0_real", "real", "reals"}
17
+ FAKE_NAMES = {"1_fake", "fake", "fakes", "ai"}
18
+ # datasets whose generator grouping / real pairing is special-cased by a bench_eval profile
19
+ PROFILE_OVERRIDE = {"cnndetection": "forensynths", "cospy_subset": "forensynths", "spai_ldm": "forensynths",
20
+ "universialfakedetection": "ufd"}
21
+
22
+
23
+ def dataset_config(name: str, modality: str = "image", root: str | None = None):
24
+ """The composed Hydra config for ``conf/dataset/<modality>/<name>.yaml`` (``root`` overrides ``root_dir``)."""
25
+ from config_utils import compose_config
26
+ conf = ROOT / "conf" / "dataset"
27
+ if not (conf / modality / f"{name}.yaml").is_file():
28
+ other = [m for m in ("image", "video") if (conf / m / f"{name}.yaml").is_file()]
29
+ if other:
30
+ raise SystemExit(f"{name} is a {other[0]} dataset; use the {other[0]} evaluator "
31
+ f"({'benchmark/bench_eval_video.py' if other[0] == 'video' else 'benchmark/bench_eval.py'})")
32
+ known = sorted(p.stem for p in (conf / modality).glob("*.yaml"))
33
+ raise SystemExit(f"unknown {modality} dataset '{name}'. Available: {', '.join(known)}")
34
+ overrides = [f"dataset@DatasetConfig={modality}/{name}"]
35
+ if root:
36
+ overrides.append(f"DatasetConfig.root_dir={root}")
37
+ return compose_config(overrides)
38
+
39
+
40
+ def has_images(root: Path) -> bool:
41
+ """True as soon as one image file is found under ``root`` (cheap: stops at the first hit)."""
42
+ if not root.is_dir():
43
+ return False
44
+ for _, _, files in os.walk(root):
45
+ if any(os.path.splitext(f)[1].lower() in IMAGE_EXT for f in files):
46
+ return True
47
+ return False
48
+
49
+
50
+ def download_dataset(name: str, modality: str = "image", root: str | None = None) -> Path:
51
+ """Run the dataset's loader (download + restructure). Returns the root directory."""
52
+ from dataset import AIGIDatasetModule
53
+ cfg = dataset_config(name, modality, root)
54
+ AIGIDatasetModule(cfg) # constructing the datasets runs the loader (prefetch: true downloads + restructures)
55
+ return Path(cfg.DatasetConfig.root_dir)
56
+
57
+
58
+ def ensure_dataset(name: str, modality: str = "image", root: str | None = None, download: bool = True) -> Path:
59
+ """The dataset's root directory, downloading it first when no images are there yet."""
60
+ cfg = dataset_config(name, modality, root)
61
+ path = Path(cfg.DatasetConfig.root_dir).expanduser()
62
+ if has_images(path):
63
+ return path
64
+ if not download:
65
+ raise SystemExit(f"{name}: no data under {path} (drop --no-download to fetch it, or pass --root)")
66
+ print(f"[dataset] {name}: nothing under {path}, downloading with the built-in loader ...", flush=True)
67
+ return download_dataset(name, modality, root)
68
+
69
+
70
+ def _subdirs(d: Path) -> list[Path]:
71
+ try:
72
+ return sorted(c for c in d.iterdir() if c.is_dir() and not c.name.startswith((".", "_")))
73
+ except OSError:
74
+ return []
75
+
76
+
77
+ def _has_real_fake(d: Path, depth: int = 3) -> bool:
78
+ names = {c.name.lower() for c in d.iterdir() if c.is_dir()} if d.is_dir() else set()
79
+ if names & REAL_NAMES and names & FAKE_NAMES:
80
+ return True
81
+ return depth > 0 and any(_has_real_fake(c, depth - 1) for c in _subdirs(d)[:60])
82
+
83
+
84
+ def find_eval_root(name: str, root: Path) -> tuple[Path, str]:
85
+ """(folder to evaluate, bench_eval profile). Looks in ``root/test``, ``root/test_full`` and ``root`` itself."""
86
+ if name in PROFILE_OVERRIDE: # fixed layouts handled by their own bench_eval profile (e.g. UFD: fakes and reals in separate folders)
87
+ for cand in (root / "test", root):
88
+ if cand.is_dir() and _subdirs(cand):
89
+ return cand, PROFILE_OVERRIDE[name]
90
+ for cand in (root / "test", root / "test_full", root):
91
+ if not cand.is_dir():
92
+ continue
93
+ names = {c.name.lower() for c in cand.iterdir() if c.is_dir()}
94
+ if names & REAL_NAMES and names & FAKE_NAMES: # one pooled real/fake set
95
+ return cand, PROFILE_OVERRIDE.get(name, "pool")
96
+ if any(_has_real_fake(g) for g in _subdirs(cand)): # one folder per generator
97
+ return cand, PROFILE_OVERRIDE.get(name, "pergen")
98
+ raise SystemExit(f"{name}: could not find real/fake folders under {root}; expected "
99
+ "<root>/[test/]<generator>/{0_real,1_fake} (see docs/BENCHMARKS.md)")
benchmark/download_dataset.py ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Download and prepare one of SynthScope's benchmark datasets with its built-in loader.
2
+
3
+ python benchmark/download_dataset.py --list # datasets and where each comes from
4
+ python benchmark/download_dataset.py genimage --root /data/GenImage
5
+ python benchmark/download_dataset.py synthbuster --root /data/Synthbuster --dry-run # only show what would happen
6
+
7
+ The loaders download from the dataset's official source (Hugging Face, Zenodo, ModelScope or Google Drive; see
8
+ ``conf/dataset/image/<name>.yaml``) and restructure it into ``<root>/<generator>/{0_real,1_fake}``, which
9
+ ``benchmark/bench_eval.py`` reads. Some hosts rate-limit (Google Drive) or ask you to accept terms first; if a download
10
+ fails, fetch the data by hand from the ``source_url`` and unpack it into ``--root`` in the same layout.
11
+ """
12
+ import argparse
13
+ import sys
14
+ from pathlib import Path
15
+
16
+ ROOT = Path(__file__).resolve().parent.parent
17
+ sys.path.insert(0, str(ROOT))
18
+
19
+ from datasets_util import dataset_config, download_dataset
20
+
21
+ SOURCE_KEYS = ("source_url", "hf_repo_id", "zenodo_record", "repo_id", "modelscope_id", "setting")
22
+
23
+
24
+ def available() -> list[Path]:
25
+ return sorted((ROOT / "conf" / "dataset").glob("*/*.yaml"))
26
+
27
+
28
+ def describe(path: Path) -> str:
29
+ """One line: modality/name and where the data comes from."""
30
+ from omegaconf import OmegaConf
31
+ cfg = OmegaConf.load(path)
32
+ src = ", ".join(f"{k}={cfg[k]}" for k in SOURCE_KEYS if k in cfg)
33
+ return f"{path.parent.name}/{path.stem:24s} {src or '(see the yaml)'}"
34
+
35
+
36
+ def main() -> None:
37
+ ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
38
+ ap.add_argument("name", nargs="?", help="dataset config name, e.g. genimage, cnndetection, aigibench, synthbuster")
39
+ ap.add_argument("--root", help="where to put the data (default: root_dir from the dataset's yaml)")
40
+ ap.add_argument("--modality", default="image", choices=["image", "video"])
41
+ ap.add_argument("--list", action="store_true", help="list the available datasets and their sources")
42
+ ap.add_argument("--dry-run", action="store_true", help="only print the resolved config; download nothing")
43
+ args = ap.parse_args()
44
+
45
+ if args.list or not args.name:
46
+ print("\n".join(describe(p) for p in available()))
47
+ return
48
+ dc = dataset_config(args.name, args.modality, args.root).DatasetConfig
49
+ print(f"dataset {dc.name}: root_dir={dc.root_dir} prefetch={dc.get('prefetch')}")
50
+ for k in SOURCE_KEYS:
51
+ if k in dc:
52
+ print(f" {k}: {dc[k]}")
53
+ if args.dry_run:
54
+ return
55
+ path = download_dataset(args.name, args.modality, args.root)
56
+ print(f"done: {path}")
57
+
58
+
59
+ if __name__ == "__main__":
60
+ main()
benchmark/evaluate.py ADDED
@@ -0,0 +1,191 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Evaluate an SynthScope detector on a benchmark track and write a schema-valid submission JSON.
2
+
3
+ python benchmark/evaluate.py --model fat_former --track forensynths \
4
+ --data /path/to/forensynths_test --out benchmark/submissions/fat_former.json
5
+
6
+ Reuses the verified ``synthscope`` inference path (model build + checkpoint load + per-model
7
+ preprocessing + fake-probability), then computes per-generator + mean metrics with torchmetrics —
8
+ the same metrics the trainer reports. Image tracks only in v1 (video harness is future work; the
9
+ video seed entries come from their reproduction eval).
10
+
11
+ Expected data layout (SynthScope common layout):
12
+
13
+ <data>/<generator>/real/*.png <data>/<generator>/fake/*.png
14
+
15
+ Use ``--reals DIR`` for benchmarks that share one real set across per-generator fake folders.
16
+ """
17
+ from __future__ import annotations
18
+
19
+ import argparse
20
+ import datetime
21
+ import json
22
+ from pathlib import Path
23
+
24
+ import torch
25
+ from PIL import Image, ImageFile
26
+
27
+ import synthscope
28
+
29
+ ImageFile.LOAD_TRUNCATED_IMAGES = True
30
+
31
+ IMAGE_EXTS = {".jpg", ".jpeg", ".png", ".webp", ".bmp", ".tif", ".tiff"}
32
+ REAL_NAMES = {"real", "0_real", "reals"}
33
+ FAKE_NAMES = {"fake", "1_fake", "fakes", "ai"}
34
+
35
+
36
+ def _images(d: Path) -> list[Path]:
37
+ return sorted(p for p in d.rglob("*") if p.suffix.lower() in IMAGE_EXTS) if d and d.is_dir() else []
38
+
39
+
40
+ def _find_split(gen_dir: Path, names: set[str]) -> Path | None:
41
+ for n in names:
42
+ if (gen_dir / n).is_dir():
43
+ return gen_dir / n
44
+ return None
45
+
46
+
47
+ def discover_generators(root: Path, shared_reals: Path | None):
48
+ """Return [(generator_name, real_paths, fake_paths)] from the benchmark root."""
49
+ shared = _images(shared_reals) if shared_reals else []
50
+ out = []
51
+ # Single pooled set: <root>/real, <root>/fake
52
+ if _find_split(root, REAL_NAMES) or _find_split(root, FAKE_NAMES):
53
+ reals = _images(_find_split(root, REAL_NAMES)) or shared
54
+ fakes = _images(_find_split(root, FAKE_NAMES))
55
+ if reals and fakes:
56
+ return [("all", reals, fakes)]
57
+ for gen_dir in sorted(p for p in root.iterdir() if p.is_dir()):
58
+ reals = _images(_find_split(gen_dir, REAL_NAMES)) or shared
59
+ fakes = _images(_find_split(gen_dir, FAKE_NAMES))
60
+ if reals and fakes:
61
+ out.append((gen_dir.name, reals, fakes))
62
+ else:
63
+ print(f" skip generator '{gen_dir.name}': need both real and fake images")
64
+ return out
65
+
66
+
67
+ @torch.no_grad()
68
+ def score(det: "synthscope.Detector", paths: list[Path], batch_size: int) -> torch.Tensor:
69
+ """Return P(fake) for a list of image paths, using the detector's own preprocessing."""
70
+ det._ensure_weights()
71
+ model = det._engine._get_model(det.spec) # build + load (verified path)
72
+ spec, device = det.spec, det._engine.device
73
+ probs = []
74
+ for i in range(0, len(paths), batch_size):
75
+ batch = []
76
+ for p in paths[i:i + batch_size]:
77
+ batch.append(spec.transform(Image.open(p).convert("RGB")))
78
+ x = torch.stack(batch).to(device)
79
+ probs.append(det._engine._fake_prob(model, spec, x).detach().float().cpu())
80
+ return torch.cat(probs) if probs else torch.empty(0)
81
+
82
+
83
+ def _per_generator_metrics(fake_probs: torch.Tensor, labels: torch.Tensor) -> dict | None:
84
+ from torchmetrics.functional import auroc, average_precision
85
+
86
+ if labels.unique().numel() < 2:
87
+ return None # AUROC/AP need both classes
88
+ ap = float(average_precision(fake_probs, labels, task="binary")) * 100
89
+ au = float(auroc(fake_probs, labels, task="binary")) * 100
90
+ preds = (fake_probs >= 0.5).int()
91
+ real_acc = float((preds[labels == 0] == 0).float().mean()) * 100
92
+ fake_acc = float((preds[labels == 1] == 1).float().mean()) * 100
93
+ return {"ap": round(ap, 2), "auroc": round(au, 2),
94
+ "real_acc": round(real_acc, 2), "fake_acc": round(fake_acc, 2),
95
+ "balanced_acc": round((real_acc + fake_acc) / 2, 2)}
96
+
97
+
98
+ def _infer_eval_type(model_type: str) -> str:
99
+ from interface.backend.registry import get_spec
100
+
101
+ spec = get_spec(model_type)
102
+ if str(spec.ckpt_kind).startswith("official"):
103
+ return "official-weights"
104
+ if spec.ckpt_kind == "none":
105
+ return "training-free"
106
+ return "from-scratch"
107
+
108
+
109
+ def main(argv=None) -> int:
110
+ ap = argparse.ArgumentParser(description="Evaluate a detector and emit a benchmark submission.")
111
+ ap.add_argument("-m", "--model", required=True, help="SynthScope detector key (see `synthscope list`)")
112
+ ap.add_argument("--track", required=True, choices=["forensynths", "genimage-sdv1.4"],
113
+ help="benchmark track (image tracks only in v1)")
114
+ ap.add_argument("--data", required=True, help="benchmark root (per-generator real/fake dirs)")
115
+ ap.add_argument("--reals", default=None, help="shared real-image dir (for shared-real layouts)")
116
+ ap.add_argument("--out", required=True, help="output submission JSON path")
117
+ ap.add_argument("--batch-size", type=int, default=32)
118
+ ap.add_argument("--limit", type=int, default=None, help="cap images per class per generator")
119
+ ap.add_argument("--device", default=None)
120
+ ap.add_argument("--method", default=None, help="display name (default: registry name)")
121
+ ap.add_argument("--eval-type", default=None,
122
+ help="override provenance (official-weights/from-scratch/frozen-probe/...)")
123
+ ap.add_argument("--submitted-by", default="SynthScope")
124
+ args = ap.parse_args(argv)
125
+
126
+ det = synthscope.load(args.model, device=args.device)
127
+ root = Path(args.data).expanduser()
128
+ gens = discover_generators(root, Path(args.reals).expanduser() if args.reals else None)
129
+ if not gens:
130
+ print(f"No generators with real+fake images under {root}")
131
+ return 1
132
+
133
+ per_gen, means = {}, {"ap": [], "auroc": [], "balanced_acc": []}
134
+ for name, reals, fakes in gens:
135
+ if args.limit:
136
+ reals, fakes = reals[:args.limit], fakes[:args.limit]
137
+ paths = reals + fakes
138
+ labels = torch.tensor([0] * len(reals) + [1] * len(fakes))
139
+ print(f" {name}: {len(reals)} real + {len(fakes)} fake ...", flush=True)
140
+ probs = score(det, paths, args.batch_size)
141
+ m = _per_generator_metrics(probs, labels)
142
+ if m is None:
143
+ print(f" (skipped metrics: only one class)")
144
+ continue
145
+ per_gen[name] = m
146
+ for k in means:
147
+ means[k].append(m[k])
148
+
149
+ if not per_gen:
150
+ print("No generator produced valid metrics.")
151
+ return 1
152
+
153
+ def mean(xs):
154
+ return round(sum(xs) / len(xs), 2)
155
+
156
+ from interface.backend.registry import get_spec
157
+ spec = get_spec(args.model)
158
+ submission = {
159
+ "method": args.method or spec.name,
160
+ "track": args.track,
161
+ "modality": "image",
162
+ "model_type": args.model,
163
+ "paper": spec.paper,
164
+ "url": "https://github.com/SMSD75/SynthScope",
165
+ "evaluation": args.eval_type or _infer_eval_type(args.model),
166
+ "metrics": {
167
+ "acc": mean(means["balanced_acc"]),
168
+ "map": mean(means["ap"]),
169
+ "ap": None,
170
+ "auroc": mean(means["auroc"]),
171
+ },
172
+ "per_generator": per_gen,
173
+ "submitted_by": args.submitted_by,
174
+ "date": datetime.date.today().isoformat(),
175
+ "verified": True,
176
+ "source": f"synthscope evaluate.py on {root} ({len(per_gen)} generators)",
177
+ "protocol_notes": None,
178
+ "synthscope_version": synthscope.__version__,
179
+ }
180
+ out = Path(args.out).expanduser()
181
+ out.parent.mkdir(parents=True, exist_ok=True)
182
+ out.write_text(json.dumps(submission, indent=2) + "\n")
183
+ print(f"Wrote {out}")
184
+ print(f" mAP={submission['metrics']['map']} AUROC={submission['metrics']['auroc']} "
185
+ f"Acc={submission['metrics']['acc']} over {len(per_gen)} generators")
186
+ print("Run `python benchmark/leaderboard.py` to refresh LEADERBOARD.md.")
187
+ return 0
188
+
189
+
190
+ if __name__ == "__main__":
191
+ raise SystemExit(main())
benchmark/generator_bench.py ADDED
@@ -0,0 +1,208 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Generator benchmark: how well do SynthScope's image detectors catch images from ONE image generator?
2
+
3
+ For every real image a text prompt is written (BLIP caption + a photographic style suffix), the generator creates a
4
+ new image from that prompt ALONE, and every available image detector scores the real and the generated images. The
5
+ result is a ranking by AUROC, shown in the web page's "Generator benchmarks" tab.
6
+
7
+ # same 100 real images + prompts as the reference run, so generators are compared on identical content
8
+ python benchmark/generator_bench.py --generator flux2_klein --label "FLUX.2 [klein] 4B" \\
9
+ --reuse benchmark/generator_runs/reference/manifest.json --out benchmark/generator_runs/flux2_klein_4b
10
+ # (the reference real images are not in git: add --real-root <your GenImage and CNNDetection folders> to find them by name)
11
+
12
+ # build a fresh image set from your own real images
13
+ python benchmark/generator_bench.py --generator nanobanana --real-glob "/data/real/*.jpg" --n 100 \\
14
+ --out benchmark/generator_runs/nanobanana
15
+
16
+ ``--generator`` is any key of ``interface/backend/generators.py`` that can create an image from text. Local open-weight
17
+ generators (FLUX.2 [klein], Qwen-Image-2.1) run in batch with one model load; hosted ones need their API key (``.env``).
18
+ Outputs in ``--out``: manifest.json, results.json, RESULTS.md (committed) and real/ + fake/ images (git-ignored).
19
+ Re-running skips images that already exist, so an interrupted run can be resumed. See docs/BENCHMARKS.md.
20
+ """
21
+ import argparse
22
+ import glob
23
+ import json
24
+ import os
25
+ import random
26
+ import shutil
27
+ import sys
28
+ import time
29
+ from pathlib import Path
30
+
31
+ ROOT = Path(__file__).resolve().parent.parent
32
+ sys.path.insert(0, str(ROOT))
33
+
34
+ import numpy as np
35
+ from PIL import Image
36
+
37
+ from interface.backend import generators as G
38
+ from interface.backend.registry import list_specs
39
+
40
+ IMG_EXT = (".jpg", ".jpeg", ".png", ".webp")
41
+
42
+
43
+ def log(*a):
44
+ print(*a, flush=True)
45
+
46
+
47
+ def build_pairs(args, real_dir: Path) -> list:
48
+ """[{idx, caption, prompt, real_src}] and the real images copied to ``real_dir`` as 000.png, 001.png, ..."""
49
+ pairs = []
50
+ if args.reuse:
51
+ src = json.load(open(args.reuse))
52
+ src_real = Path(args.reuse).parent / "real"
53
+ found = None # file name -> path, built only if --real-root is needed
54
+ for p in src["pairs"][: args.n]:
55
+ png = src_real / f"{p['idx']:03d}.png"
56
+ dst = real_dir / f"{p['idx']:03d}.png"
57
+ if png.is_file():
58
+ shutil.copyfile(png, dst)
59
+ elif args.real_root: # the real images are not in git: find them by file name
60
+ if found is None:
61
+ found = {f.name: f for root in args.real_root for f in Path(root).rglob("*")
62
+ if f.suffix.lower() in IMG_EXT}
63
+ match = found.get(Path(p.get("real_src", "")).name)
64
+ if match is None:
65
+ log(f" [{p['idx']}] real image {Path(p.get('real_src', '')).name} not found under --real-root, skipped")
66
+ continue
67
+ Image.open(match).convert("RGB").save(dst)
68
+ else:
69
+ continue
70
+ pairs.append({"idx": p["idx"], "caption": p.get("caption", ""), "prompt": p["prompt"],
71
+ "real_src": p.get("real_src", "")})
72
+ log(f"[pairs] reusing {len(pairs)} prompts + real images from {args.reuse}")
73
+ return pairs
74
+ if not args.real_glob:
75
+ sys.exit("give --reuse MANIFEST or --real-glob PATTERN (real images to caption)")
76
+ cands = sorted({f for pat in args.real_glob for f in glob.glob(pat) if f.lower().endswith(IMG_EXT)})
77
+ random.Random(args.seed).shuffle(cands)
78
+ log(f"[pairs] {len(cands)} candidate real images; need {args.n} (people are skipped)")
79
+ for src in cands:
80
+ if len(pairs) >= args.n:
81
+ break
82
+ data = open(src, "rb").read()
83
+ cap = G._caption(data)
84
+ if not cap or G._PERSON_RE.search(cap): # no photos of people in the benchmark
85
+ continue
86
+ i = len(pairs)
87
+ Image.open(src).convert("RGB").save(real_dir / f"{i:03d}.png")
88
+ pairs.append({"idx": i, "caption": cap, "prompt": cap + G.STYLE_SUFFIX, "real_src": src})
89
+ return pairs
90
+
91
+
92
+ def generate(args, pairs: list, real_dir: Path, fake_dir: Path) -> list:
93
+ g = G.GENERATORS[args.generator]
94
+ if "recreate" not in g.modes:
95
+ sys.exit(f"{g.name} cannot create an image from text (modes: {g.modes})")
96
+ if not g.available():
97
+ sys.exit(f"{g.name} is not available (API key / local setup missing, see docs/BENCHMARKS.md)")
98
+ model_key = getattr(g.call, "model_key", None)
99
+ t0 = time.time()
100
+ if model_key: # local open-weight model: one batch, one model load
101
+ items = [{"prompt": p["prompt"], "out": str(fake_dir / f"{p['idx']:03d}.png"), "seed": p["idx"],
102
+ "size": f"{args.res}x{args.res}"} for p in pairs]
103
+ G.local_batch(model_key, items)
104
+ else: # hosted generator: one API call per image
105
+ for p in pairs:
106
+ out = fake_dir / f"{p['idx']:03d}.png"
107
+ if out.exists():
108
+ continue
109
+ try:
110
+ png = G.generate(args.generator, open(real_dir / f"{p['idx']:03d}.png", "rb").read(), p["prompt"], "recreate")
111
+ out.write_bytes(png)
112
+ log(f" [{p['idx']}] {p['caption']!r}")
113
+ except Exception as e: # blocked by a safety filter, rate limit, ...
114
+ log(f" [{p['idx']}] skipped: {type(e).__name__}: {e}")
115
+ kept = [p for p in pairs if (fake_dir / f"{p['idx']:03d}.png").is_file()]
116
+ for p in pairs: # keep real and fake balanced
117
+ if p not in kept and (real_dir / f"{p['idx']:03d}.png").exists():
118
+ (real_dir / f"{p['idx']:03d}.png").unlink()
119
+ log(f"[generate] {len(kept)}/{len(pairs)} fakes ready ({time.time() - t0:.0f}s)")
120
+ return kept
121
+
122
+
123
+ def score(args, real_dir: Path, fake_dir: Path, out: Path) -> list:
124
+ from sklearn.metrics import average_precision_score, roc_auc_score
125
+ from interface.backend.engine import get_engine
126
+ engine = get_engine()
127
+ reals = [Image.open(p).convert("RGB") for p in sorted(glob.glob(str(real_dir / "*.png")))]
128
+ fakes = [Image.open(p).convert("RGB") for p in sorted(glob.glob(str(fake_dir / "*.png")))]
129
+ log(f"[score] {len(reals)} real + {len(fakes)} fake")
130
+ y = np.array([0] * len(reals) + [1] * len(fakes))
131
+ keys = args.detectors.split(",") if args.detectors else None
132
+ rows = []
133
+ for spec in list_specs():
134
+ if spec.modality != "image" or (keys and spec.key not in keys):
135
+ continue
136
+ if not engine.is_available(spec):
137
+ log(f" {spec.key}: no checkpoint here, skipped")
138
+ continue
139
+ try:
140
+ t0 = time.time()
141
+ probs = np.array([engine.predict_image(spec, im)["fake_probability"] for im in reals + fakes], dtype="float64")
142
+ rows.append({
143
+ "detector": spec.key, "name": spec.name,
144
+ "auroc": round(float(roc_auc_score(y, probs)) * 100, 2),
145
+ "ap": round(float(average_precision_score(y, probs)) * 100, 2),
146
+ "acc": round(float(((probs >= 0.5).astype(int) == y).mean()) * 100, 2),
147
+ "fake_detect_rate": round(float((probs[len(reals):] >= 0.5).mean()) * 100, 2),
148
+ "real_false_pos": round(float((probs[: len(reals)] >= 0.5).mean()) * 100, 2),
149
+ "mean_p_fake_on_fakes": round(float(probs[len(reals):].mean()), 4),
150
+ "mean_p_fake_on_reals": round(float(probs[: len(reals)].mean()), 4)})
151
+ r = rows[-1]
152
+ log(f" {spec.key:12} AUROC={r['auroc']:6.2f} AP={r['ap']:6.2f} acc={r['acc']:6.2f} ({time.time() - t0:.0f}s)")
153
+ except Exception as e:
154
+ log(f" {spec.key}: ERROR {type(e).__name__}: {e}")
155
+ rows.sort(key=lambda r: r["auroc"], reverse=True)
156
+ json.dump(rows, open(out / "results.json", "w"), indent=2)
157
+ return rows
158
+
159
+
160
+ def main():
161
+ ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
162
+ ap.add_argument("--generator", required=True, help="key from interface/backend/generators.py, e.g. flux2_klein")
163
+ ap.add_argument("--label", help="name shown in the web page (default: the generator's name)")
164
+ ap.add_argument("--out", required=True, help="output directory, e.g. benchmark/generator_runs/flux2_klein_4b")
165
+ ap.add_argument("--reuse", help="manifest.json of an earlier run: reuse its real images + prompts (same content for every generator)")
166
+ ap.add_argument("--real-root", action="append", help="with --reuse: folder(s) to search for the reference run's real images by file "
167
+ "name (e.g. your GenImage and CNNDetection downloads), because the images themselves are not in the repo")
168
+ ap.add_argument("--real-glob", action="append", help="glob of real images to caption (repeatable); needed without --reuse")
169
+ ap.add_argument("--n", type=int, default=100, help="number of real/fake pairs")
170
+ ap.add_argument("--res", type=int, default=1024, help="output side in pixels for local generators")
171
+ ap.add_argument("--seed", type=int, default=0)
172
+ ap.add_argument("--detectors", help="comma-separated detector keys (default: every available image detector)")
173
+ ap.add_argument("--skip-generate", action="store_true", help="only (re)score the images already in --out")
174
+ args = ap.parse_args()
175
+
176
+ out = Path(args.out).resolve()
177
+ real_dir, fake_dir = out / "real", out / "fake"
178
+ real_dir.mkdir(parents=True, exist_ok=True); fake_dir.mkdir(parents=True, exist_ok=True)
179
+ g = G.GENERATORS[args.generator]
180
+ manifest_path = out / "manifest.json"
181
+ if manifest_path.exists(): # resume
182
+ pairs = json.load(open(manifest_path))["pairs"]
183
+ for p in pairs: # real images may have been cleaned up after a partial run
184
+ src_png = Path(args.reuse).parent / "real" / f"{p['idx']:03d}.png" if args.reuse else None
185
+ if not (real_dir / f"{p['idx']:03d}.png").exists() and src_png and src_png.exists():
186
+ shutil.copyfile(src_png, real_dir / f"{p['idx']:03d}.png")
187
+ else:
188
+ pairs = build_pairs(args, real_dir)
189
+ if not args.skip_generate:
190
+ pairs = generate(args, pairs, real_dir, fake_dir)
191
+ rows = score(args, real_dir, fake_dir, out)
192
+ label = args.label or g.name
193
+ manifest = {"label": label, "generator": args.generator, "n": len(pairs), "res": args.res,
194
+ "settings": f"{args.res}px · text-to-image from a caption", "created": time.strftime("%Y-%m-%d"),
195
+ "reuse_from": args.reuse or "", "pairs": pairs}
196
+ json.dump(manifest, open(manifest_path, "w"), indent=2)
197
+ md = [f"# Detectors vs {label}", "",
198
+ f"{len(pairs)} real images (people excluded) + {len(pairs)} images generated by {label} from a BLIP caption of each "
199
+ f"real image ({args.res}px). Ranked by AUROC; accuracy uses the 0.5 threshold.", "",
200
+ "| Rank | Detector | AUROC | AP | acc@0.5 | fake detect % | real FP % |", "|---|---|---|---|---|---|---|"]
201
+ md += [f"| {i} | {r['name']} | {r['auroc']} | {r['ap']} | {r['acc']} | {r['fake_detect_rate']} | {r['real_false_pos']} |"
202
+ for i, r in enumerate(rows, 1)]
203
+ (out / "RESULTS.md").write_text("\n".join(md) + "\n")
204
+ log("\n".join(md))
205
+
206
+
207
+ if __name__ == "__main__":
208
+ main()
benchmark/generator_runs/_test_qwen/RESULTS.md ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Detectors vs Qwen-Image-2.1
2
+
3
+ 3 real images (people excluded) + 3 images generated by Qwen-Image-2.1 from a BLIP caption of each real image (1024px). Ranked by AUROC; accuracy uses the 0.5 threshold.
4
+
5
+ | Rank | Detector | AUROC | AP | acc@0.5 | fake detect % | real FP % |
6
+ |---|---|---|---|---|---|---|
7
+ | 1 | SAFE | 100.0 | 100.0 | 83.33 | 66.67 | 0.0 |
8
+ | 2 | AIDE | 100.0 | 100.0 | 83.33 | 66.67 | 0.0 |
9
+ | 3 | SPAI | 100.0 | 100.0 | 100.0 | 100.0 | 0.0 |
10
+ | 4 | VIB-Net | 100.0 | 100.0 | 100.0 | 100.0 | 0.0 |
11
+ | 5 | CO-SPY | 100.0 | 100.0 | 83.33 | 66.67 | 0.0 |
12
+ | 6 | PGC | 100.0 | 100.0 | 66.67 | 33.33 | 0.0 |
13
+ | 7 | CuRe | 100.0 | 100.0 | 66.67 | 33.33 | 0.0 |
14
+ | 8 | NPR | 83.33 | 75.0 | 66.67 | 100.0 | 66.67 |
15
+ | 9 | FatFormer | 77.78 | 86.67 | 83.33 | 66.67 | 0.0 |
16
+ | 10 | CNNDetection (ResNet-50) | 72.22 | 83.33 | 50.0 | 0.0 | 0.0 |
17
+ | 11 | Adapter-tuned DINOv2 | 72.22 | 83.33 | 50.0 | 0.0 | 0.0 |
18
+ | 12 | UnivFD / CLIP | 44.44 | 55.56 | 50.0 | 0.0 | 0.0 |
19
+ | 13 | DINOv2 probe | 44.44 | 53.33 | 50.0 | 0.0 | 0.0 |
benchmark/generator_runs/_test_qwen/manifest.json ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "label": "Qwen-Image-2.1",
3
+ "generator": "qwen_image_2_1",
4
+ "n": 3,
5
+ "res": 1024,
6
+ "settings": "1024px \u00b7 text-to-image from a caption",
7
+ "created": "2026-10-04",
8
+ "reuse_from": "benchmark/generator_runs/reference/manifest.json",
9
+ "pairs": [
10
+ {
11
+ "idx": 0,
12
+ "caption": "sheep is white",
13
+ "prompt": "sheep is white, photorealistic, high detail",
14
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/003443_ILSVRC2012_val_00028605.JPEG"
15
+ },
16
+ {
17
+ "idx": 1,
18
+ "caption": "a bird sitting on a branch in a tree",
19
+ "prompt": "a bird sitting on a branch in a tree, photorealistic, high detail",
20
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/000582_ILSVRC2012_val_00004554.JPEG"
21
+ },
22
+ {
23
+ "idx": 2,
24
+ "caption": "a green grasshopper on a leaf",
25
+ "prompt": "a green grasshopper on a leaf, photorealistic, high detail",
26
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/002258_ILSVRC2012_val_00018535.JPEG"
27
+ }
28
+ ]
29
+ }
benchmark/generator_runs/_test_qwen/results.json ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "detector": "safe",
4
+ "name": "SAFE",
5
+ "auroc": 100.0,
6
+ "ap": 100.0,
7
+ "acc": 83.33,
8
+ "fake_detect_rate": 66.67,
9
+ "real_false_pos": 0.0,
10
+ "mean_p_fake_on_fakes": 0.5512,
11
+ "mean_p_fake_on_reals": 0.0758
12
+ },
13
+ {
14
+ "detector": "aide",
15
+ "name": "AIDE",
16
+ "auroc": 100.0,
17
+ "ap": 100.0,
18
+ "acc": 83.33,
19
+ "fake_detect_rate": 66.67,
20
+ "real_false_pos": 0.0,
21
+ "mean_p_fake_on_fakes": 0.623,
22
+ "mean_p_fake_on_reals": 0.0486
23
+ },
24
+ {
25
+ "detector": "spai",
26
+ "name": "SPAI",
27
+ "auroc": 100.0,
28
+ "ap": 100.0,
29
+ "acc": 100.0,
30
+ "fake_detect_rate": 100.0,
31
+ "real_false_pos": 0.0,
32
+ "mean_p_fake_on_fakes": 0.984,
33
+ "mean_p_fake_on_reals": 0.0026
34
+ },
35
+ {
36
+ "detector": "vib_net",
37
+ "name": "VIB-Net",
38
+ "auroc": 100.0,
39
+ "ap": 100.0,
40
+ "acc": 100.0,
41
+ "fake_detect_rate": 100.0,
42
+ "real_false_pos": 0.0,
43
+ "mean_p_fake_on_fakes": 0.9034,
44
+ "mean_p_fake_on_reals": 0.0684
45
+ },
46
+ {
47
+ "detector": "co_spy",
48
+ "name": "CO-SPY",
49
+ "auroc": 100.0,
50
+ "ap": 100.0,
51
+ "acc": 83.33,
52
+ "fake_detect_rate": 66.67,
53
+ "real_false_pos": 0.0,
54
+ "mean_p_fake_on_fakes": 0.7782,
55
+ "mean_p_fake_on_reals": 0.0484
56
+ },
57
+ {
58
+ "detector": "pgc",
59
+ "name": "PGC",
60
+ "auroc": 100.0,
61
+ "ap": 100.0,
62
+ "acc": 66.67,
63
+ "fake_detect_rate": 33.33,
64
+ "real_false_pos": 0.0,
65
+ "mean_p_fake_on_fakes": 0.4674,
66
+ "mean_p_fake_on_reals": 0.2349
67
+ },
68
+ {
69
+ "detector": "cure",
70
+ "name": "CuRe",
71
+ "auroc": 100.0,
72
+ "ap": 100.0,
73
+ "acc": 66.67,
74
+ "fake_detect_rate": 33.33,
75
+ "real_false_pos": 0.0,
76
+ "mean_p_fake_on_fakes": 0.5297,
77
+ "mean_p_fake_on_reals": 0.0
78
+ },
79
+ {
80
+ "detector": "npr",
81
+ "name": "NPR",
82
+ "auroc": 83.33,
83
+ "ap": 75.0,
84
+ "acc": 66.67,
85
+ "fake_detect_rate": 100.0,
86
+ "real_false_pos": 66.67,
87
+ "mean_p_fake_on_fakes": 1.0,
88
+ "mean_p_fake_on_reals": 0.6673
89
+ },
90
+ {
91
+ "detector": "fat_former",
92
+ "name": "FatFormer",
93
+ "auroc": 77.78,
94
+ "ap": 86.67,
95
+ "acc": 83.33,
96
+ "fake_detect_rate": 66.67,
97
+ "real_false_pos": 0.0,
98
+ "mean_p_fake_on_fakes": 0.6629,
99
+ "mean_p_fake_on_reals": 0.0
100
+ },
101
+ {
102
+ "detector": "cnn",
103
+ "name": "CNNDetection (ResNet-50)",
104
+ "auroc": 72.22,
105
+ "ap": 83.33,
106
+ "acc": 50.0,
107
+ "fake_detect_rate": 0.0,
108
+ "real_false_pos": 0.0,
109
+ "mean_p_fake_on_fakes": 0.0003,
110
+ "mean_p_fake_on_reals": 0.0
111
+ },
112
+ {
113
+ "detector": "adapted_dino",
114
+ "name": "Adapter-tuned DINOv2",
115
+ "auroc": 72.22,
116
+ "ap": 83.33,
117
+ "acc": 50.0,
118
+ "fake_detect_rate": 0.0,
119
+ "real_false_pos": 0.0,
120
+ "mean_p_fake_on_fakes": 0.0,
121
+ "mean_p_fake_on_reals": 0.0
122
+ },
123
+ {
124
+ "detector": "clip",
125
+ "name": "UnivFD / CLIP",
126
+ "auroc": 44.44,
127
+ "ap": 55.56,
128
+ "acc": 50.0,
129
+ "fake_detect_rate": 0.0,
130
+ "real_false_pos": 0.0,
131
+ "mean_p_fake_on_fakes": 0.1024,
132
+ "mean_p_fake_on_reals": 0.1369
133
+ },
134
+ {
135
+ "detector": "dinov2",
136
+ "name": "DINOv2 probe",
137
+ "auroc": 44.44,
138
+ "ap": 53.33,
139
+ "acc": 50.0,
140
+ "fake_detect_rate": 0.0,
141
+ "real_false_pos": 0.0,
142
+ "mean_p_fake_on_fakes": 0.0132,
143
+ "mean_p_fake_on_reals": 0.0194
144
+ }
145
+ ]
benchmark/generator_runs/flux2_klein_4b/RESULTS.md ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Detectors vs FLUX.2 [klein] 4B
2
+
3
+ 100 real images (people excluded) + 100 images generated by FLUX.2 [klein] 4B from a BLIP caption of each real image (1024px). Ranked by AUROC; accuracy uses the 0.5 threshold.
4
+
5
+ | Rank | Detector | AUROC | AP | acc@0.5 | fake detect % | real FP % |
6
+ |---|---|---|---|---|---|---|
7
+ | 1 | VIB-Net | 99.91 | 99.91 | 92.0 | 100.0 | 16.0 |
8
+ | 2 | CO-SPY | 99.31 | 99.27 | 98.0 | 99.0 | 3.0 |
9
+ | 3 | CuRe | 98.6 | 98.91 | 92.5 | 85.0 | 0.0 |
10
+ | 4 | PGC | 97.33 | 96.57 | 53.5 | 7.0 | 0.0 |
11
+ | 5 | AIDE | 94.08 | 90.5 | 81.0 | 69.0 | 7.0 |
12
+ | 6 | SAFE | 92.04 | 82.32 | 87.0 | 84.0 | 10.0 |
13
+ | 7 | NPR | 89.18 | 82.53 | 78.0 | 99.0 | 43.0 |
14
+ | 8 | SPAI | 78.08 | 75.23 | 65.0 | 38.0 | 8.0 |
15
+ | 9 | DINOv3 probe | 51.06 | 49.11 | 47.5 | 8.0 | 13.0 |
16
+ | 10 | FatFormer | 46.01 | 48.06 | 50.5 | 5.0 | 4.0 |
17
+ | 11 | Adapter-tuned DINOv2 | 42.62 | 47.55 | 50.0 | 0.0 | 0.0 |
18
+ | 12 | CNNDetection (ResNet-50) | 40.84 | 45.42 | 50.5 | 2.0 | 1.0 |
19
+ | 13 | DINOv2 probe | 38.52 | 43.2 | 47.0 | 7.0 | 13.0 |
20
+ | 14 | UnivFD / CLIP | 26.8 | 36.87 | 47.0 | 1.0 | 7.0 |
benchmark/generator_runs/flux2_klein_4b/manifest.json ADDED
@@ -0,0 +1,611 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "label": "FLUX.2 [klein] 4B",
3
+ "generator": "flux2_klein",
4
+ "n": 100,
5
+ "res": 1024,
6
+ "settings": "1024px \u00b7 text-to-image from a caption",
7
+ "created": "2026-10-04",
8
+ "reuse_from": "benchmark/generator_runs/reference/manifest.json",
9
+ "pairs": [
10
+ {
11
+ "idx": 0,
12
+ "caption": "sheep is white",
13
+ "prompt": "sheep is white, photorealistic, high detail",
14
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/003443_ILSVRC2012_val_00028605.JPEG"
15
+ },
16
+ {
17
+ "idx": 1,
18
+ "caption": "a bird sitting on a branch in a tree",
19
+ "prompt": "a bird sitting on a branch in a tree, photorealistic, high detail",
20
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/000582_ILSVRC2012_val_00004554.JPEG"
21
+ },
22
+ {
23
+ "idx": 2,
24
+ "caption": "a green grasshopper on a leaf",
25
+ "prompt": "a green grasshopper on a leaf, photorealistic, high detail",
26
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/002258_ILSVRC2012_val_00018535.JPEG"
27
+ },
28
+ {
29
+ "idx": 3,
30
+ "caption": "the bell is black",
31
+ "prompt": "the bell is black, photorealistic, high detail",
32
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00028778.JPEG"
33
+ },
34
+ {
35
+ "idx": 4,
36
+ "caption": "a car driving down a city street in the middle of the day",
37
+ "prompt": "a car driving down a city street in the middle of the day, photorealistic, high detail",
38
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/crn/0_real/00103410.png"
39
+ },
40
+ {
41
+ "idx": 5,
42
+ "caption": "a dog is standing in the grass",
43
+ "prompt": "a dog is standing in the grass, photorealistic, high detail",
44
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/003845_ILSVRC2012_val_00031963.JPEG"
45
+ },
46
+ {
47
+ "idx": 6,
48
+ "caption": "a small kitten walking across a rocky beach",
49
+ "prompt": "a small kitten walking across a rocky beach, photorealistic, high detail",
50
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/000784_ILSVRC2012_val_00006407.JPEG"
51
+ },
52
+ {
53
+ "idx": 7,
54
+ "caption": "a mountain covered in snow",
55
+ "prompt": "a mountain covered in snow, photorealistic, high detail",
56
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/000414_ILSVRC2012_val_00003305.JPEG"
57
+ },
58
+ {
59
+ "idx": 8,
60
+ "caption": "a sailer sailing in the ocean near a lighthouse",
61
+ "prompt": "a sailer sailing in the ocean near a lighthouse, photorealistic, high detail",
62
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00040977.JPEG"
63
+ },
64
+ {
65
+ "idx": 9,
66
+ "caption": "a bowl of masoor",
67
+ "prompt": "a bowl of masoor, photorealistic, high detail",
68
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv5/0_real/001588_ILSVRC2012_val_00009675.JPEG"
69
+ },
70
+ {
71
+ "idx": 10,
72
+ "caption": "a green bird house",
73
+ "prompt": "a green bird house, photorealistic, high detail",
74
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/003296_ILSVRC2012_val_00026872.JPEG"
75
+ },
76
+ {
77
+ "idx": 11,
78
+ "caption": "a body of water",
79
+ "prompt": "a body of water, photorealistic, high detail",
80
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/001100_ILSVRC2012_val_00008791.JPEG"
81
+ },
82
+ {
83
+ "idx": 12,
84
+ "caption": "a dog in a pool",
85
+ "prompt": "a dog in a pool, photorealistic, high detail",
86
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv5/0_real/003956_ILSVRC2012_val_00024961.JPEG"
87
+ },
88
+ {
89
+ "idx": 13,
90
+ "caption": "two tools, one with a wren and the other with a wren",
91
+ "prompt": "two tools, one with a wren and the other with a wren, photorealistic, high detail",
92
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/002410_ILSVRC2012_val_00020055.JPEG"
93
+ },
94
+ {
95
+ "idx": 14,
96
+ "caption": "a black leather folder with a red trim",
97
+ "prompt": "a black leather folder with a red trim, photorealistic, high detail",
98
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/biggan/0_real/446--n02840245_7225.png"
99
+ },
100
+ {
101
+ "idx": 15,
102
+ "caption": "a small bird sitting on a wooden surface",
103
+ "prompt": "a small bird sitting on a wooden surface, photorealistic, high detail",
104
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/000105_ILSVRC2012_val_00000837.JPEG"
105
+ },
106
+ {
107
+ "idx": 16,
108
+ "caption": "mouse mouse on mouse mouse mouse",
109
+ "prompt": "mouse mouse on mouse mouse mouse, photorealistic, high detail",
110
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/000058_ILSVRC2012_val_00000430.JPEG"
111
+ },
112
+ {
113
+ "idx": 17,
114
+ "caption": "a small metal object on a wooden table",
115
+ "prompt": "a small metal object on a wooden table, photorealistic, high detail",
116
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/003751_ILSVRC2012_val_00030855.JPEG"
117
+ },
118
+ {
119
+ "idx": 18,
120
+ "caption": "an hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour",
121
+ "prompt": "an hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour, photorealistic, high detail",
122
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/002367_ILSVRC2012_val_00019475.JPEG"
123
+ },
124
+ {
125
+ "idx": 19,
126
+ "caption": "a white rabbit in a cage",
127
+ "prompt": "a white rabbit in a cage, photorealistic, high detail",
128
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/001872_ILSVRC2012_val_00015301.JPEG"
129
+ },
130
+ {
131
+ "idx": 20,
132
+ "caption": "a grass bug on a green leaf",
133
+ "prompt": "a grass bug on a green leaf, photorealistic, high detail",
134
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00032265.JPEG"
135
+ },
136
+ {
137
+ "idx": 21,
138
+ "caption": "a field of grass",
139
+ "prompt": "a field of grass, photorealistic, high detail",
140
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/001114_ILSVRC2012_val_00009176.JPEG"
141
+ },
142
+ {
143
+ "idx": 22,
144
+ "caption": "a black padlock with a key",
145
+ "prompt": "a black padlock with a key, photorealistic, high detail",
146
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/biggan/0_real/695--n03874599_4507.png"
147
+ },
148
+ {
149
+ "idx": 23,
150
+ "caption": "a group of balls",
151
+ "prompt": "a group of balls, photorealistic, high detail",
152
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/002837_ILSVRC2012_val_00024198.JPEG"
153
+ },
154
+ {
155
+ "idx": 24,
156
+ "caption": "three dogs standing on a hill",
157
+ "prompt": "three dogs standing on a hill, photorealistic, high detail",
158
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00022571.JPEG"
159
+ },
160
+ {
161
+ "idx": 25,
162
+ "caption": "a dog standing in a field",
163
+ "prompt": "a dog standing in a field, photorealistic, high detail",
164
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/004562_ILSVRC2012_val_00038455.JPEG"
165
+ },
166
+ {
167
+ "idx": 26,
168
+ "caption": "a pink toilet",
169
+ "prompt": "a pink toilet, photorealistic, high detail",
170
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/005007_ILSVRC2012_val_00042247.JPEG"
171
+ },
172
+ {
173
+ "idx": 27,
174
+ "caption": "the sky is cloudy",
175
+ "prompt": "the sky is cloudy, photorealistic, high detail",
176
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/003771_ILSVRC2012_val_00031161.JPEG"
177
+ },
178
+ {
179
+ "idx": 28,
180
+ "caption": "a bird is standing on the ground",
181
+ "prompt": "a bird is standing on the ground, photorealistic, high detail",
182
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/004662_ILSVRC2012_val_00039216.JPEG"
183
+ },
184
+ {
185
+ "idx": 29,
186
+ "caption": "a leopard sitting on a tree branch",
187
+ "prompt": "a leopard sitting on a tree branch, photorealistic, high detail",
188
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv5/0_real/006884_ILSVRC2012_val_00043117.JPEG"
189
+ },
190
+ {
191
+ "idx": 30,
192
+ "caption": "an old barn with a broken roof",
193
+ "prompt": "an old barn with a broken roof, photorealistic, high detail",
194
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/004995_ILSVRC2012_val_00041650.JPEG"
195
+ },
196
+ {
197
+ "idx": 31,
198
+ "caption": "a slug crawling on a concrete surface",
199
+ "prompt": "a slug crawling on a concrete surface, photorealistic, high detail",
200
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/000580_ILSVRC2012_val_00004691.JPEG"
201
+ },
202
+ {
203
+ "idx": 32,
204
+ "caption": "the three bottles of the serums are shown in the image",
205
+ "prompt": "the three bottles of the serums are shown in the image, photorealistic, high detail",
206
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/biggan/0_real/631--n03690938_23212.png"
207
+ },
208
+ {
209
+ "idx": 33,
210
+ "caption": "a bear cub",
211
+ "prompt": "a bear cub, photorealistic, high detail",
212
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/005149_ILSVRC2012_val_00043353.JPEG"
213
+ },
214
+ {
215
+ "idx": 34,
216
+ "caption": "a street with a yellow line painted on the road",
217
+ "prompt": "a street with a yellow line painted on the road, photorealistic, high detail",
218
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/crn/0_real/00102007.png"
219
+ },
220
+ {
221
+ "idx": 35,
222
+ "caption": "a lion fish swimming in the water",
223
+ "prompt": "a lion fish swimming in the water, photorealistic, high detail",
224
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/000092_ILSVRC2012_val_00000699.JPEG"
225
+ },
226
+ {
227
+ "idx": 36,
228
+ "caption": "a plastic container with food",
229
+ "prompt": "a plastic container with food, photorealistic, high detail",
230
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/gaugan/0_real/000000113589.png"
231
+ },
232
+ {
233
+ "idx": 37,
234
+ "caption": "a car is driving down a street in a city",
235
+ "prompt": "a car is driving down a street in a city, photorealistic, high detail",
236
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/crn/0_real/00103003.png"
237
+ },
238
+ {
239
+ "idx": 38,
240
+ "caption": "a wooden desk",
241
+ "prompt": "a wooden desk, photorealistic, high detail",
242
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/004470_ILSVRC2012_val_00037573.JPEG"
243
+ },
244
+ {
245
+ "idx": 39,
246
+ "caption": "a bird standing in the water",
247
+ "prompt": "a bird standing in the water, photorealistic, high detail",
248
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/001503_ILSVRC2012_val_00012618.JPEG"
249
+ },
250
+ {
251
+ "idx": 40,
252
+ "caption": "two parking meters",
253
+ "prompt": "two parking meters, photorealistic, high detail",
254
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/000019_ILSVRC2012_val_00000201.JPEG"
255
+ },
256
+ {
257
+ "idx": 41,
258
+ "caption": "a butterfly on a yellow flower",
259
+ "prompt": "a butterfly on a yellow flower, photorealistic, high detail",
260
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00006608.JPEG"
261
+ },
262
+ {
263
+ "idx": 42,
264
+ "caption": "a green snake on a rock",
265
+ "prompt": "a green snake on a rock, photorealistic, high detail",
266
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/000933_ILSVRC2012_val_00007877.JPEG"
267
+ },
268
+ {
269
+ "idx": 43,
270
+ "caption": "a green snake in a tree",
271
+ "prompt": "a green snake in a tree, photorealistic, high detail",
272
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00042162.JPEG"
273
+ },
274
+ {
275
+ "idx": 44,
276
+ "caption": "purple and gold beaded bracelet",
277
+ "prompt": "purple and gold beaded bracelet, photorealistic, high detail",
278
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/002068_ILSVRC2012_val_00017972.JPEG"
279
+ },
280
+ {
281
+ "idx": 45,
282
+ "caption": "a dog standing in the shade",
283
+ "prompt": "a dog standing in the shade, photorealistic, high detail",
284
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/005084_ILSVRC2012_val_00042318.JPEG"
285
+ },
286
+ {
287
+ "idx": 46,
288
+ "caption": "a cliff with a cliff face",
289
+ "prompt": "a cliff with a cliff face, photorealistic, high detail",
290
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00031528.JPEG"
291
+ },
292
+ {
293
+ "idx": 47,
294
+ "caption": "a dog laying in the grass",
295
+ "prompt": "a dog laying in the grass, photorealistic, high detail",
296
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv5/0_real/004359_ILSVRC2012_val_00027268.JPEG"
297
+ },
298
+ {
299
+ "idx": 48,
300
+ "caption": "a small dog sitting on a bench",
301
+ "prompt": "a small dog sitting on a bench, photorealistic, high detail",
302
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/005226_ILSVRC2012_val_00043233.JPEG"
303
+ },
304
+ {
305
+ "idx": 49,
306
+ "caption": "a dog standing on a hill",
307
+ "prompt": "a dog standing on a hill, photorealistic, high detail",
308
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/001612_ILSVRC2012_val_00013323.JPEG"
309
+ },
310
+ {
311
+ "idx": 50,
312
+ "caption": "a white plate with food on it",
313
+ "prompt": "a white plate with food on it, photorealistic, high detail",
314
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/001277_ILSVRC2012_val_00010872.JPEG"
315
+ },
316
+ {
317
+ "idx": 51,
318
+ "caption": "a wooden chair",
319
+ "prompt": "a wooden chair, photorealistic, high detail",
320
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/001537_ILSVRC2012_val_00012771.JPEG"
321
+ },
322
+ {
323
+ "idx": 52,
324
+ "caption": "a large church with a stained glass window",
325
+ "prompt": "a large church with a stained glass window, photorealistic, high detail",
326
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/003670_ILSVRC2012_val_00030337.JPEG"
327
+ },
328
+ {
329
+ "idx": 53,
330
+ "caption": "a dog running in the grass",
331
+ "prompt": "a dog running in the grass, photorealistic, high detail",
332
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/004349_ILSVRC2012_val_00035935.JPEG"
333
+ },
334
+ {
335
+ "idx": 54,
336
+ "caption": "a hand holding a hot dog with lete and lete",
337
+ "prompt": "a hand holding a hot dog with lete and lete, photorealistic, high detail",
338
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/gaugan/0_real/000000118367.png"
339
+ },
340
+ {
341
+ "idx": 55,
342
+ "caption": "a large satellite dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish",
343
+ "prompt": "a large satellite dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish, photorealistic, high detail",
344
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/004018_ILSVRC2012_val_00033065.JPEG"
345
+ },
346
+ {
347
+ "idx": 56,
348
+ "caption": "a brown dog with a long tongue",
349
+ "prompt": "a brown dog with a long tongue, photorealistic, high detail",
350
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/002541_ILSVRC2012_val_00021171.JPEG"
351
+ },
352
+ {
353
+ "idx": 57,
354
+ "caption": "a wooden bench",
355
+ "prompt": "a wooden bench, photorealistic, high detail",
356
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/002922_ILSVRC2012_val_00024245.JPEG"
357
+ },
358
+ {
359
+ "idx": 58,
360
+ "caption": "a white dog toy",
361
+ "prompt": "a white dog toy, photorealistic, high detail",
362
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/001637_ILSVRC2012_val_00013696.JPEG"
363
+ },
364
+ {
365
+ "idx": 59,
366
+ "caption": "a lake with trees and water in the background",
367
+ "prompt": "a lake with trees and water in the background, photorealistic, high detail",
368
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/003749_ILSVRC2012_val_00031159.JPEG"
369
+ },
370
+ {
371
+ "idx": 60,
372
+ "caption": "a crab crawling on the ground",
373
+ "prompt": "a crab crawling on the ground, photorealistic, high detail",
374
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/002813_ILSVRC2012_val_00023550.JPEG"
375
+ },
376
+ {
377
+ "idx": 61,
378
+ "caption": "a city street with a lot of buildings",
379
+ "prompt": "a city street with a lot of buildings, photorealistic, high detail",
380
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/imle/0_real/00103670.png"
381
+ },
382
+ {
383
+ "idx": 62,
384
+ "caption": "old wooden barrels stock photo, old wooden barrels by andy",
385
+ "prompt": "old wooden barrels stock photo, old wooden barrels by andy, photorealistic, high detail",
386
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/000703_ILSVRC2012_val_00005570.JPEG"
387
+ },
388
+ {
389
+ "idx": 63,
390
+ "caption": "a green beetle with red and green stripes",
391
+ "prompt": "a green beetle with red and green stripes, photorealistic, high detail",
392
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv5/0_real/006233_ILSVRC2012_val_00039157.JPEG"
393
+ },
394
+ {
395
+ "idx": 64,
396
+ "caption": "a plate of food",
397
+ "prompt": "a plate of food, photorealistic, high detail",
398
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/002016_ILSVRC2012_val_00016730.JPEG"
399
+ },
400
+ {
401
+ "idx": 65,
402
+ "caption": "a fish in a tank",
403
+ "prompt": "a fish in a tank, photorealistic, high detail",
404
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/001971_ILSVRC2012_val_00016470.JPEG"
405
+ },
406
+ {
407
+ "idx": 66,
408
+ "caption": "a street with a lot of luggage and palm trees",
409
+ "prompt": "a street with a lot of luggage and palm trees, photorealistic, high detail",
410
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/crn/0_real/00105512.png"
411
+ },
412
+ {
413
+ "idx": 67,
414
+ "caption": "a tree in the middle of a city",
415
+ "prompt": "a tree in the middle of a city, photorealistic, high detail",
416
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/imle/0_real/00100948.png"
417
+ },
418
+ {
419
+ "idx": 68,
420
+ "caption": "a kitchen with a large white island and a large window",
421
+ "prompt": "a kitchen with a large white island and a large window, photorealistic, high detail",
422
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/gaugan/0_real/000000458768.png"
423
+ },
424
+ {
425
+ "idx": 69,
426
+ "caption": "a small brown and black dog standing on a white surface",
427
+ "prompt": "a small brown and black dog standing on a white surface, photorealistic, high detail",
428
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/003964_ILSVRC2012_val_00033278.JPEG"
429
+ },
430
+ {
431
+ "idx": 70,
432
+ "caption": "a train on the tracks",
433
+ "prompt": "a train on the tracks, photorealistic, high detail",
434
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/005265_ILSVRC2012_val_00043551.JPEG"
435
+ },
436
+ {
437
+ "idx": 71,
438
+ "caption": "a large circular window",
439
+ "prompt": "a large circular window, photorealistic, high detail",
440
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/003867_ILSVRC2012_val_00032479.JPEG"
441
+ },
442
+ {
443
+ "idx": 72,
444
+ "caption": "a machine in a factory",
445
+ "prompt": "a machine in a factory, photorealistic, high detail",
446
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/004837_ILSVRC2012_val_00039836.JPEG"
447
+ },
448
+ {
449
+ "idx": 73,
450
+ "caption": "a red boat docked in a harbor",
451
+ "prompt": "a red boat docked in a harbor, photorealistic, high detail",
452
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/001452_ILSVRC2012_val_00012691.JPEG"
453
+ },
454
+ {
455
+ "idx": 74,
456
+ "caption": "a bird perched on a branch",
457
+ "prompt": "a bird perched on a branch, photorealistic, high detail",
458
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv5/0_real/004217_ILSVRC2012_val_00026362.JPEG"
459
+ },
460
+ {
461
+ "idx": 75,
462
+ "caption": "a large gray elephant",
463
+ "prompt": "a large gray elephant, photorealistic, high detail",
464
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/001980_ILSVRC2012_val_00016437.JPEG"
465
+ },
466
+ {
467
+ "idx": 76,
468
+ "caption": "a street with a star painted on the sidewalk",
469
+ "prompt": "a street with a star painted on the sidewalk, photorealistic, high detail",
470
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/imle/0_real/00101546.png"
471
+ },
472
+ {
473
+ "idx": 77,
474
+ "caption": "a fish in a tank with a fish inside",
475
+ "prompt": "a fish in a tank with a fish inside, photorealistic, high detail",
476
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/003951_ILSVRC2012_val_00033320.JPEG"
477
+ },
478
+ {
479
+ "idx": 78,
480
+ "caption": "a pot of soup",
481
+ "prompt": "a pot of soup, photorealistic, high detail",
482
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/002526_ILSVRC2012_val_00021615.JPEG"
483
+ },
484
+ {
485
+ "idx": 79,
486
+ "caption": "a bunch of bubbles",
487
+ "prompt": "a bunch of bubbles, photorealistic, high detail",
488
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/005966_ILSVRC2012_val_00049716.JPEG"
489
+ },
490
+ {
491
+ "idx": 80,
492
+ "caption": "a vase on display",
493
+ "prompt": "a vase on display, photorealistic, high detail",
494
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/005439_ILSVRC2012_val_00045714.JPEG"
495
+ },
496
+ {
497
+ "idx": 81,
498
+ "caption": "a toilet with a toilet seat and a toilet roll",
499
+ "prompt": "a toilet with a toilet seat and a toilet roll, photorealistic, high detail",
500
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/003325_ILSVRC2012_val_00028223.JPEG"
501
+ },
502
+ {
503
+ "idx": 82,
504
+ "caption": "a piece of food",
505
+ "prompt": "a piece of food, photorealistic, high detail",
506
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/001630_ILSVRC2012_val_00013254.JPEG"
507
+ },
508
+ {
509
+ "idx": 83,
510
+ "caption": "a car is parked in a street with a bus in the background",
511
+ "prompt": "a car is parked in a street with a bus in the background, photorealistic, high detail",
512
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/crn/0_real/00104005.png"
513
+ },
514
+ {
515
+ "idx": 84,
516
+ "caption": "a white car driving down a street next to a building",
517
+ "prompt": "a white car driving down a street next to a building, photorealistic, high detail",
518
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/imle/0_real/00105681.png"
519
+ },
520
+ {
521
+ "idx": 85,
522
+ "caption": "a small canal in venice, italy",
523
+ "prompt": "a small canal in venice, italy, photorealistic, high detail",
524
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/004284_ILSVRC2012_val_00035514.JPEG"
525
+ },
526
+ {
527
+ "idx": 86,
528
+ "caption": "a black velvet jacket",
529
+ "prompt": "a black velvet jacket, photorealistic, high detail",
530
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/003062_ILSVRC2012_val_00025342.JPEG"
531
+ },
532
+ {
533
+ "idx": 87,
534
+ "caption": "a bear is sitting in a tree branch",
535
+ "prompt": "a bear is sitting in a tree branch, photorealistic, high detail",
536
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/004938_ILSVRC2012_val_00041120.JPEG"
537
+ },
538
+ {
539
+ "idx": 88,
540
+ "caption": "a goat standing in the woods",
541
+ "prompt": "a goat standing in the woods, photorealistic, high detail",
542
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/000197_ILSVRC2012_val_00001705.JPEG"
543
+ },
544
+ {
545
+ "idx": 89,
546
+ "caption": "a military vehicle",
547
+ "prompt": "a military vehicle, photorealistic, high detail",
548
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/004633_ILSVRC2012_val_00039017.JPEG"
549
+ },
550
+ {
551
+ "idx": 90,
552
+ "caption": "a cup with a bunch of pencils in it",
553
+ "prompt": "a cup with a bunch of pencils in it, photorealistic, high detail",
554
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/002918_ILSVRC2012_val_00024434.JPEG"
555
+ },
556
+ {
557
+ "idx": 91,
558
+ "caption": "a jaguar in the water",
559
+ "prompt": "a jaguar in the water, photorealistic, high detail",
560
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/002525_ILSVRC2012_val_00021064.JPEG"
561
+ },
562
+ {
563
+ "idx": 92,
564
+ "caption": "a flower made out of felt and felt",
565
+ "prompt": "a flower made out of felt and felt, photorealistic, high detail",
566
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/003858_ILSVRC2012_val_00031978.JPEG"
567
+ },
568
+ {
569
+ "idx": 93,
570
+ "caption": "a dog with a pink shirt on",
571
+ "prompt": "a dog with a pink shirt on, photorealistic, high detail",
572
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/001164_ILSVRC2012_val_00009888.JPEG"
573
+ },
574
+ {
575
+ "idx": 94,
576
+ "caption": "a close up of a bug on a rock",
577
+ "prompt": "a close up of a bug on a rock, photorealistic, high detail",
578
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/004231_ILSVRC2012_val_00035409.JPEG"
579
+ },
580
+ {
581
+ "idx": 95,
582
+ "caption": "a close up of a bird with a yellow eye",
583
+ "prompt": "a close up of a bird with a yellow eye, photorealistic, high detail",
584
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/000274_ILSVRC2012_val_00002228.JPEG"
585
+ },
586
+ {
587
+ "idx": 96,
588
+ "caption": "a hyen walking down a dirt road",
589
+ "prompt": "a hyen walking down a dirt road, photorealistic, high detail",
590
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/002696_ILSVRC2012_val_00023004.JPEG"
591
+ },
592
+ {
593
+ "idx": 97,
594
+ "caption": "a col of pictures of food including vegetables and vegetables",
595
+ "prompt": "a col of pictures of food including vegetables and vegetables, photorealistic, high detail",
596
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/005131_ILSVRC2012_val_00042927.JPEG"
597
+ },
598
+ {
599
+ "idx": 98,
600
+ "caption": "a brown barn",
601
+ "prompt": "a brown barn, photorealistic, high detail",
602
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00014180.JPEG"
603
+ },
604
+ {
605
+ "idx": 99,
606
+ "caption": "a small black and white dog sitting on the ground",
607
+ "prompt": "a small black and white dog sitting on the ground, photorealistic, high detail",
608
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/004154_ILSVRC2012_val_00034951.JPEG"
609
+ }
610
+ ]
611
+ }
benchmark/generator_runs/flux2_klein_4b/results.json ADDED
@@ -0,0 +1,156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "detector": "vib_net",
4
+ "name": "VIB-Net",
5
+ "auroc": 99.91,
6
+ "ap": 99.91,
7
+ "acc": 92.0,
8
+ "fake_detect_rate": 100.0,
9
+ "real_false_pos": 16.0,
10
+ "mean_p_fake_on_fakes": 0.9752,
11
+ "mean_p_fake_on_reals": 0.2301
12
+ },
13
+ {
14
+ "detector": "co_spy",
15
+ "name": "CO-SPY",
16
+ "auroc": 99.31,
17
+ "ap": 99.27,
18
+ "acc": 98.0,
19
+ "fake_detect_rate": 99.0,
20
+ "real_false_pos": 3.0,
21
+ "mean_p_fake_on_fakes": 0.847,
22
+ "mean_p_fake_on_reals": 0.116
23
+ },
24
+ {
25
+ "detector": "cure",
26
+ "name": "CuRe",
27
+ "auroc": 98.6,
28
+ "ap": 98.91,
29
+ "acc": 92.5,
30
+ "fake_detect_rate": 85.0,
31
+ "real_false_pos": 0.0,
32
+ "mean_p_fake_on_fakes": 0.8466,
33
+ "mean_p_fake_on_reals": 0.0129
34
+ },
35
+ {
36
+ "detector": "pgc",
37
+ "name": "PGC",
38
+ "auroc": 97.33,
39
+ "ap": 96.57,
40
+ "acc": 53.5,
41
+ "fake_detect_rate": 7.0,
42
+ "real_false_pos": 0.0,
43
+ "mean_p_fake_on_fakes": 0.438,
44
+ "mean_p_fake_on_reals": 0.2672
45
+ },
46
+ {
47
+ "detector": "aide",
48
+ "name": "AIDE",
49
+ "auroc": 94.08,
50
+ "ap": 90.5,
51
+ "acc": 81.0,
52
+ "fake_detect_rate": 69.0,
53
+ "real_false_pos": 7.0,
54
+ "mean_p_fake_on_fakes": 0.6593,
55
+ "mean_p_fake_on_reals": 0.1102
56
+ },
57
+ {
58
+ "detector": "safe",
59
+ "name": "SAFE",
60
+ "auroc": 92.04,
61
+ "ap": 82.32,
62
+ "acc": 87.0,
63
+ "fake_detect_rate": 84.0,
64
+ "real_false_pos": 10.0,
65
+ "mean_p_fake_on_fakes": 0.7562,
66
+ "mean_p_fake_on_reals": 0.1425
67
+ },
68
+ {
69
+ "detector": "npr",
70
+ "name": "NPR",
71
+ "auroc": 89.18,
72
+ "ap": 82.53,
73
+ "acc": 78.0,
74
+ "fake_detect_rate": 99.0,
75
+ "real_false_pos": 43.0,
76
+ "mean_p_fake_on_fakes": 0.99,
77
+ "mean_p_fake_on_reals": 0.4365
78
+ },
79
+ {
80
+ "detector": "spai",
81
+ "name": "SPAI",
82
+ "auroc": 78.08,
83
+ "ap": 75.23,
84
+ "acc": 65.0,
85
+ "fake_detect_rate": 38.0,
86
+ "real_false_pos": 8.0,
87
+ "mean_p_fake_on_fakes": 0.368,
88
+ "mean_p_fake_on_reals": 0.0778
89
+ },
90
+ {
91
+ "detector": "dinov3",
92
+ "name": "DINOv3 probe",
93
+ "auroc": 51.06,
94
+ "ap": 49.11,
95
+ "acc": 47.5,
96
+ "fake_detect_rate": 8.0,
97
+ "real_false_pos": 13.0,
98
+ "mean_p_fake_on_fakes": 0.2746,
99
+ "mean_p_fake_on_reals": 0.2792
100
+ },
101
+ {
102
+ "detector": "fat_former",
103
+ "name": "FatFormer",
104
+ "auroc": 46.01,
105
+ "ap": 48.06,
106
+ "acc": 50.5,
107
+ "fake_detect_rate": 5.0,
108
+ "real_false_pos": 4.0,
109
+ "mean_p_fake_on_fakes": 0.0523,
110
+ "mean_p_fake_on_reals": 0.0412
111
+ },
112
+ {
113
+ "detector": "adapted_dino",
114
+ "name": "Adapter-tuned DINOv2",
115
+ "auroc": 42.62,
116
+ "ap": 47.55,
117
+ "acc": 50.0,
118
+ "fake_detect_rate": 0.0,
119
+ "real_false_pos": 0.0,
120
+ "mean_p_fake_on_fakes": 0.0001,
121
+ "mean_p_fake_on_reals": 0.0
122
+ },
123
+ {
124
+ "detector": "cnn",
125
+ "name": "CNNDetection (ResNet-50)",
126
+ "auroc": 40.84,
127
+ "ap": 45.42,
128
+ "acc": 50.5,
129
+ "fake_detect_rate": 2.0,
130
+ "real_false_pos": 1.0,
131
+ "mean_p_fake_on_fakes": 0.0169,
132
+ "mean_p_fake_on_reals": 0.0083
133
+ },
134
+ {
135
+ "detector": "dinov2",
136
+ "name": "DINOv2 probe",
137
+ "auroc": 38.52,
138
+ "ap": 43.2,
139
+ "acc": 47.0,
140
+ "fake_detect_rate": 7.0,
141
+ "real_false_pos": 13.0,
142
+ "mean_p_fake_on_fakes": 0.1156,
143
+ "mean_p_fake_on_reals": 0.1751
144
+ },
145
+ {
146
+ "detector": "clip",
147
+ "name": "UnivFD / CLIP",
148
+ "auroc": 26.8,
149
+ "ap": 36.87,
150
+ "acc": 47.0,
151
+ "fake_detect_rate": 1.0,
152
+ "real_false_pos": 7.0,
153
+ "mean_p_fake_on_fakes": 0.0728,
154
+ "mean_p_fake_on_reals": 0.1656
155
+ }
156
+ ]
benchmark/generator_runs/flux2_klein_9b/RESULTS.md ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Detectors vs FLUX.2 [klein] 9B
2
+
3
+ 100 real images (people excluded) + 100 images generated by FLUX.2 [klein] 9B from a BLIP caption of each real image (1024px). Ranked by AUROC; accuracy uses the 0.5 threshold.
4
+
5
+ | Rank | Detector | AUROC | AP | acc@0.5 | fake detect % | real FP % |
6
+ |---|---|---|---|---|---|---|
7
+ | 1 | VIB-Net | 99.73 | 99.73 | 92.0 | 100.0 | 16.0 |
8
+ | 2 | CO-SPY | 99.34 | 99.3 | 98.0 | 99.0 | 3.0 |
9
+ | 3 | PGC | 97.35 | 96.45 | 53.5 | 7.0 | 0.0 |
10
+ | 4 | CuRe | 96.2 | 97.04 | 88.5 | 77.0 | 0.0 |
11
+ | 5 | AIDE | 93.73 | 88.94 | 81.0 | 69.0 | 7.0 |
12
+ | 6 | SAFE | 92.32 | 84.09 | 88.5 | 87.0 | 10.0 |
13
+ | 7 | NPR | 88.61 | 81.74 | 78.5 | 100.0 | 43.0 |
14
+ | 8 | SPAI | 66.54 | 63.78 | 56.0 | 20.0 | 8.0 |
15
+ | 9 | FatFormer | 45.86 | 46.65 | 50.5 | 5.0 | 4.0 |
16
+ | 10 | DINOv3 probe | 45.76 | 45.57 | 46.0 | 5.0 | 13.0 |
17
+ | 11 | Adapter-tuned DINOv2 | 44.13 | 46.55 | 50.0 | 0.0 | 0.0 |
18
+ | 12 | CNNDetection (ResNet-50) | 40.86 | 46.29 | 50.0 | 1.0 | 1.0 |
19
+ | 13 | DINOv2 probe | 35.29 | 41.64 | 46.0 | 5.0 | 13.0 |
20
+ | 14 | UnivFD / CLIP | 26.07 | 36.57 | 47.0 | 1.0 | 7.0 |
benchmark/generator_runs/flux2_klein_9b/manifest.json ADDED
@@ -0,0 +1,611 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "label": "FLUX.2 [klein] 9B",
3
+ "generator": "flux2_klein_9b",
4
+ "n": 100,
5
+ "res": 1024,
6
+ "settings": "1024px \u00b7 text-to-image from a caption",
7
+ "created": "2026-10-04",
8
+ "reuse_from": "benchmark/generator_runs/reference/manifest.json",
9
+ "pairs": [
10
+ {
11
+ "idx": 0,
12
+ "caption": "sheep is white",
13
+ "prompt": "sheep is white, photorealistic, high detail",
14
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/003443_ILSVRC2012_val_00028605.JPEG"
15
+ },
16
+ {
17
+ "idx": 1,
18
+ "caption": "a bird sitting on a branch in a tree",
19
+ "prompt": "a bird sitting on a branch in a tree, photorealistic, high detail",
20
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/000582_ILSVRC2012_val_00004554.JPEG"
21
+ },
22
+ {
23
+ "idx": 2,
24
+ "caption": "a green grasshopper on a leaf",
25
+ "prompt": "a green grasshopper on a leaf, photorealistic, high detail",
26
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/002258_ILSVRC2012_val_00018535.JPEG"
27
+ },
28
+ {
29
+ "idx": 3,
30
+ "caption": "the bell is black",
31
+ "prompt": "the bell is black, photorealistic, high detail",
32
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00028778.JPEG"
33
+ },
34
+ {
35
+ "idx": 4,
36
+ "caption": "a car driving down a city street in the middle of the day",
37
+ "prompt": "a car driving down a city street in the middle of the day, photorealistic, high detail",
38
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/crn/0_real/00103410.png"
39
+ },
40
+ {
41
+ "idx": 5,
42
+ "caption": "a dog is standing in the grass",
43
+ "prompt": "a dog is standing in the grass, photorealistic, high detail",
44
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/003845_ILSVRC2012_val_00031963.JPEG"
45
+ },
46
+ {
47
+ "idx": 6,
48
+ "caption": "a small kitten walking across a rocky beach",
49
+ "prompt": "a small kitten walking across a rocky beach, photorealistic, high detail",
50
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/000784_ILSVRC2012_val_00006407.JPEG"
51
+ },
52
+ {
53
+ "idx": 7,
54
+ "caption": "a mountain covered in snow",
55
+ "prompt": "a mountain covered in snow, photorealistic, high detail",
56
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/000414_ILSVRC2012_val_00003305.JPEG"
57
+ },
58
+ {
59
+ "idx": 8,
60
+ "caption": "a sailer sailing in the ocean near a lighthouse",
61
+ "prompt": "a sailer sailing in the ocean near a lighthouse, photorealistic, high detail",
62
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00040977.JPEG"
63
+ },
64
+ {
65
+ "idx": 9,
66
+ "caption": "a bowl of masoor",
67
+ "prompt": "a bowl of masoor, photorealistic, high detail",
68
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv5/0_real/001588_ILSVRC2012_val_00009675.JPEG"
69
+ },
70
+ {
71
+ "idx": 10,
72
+ "caption": "a green bird house",
73
+ "prompt": "a green bird house, photorealistic, high detail",
74
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/003296_ILSVRC2012_val_00026872.JPEG"
75
+ },
76
+ {
77
+ "idx": 11,
78
+ "caption": "a body of water",
79
+ "prompt": "a body of water, photorealistic, high detail",
80
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/001100_ILSVRC2012_val_00008791.JPEG"
81
+ },
82
+ {
83
+ "idx": 12,
84
+ "caption": "a dog in a pool",
85
+ "prompt": "a dog in a pool, photorealistic, high detail",
86
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv5/0_real/003956_ILSVRC2012_val_00024961.JPEG"
87
+ },
88
+ {
89
+ "idx": 13,
90
+ "caption": "two tools, one with a wren and the other with a wren",
91
+ "prompt": "two tools, one with a wren and the other with a wren, photorealistic, high detail",
92
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/002410_ILSVRC2012_val_00020055.JPEG"
93
+ },
94
+ {
95
+ "idx": 14,
96
+ "caption": "a black leather folder with a red trim",
97
+ "prompt": "a black leather folder with a red trim, photorealistic, high detail",
98
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/biggan/0_real/446--n02840245_7225.png"
99
+ },
100
+ {
101
+ "idx": 15,
102
+ "caption": "a small bird sitting on a wooden surface",
103
+ "prompt": "a small bird sitting on a wooden surface, photorealistic, high detail",
104
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/000105_ILSVRC2012_val_00000837.JPEG"
105
+ },
106
+ {
107
+ "idx": 16,
108
+ "caption": "mouse mouse on mouse mouse mouse",
109
+ "prompt": "mouse mouse on mouse mouse mouse, photorealistic, high detail",
110
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/000058_ILSVRC2012_val_00000430.JPEG"
111
+ },
112
+ {
113
+ "idx": 17,
114
+ "caption": "a small metal object on a wooden table",
115
+ "prompt": "a small metal object on a wooden table, photorealistic, high detail",
116
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/003751_ILSVRC2012_val_00030855.JPEG"
117
+ },
118
+ {
119
+ "idx": 18,
120
+ "caption": "an hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour",
121
+ "prompt": "an hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour, photorealistic, high detail",
122
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/002367_ILSVRC2012_val_00019475.JPEG"
123
+ },
124
+ {
125
+ "idx": 19,
126
+ "caption": "a white rabbit in a cage",
127
+ "prompt": "a white rabbit in a cage, photorealistic, high detail",
128
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/001872_ILSVRC2012_val_00015301.JPEG"
129
+ },
130
+ {
131
+ "idx": 20,
132
+ "caption": "a grass bug on a green leaf",
133
+ "prompt": "a grass bug on a green leaf, photorealistic, high detail",
134
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00032265.JPEG"
135
+ },
136
+ {
137
+ "idx": 21,
138
+ "caption": "a field of grass",
139
+ "prompt": "a field of grass, photorealistic, high detail",
140
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/001114_ILSVRC2012_val_00009176.JPEG"
141
+ },
142
+ {
143
+ "idx": 22,
144
+ "caption": "a black padlock with a key",
145
+ "prompt": "a black padlock with a key, photorealistic, high detail",
146
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/biggan/0_real/695--n03874599_4507.png"
147
+ },
148
+ {
149
+ "idx": 23,
150
+ "caption": "a group of balls",
151
+ "prompt": "a group of balls, photorealistic, high detail",
152
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/002837_ILSVRC2012_val_00024198.JPEG"
153
+ },
154
+ {
155
+ "idx": 24,
156
+ "caption": "three dogs standing on a hill",
157
+ "prompt": "three dogs standing on a hill, photorealistic, high detail",
158
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00022571.JPEG"
159
+ },
160
+ {
161
+ "idx": 25,
162
+ "caption": "a dog standing in a field",
163
+ "prompt": "a dog standing in a field, photorealistic, high detail",
164
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/004562_ILSVRC2012_val_00038455.JPEG"
165
+ },
166
+ {
167
+ "idx": 26,
168
+ "caption": "a pink toilet",
169
+ "prompt": "a pink toilet, photorealistic, high detail",
170
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/005007_ILSVRC2012_val_00042247.JPEG"
171
+ },
172
+ {
173
+ "idx": 27,
174
+ "caption": "the sky is cloudy",
175
+ "prompt": "the sky is cloudy, photorealistic, high detail",
176
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/003771_ILSVRC2012_val_00031161.JPEG"
177
+ },
178
+ {
179
+ "idx": 28,
180
+ "caption": "a bird is standing on the ground",
181
+ "prompt": "a bird is standing on the ground, photorealistic, high detail",
182
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/004662_ILSVRC2012_val_00039216.JPEG"
183
+ },
184
+ {
185
+ "idx": 29,
186
+ "caption": "a leopard sitting on a tree branch",
187
+ "prompt": "a leopard sitting on a tree branch, photorealistic, high detail",
188
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv5/0_real/006884_ILSVRC2012_val_00043117.JPEG"
189
+ },
190
+ {
191
+ "idx": 30,
192
+ "caption": "an old barn with a broken roof",
193
+ "prompt": "an old barn with a broken roof, photorealistic, high detail",
194
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/004995_ILSVRC2012_val_00041650.JPEG"
195
+ },
196
+ {
197
+ "idx": 31,
198
+ "caption": "a slug crawling on a concrete surface",
199
+ "prompt": "a slug crawling on a concrete surface, photorealistic, high detail",
200
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/000580_ILSVRC2012_val_00004691.JPEG"
201
+ },
202
+ {
203
+ "idx": 32,
204
+ "caption": "the three bottles of the serums are shown in the image",
205
+ "prompt": "the three bottles of the serums are shown in the image, photorealistic, high detail",
206
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/biggan/0_real/631--n03690938_23212.png"
207
+ },
208
+ {
209
+ "idx": 33,
210
+ "caption": "a bear cub",
211
+ "prompt": "a bear cub, photorealistic, high detail",
212
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/005149_ILSVRC2012_val_00043353.JPEG"
213
+ },
214
+ {
215
+ "idx": 34,
216
+ "caption": "a street with a yellow line painted on the road",
217
+ "prompt": "a street with a yellow line painted on the road, photorealistic, high detail",
218
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/crn/0_real/00102007.png"
219
+ },
220
+ {
221
+ "idx": 35,
222
+ "caption": "a lion fish swimming in the water",
223
+ "prompt": "a lion fish swimming in the water, photorealistic, high detail",
224
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/000092_ILSVRC2012_val_00000699.JPEG"
225
+ },
226
+ {
227
+ "idx": 36,
228
+ "caption": "a plastic container with food",
229
+ "prompt": "a plastic container with food, photorealistic, high detail",
230
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/gaugan/0_real/000000113589.png"
231
+ },
232
+ {
233
+ "idx": 37,
234
+ "caption": "a car is driving down a street in a city",
235
+ "prompt": "a car is driving down a street in a city, photorealistic, high detail",
236
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/crn/0_real/00103003.png"
237
+ },
238
+ {
239
+ "idx": 38,
240
+ "caption": "a wooden desk",
241
+ "prompt": "a wooden desk, photorealistic, high detail",
242
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/004470_ILSVRC2012_val_00037573.JPEG"
243
+ },
244
+ {
245
+ "idx": 39,
246
+ "caption": "a bird standing in the water",
247
+ "prompt": "a bird standing in the water, photorealistic, high detail",
248
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/001503_ILSVRC2012_val_00012618.JPEG"
249
+ },
250
+ {
251
+ "idx": 40,
252
+ "caption": "two parking meters",
253
+ "prompt": "two parking meters, photorealistic, high detail",
254
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/000019_ILSVRC2012_val_00000201.JPEG"
255
+ },
256
+ {
257
+ "idx": 41,
258
+ "caption": "a butterfly on a yellow flower",
259
+ "prompt": "a butterfly on a yellow flower, photorealistic, high detail",
260
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00006608.JPEG"
261
+ },
262
+ {
263
+ "idx": 42,
264
+ "caption": "a green snake on a rock",
265
+ "prompt": "a green snake on a rock, photorealistic, high detail",
266
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/000933_ILSVRC2012_val_00007877.JPEG"
267
+ },
268
+ {
269
+ "idx": 43,
270
+ "caption": "a green snake in a tree",
271
+ "prompt": "a green snake in a tree, photorealistic, high detail",
272
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00042162.JPEG"
273
+ },
274
+ {
275
+ "idx": 44,
276
+ "caption": "purple and gold beaded bracelet",
277
+ "prompt": "purple and gold beaded bracelet, photorealistic, high detail",
278
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/002068_ILSVRC2012_val_00017972.JPEG"
279
+ },
280
+ {
281
+ "idx": 45,
282
+ "caption": "a dog standing in the shade",
283
+ "prompt": "a dog standing in the shade, photorealistic, high detail",
284
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/005084_ILSVRC2012_val_00042318.JPEG"
285
+ },
286
+ {
287
+ "idx": 46,
288
+ "caption": "a cliff with a cliff face",
289
+ "prompt": "a cliff with a cliff face, photorealistic, high detail",
290
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00031528.JPEG"
291
+ },
292
+ {
293
+ "idx": 47,
294
+ "caption": "a dog laying in the grass",
295
+ "prompt": "a dog laying in the grass, photorealistic, high detail",
296
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv5/0_real/004359_ILSVRC2012_val_00027268.JPEG"
297
+ },
298
+ {
299
+ "idx": 48,
300
+ "caption": "a small dog sitting on a bench",
301
+ "prompt": "a small dog sitting on a bench, photorealistic, high detail",
302
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/005226_ILSVRC2012_val_00043233.JPEG"
303
+ },
304
+ {
305
+ "idx": 49,
306
+ "caption": "a dog standing on a hill",
307
+ "prompt": "a dog standing on a hill, photorealistic, high detail",
308
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/001612_ILSVRC2012_val_00013323.JPEG"
309
+ },
310
+ {
311
+ "idx": 50,
312
+ "caption": "a white plate with food on it",
313
+ "prompt": "a white plate with food on it, photorealistic, high detail",
314
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/001277_ILSVRC2012_val_00010872.JPEG"
315
+ },
316
+ {
317
+ "idx": 51,
318
+ "caption": "a wooden chair",
319
+ "prompt": "a wooden chair, photorealistic, high detail",
320
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/001537_ILSVRC2012_val_00012771.JPEG"
321
+ },
322
+ {
323
+ "idx": 52,
324
+ "caption": "a large church with a stained glass window",
325
+ "prompt": "a large church with a stained glass window, photorealistic, high detail",
326
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/003670_ILSVRC2012_val_00030337.JPEG"
327
+ },
328
+ {
329
+ "idx": 53,
330
+ "caption": "a dog running in the grass",
331
+ "prompt": "a dog running in the grass, photorealistic, high detail",
332
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/004349_ILSVRC2012_val_00035935.JPEG"
333
+ },
334
+ {
335
+ "idx": 54,
336
+ "caption": "a hand holding a hot dog with lete and lete",
337
+ "prompt": "a hand holding a hot dog with lete and lete, photorealistic, high detail",
338
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/gaugan/0_real/000000118367.png"
339
+ },
340
+ {
341
+ "idx": 55,
342
+ "caption": "a large satellite dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish",
343
+ "prompt": "a large satellite dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish, photorealistic, high detail",
344
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/004018_ILSVRC2012_val_00033065.JPEG"
345
+ },
346
+ {
347
+ "idx": 56,
348
+ "caption": "a brown dog with a long tongue",
349
+ "prompt": "a brown dog with a long tongue, photorealistic, high detail",
350
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/002541_ILSVRC2012_val_00021171.JPEG"
351
+ },
352
+ {
353
+ "idx": 57,
354
+ "caption": "a wooden bench",
355
+ "prompt": "a wooden bench, photorealistic, high detail",
356
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/002922_ILSVRC2012_val_00024245.JPEG"
357
+ },
358
+ {
359
+ "idx": 58,
360
+ "caption": "a white dog toy",
361
+ "prompt": "a white dog toy, photorealistic, high detail",
362
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/001637_ILSVRC2012_val_00013696.JPEG"
363
+ },
364
+ {
365
+ "idx": 59,
366
+ "caption": "a lake with trees and water in the background",
367
+ "prompt": "a lake with trees and water in the background, photorealistic, high detail",
368
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/003749_ILSVRC2012_val_00031159.JPEG"
369
+ },
370
+ {
371
+ "idx": 60,
372
+ "caption": "a crab crawling on the ground",
373
+ "prompt": "a crab crawling on the ground, photorealistic, high detail",
374
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/002813_ILSVRC2012_val_00023550.JPEG"
375
+ },
376
+ {
377
+ "idx": 61,
378
+ "caption": "a city street with a lot of buildings",
379
+ "prompt": "a city street with a lot of buildings, photorealistic, high detail",
380
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/imle/0_real/00103670.png"
381
+ },
382
+ {
383
+ "idx": 62,
384
+ "caption": "old wooden barrels stock photo, old wooden barrels by andy",
385
+ "prompt": "old wooden barrels stock photo, old wooden barrels by andy, photorealistic, high detail",
386
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/000703_ILSVRC2012_val_00005570.JPEG"
387
+ },
388
+ {
389
+ "idx": 63,
390
+ "caption": "a green beetle with red and green stripes",
391
+ "prompt": "a green beetle with red and green stripes, photorealistic, high detail",
392
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv5/0_real/006233_ILSVRC2012_val_00039157.JPEG"
393
+ },
394
+ {
395
+ "idx": 64,
396
+ "caption": "a plate of food",
397
+ "prompt": "a plate of food, photorealistic, high detail",
398
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/002016_ILSVRC2012_val_00016730.JPEG"
399
+ },
400
+ {
401
+ "idx": 65,
402
+ "caption": "a fish in a tank",
403
+ "prompt": "a fish in a tank, photorealistic, high detail",
404
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/001971_ILSVRC2012_val_00016470.JPEG"
405
+ },
406
+ {
407
+ "idx": 66,
408
+ "caption": "a street with a lot of luggage and palm trees",
409
+ "prompt": "a street with a lot of luggage and palm trees, photorealistic, high detail",
410
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/crn/0_real/00105512.png"
411
+ },
412
+ {
413
+ "idx": 67,
414
+ "caption": "a tree in the middle of a city",
415
+ "prompt": "a tree in the middle of a city, photorealistic, high detail",
416
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/imle/0_real/00100948.png"
417
+ },
418
+ {
419
+ "idx": 68,
420
+ "caption": "a kitchen with a large white island and a large window",
421
+ "prompt": "a kitchen with a large white island and a large window, photorealistic, high detail",
422
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/gaugan/0_real/000000458768.png"
423
+ },
424
+ {
425
+ "idx": 69,
426
+ "caption": "a small brown and black dog standing on a white surface",
427
+ "prompt": "a small brown and black dog standing on a white surface, photorealistic, high detail",
428
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/003964_ILSVRC2012_val_00033278.JPEG"
429
+ },
430
+ {
431
+ "idx": 70,
432
+ "caption": "a train on the tracks",
433
+ "prompt": "a train on the tracks, photorealistic, high detail",
434
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/005265_ILSVRC2012_val_00043551.JPEG"
435
+ },
436
+ {
437
+ "idx": 71,
438
+ "caption": "a large circular window",
439
+ "prompt": "a large circular window, photorealistic, high detail",
440
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/003867_ILSVRC2012_val_00032479.JPEG"
441
+ },
442
+ {
443
+ "idx": 72,
444
+ "caption": "a machine in a factory",
445
+ "prompt": "a machine in a factory, photorealistic, high detail",
446
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/004837_ILSVRC2012_val_00039836.JPEG"
447
+ },
448
+ {
449
+ "idx": 73,
450
+ "caption": "a red boat docked in a harbor",
451
+ "prompt": "a red boat docked in a harbor, photorealistic, high detail",
452
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/001452_ILSVRC2012_val_00012691.JPEG"
453
+ },
454
+ {
455
+ "idx": 74,
456
+ "caption": "a bird perched on a branch",
457
+ "prompt": "a bird perched on a branch, photorealistic, high detail",
458
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv5/0_real/004217_ILSVRC2012_val_00026362.JPEG"
459
+ },
460
+ {
461
+ "idx": 75,
462
+ "caption": "a large gray elephant",
463
+ "prompt": "a large gray elephant, photorealistic, high detail",
464
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/001980_ILSVRC2012_val_00016437.JPEG"
465
+ },
466
+ {
467
+ "idx": 76,
468
+ "caption": "a street with a star painted on the sidewalk",
469
+ "prompt": "a street with a star painted on the sidewalk, photorealistic, high detail",
470
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/imle/0_real/00101546.png"
471
+ },
472
+ {
473
+ "idx": 77,
474
+ "caption": "a fish in a tank with a fish inside",
475
+ "prompt": "a fish in a tank with a fish inside, photorealistic, high detail",
476
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/003951_ILSVRC2012_val_00033320.JPEG"
477
+ },
478
+ {
479
+ "idx": 78,
480
+ "caption": "a pot of soup",
481
+ "prompt": "a pot of soup, photorealistic, high detail",
482
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/002526_ILSVRC2012_val_00021615.JPEG"
483
+ },
484
+ {
485
+ "idx": 79,
486
+ "caption": "a bunch of bubbles",
487
+ "prompt": "a bunch of bubbles, photorealistic, high detail",
488
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/005966_ILSVRC2012_val_00049716.JPEG"
489
+ },
490
+ {
491
+ "idx": 80,
492
+ "caption": "a vase on display",
493
+ "prompt": "a vase on display, photorealistic, high detail",
494
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/005439_ILSVRC2012_val_00045714.JPEG"
495
+ },
496
+ {
497
+ "idx": 81,
498
+ "caption": "a toilet with a toilet seat and a toilet roll",
499
+ "prompt": "a toilet with a toilet seat and a toilet roll, photorealistic, high detail",
500
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/003325_ILSVRC2012_val_00028223.JPEG"
501
+ },
502
+ {
503
+ "idx": 82,
504
+ "caption": "a piece of food",
505
+ "prompt": "a piece of food, photorealistic, high detail",
506
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/001630_ILSVRC2012_val_00013254.JPEG"
507
+ },
508
+ {
509
+ "idx": 83,
510
+ "caption": "a car is parked in a street with a bus in the background",
511
+ "prompt": "a car is parked in a street with a bus in the background, photorealistic, high detail",
512
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/crn/0_real/00104005.png"
513
+ },
514
+ {
515
+ "idx": 84,
516
+ "caption": "a white car driving down a street next to a building",
517
+ "prompt": "a white car driving down a street next to a building, photorealistic, high detail",
518
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/imle/0_real/00105681.png"
519
+ },
520
+ {
521
+ "idx": 85,
522
+ "caption": "a small canal in venice, italy",
523
+ "prompt": "a small canal in venice, italy, photorealistic, high detail",
524
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/004284_ILSVRC2012_val_00035514.JPEG"
525
+ },
526
+ {
527
+ "idx": 86,
528
+ "caption": "a black velvet jacket",
529
+ "prompt": "a black velvet jacket, photorealistic, high detail",
530
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/003062_ILSVRC2012_val_00025342.JPEG"
531
+ },
532
+ {
533
+ "idx": 87,
534
+ "caption": "a bear is sitting in a tree branch",
535
+ "prompt": "a bear is sitting in a tree branch, photorealistic, high detail",
536
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/004938_ILSVRC2012_val_00041120.JPEG"
537
+ },
538
+ {
539
+ "idx": 88,
540
+ "caption": "a goat standing in the woods",
541
+ "prompt": "a goat standing in the woods, photorealistic, high detail",
542
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/000197_ILSVRC2012_val_00001705.JPEG"
543
+ },
544
+ {
545
+ "idx": 89,
546
+ "caption": "a military vehicle",
547
+ "prompt": "a military vehicle, photorealistic, high detail",
548
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/004633_ILSVRC2012_val_00039017.JPEG"
549
+ },
550
+ {
551
+ "idx": 90,
552
+ "caption": "a cup with a bunch of pencils in it",
553
+ "prompt": "a cup with a bunch of pencils in it, photorealistic, high detail",
554
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/002918_ILSVRC2012_val_00024434.JPEG"
555
+ },
556
+ {
557
+ "idx": 91,
558
+ "caption": "a jaguar in the water",
559
+ "prompt": "a jaguar in the water, photorealistic, high detail",
560
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/002525_ILSVRC2012_val_00021064.JPEG"
561
+ },
562
+ {
563
+ "idx": 92,
564
+ "caption": "a flower made out of felt and felt",
565
+ "prompt": "a flower made out of felt and felt, photorealistic, high detail",
566
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/003858_ILSVRC2012_val_00031978.JPEG"
567
+ },
568
+ {
569
+ "idx": 93,
570
+ "caption": "a dog with a pink shirt on",
571
+ "prompt": "a dog with a pink shirt on, photorealistic, high detail",
572
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/001164_ILSVRC2012_val_00009888.JPEG"
573
+ },
574
+ {
575
+ "idx": 94,
576
+ "caption": "a close up of a bug on a rock",
577
+ "prompt": "a close up of a bug on a rock, photorealistic, high detail",
578
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/004231_ILSVRC2012_val_00035409.JPEG"
579
+ },
580
+ {
581
+ "idx": 95,
582
+ "caption": "a close up of a bird with a yellow eye",
583
+ "prompt": "a close up of a bird with a yellow eye, photorealistic, high detail",
584
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/000274_ILSVRC2012_val_00002228.JPEG"
585
+ },
586
+ {
587
+ "idx": 96,
588
+ "caption": "a hyen walking down a dirt road",
589
+ "prompt": "a hyen walking down a dirt road, photorealistic, high detail",
590
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/002696_ILSVRC2012_val_00023004.JPEG"
591
+ },
592
+ {
593
+ "idx": 97,
594
+ "caption": "a col of pictures of food including vegetables and vegetables",
595
+ "prompt": "a col of pictures of food including vegetables and vegetables, photorealistic, high detail",
596
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/005131_ILSVRC2012_val_00042927.JPEG"
597
+ },
598
+ {
599
+ "idx": 98,
600
+ "caption": "a brown barn",
601
+ "prompt": "a brown barn, photorealistic, high detail",
602
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00014180.JPEG"
603
+ },
604
+ {
605
+ "idx": 99,
606
+ "caption": "a small black and white dog sitting on the ground",
607
+ "prompt": "a small black and white dog sitting on the ground, photorealistic, high detail",
608
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/004154_ILSVRC2012_val_00034951.JPEG"
609
+ }
610
+ ]
611
+ }
benchmark/generator_runs/flux2_klein_9b/results.json ADDED
@@ -0,0 +1,156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "detector": "vib_net",
4
+ "name": "VIB-Net",
5
+ "auroc": 99.73,
6
+ "ap": 99.73,
7
+ "acc": 92.0,
8
+ "fake_detect_rate": 100.0,
9
+ "real_false_pos": 16.0,
10
+ "mean_p_fake_on_fakes": 0.9684,
11
+ "mean_p_fake_on_reals": 0.2277
12
+ },
13
+ {
14
+ "detector": "co_spy",
15
+ "name": "CO-SPY",
16
+ "auroc": 99.34,
17
+ "ap": 99.3,
18
+ "acc": 98.0,
19
+ "fake_detect_rate": 99.0,
20
+ "real_false_pos": 3.0,
21
+ "mean_p_fake_on_fakes": 0.8509,
22
+ "mean_p_fake_on_reals": 0.116
23
+ },
24
+ {
25
+ "detector": "pgc",
26
+ "name": "PGC",
27
+ "auroc": 97.35,
28
+ "ap": 96.45,
29
+ "acc": 53.5,
30
+ "fake_detect_rate": 7.0,
31
+ "real_false_pos": 0.0,
32
+ "mean_p_fake_on_fakes": 0.4389,
33
+ "mean_p_fake_on_reals": 0.2672
34
+ },
35
+ {
36
+ "detector": "cure",
37
+ "name": "CuRe",
38
+ "auroc": 96.2,
39
+ "ap": 97.04,
40
+ "acc": 88.5,
41
+ "fake_detect_rate": 77.0,
42
+ "real_false_pos": 0.0,
43
+ "mean_p_fake_on_fakes": 0.7393,
44
+ "mean_p_fake_on_reals": 0.0129
45
+ },
46
+ {
47
+ "detector": "aide",
48
+ "name": "AIDE",
49
+ "auroc": 93.73,
50
+ "ap": 88.94,
51
+ "acc": 81.0,
52
+ "fake_detect_rate": 69.0,
53
+ "real_false_pos": 7.0,
54
+ "mean_p_fake_on_fakes": 0.6246,
55
+ "mean_p_fake_on_reals": 0.1102
56
+ },
57
+ {
58
+ "detector": "safe",
59
+ "name": "SAFE",
60
+ "auroc": 92.32,
61
+ "ap": 84.09,
62
+ "acc": 88.5,
63
+ "fake_detect_rate": 87.0,
64
+ "real_false_pos": 10.0,
65
+ "mean_p_fake_on_fakes": 0.7988,
66
+ "mean_p_fake_on_reals": 0.1425
67
+ },
68
+ {
69
+ "detector": "npr",
70
+ "name": "NPR",
71
+ "auroc": 88.61,
72
+ "ap": 81.74,
73
+ "acc": 78.5,
74
+ "fake_detect_rate": 100.0,
75
+ "real_false_pos": 43.0,
76
+ "mean_p_fake_on_fakes": 0.9986,
77
+ "mean_p_fake_on_reals": 0.4365
78
+ },
79
+ {
80
+ "detector": "spai",
81
+ "name": "SPAI",
82
+ "auroc": 66.54,
83
+ "ap": 63.78,
84
+ "acc": 56.0,
85
+ "fake_detect_rate": 20.0,
86
+ "real_false_pos": 8.0,
87
+ "mean_p_fake_on_fakes": 0.2118,
88
+ "mean_p_fake_on_reals": 0.0778
89
+ },
90
+ {
91
+ "detector": "fat_former",
92
+ "name": "FatFormer",
93
+ "auroc": 45.86,
94
+ "ap": 46.65,
95
+ "acc": 50.5,
96
+ "fake_detect_rate": 5.0,
97
+ "real_false_pos": 4.0,
98
+ "mean_p_fake_on_fakes": 0.0477,
99
+ "mean_p_fake_on_reals": 0.0412
100
+ },
101
+ {
102
+ "detector": "dinov3",
103
+ "name": "DINOv3 probe",
104
+ "auroc": 45.76,
105
+ "ap": 45.57,
106
+ "acc": 46.0,
107
+ "fake_detect_rate": 5.0,
108
+ "real_false_pos": 13.0,
109
+ "mean_p_fake_on_fakes": 0.2405,
110
+ "mean_p_fake_on_reals": 0.2792
111
+ },
112
+ {
113
+ "detector": "adapted_dino",
114
+ "name": "Adapter-tuned DINOv2",
115
+ "auroc": 44.13,
116
+ "ap": 46.55,
117
+ "acc": 50.0,
118
+ "fake_detect_rate": 0.0,
119
+ "real_false_pos": 0.0,
120
+ "mean_p_fake_on_fakes": 0.0,
121
+ "mean_p_fake_on_reals": 0.0
122
+ },
123
+ {
124
+ "detector": "cnn",
125
+ "name": "CNNDetection (ResNet-50)",
126
+ "auroc": 40.86,
127
+ "ap": 46.29,
128
+ "acc": 50.0,
129
+ "fake_detect_rate": 1.0,
130
+ "real_false_pos": 1.0,
131
+ "mean_p_fake_on_fakes": 0.0116,
132
+ "mean_p_fake_on_reals": 0.0083
133
+ },
134
+ {
135
+ "detector": "dinov2",
136
+ "name": "DINOv2 probe",
137
+ "auroc": 35.29,
138
+ "ap": 41.64,
139
+ "acc": 46.0,
140
+ "fake_detect_rate": 5.0,
141
+ "real_false_pos": 13.0,
142
+ "mean_p_fake_on_fakes": 0.1056,
143
+ "mean_p_fake_on_reals": 0.1751
144
+ },
145
+ {
146
+ "detector": "clip",
147
+ "name": "UnivFD / CLIP",
148
+ "auroc": 26.07,
149
+ "ap": 36.57,
150
+ "acc": 47.0,
151
+ "fake_detect_rate": 1.0,
152
+ "real_false_pos": 7.0,
153
+ "mean_p_fake_on_fakes": 0.0715,
154
+ "mean_p_fake_on_reals": 0.1656
155
+ }
156
+ ]
benchmark/generator_runs/qwen_image_2_1/RESULTS.md ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Detectors vs Qwen-Image-2.1
2
+
3
+ 100 real images (people excluded) + 100 images generated by Qwen-Image-2.1 from a BLIP caption of each real image (1024px). Ranked by AUROC; accuracy uses the 0.5 threshold.
4
+
5
+ | Rank | Detector | AUROC | AP | acc@0.5 | fake detect % | real FP % |
6
+ |---|---|---|---|---|---|---|
7
+ | 1 | CO-SPY | 98.87 | 98.7 | 95.5 | 94.0 | 3.0 |
8
+ | 2 | PGC | 98.5 | 98.3 | 60.0 | 20.0 | 0.0 |
9
+ | 3 | VIB-Net | 98.35 | 98.51 | 91.5 | 98.0 | 15.0 |
10
+ | 4 | SPAI | 96.71 | 96.1 | 92.0 | 92.0 | 8.0 |
11
+ | 5 | CuRe | 92.68 | 94.28 | 82.0 | 64.0 | 0.0 |
12
+ | 6 | SAFE | 90.85 | 81.07 | 76.5 | 63.0 | 10.0 |
13
+ | 7 | NPR | 89.67 | 83.06 | 78.0 | 99.0 | 43.0 |
14
+ | 8 | AIDE | 89.42 | 82.41 | 60.0 | 27.0 | 7.0 |
15
+ | 9 | FatFormer | 76.74 | 78.17 | 67.5 | 39.0 | 4.0 |
16
+ | 10 | DINOv3 probe | 53.2 | 51.63 | 49.5 | 12.0 | 13.0 |
17
+ | 11 | CNNDetection (ResNet-50) | 52.52 | 52.58 | 50.0 | 1.0 | 1.0 |
18
+ | 12 | UnivFD / CLIP | 50.11 | 50.43 | 48.5 | 4.0 | 7.0 |
19
+ | 13 | Adapter-tuned DINOv2 | 49.15 | 49.17 | 50.0 | 0.0 | 0.0 |
20
+ | 14 | DINOv2 probe | 44.69 | 46.44 | 47.0 | 7.0 | 13.0 |
benchmark/generator_runs/qwen_image_2_1/manifest.json ADDED
@@ -0,0 +1,611 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "label": "Qwen-Image-2.1",
3
+ "generator": "qwen_image_2_1",
4
+ "n": 100,
5
+ "res": 1024,
6
+ "settings": "1024px \u00b7 text-to-image from a caption",
7
+ "created": "2026-10-04",
8
+ "reuse_from": "benchmark/generator_runs/reference/manifest.json",
9
+ "pairs": [
10
+ {
11
+ "idx": 0,
12
+ "caption": "sheep is white",
13
+ "prompt": "sheep is white, photorealistic, high detail",
14
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/003443_ILSVRC2012_val_00028605.JPEG"
15
+ },
16
+ {
17
+ "idx": 1,
18
+ "caption": "a bird sitting on a branch in a tree",
19
+ "prompt": "a bird sitting on a branch in a tree, photorealistic, high detail",
20
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/000582_ILSVRC2012_val_00004554.JPEG"
21
+ },
22
+ {
23
+ "idx": 2,
24
+ "caption": "a green grasshopper on a leaf",
25
+ "prompt": "a green grasshopper on a leaf, photorealistic, high detail",
26
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/002258_ILSVRC2012_val_00018535.JPEG"
27
+ },
28
+ {
29
+ "idx": 3,
30
+ "caption": "the bell is black",
31
+ "prompt": "the bell is black, photorealistic, high detail",
32
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00028778.JPEG"
33
+ },
34
+ {
35
+ "idx": 4,
36
+ "caption": "a car driving down a city street in the middle of the day",
37
+ "prompt": "a car driving down a city street in the middle of the day, photorealistic, high detail",
38
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/crn/0_real/00103410.png"
39
+ },
40
+ {
41
+ "idx": 5,
42
+ "caption": "a dog is standing in the grass",
43
+ "prompt": "a dog is standing in the grass, photorealistic, high detail",
44
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/003845_ILSVRC2012_val_00031963.JPEG"
45
+ },
46
+ {
47
+ "idx": 6,
48
+ "caption": "a small kitten walking across a rocky beach",
49
+ "prompt": "a small kitten walking across a rocky beach, photorealistic, high detail",
50
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/000784_ILSVRC2012_val_00006407.JPEG"
51
+ },
52
+ {
53
+ "idx": 7,
54
+ "caption": "a mountain covered in snow",
55
+ "prompt": "a mountain covered in snow, photorealistic, high detail",
56
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/000414_ILSVRC2012_val_00003305.JPEG"
57
+ },
58
+ {
59
+ "idx": 8,
60
+ "caption": "a sailer sailing in the ocean near a lighthouse",
61
+ "prompt": "a sailer sailing in the ocean near a lighthouse, photorealistic, high detail",
62
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00040977.JPEG"
63
+ },
64
+ {
65
+ "idx": 9,
66
+ "caption": "a bowl of masoor",
67
+ "prompt": "a bowl of masoor, photorealistic, high detail",
68
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv5/0_real/001588_ILSVRC2012_val_00009675.JPEG"
69
+ },
70
+ {
71
+ "idx": 10,
72
+ "caption": "a green bird house",
73
+ "prompt": "a green bird house, photorealistic, high detail",
74
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/003296_ILSVRC2012_val_00026872.JPEG"
75
+ },
76
+ {
77
+ "idx": 11,
78
+ "caption": "a body of water",
79
+ "prompt": "a body of water, photorealistic, high detail",
80
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/001100_ILSVRC2012_val_00008791.JPEG"
81
+ },
82
+ {
83
+ "idx": 12,
84
+ "caption": "a dog in a pool",
85
+ "prompt": "a dog in a pool, photorealistic, high detail",
86
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv5/0_real/003956_ILSVRC2012_val_00024961.JPEG"
87
+ },
88
+ {
89
+ "idx": 13,
90
+ "caption": "two tools, one with a wren and the other with a wren",
91
+ "prompt": "two tools, one with a wren and the other with a wren, photorealistic, high detail",
92
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/002410_ILSVRC2012_val_00020055.JPEG"
93
+ },
94
+ {
95
+ "idx": 14,
96
+ "caption": "a black leather folder with a red trim",
97
+ "prompt": "a black leather folder with a red trim, photorealistic, high detail",
98
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/biggan/0_real/446--n02840245_7225.png"
99
+ },
100
+ {
101
+ "idx": 15,
102
+ "caption": "a small bird sitting on a wooden surface",
103
+ "prompt": "a small bird sitting on a wooden surface, photorealistic, high detail",
104
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/000105_ILSVRC2012_val_00000837.JPEG"
105
+ },
106
+ {
107
+ "idx": 16,
108
+ "caption": "mouse mouse on mouse mouse mouse",
109
+ "prompt": "mouse mouse on mouse mouse mouse, photorealistic, high detail",
110
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/000058_ILSVRC2012_val_00000430.JPEG"
111
+ },
112
+ {
113
+ "idx": 17,
114
+ "caption": "a small metal object on a wooden table",
115
+ "prompt": "a small metal object on a wooden table, photorealistic, high detail",
116
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/003751_ILSVRC2012_val_00030855.JPEG"
117
+ },
118
+ {
119
+ "idx": 18,
120
+ "caption": "an hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour",
121
+ "prompt": "an hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour, photorealistic, high detail",
122
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/002367_ILSVRC2012_val_00019475.JPEG"
123
+ },
124
+ {
125
+ "idx": 19,
126
+ "caption": "a white rabbit in a cage",
127
+ "prompt": "a white rabbit in a cage, photorealistic, high detail",
128
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/001872_ILSVRC2012_val_00015301.JPEG"
129
+ },
130
+ {
131
+ "idx": 20,
132
+ "caption": "a grass bug on a green leaf",
133
+ "prompt": "a grass bug on a green leaf, photorealistic, high detail",
134
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00032265.JPEG"
135
+ },
136
+ {
137
+ "idx": 21,
138
+ "caption": "a field of grass",
139
+ "prompt": "a field of grass, photorealistic, high detail",
140
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/001114_ILSVRC2012_val_00009176.JPEG"
141
+ },
142
+ {
143
+ "idx": 22,
144
+ "caption": "a black padlock with a key",
145
+ "prompt": "a black padlock with a key, photorealistic, high detail",
146
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/biggan/0_real/695--n03874599_4507.png"
147
+ },
148
+ {
149
+ "idx": 23,
150
+ "caption": "a group of balls",
151
+ "prompt": "a group of balls, photorealistic, high detail",
152
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/002837_ILSVRC2012_val_00024198.JPEG"
153
+ },
154
+ {
155
+ "idx": 24,
156
+ "caption": "three dogs standing on a hill",
157
+ "prompt": "three dogs standing on a hill, photorealistic, high detail",
158
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00022571.JPEG"
159
+ },
160
+ {
161
+ "idx": 25,
162
+ "caption": "a dog standing in a field",
163
+ "prompt": "a dog standing in a field, photorealistic, high detail",
164
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/004562_ILSVRC2012_val_00038455.JPEG"
165
+ },
166
+ {
167
+ "idx": 26,
168
+ "caption": "a pink toilet",
169
+ "prompt": "a pink toilet, photorealistic, high detail",
170
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/005007_ILSVRC2012_val_00042247.JPEG"
171
+ },
172
+ {
173
+ "idx": 27,
174
+ "caption": "the sky is cloudy",
175
+ "prompt": "the sky is cloudy, photorealistic, high detail",
176
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/003771_ILSVRC2012_val_00031161.JPEG"
177
+ },
178
+ {
179
+ "idx": 28,
180
+ "caption": "a bird is standing on the ground",
181
+ "prompt": "a bird is standing on the ground, photorealistic, high detail",
182
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/004662_ILSVRC2012_val_00039216.JPEG"
183
+ },
184
+ {
185
+ "idx": 29,
186
+ "caption": "a leopard sitting on a tree branch",
187
+ "prompt": "a leopard sitting on a tree branch, photorealistic, high detail",
188
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv5/0_real/006884_ILSVRC2012_val_00043117.JPEG"
189
+ },
190
+ {
191
+ "idx": 30,
192
+ "caption": "an old barn with a broken roof",
193
+ "prompt": "an old barn with a broken roof, photorealistic, high detail",
194
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/004995_ILSVRC2012_val_00041650.JPEG"
195
+ },
196
+ {
197
+ "idx": 31,
198
+ "caption": "a slug crawling on a concrete surface",
199
+ "prompt": "a slug crawling on a concrete surface, photorealistic, high detail",
200
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/000580_ILSVRC2012_val_00004691.JPEG"
201
+ },
202
+ {
203
+ "idx": 32,
204
+ "caption": "the three bottles of the serums are shown in the image",
205
+ "prompt": "the three bottles of the serums are shown in the image, photorealistic, high detail",
206
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/biggan/0_real/631--n03690938_23212.png"
207
+ },
208
+ {
209
+ "idx": 33,
210
+ "caption": "a bear cub",
211
+ "prompt": "a bear cub, photorealistic, high detail",
212
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/005149_ILSVRC2012_val_00043353.JPEG"
213
+ },
214
+ {
215
+ "idx": 34,
216
+ "caption": "a street with a yellow line painted on the road",
217
+ "prompt": "a street with a yellow line painted on the road, photorealistic, high detail",
218
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/crn/0_real/00102007.png"
219
+ },
220
+ {
221
+ "idx": 35,
222
+ "caption": "a lion fish swimming in the water",
223
+ "prompt": "a lion fish swimming in the water, photorealistic, high detail",
224
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/000092_ILSVRC2012_val_00000699.JPEG"
225
+ },
226
+ {
227
+ "idx": 36,
228
+ "caption": "a plastic container with food",
229
+ "prompt": "a plastic container with food, photorealistic, high detail",
230
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/gaugan/0_real/000000113589.png"
231
+ },
232
+ {
233
+ "idx": 37,
234
+ "caption": "a car is driving down a street in a city",
235
+ "prompt": "a car is driving down a street in a city, photorealistic, high detail",
236
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/crn/0_real/00103003.png"
237
+ },
238
+ {
239
+ "idx": 38,
240
+ "caption": "a wooden desk",
241
+ "prompt": "a wooden desk, photorealistic, high detail",
242
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/004470_ILSVRC2012_val_00037573.JPEG"
243
+ },
244
+ {
245
+ "idx": 39,
246
+ "caption": "a bird standing in the water",
247
+ "prompt": "a bird standing in the water, photorealistic, high detail",
248
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/001503_ILSVRC2012_val_00012618.JPEG"
249
+ },
250
+ {
251
+ "idx": 40,
252
+ "caption": "two parking meters",
253
+ "prompt": "two parking meters, photorealistic, high detail",
254
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/000019_ILSVRC2012_val_00000201.JPEG"
255
+ },
256
+ {
257
+ "idx": 41,
258
+ "caption": "a butterfly on a yellow flower",
259
+ "prompt": "a butterfly on a yellow flower, photorealistic, high detail",
260
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00006608.JPEG"
261
+ },
262
+ {
263
+ "idx": 42,
264
+ "caption": "a green snake on a rock",
265
+ "prompt": "a green snake on a rock, photorealistic, high detail",
266
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/000933_ILSVRC2012_val_00007877.JPEG"
267
+ },
268
+ {
269
+ "idx": 43,
270
+ "caption": "a green snake in a tree",
271
+ "prompt": "a green snake in a tree, photorealistic, high detail",
272
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00042162.JPEG"
273
+ },
274
+ {
275
+ "idx": 44,
276
+ "caption": "purple and gold beaded bracelet",
277
+ "prompt": "purple and gold beaded bracelet, photorealistic, high detail",
278
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/002068_ILSVRC2012_val_00017972.JPEG"
279
+ },
280
+ {
281
+ "idx": 45,
282
+ "caption": "a dog standing in the shade",
283
+ "prompt": "a dog standing in the shade, photorealistic, high detail",
284
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/005084_ILSVRC2012_val_00042318.JPEG"
285
+ },
286
+ {
287
+ "idx": 46,
288
+ "caption": "a cliff with a cliff face",
289
+ "prompt": "a cliff with a cliff face, photorealistic, high detail",
290
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00031528.JPEG"
291
+ },
292
+ {
293
+ "idx": 47,
294
+ "caption": "a dog laying in the grass",
295
+ "prompt": "a dog laying in the grass, photorealistic, high detail",
296
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv5/0_real/004359_ILSVRC2012_val_00027268.JPEG"
297
+ },
298
+ {
299
+ "idx": 48,
300
+ "caption": "a small dog sitting on a bench",
301
+ "prompt": "a small dog sitting on a bench, photorealistic, high detail",
302
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/005226_ILSVRC2012_val_00043233.JPEG"
303
+ },
304
+ {
305
+ "idx": 49,
306
+ "caption": "a dog standing on a hill",
307
+ "prompt": "a dog standing on a hill, photorealistic, high detail",
308
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/001612_ILSVRC2012_val_00013323.JPEG"
309
+ },
310
+ {
311
+ "idx": 50,
312
+ "caption": "a white plate with food on it",
313
+ "prompt": "a white plate with food on it, photorealistic, high detail",
314
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/001277_ILSVRC2012_val_00010872.JPEG"
315
+ },
316
+ {
317
+ "idx": 51,
318
+ "caption": "a wooden chair",
319
+ "prompt": "a wooden chair, photorealistic, high detail",
320
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/001537_ILSVRC2012_val_00012771.JPEG"
321
+ },
322
+ {
323
+ "idx": 52,
324
+ "caption": "a large church with a stained glass window",
325
+ "prompt": "a large church with a stained glass window, photorealistic, high detail",
326
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/003670_ILSVRC2012_val_00030337.JPEG"
327
+ },
328
+ {
329
+ "idx": 53,
330
+ "caption": "a dog running in the grass",
331
+ "prompt": "a dog running in the grass, photorealistic, high detail",
332
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/004349_ILSVRC2012_val_00035935.JPEG"
333
+ },
334
+ {
335
+ "idx": 54,
336
+ "caption": "a hand holding a hot dog with lete and lete",
337
+ "prompt": "a hand holding a hot dog with lete and lete, photorealistic, high detail",
338
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/gaugan/0_real/000000118367.png"
339
+ },
340
+ {
341
+ "idx": 55,
342
+ "caption": "a large satellite dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish",
343
+ "prompt": "a large satellite dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish, photorealistic, high detail",
344
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/004018_ILSVRC2012_val_00033065.JPEG"
345
+ },
346
+ {
347
+ "idx": 56,
348
+ "caption": "a brown dog with a long tongue",
349
+ "prompt": "a brown dog with a long tongue, photorealistic, high detail",
350
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/002541_ILSVRC2012_val_00021171.JPEG"
351
+ },
352
+ {
353
+ "idx": 57,
354
+ "caption": "a wooden bench",
355
+ "prompt": "a wooden bench, photorealistic, high detail",
356
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/002922_ILSVRC2012_val_00024245.JPEG"
357
+ },
358
+ {
359
+ "idx": 58,
360
+ "caption": "a white dog toy",
361
+ "prompt": "a white dog toy, photorealistic, high detail",
362
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/001637_ILSVRC2012_val_00013696.JPEG"
363
+ },
364
+ {
365
+ "idx": 59,
366
+ "caption": "a lake with trees and water in the background",
367
+ "prompt": "a lake with trees and water in the background, photorealistic, high detail",
368
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/003749_ILSVRC2012_val_00031159.JPEG"
369
+ },
370
+ {
371
+ "idx": 60,
372
+ "caption": "a crab crawling on the ground",
373
+ "prompt": "a crab crawling on the ground, photorealistic, high detail",
374
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/002813_ILSVRC2012_val_00023550.JPEG"
375
+ },
376
+ {
377
+ "idx": 61,
378
+ "caption": "a city street with a lot of buildings",
379
+ "prompt": "a city street with a lot of buildings, photorealistic, high detail",
380
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/imle/0_real/00103670.png"
381
+ },
382
+ {
383
+ "idx": 62,
384
+ "caption": "old wooden barrels stock photo, old wooden barrels by andy",
385
+ "prompt": "old wooden barrels stock photo, old wooden barrels by andy, photorealistic, high detail",
386
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/000703_ILSVRC2012_val_00005570.JPEG"
387
+ },
388
+ {
389
+ "idx": 63,
390
+ "caption": "a green beetle with red and green stripes",
391
+ "prompt": "a green beetle with red and green stripes, photorealistic, high detail",
392
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv5/0_real/006233_ILSVRC2012_val_00039157.JPEG"
393
+ },
394
+ {
395
+ "idx": 64,
396
+ "caption": "a plate of food",
397
+ "prompt": "a plate of food, photorealistic, high detail",
398
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/002016_ILSVRC2012_val_00016730.JPEG"
399
+ },
400
+ {
401
+ "idx": 65,
402
+ "caption": "a fish in a tank",
403
+ "prompt": "a fish in a tank, photorealistic, high detail",
404
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/001971_ILSVRC2012_val_00016470.JPEG"
405
+ },
406
+ {
407
+ "idx": 66,
408
+ "caption": "a street with a lot of luggage and palm trees",
409
+ "prompt": "a street with a lot of luggage and palm trees, photorealistic, high detail",
410
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/crn/0_real/00105512.png"
411
+ },
412
+ {
413
+ "idx": 67,
414
+ "caption": "a tree in the middle of a city",
415
+ "prompt": "a tree in the middle of a city, photorealistic, high detail",
416
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/imle/0_real/00100948.png"
417
+ },
418
+ {
419
+ "idx": 68,
420
+ "caption": "a kitchen with a large white island and a large window",
421
+ "prompt": "a kitchen with a large white island and a large window, photorealistic, high detail",
422
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/gaugan/0_real/000000458768.png"
423
+ },
424
+ {
425
+ "idx": 69,
426
+ "caption": "a small brown and black dog standing on a white surface",
427
+ "prompt": "a small brown and black dog standing on a white surface, photorealistic, high detail",
428
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/003964_ILSVRC2012_val_00033278.JPEG"
429
+ },
430
+ {
431
+ "idx": 70,
432
+ "caption": "a train on the tracks",
433
+ "prompt": "a train on the tracks, photorealistic, high detail",
434
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/005265_ILSVRC2012_val_00043551.JPEG"
435
+ },
436
+ {
437
+ "idx": 71,
438
+ "caption": "a large circular window",
439
+ "prompt": "a large circular window, photorealistic, high detail",
440
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/003867_ILSVRC2012_val_00032479.JPEG"
441
+ },
442
+ {
443
+ "idx": 72,
444
+ "caption": "a machine in a factory",
445
+ "prompt": "a machine in a factory, photorealistic, high detail",
446
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/004837_ILSVRC2012_val_00039836.JPEG"
447
+ },
448
+ {
449
+ "idx": 73,
450
+ "caption": "a red boat docked in a harbor",
451
+ "prompt": "a red boat docked in a harbor, photorealistic, high detail",
452
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/001452_ILSVRC2012_val_00012691.JPEG"
453
+ },
454
+ {
455
+ "idx": 74,
456
+ "caption": "a bird perched on a branch",
457
+ "prompt": "a bird perched on a branch, photorealistic, high detail",
458
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv5/0_real/004217_ILSVRC2012_val_00026362.JPEG"
459
+ },
460
+ {
461
+ "idx": 75,
462
+ "caption": "a large gray elephant",
463
+ "prompt": "a large gray elephant, photorealistic, high detail",
464
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/001980_ILSVRC2012_val_00016437.JPEG"
465
+ },
466
+ {
467
+ "idx": 76,
468
+ "caption": "a street with a star painted on the sidewalk",
469
+ "prompt": "a street with a star painted on the sidewalk, photorealistic, high detail",
470
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/imle/0_real/00101546.png"
471
+ },
472
+ {
473
+ "idx": 77,
474
+ "caption": "a fish in a tank with a fish inside",
475
+ "prompt": "a fish in a tank with a fish inside, photorealistic, high detail",
476
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/003951_ILSVRC2012_val_00033320.JPEG"
477
+ },
478
+ {
479
+ "idx": 78,
480
+ "caption": "a pot of soup",
481
+ "prompt": "a pot of soup, photorealistic, high detail",
482
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/002526_ILSVRC2012_val_00021615.JPEG"
483
+ },
484
+ {
485
+ "idx": 79,
486
+ "caption": "a bunch of bubbles",
487
+ "prompt": "a bunch of bubbles, photorealistic, high detail",
488
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/005966_ILSVRC2012_val_00049716.JPEG"
489
+ },
490
+ {
491
+ "idx": 80,
492
+ "caption": "a vase on display",
493
+ "prompt": "a vase on display, photorealistic, high detail",
494
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/005439_ILSVRC2012_val_00045714.JPEG"
495
+ },
496
+ {
497
+ "idx": 81,
498
+ "caption": "a toilet with a toilet seat and a toilet roll",
499
+ "prompt": "a toilet with a toilet seat and a toilet roll, photorealistic, high detail",
500
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/003325_ILSVRC2012_val_00028223.JPEG"
501
+ },
502
+ {
503
+ "idx": 82,
504
+ "caption": "a piece of food",
505
+ "prompt": "a piece of food, photorealistic, high detail",
506
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/001630_ILSVRC2012_val_00013254.JPEG"
507
+ },
508
+ {
509
+ "idx": 83,
510
+ "caption": "a car is parked in a street with a bus in the background",
511
+ "prompt": "a car is parked in a street with a bus in the background, photorealistic, high detail",
512
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/crn/0_real/00104005.png"
513
+ },
514
+ {
515
+ "idx": 84,
516
+ "caption": "a white car driving down a street next to a building",
517
+ "prompt": "a white car driving down a street next to a building, photorealistic, high detail",
518
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/imle/0_real/00105681.png"
519
+ },
520
+ {
521
+ "idx": 85,
522
+ "caption": "a small canal in venice, italy",
523
+ "prompt": "a small canal in venice, italy, photorealistic, high detail",
524
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/004284_ILSVRC2012_val_00035514.JPEG"
525
+ },
526
+ {
527
+ "idx": 86,
528
+ "caption": "a black velvet jacket",
529
+ "prompt": "a black velvet jacket, photorealistic, high detail",
530
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/003062_ILSVRC2012_val_00025342.JPEG"
531
+ },
532
+ {
533
+ "idx": 87,
534
+ "caption": "a bear is sitting in a tree branch",
535
+ "prompt": "a bear is sitting in a tree branch, photorealistic, high detail",
536
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/004938_ILSVRC2012_val_00041120.JPEG"
537
+ },
538
+ {
539
+ "idx": 88,
540
+ "caption": "a goat standing in the woods",
541
+ "prompt": "a goat standing in the woods, photorealistic, high detail",
542
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/000197_ILSVRC2012_val_00001705.JPEG"
543
+ },
544
+ {
545
+ "idx": 89,
546
+ "caption": "a military vehicle",
547
+ "prompt": "a military vehicle, photorealistic, high detail",
548
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/004633_ILSVRC2012_val_00039017.JPEG"
549
+ },
550
+ {
551
+ "idx": 90,
552
+ "caption": "a cup with a bunch of pencils in it",
553
+ "prompt": "a cup with a bunch of pencils in it, photorealistic, high detail",
554
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/002918_ILSVRC2012_val_00024434.JPEG"
555
+ },
556
+ {
557
+ "idx": 91,
558
+ "caption": "a jaguar in the water",
559
+ "prompt": "a jaguar in the water, photorealistic, high detail",
560
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/002525_ILSVRC2012_val_00021064.JPEG"
561
+ },
562
+ {
563
+ "idx": 92,
564
+ "caption": "a flower made out of felt and felt",
565
+ "prompt": "a flower made out of felt and felt, photorealistic, high detail",
566
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/003858_ILSVRC2012_val_00031978.JPEG"
567
+ },
568
+ {
569
+ "idx": 93,
570
+ "caption": "a dog with a pink shirt on",
571
+ "prompt": "a dog with a pink shirt on, photorealistic, high detail",
572
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/001164_ILSVRC2012_val_00009888.JPEG"
573
+ },
574
+ {
575
+ "idx": 94,
576
+ "caption": "a close up of a bug on a rock",
577
+ "prompt": "a close up of a bug on a rock, photorealistic, high detail",
578
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/004231_ILSVRC2012_val_00035409.JPEG"
579
+ },
580
+ {
581
+ "idx": 95,
582
+ "caption": "a close up of a bird with a yellow eye",
583
+ "prompt": "a close up of a bird with a yellow eye, photorealistic, high detail",
584
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/000274_ILSVRC2012_val_00002228.JPEG"
585
+ },
586
+ {
587
+ "idx": 96,
588
+ "caption": "a hyen walking down a dirt road",
589
+ "prompt": "a hyen walking down a dirt road, photorealistic, high detail",
590
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/002696_ILSVRC2012_val_00023004.JPEG"
591
+ },
592
+ {
593
+ "idx": 97,
594
+ "caption": "a col of pictures of food including vegetables and vegetables",
595
+ "prompt": "a col of pictures of food including vegetables and vegetables, photorealistic, high detail",
596
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/005131_ILSVRC2012_val_00042927.JPEG"
597
+ },
598
+ {
599
+ "idx": 98,
600
+ "caption": "a brown barn",
601
+ "prompt": "a brown barn, photorealistic, high detail",
602
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00014180.JPEG"
603
+ },
604
+ {
605
+ "idx": 99,
606
+ "caption": "a small black and white dog sitting on the ground",
607
+ "prompt": "a small black and white dog sitting on the ground, photorealistic, high detail",
608
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/004154_ILSVRC2012_val_00034951.JPEG"
609
+ }
610
+ ]
611
+ }
benchmark/generator_runs/qwen_image_2_1/results.json ADDED
@@ -0,0 +1,156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "detector": "co_spy",
4
+ "name": "CO-SPY",
5
+ "auroc": 98.87,
6
+ "ap": 98.7,
7
+ "acc": 95.5,
8
+ "fake_detect_rate": 94.0,
9
+ "real_false_pos": 3.0,
10
+ "mean_p_fake_on_fakes": 0.8087,
11
+ "mean_p_fake_on_reals": 0.116
12
+ },
13
+ {
14
+ "detector": "pgc",
15
+ "name": "PGC",
16
+ "auroc": 98.5,
17
+ "ap": 98.3,
18
+ "acc": 60.0,
19
+ "fake_detect_rate": 20.0,
20
+ "real_false_pos": 0.0,
21
+ "mean_p_fake_on_fakes": 0.4666,
22
+ "mean_p_fake_on_reals": 0.2672
23
+ },
24
+ {
25
+ "detector": "vib_net",
26
+ "name": "VIB-Net",
27
+ "auroc": 98.35,
28
+ "ap": 98.51,
29
+ "acc": 91.5,
30
+ "fake_detect_rate": 98.0,
31
+ "real_false_pos": 15.0,
32
+ "mean_p_fake_on_fakes": 0.9181,
33
+ "mean_p_fake_on_reals": 0.2277
34
+ },
35
+ {
36
+ "detector": "spai",
37
+ "name": "SPAI",
38
+ "auroc": 96.71,
39
+ "ap": 96.1,
40
+ "acc": 92.0,
41
+ "fake_detect_rate": 92.0,
42
+ "real_false_pos": 8.0,
43
+ "mean_p_fake_on_fakes": 0.8983,
44
+ "mean_p_fake_on_reals": 0.0778
45
+ },
46
+ {
47
+ "detector": "cure",
48
+ "name": "CuRe",
49
+ "auroc": 92.68,
50
+ "ap": 94.28,
51
+ "acc": 82.0,
52
+ "fake_detect_rate": 64.0,
53
+ "real_false_pos": 0.0,
54
+ "mean_p_fake_on_fakes": 0.6284,
55
+ "mean_p_fake_on_reals": 0.0129
56
+ },
57
+ {
58
+ "detector": "safe",
59
+ "name": "SAFE",
60
+ "auroc": 90.85,
61
+ "ap": 81.07,
62
+ "acc": 76.5,
63
+ "fake_detect_rate": 63.0,
64
+ "real_false_pos": 10.0,
65
+ "mean_p_fake_on_fakes": 0.6334,
66
+ "mean_p_fake_on_reals": 0.1425
67
+ },
68
+ {
69
+ "detector": "npr",
70
+ "name": "NPR",
71
+ "auroc": 89.67,
72
+ "ap": 83.06,
73
+ "acc": 78.0,
74
+ "fake_detect_rate": 99.0,
75
+ "real_false_pos": 43.0,
76
+ "mean_p_fake_on_fakes": 0.9944,
77
+ "mean_p_fake_on_reals": 0.4365
78
+ },
79
+ {
80
+ "detector": "aide",
81
+ "name": "AIDE",
82
+ "auroc": 89.42,
83
+ "ap": 82.41,
84
+ "acc": 60.0,
85
+ "fake_detect_rate": 27.0,
86
+ "real_false_pos": 7.0,
87
+ "mean_p_fake_on_fakes": 0.3517,
88
+ "mean_p_fake_on_reals": 0.1102
89
+ },
90
+ {
91
+ "detector": "fat_former",
92
+ "name": "FatFormer",
93
+ "auroc": 76.74,
94
+ "ap": 78.17,
95
+ "acc": 67.5,
96
+ "fake_detect_rate": 39.0,
97
+ "real_false_pos": 4.0,
98
+ "mean_p_fake_on_fakes": 0.3841,
99
+ "mean_p_fake_on_reals": 0.0412
100
+ },
101
+ {
102
+ "detector": "dinov3",
103
+ "name": "DINOv3 probe",
104
+ "auroc": 53.2,
105
+ "ap": 51.63,
106
+ "acc": 49.5,
107
+ "fake_detect_rate": 12.0,
108
+ "real_false_pos": 13.0,
109
+ "mean_p_fake_on_fakes": 0.2902,
110
+ "mean_p_fake_on_reals": 0.2792
111
+ },
112
+ {
113
+ "detector": "cnn",
114
+ "name": "CNNDetection (ResNet-50)",
115
+ "auroc": 52.52,
116
+ "ap": 52.58,
117
+ "acc": 50.0,
118
+ "fake_detect_rate": 1.0,
119
+ "real_false_pos": 1.0,
120
+ "mean_p_fake_on_fakes": 0.0126,
121
+ "mean_p_fake_on_reals": 0.0083
122
+ },
123
+ {
124
+ "detector": "clip",
125
+ "name": "UnivFD / CLIP",
126
+ "auroc": 50.11,
127
+ "ap": 50.43,
128
+ "acc": 48.5,
129
+ "fake_detect_rate": 4.0,
130
+ "real_false_pos": 7.0,
131
+ "mean_p_fake_on_fakes": 0.161,
132
+ "mean_p_fake_on_reals": 0.1656
133
+ },
134
+ {
135
+ "detector": "adapted_dino",
136
+ "name": "Adapter-tuned DINOv2",
137
+ "auroc": 49.15,
138
+ "ap": 49.17,
139
+ "acc": 50.0,
140
+ "fake_detect_rate": 0.0,
141
+ "real_false_pos": 0.0,
142
+ "mean_p_fake_on_fakes": 0.0,
143
+ "mean_p_fake_on_reals": 0.0
144
+ },
145
+ {
146
+ "detector": "dinov2",
147
+ "name": "DINOv2 probe",
148
+ "auroc": 44.69,
149
+ "ap": 46.44,
150
+ "acc": 47.0,
151
+ "fake_detect_rate": 7.0,
152
+ "real_false_pos": 13.0,
153
+ "mean_p_fake_on_fakes": 0.1279,
154
+ "mean_p_fake_on_reals": 0.1751
155
+ }
156
+ ]
benchmark/generator_runs/reference/manifest.json ADDED
@@ -0,0 +1,609 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "n": 100,
3
+ "steps": 28,
4
+ "res": 512,
5
+ "attempts": 271,
6
+ "pairs": [
7
+ {
8
+ "idx": 0,
9
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/003443_ILSVRC2012_val_00028605.JPEG",
10
+ "caption": "sheep is white",
11
+ "prompt": "sheep is white, photorealistic, high detail"
12
+ },
13
+ {
14
+ "idx": 1,
15
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/000582_ILSVRC2012_val_00004554.JPEG",
16
+ "caption": "a bird sitting on a branch in a tree",
17
+ "prompt": "a bird sitting on a branch in a tree, photorealistic, high detail"
18
+ },
19
+ {
20
+ "idx": 2,
21
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/002258_ILSVRC2012_val_00018535.JPEG",
22
+ "caption": "a green grasshopper on a leaf",
23
+ "prompt": "a green grasshopper on a leaf, photorealistic, high detail"
24
+ },
25
+ {
26
+ "idx": 3,
27
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00028778.JPEG",
28
+ "caption": "the bell is black",
29
+ "prompt": "the bell is black, photorealistic, high detail"
30
+ },
31
+ {
32
+ "idx": 4,
33
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/crn/0_real/00103410.png",
34
+ "caption": "a car driving down a city street in the middle of the day",
35
+ "prompt": "a car driving down a city street in the middle of the day, photorealistic, high detail"
36
+ },
37
+ {
38
+ "idx": 5,
39
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/003845_ILSVRC2012_val_00031963.JPEG",
40
+ "caption": "a dog is standing in the grass",
41
+ "prompt": "a dog is standing in the grass, photorealistic, high detail"
42
+ },
43
+ {
44
+ "idx": 6,
45
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/000784_ILSVRC2012_val_00006407.JPEG",
46
+ "caption": "a small kitten walking across a rocky beach",
47
+ "prompt": "a small kitten walking across a rocky beach, photorealistic, high detail"
48
+ },
49
+ {
50
+ "idx": 7,
51
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/000414_ILSVRC2012_val_00003305.JPEG",
52
+ "caption": "a mountain covered in snow",
53
+ "prompt": "a mountain covered in snow, photorealistic, high detail"
54
+ },
55
+ {
56
+ "idx": 8,
57
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00040977.JPEG",
58
+ "caption": "a sailer sailing in the ocean near a lighthouse",
59
+ "prompt": "a sailer sailing in the ocean near a lighthouse, photorealistic, high detail"
60
+ },
61
+ {
62
+ "idx": 9,
63
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv5/0_real/001588_ILSVRC2012_val_00009675.JPEG",
64
+ "caption": "a bowl of masoor",
65
+ "prompt": "a bowl of masoor, photorealistic, high detail"
66
+ },
67
+ {
68
+ "idx": 10,
69
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/003296_ILSVRC2012_val_00026872.JPEG",
70
+ "caption": "a green bird house",
71
+ "prompt": "a green bird house, photorealistic, high detail"
72
+ },
73
+ {
74
+ "idx": 11,
75
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/001100_ILSVRC2012_val_00008791.JPEG",
76
+ "caption": "a body of water",
77
+ "prompt": "a body of water, photorealistic, high detail"
78
+ },
79
+ {
80
+ "idx": 12,
81
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv5/0_real/003956_ILSVRC2012_val_00024961.JPEG",
82
+ "caption": "a dog in a pool",
83
+ "prompt": "a dog in a pool, photorealistic, high detail"
84
+ },
85
+ {
86
+ "idx": 13,
87
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/002410_ILSVRC2012_val_00020055.JPEG",
88
+ "caption": "two tools, one with a wren and the other with a wren",
89
+ "prompt": "two tools, one with a wren and the other with a wren, photorealistic, high detail"
90
+ },
91
+ {
92
+ "idx": 14,
93
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/biggan/0_real/446--n02840245_7225.png",
94
+ "caption": "a black leather folder with a red trim",
95
+ "prompt": "a black leather folder with a red trim, photorealistic, high detail"
96
+ },
97
+ {
98
+ "idx": 15,
99
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/000105_ILSVRC2012_val_00000837.JPEG",
100
+ "caption": "a small bird sitting on a wooden surface",
101
+ "prompt": "a small bird sitting on a wooden surface, photorealistic, high detail"
102
+ },
103
+ {
104
+ "idx": 16,
105
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/000058_ILSVRC2012_val_00000430.JPEG",
106
+ "caption": "mouse mouse on mouse mouse mouse",
107
+ "prompt": "mouse mouse on mouse mouse mouse, photorealistic, high detail"
108
+ },
109
+ {
110
+ "idx": 17,
111
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/003751_ILSVRC2012_val_00030855.JPEG",
112
+ "caption": "a small metal object on a wooden table",
113
+ "prompt": "a small metal object on a wooden table, photorealistic, high detail"
114
+ },
115
+ {
116
+ "idx": 18,
117
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/002367_ILSVRC2012_val_00019475.JPEG",
118
+ "caption": "an hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour",
119
+ "prompt": "an hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour hour, photorealistic, high detail"
120
+ },
121
+ {
122
+ "idx": 19,
123
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/001872_ILSVRC2012_val_00015301.JPEG",
124
+ "caption": "a white rabbit in a cage",
125
+ "prompt": "a white rabbit in a cage, photorealistic, high detail"
126
+ },
127
+ {
128
+ "idx": 20,
129
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00032265.JPEG",
130
+ "caption": "a grass bug on a green leaf",
131
+ "prompt": "a grass bug on a green leaf, photorealistic, high detail"
132
+ },
133
+ {
134
+ "idx": 21,
135
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/001114_ILSVRC2012_val_00009176.JPEG",
136
+ "caption": "a field of grass",
137
+ "prompt": "a field of grass, photorealistic, high detail"
138
+ },
139
+ {
140
+ "idx": 22,
141
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/biggan/0_real/695--n03874599_4507.png",
142
+ "caption": "a black padlock with a key",
143
+ "prompt": "a black padlock with a key, photorealistic, high detail"
144
+ },
145
+ {
146
+ "idx": 23,
147
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/002837_ILSVRC2012_val_00024198.JPEG",
148
+ "caption": "a group of balls",
149
+ "prompt": "a group of balls, photorealistic, high detail"
150
+ },
151
+ {
152
+ "idx": 24,
153
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00022571.JPEG",
154
+ "caption": "three dogs standing on a hill",
155
+ "prompt": "three dogs standing on a hill, photorealistic, high detail"
156
+ },
157
+ {
158
+ "idx": 25,
159
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/004562_ILSVRC2012_val_00038455.JPEG",
160
+ "caption": "a dog standing in a field",
161
+ "prompt": "a dog standing in a field, photorealistic, high detail"
162
+ },
163
+ {
164
+ "idx": 26,
165
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/005007_ILSVRC2012_val_00042247.JPEG",
166
+ "caption": "a pink toilet",
167
+ "prompt": "a pink toilet, photorealistic, high detail"
168
+ },
169
+ {
170
+ "idx": 27,
171
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/003771_ILSVRC2012_val_00031161.JPEG",
172
+ "caption": "the sky is cloudy",
173
+ "prompt": "the sky is cloudy, photorealistic, high detail"
174
+ },
175
+ {
176
+ "idx": 28,
177
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/004662_ILSVRC2012_val_00039216.JPEG",
178
+ "caption": "a bird is standing on the ground",
179
+ "prompt": "a bird is standing on the ground, photorealistic, high detail"
180
+ },
181
+ {
182
+ "idx": 29,
183
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv5/0_real/006884_ILSVRC2012_val_00043117.JPEG",
184
+ "caption": "a leopard sitting on a tree branch",
185
+ "prompt": "a leopard sitting on a tree branch, photorealistic, high detail"
186
+ },
187
+ {
188
+ "idx": 30,
189
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/004995_ILSVRC2012_val_00041650.JPEG",
190
+ "caption": "an old barn with a broken roof",
191
+ "prompt": "an old barn with a broken roof, photorealistic, high detail"
192
+ },
193
+ {
194
+ "idx": 31,
195
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/000580_ILSVRC2012_val_00004691.JPEG",
196
+ "caption": "a slug crawling on a concrete surface",
197
+ "prompt": "a slug crawling on a concrete surface, photorealistic, high detail"
198
+ },
199
+ {
200
+ "idx": 32,
201
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/biggan/0_real/631--n03690938_23212.png",
202
+ "caption": "the three bottles of the serums are shown in the image",
203
+ "prompt": "the three bottles of the serums are shown in the image, photorealistic, high detail"
204
+ },
205
+ {
206
+ "idx": 33,
207
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/005149_ILSVRC2012_val_00043353.JPEG",
208
+ "caption": "a bear cub",
209
+ "prompt": "a bear cub, photorealistic, high detail"
210
+ },
211
+ {
212
+ "idx": 34,
213
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/crn/0_real/00102007.png",
214
+ "caption": "a street with a yellow line painted on the road",
215
+ "prompt": "a street with a yellow line painted on the road, photorealistic, high detail"
216
+ },
217
+ {
218
+ "idx": 35,
219
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/000092_ILSVRC2012_val_00000699.JPEG",
220
+ "caption": "a lion fish swimming in the water",
221
+ "prompt": "a lion fish swimming in the water, photorealistic, high detail"
222
+ },
223
+ {
224
+ "idx": 36,
225
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/gaugan/0_real/000000113589.png",
226
+ "caption": "a plastic container with food",
227
+ "prompt": "a plastic container with food, photorealistic, high detail"
228
+ },
229
+ {
230
+ "idx": 37,
231
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/crn/0_real/00103003.png",
232
+ "caption": "a car is driving down a street in a city",
233
+ "prompt": "a car is driving down a street in a city, photorealistic, high detail"
234
+ },
235
+ {
236
+ "idx": 38,
237
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/004470_ILSVRC2012_val_00037573.JPEG",
238
+ "caption": "a wooden desk",
239
+ "prompt": "a wooden desk, photorealistic, high detail"
240
+ },
241
+ {
242
+ "idx": 39,
243
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/001503_ILSVRC2012_val_00012618.JPEG",
244
+ "caption": "a bird standing in the water",
245
+ "prompt": "a bird standing in the water, photorealistic, high detail"
246
+ },
247
+ {
248
+ "idx": 40,
249
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/000019_ILSVRC2012_val_00000201.JPEG",
250
+ "caption": "two parking meters",
251
+ "prompt": "two parking meters, photorealistic, high detail"
252
+ },
253
+ {
254
+ "idx": 41,
255
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00006608.JPEG",
256
+ "caption": "a butterfly on a yellow flower",
257
+ "prompt": "a butterfly on a yellow flower, photorealistic, high detail"
258
+ },
259
+ {
260
+ "idx": 42,
261
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/000933_ILSVRC2012_val_00007877.JPEG",
262
+ "caption": "a green snake on a rock",
263
+ "prompt": "a green snake on a rock, photorealistic, high detail"
264
+ },
265
+ {
266
+ "idx": 43,
267
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00042162.JPEG",
268
+ "caption": "a green snake in a tree",
269
+ "prompt": "a green snake in a tree, photorealistic, high detail"
270
+ },
271
+ {
272
+ "idx": 44,
273
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/002068_ILSVRC2012_val_00017972.JPEG",
274
+ "caption": "purple and gold beaded bracelet",
275
+ "prompt": "purple and gold beaded bracelet, photorealistic, high detail"
276
+ },
277
+ {
278
+ "idx": 45,
279
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/005084_ILSVRC2012_val_00042318.JPEG",
280
+ "caption": "a dog standing in the shade",
281
+ "prompt": "a dog standing in the shade, photorealistic, high detail"
282
+ },
283
+ {
284
+ "idx": 46,
285
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00031528.JPEG",
286
+ "caption": "a cliff with a cliff face",
287
+ "prompt": "a cliff with a cliff face, photorealistic, high detail"
288
+ },
289
+ {
290
+ "idx": 47,
291
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv5/0_real/004359_ILSVRC2012_val_00027268.JPEG",
292
+ "caption": "a dog laying in the grass",
293
+ "prompt": "a dog laying in the grass, photorealistic, high detail"
294
+ },
295
+ {
296
+ "idx": 48,
297
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/005226_ILSVRC2012_val_00043233.JPEG",
298
+ "caption": "a small dog sitting on a bench",
299
+ "prompt": "a small dog sitting on a bench, photorealistic, high detail"
300
+ },
301
+ {
302
+ "idx": 49,
303
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/001612_ILSVRC2012_val_00013323.JPEG",
304
+ "caption": "a dog standing on a hill",
305
+ "prompt": "a dog standing on a hill, photorealistic, high detail"
306
+ },
307
+ {
308
+ "idx": 50,
309
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/001277_ILSVRC2012_val_00010872.JPEG",
310
+ "caption": "a white plate with food on it",
311
+ "prompt": "a white plate with food on it, photorealistic, high detail"
312
+ },
313
+ {
314
+ "idx": 51,
315
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/001537_ILSVRC2012_val_00012771.JPEG",
316
+ "caption": "a wooden chair",
317
+ "prompt": "a wooden chair, photorealistic, high detail"
318
+ },
319
+ {
320
+ "idx": 52,
321
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/003670_ILSVRC2012_val_00030337.JPEG",
322
+ "caption": "a large church with a stained glass window",
323
+ "prompt": "a large church with a stained glass window, photorealistic, high detail"
324
+ },
325
+ {
326
+ "idx": 53,
327
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/004349_ILSVRC2012_val_00035935.JPEG",
328
+ "caption": "a dog running in the grass",
329
+ "prompt": "a dog running in the grass, photorealistic, high detail"
330
+ },
331
+ {
332
+ "idx": 54,
333
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/gaugan/0_real/000000118367.png",
334
+ "caption": "a hand holding a hot dog with lete and lete",
335
+ "prompt": "a hand holding a hot dog with lete and lete, photorealistic, high detail"
336
+ },
337
+ {
338
+ "idx": 55,
339
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/wukong/0_real/004018_ILSVRC2012_val_00033065.JPEG",
340
+ "caption": "a large satellite dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish",
341
+ "prompt": "a large satellite dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish dish, photorealistic, high detail"
342
+ },
343
+ {
344
+ "idx": 56,
345
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/002541_ILSVRC2012_val_00021171.JPEG",
346
+ "caption": "a brown dog with a long tongue",
347
+ "prompt": "a brown dog with a long tongue, photorealistic, high detail"
348
+ },
349
+ {
350
+ "idx": 57,
351
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/002922_ILSVRC2012_val_00024245.JPEG",
352
+ "caption": "a wooden bench",
353
+ "prompt": "a wooden bench, photorealistic, high detail"
354
+ },
355
+ {
356
+ "idx": 58,
357
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/001637_ILSVRC2012_val_00013696.JPEG",
358
+ "caption": "a white dog toy",
359
+ "prompt": "a white dog toy, photorealistic, high detail"
360
+ },
361
+ {
362
+ "idx": 59,
363
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/003749_ILSVRC2012_val_00031159.JPEG",
364
+ "caption": "a lake with trees and water in the background",
365
+ "prompt": "a lake with trees and water in the background, photorealistic, high detail"
366
+ },
367
+ {
368
+ "idx": 60,
369
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/002813_ILSVRC2012_val_00023550.JPEG",
370
+ "caption": "a crab crawling on the ground",
371
+ "prompt": "a crab crawling on the ground, photorealistic, high detail"
372
+ },
373
+ {
374
+ "idx": 61,
375
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/imle/0_real/00103670.png",
376
+ "caption": "a city street with a lot of buildings",
377
+ "prompt": "a city street with a lot of buildings, photorealistic, high detail"
378
+ },
379
+ {
380
+ "idx": 62,
381
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/000703_ILSVRC2012_val_00005570.JPEG",
382
+ "caption": "old wooden barrels stock photo, old wooden barrels by andy",
383
+ "prompt": "old wooden barrels stock photo, old wooden barrels by andy, photorealistic, high detail"
384
+ },
385
+ {
386
+ "idx": 63,
387
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv5/0_real/006233_ILSVRC2012_val_00039157.JPEG",
388
+ "caption": "a green beetle with red and green stripes",
389
+ "prompt": "a green beetle with red and green stripes, photorealistic, high detail"
390
+ },
391
+ {
392
+ "idx": 64,
393
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/002016_ILSVRC2012_val_00016730.JPEG",
394
+ "caption": "a plate of food",
395
+ "prompt": "a plate of food, photorealistic, high detail"
396
+ },
397
+ {
398
+ "idx": 65,
399
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/001971_ILSVRC2012_val_00016470.JPEG",
400
+ "caption": "a fish in a tank",
401
+ "prompt": "a fish in a tank, photorealistic, high detail"
402
+ },
403
+ {
404
+ "idx": 66,
405
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/crn/0_real/00105512.png",
406
+ "caption": "a street with a lot of luggage and palm trees",
407
+ "prompt": "a street with a lot of luggage and palm trees, photorealistic, high detail"
408
+ },
409
+ {
410
+ "idx": 67,
411
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/imle/0_real/00100948.png",
412
+ "caption": "a tree in the middle of a city",
413
+ "prompt": "a tree in the middle of a city, photorealistic, high detail"
414
+ },
415
+ {
416
+ "idx": 68,
417
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/gaugan/0_real/000000458768.png",
418
+ "caption": "a kitchen with a large white island and a large window",
419
+ "prompt": "a kitchen with a large white island and a large window, photorealistic, high detail"
420
+ },
421
+ {
422
+ "idx": 69,
423
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/003964_ILSVRC2012_val_00033278.JPEG",
424
+ "caption": "a small brown and black dog standing on a white surface",
425
+ "prompt": "a small brown and black dog standing on a white surface, photorealistic, high detail"
426
+ },
427
+ {
428
+ "idx": 70,
429
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/005265_ILSVRC2012_val_00043551.JPEG",
430
+ "caption": "a train on the tracks",
431
+ "prompt": "a train on the tracks, photorealistic, high detail"
432
+ },
433
+ {
434
+ "idx": 71,
435
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/003867_ILSVRC2012_val_00032479.JPEG",
436
+ "caption": "a large circular window",
437
+ "prompt": "a large circular window, photorealistic, high detail"
438
+ },
439
+ {
440
+ "idx": 72,
441
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/004837_ILSVRC2012_val_00039836.JPEG",
442
+ "caption": "a machine in a factory",
443
+ "prompt": "a machine in a factory, photorealistic, high detail"
444
+ },
445
+ {
446
+ "idx": 73,
447
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/001452_ILSVRC2012_val_00012691.JPEG",
448
+ "caption": "a red boat docked in a harbor",
449
+ "prompt": "a red boat docked in a harbor, photorealistic, high detail"
450
+ },
451
+ {
452
+ "idx": 74,
453
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv5/0_real/004217_ILSVRC2012_val_00026362.JPEG",
454
+ "caption": "a bird perched on a branch",
455
+ "prompt": "a bird perched on a branch, photorealistic, high detail"
456
+ },
457
+ {
458
+ "idx": 75,
459
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/001980_ILSVRC2012_val_00016437.JPEG",
460
+ "caption": "a large gray elephant",
461
+ "prompt": "a large gray elephant, photorealistic, high detail"
462
+ },
463
+ {
464
+ "idx": 76,
465
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/imle/0_real/00101546.png",
466
+ "caption": "a street with a star painted on the sidewalk",
467
+ "prompt": "a street with a star painted on the sidewalk, photorealistic, high detail"
468
+ },
469
+ {
470
+ "idx": 77,
471
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/003951_ILSVRC2012_val_00033320.JPEG",
472
+ "caption": "a fish in a tank with a fish inside",
473
+ "prompt": "a fish in a tank with a fish inside, photorealistic, high detail"
474
+ },
475
+ {
476
+ "idx": 78,
477
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/002526_ILSVRC2012_val_00021615.JPEG",
478
+ "caption": "a pot of soup",
479
+ "prompt": "a pot of soup, photorealistic, high detail"
480
+ },
481
+ {
482
+ "idx": 79,
483
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/005966_ILSVRC2012_val_00049716.JPEG",
484
+ "caption": "a bunch of bubbles",
485
+ "prompt": "a bunch of bubbles, photorealistic, high detail"
486
+ },
487
+ {
488
+ "idx": 80,
489
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/005439_ILSVRC2012_val_00045714.JPEG",
490
+ "caption": "a vase on display",
491
+ "prompt": "a vase on display, photorealistic, high detail"
492
+ },
493
+ {
494
+ "idx": 81,
495
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/003325_ILSVRC2012_val_00028223.JPEG",
496
+ "caption": "a toilet with a toilet seat and a toilet roll",
497
+ "prompt": "a toilet with a toilet seat and a toilet roll, photorealistic, high detail"
498
+ },
499
+ {
500
+ "idx": 82,
501
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/001630_ILSVRC2012_val_00013254.JPEG",
502
+ "caption": "a piece of food",
503
+ "prompt": "a piece of food, photorealistic, high detail"
504
+ },
505
+ {
506
+ "idx": 83,
507
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/crn/0_real/00104005.png",
508
+ "caption": "a car is parked in a street with a bus in the background",
509
+ "prompt": "a car is parked in a street with a bus in the background, photorealistic, high detail"
510
+ },
511
+ {
512
+ "idx": 84,
513
+ "real_src": "/hddstore/ssalehi/SynthScope/CNNDetection/test/imle/0_real/00105681.png",
514
+ "caption": "a white car driving down a street next to a building",
515
+ "prompt": "a white car driving down a street next to a building, photorealistic, high detail"
516
+ },
517
+ {
518
+ "idx": 85,
519
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/sdv4/0_real/004284_ILSVRC2012_val_00035514.JPEG",
520
+ "caption": "a small canal in venice, italy",
521
+ "prompt": "a small canal in venice, italy, photorealistic, high detail"
522
+ },
523
+ {
524
+ "idx": 86,
525
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/003062_ILSVRC2012_val_00025342.JPEG",
526
+ "caption": "a black velvet jacket",
527
+ "prompt": "a black velvet jacket, photorealistic, high detail"
528
+ },
529
+ {
530
+ "idx": 87,
531
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/004938_ILSVRC2012_val_00041120.JPEG",
532
+ "caption": "a bear is sitting in a tree branch",
533
+ "prompt": "a bear is sitting in a tree branch, photorealistic, high detail"
534
+ },
535
+ {
536
+ "idx": 88,
537
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/000197_ILSVRC2012_val_00001705.JPEG",
538
+ "caption": "a goat standing in the woods",
539
+ "prompt": "a goat standing in the woods, photorealistic, high detail"
540
+ },
541
+ {
542
+ "idx": 89,
543
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/004633_ILSVRC2012_val_00039017.JPEG",
544
+ "caption": "a military vehicle",
545
+ "prompt": "a military vehicle, photorealistic, high detail"
546
+ },
547
+ {
548
+ "idx": 90,
549
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/002918_ILSVRC2012_val_00024434.JPEG",
550
+ "caption": "a cup with a bunch of pencils in it",
551
+ "prompt": "a cup with a bunch of pencils in it, photorealistic, high detail"
552
+ },
553
+ {
554
+ "idx": 91,
555
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/002525_ILSVRC2012_val_00021064.JPEG",
556
+ "caption": "a jaguar in the water",
557
+ "prompt": "a jaguar in the water, photorealistic, high detail"
558
+ },
559
+ {
560
+ "idx": 92,
561
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/adm/0_real/003858_ILSVRC2012_val_00031978.JPEG",
562
+ "caption": "a flower made out of felt and felt",
563
+ "prompt": "a flower made out of felt and felt, photorealistic, high detail"
564
+ },
565
+ {
566
+ "idx": 93,
567
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/001164_ILSVRC2012_val_00009888.JPEG",
568
+ "caption": "a dog with a pink shirt on",
569
+ "prompt": "a dog with a pink shirt on, photorealistic, high detail"
570
+ },
571
+ {
572
+ "idx": 94,
573
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/midjourney/0_real/004231_ILSVRC2012_val_00035409.JPEG",
574
+ "caption": "a close up of a bug on a rock",
575
+ "prompt": "a close up of a bug on a rock, photorealistic, high detail"
576
+ },
577
+ {
578
+ "idx": 95,
579
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/vqdm/0_real/000274_ILSVRC2012_val_00002228.JPEG",
580
+ "caption": "a close up of a bird with a yellow eye",
581
+ "prompt": "a close up of a bird with a yellow eye, photorealistic, high detail"
582
+ },
583
+ {
584
+ "idx": 96,
585
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/biggan/0_real/002696_ILSVRC2012_val_00023004.JPEG",
586
+ "caption": "a hyen walking down a dirt road",
587
+ "prompt": "a hyen walking down a dirt road, photorealistic, high detail"
588
+ },
589
+ {
590
+ "idx": 97,
591
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/005131_ILSVRC2012_val_00042927.JPEG",
592
+ "caption": "a col of pictures of food including vegetables and vegetables",
593
+ "prompt": "a col of pictures of food including vegetables and vegetables, photorealistic, high detail"
594
+ },
595
+ {
596
+ "idx": 98,
597
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage/test/real/ILSVRC2012_val_00014180.JPEG",
598
+ "caption": "a brown barn",
599
+ "prompt": "a brown barn, photorealistic, high detail"
600
+ },
601
+ {
602
+ "idx": 99,
603
+ "real_src": "/hddstore/ssalehi/SynthScope/GenImage_full/test_full/glide/0_real/004154_ILSVRC2012_val_00034951.JPEG",
604
+ "caption": "a small black and white dog sitting on the ground",
605
+ "prompt": "a small black and white dog sitting on the ground, photorealistic, high detail"
606
+ }
607
+ ],
608
+ "label": "Ideogram 4.0 (512px)"
609
+ }
benchmark/leaderboard.py ADDED
@@ -0,0 +1,160 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Validate benchmark submissions and render the leaderboard.
2
+
3
+ python benchmark/leaderboard.py # write LEADERBOARD.md
4
+ python benchmark/leaderboard.py --check # CI: non-zero exit if invalid or stale
5
+
6
+ Output is deterministic (no timestamps) so ``--check`` is a stable up-to-date test.
7
+ """
8
+ from __future__ import annotations
9
+
10
+ import argparse
11
+ import json
12
+ import sys
13
+ from pathlib import Path
14
+
15
+ BENCH_DIR = Path(__file__).resolve().parent
16
+ SUBMISSIONS_DIR = BENCH_DIR / "submissions"
17
+ LEADERBOARD_MD = BENCH_DIR.parent / "LEADERBOARD.md"
18
+
19
+ # Track order, titles, and the metric each track ranks by.
20
+ TRACKS = {
21
+ "forensynths": {
22
+ "title": "ForenSynths — image (ProGAN-trained, cross-generator)",
23
+ "primary": "map", "modality": "image",
24
+ },
25
+ "genimage-sdv1.4": {
26
+ "title": "GenImage SD-v1.4 — image", "primary": "auroc", "modality": "image",
27
+ },
28
+ "genvideo-val": {
29
+ "title": "GenVideo-Val — video", "primary": "ap", "modality": "video",
30
+ },
31
+ }
32
+ METRIC_COLS = [("acc", "Acc"), ("map", "mAP"), ("ap", "AP"), ("auroc", "AUROC")]
33
+ EVALUATIONS = {"official-weights", "from-scratch", "frozen-probe", "training-free", "external"}
34
+ MODALITIES = {"image", "video"}
35
+ REQUIRED = ["method", "track", "modality", "evaluation", "metrics", "submitted_by"]
36
+
37
+
38
+ def validate(sub: dict, where: str) -> list[str]:
39
+ """Return a list of human-readable errors for one submission (empty = valid)."""
40
+ errs = []
41
+ for k in REQUIRED:
42
+ if k not in sub:
43
+ errs.append(f"missing required field '{k}'")
44
+ if sub.get("track") not in TRACKS:
45
+ errs.append(f"track '{sub.get('track')}' not in {sorted(TRACKS)}")
46
+ if sub.get("modality") not in MODALITIES:
47
+ errs.append(f"modality '{sub.get('modality')}' not in {sorted(MODALITIES)}")
48
+ if sub.get("evaluation") not in EVALUATIONS:
49
+ errs.append(f"evaluation '{sub.get('evaluation')}' not in {sorted(EVALUATIONS)}")
50
+ metrics = sub.get("metrics")
51
+ if not isinstance(metrics, dict):
52
+ errs.append("'metrics' must be an object")
53
+ else:
54
+ vals = [metrics.get(m) for m, _ in METRIC_COLS]
55
+ if not any(isinstance(v, (int, float)) for v in vals):
56
+ errs.append("'metrics' needs at least one numeric value among acc/map/ap/auroc")
57
+ return [f"{where}: {e}" for e in errs]
58
+
59
+
60
+ def load_submissions():
61
+ """Return (valid_submissions, errors)."""
62
+ subs, errors = [], []
63
+ for path in sorted(SUBMISSIONS_DIR.glob("*.json")):
64
+ try:
65
+ sub = json.loads(path.read_text())
66
+ except json.JSONDecodeError as exc:
67
+ errors.append(f"{path.name}: invalid JSON ({exc})")
68
+ continue
69
+ errs = validate(sub, path.name)
70
+ if errs:
71
+ errors.extend(errs)
72
+ continue
73
+ sub["_file"] = path.name
74
+ subs.append(sub)
75
+ return subs, errors
76
+
77
+
78
+ def _fmt(v) -> str:
79
+ return f"{v:.2f}" if isinstance(v, (int, float)) else "—"
80
+
81
+
82
+ def _sort_key(sub, primary):
83
+ v = sub.get("metrics", {}).get(primary)
84
+ # rank desc by primary; missing primary sorts last
85
+ return (0, -v) if isinstance(v, (int, float)) else (1, 0.0)
86
+
87
+
88
+ def render() -> str:
89
+ subs, errors = load_submissions()
90
+ lines = [
91
+ "# SynthScope Leaderboard (v1)", "",
92
+ "_Auto-generated by `benchmark/leaderboard.py` — do not edit by hand._ "
93
+ "See [benchmark/README.md](benchmark/README.md) for the protocol and how to submit.",
94
+ "", "This is the **standardized, versioned** table: a few tracks with a fixed protocol that anyone can submit to. The web page's **Leaderboard** tab is broader (every paper benchmark, 30+ groups) and the repo supports many more datasets, which download and organize themselves: see [docs/BENCHMARKS.md](docs/BENCHMARKS.md).", "",
95
+ "Metrics are percentages. **mAP** = mean AP over generators. Each track is ranked by "
96
+ "its primary metric (in bold).", "",
97
+ ]
98
+ for track_id, cfg in TRACKS.items():
99
+ rows = [s for s in subs if s.get("track") == track_id]
100
+ primary = cfg["primary"]
101
+ header_cells = ["Rank", "Method", "Eval"]
102
+ for key, label in METRIC_COLS:
103
+ header_cells.append(f"**{label}**" if key == primary else label)
104
+ header_cells += ["Verified", "Notes"]
105
+ lines.append(f"## {cfg['title']}")
106
+ lines.append("")
107
+ if not rows:
108
+ lines += ["_No submissions yet._", ""]
109
+ continue
110
+ rows.sort(key=lambda s: _sort_key(s, primary))
111
+ lines.append("| " + " | ".join(header_cells) + " |")
112
+ lines.append("| " + " | ".join(["---"] * len(header_cells)) + " |")
113
+ for i, s in enumerate(rows, 1):
114
+ m = s.get("metrics", {})
115
+ cells = [str(i), s["method"], s["evaluation"]]
116
+ cells += [_fmt(m.get(key)) for key, _ in METRIC_COLS]
117
+ cells.append("✓" if s.get("verified") else "")
118
+ note = s.get("protocol_notes") or ""
119
+ cells.append(note.replace("|", "/"))
120
+ lines.append("| " + " | ".join(cells) + " |")
121
+ lines.append("")
122
+ if errors:
123
+ lines += ["## ⚠️ Invalid submissions", ""] + [f"- {e}" for e in errors] + [""]
124
+ return "\n".join(lines).rstrip() + "\n"
125
+
126
+
127
+ def main(argv=None) -> int:
128
+ ap = argparse.ArgumentParser(description="Build/validate the SynthScope leaderboard.")
129
+ ap.add_argument("--check", action="store_true",
130
+ help="validate submissions and verify LEADERBOARD.md is up to date (CI)")
131
+ args = ap.parse_args(argv)
132
+
133
+ subs, errors = load_submissions()
134
+ content = render()
135
+
136
+ if args.check:
137
+ ok = True
138
+ if errors:
139
+ print("Invalid submissions:", file=sys.stderr)
140
+ for e in errors:
141
+ print(f" - {e}", file=sys.stderr)
142
+ ok = False
143
+ current = LEADERBOARD_MD.read_text() if LEADERBOARD_MD.exists() else ""
144
+ if current != content:
145
+ print("LEADERBOARD.md is stale — run `python benchmark/leaderboard.py`.", file=sys.stderr)
146
+ ok = False
147
+ if ok:
148
+ print(f"OK: {len(subs)} submissions, leaderboard up to date.")
149
+ return 0 if ok else 1
150
+
151
+ LEADERBOARD_MD.write_text(content)
152
+ print(f"Wrote {LEADERBOARD_MD} ({len(subs)} submissions"
153
+ + (f", {len(errors)} invalid" if errors else "") + ").")
154
+ for e in errors:
155
+ print(f" invalid: {e}")
156
+ return 0
157
+
158
+
159
+ if __name__ == "__main__":
160
+ raise SystemExit(main())
benchmark/schema.json ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "SynthScope benchmark submission (v1)",
4
+ "description": "One result for one (method, track). Lives in benchmark/submissions/*.json.",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["method", "track", "modality", "evaluation", "metrics", "submitted_by"],
8
+ "properties": {
9
+ "method": {"type": "string", "description": "Human-readable method name."},
10
+ "track": {"type": "string", "enum": ["forensynths", "genimage-sdv1.4", "genvideo-val"]},
11
+ "modality": {"type": "string", "enum": ["image", "video"]},
12
+ "model_type": {"type": ["string", "null"], "description": "SynthScope detector key, if applicable."},
13
+ "paper": {"type": ["string", "null"]},
14
+ "url": {"type": ["string", "null"], "description": "Paper or code URL."},
15
+ "evaluation": {
16
+ "type": "string",
17
+ "enum": ["official-weights", "from-scratch", "frozen-probe", "training-free", "external"]
18
+ },
19
+ "metrics": {
20
+ "type": "object",
21
+ "additionalProperties": false,
22
+ "description": "Percentages (0-100). At least one must be non-null.",
23
+ "properties": {
24
+ "acc": {"type": ["number", "null"]},
25
+ "map": {"type": ["number", "null"], "description": "mean AP over generators"},
26
+ "ap": {"type": ["number", "null"]},
27
+ "auroc": {"type": ["number", "null"]}
28
+ }
29
+ },
30
+ "per_generator": {
31
+ "type": ["object", "null"],
32
+ "description": "Optional per-generator metric breakdown."
33
+ },
34
+ "submitted_by": {"type": "string"},
35
+ "date": {"type": ["string", "null"], "description": "YYYY-MM-DD."},
36
+ "verified": {"type": "boolean", "description": "Traces to a logged SynthScope evaluation."},
37
+ "source": {"type": ["string", "null"], "description": "Log / run path or external reference."},
38
+ "protocol_notes": {"type": ["string", "null"]},
39
+ "synthscope_version": {"type": ["string", "null"]}
40
+ }
41
+ }
benchmark/seed_reference_results.py ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Generate the reference (already-reproduced) leaderboard submissions.
2
+
3
+ Every number here is **transcribed from the verified reproduction table in the repo README**
4
+ (each traces to a logged `Test Metrics` evaluation; see `repro/FINAL_RESULTS.md`). No number is
5
+ estimated. Re-run to regenerate `submissions/*.json`:
6
+
7
+ python benchmark/seed_reference_results.py
8
+ """
9
+ import json
10
+ from pathlib import Path
11
+
12
+ SUB = Path(__file__).resolve().parent / "submissions"
13
+ REPO = "https://github.com/SMSD75/SynthScope"
14
+ SOURCE = "SynthScope reproduction (logged Test Metrics); see repro/FINAL_RESULTS.md"
15
+ DATE = "2026-06-02"
16
+
17
+ # (slug, method, track, modality, model_type, paper, evaluation, metrics, protocol_notes)
18
+ ROWS = [
19
+ # --- ForenSynths (image) ---
20
+ ("fat_former", "FatFormer", "forensynths", "image", "fat_former", "Liu et al., CVPR'24",
21
+ "official-weights", {"acc": 98.39, "map": 99.70}, "ForenSynths-8 subset; official released weights"),
22
+ ("co_spy_official", "CO-SPY (official weights)", "forensynths", "image", "co_spy", "Cheng et al., CVPR'25",
23
+ "official-weights", {"acc": 95.12, "map": 98.71}, "ForenSynths-8; vendored official architecture"),
24
+ ("npr", "NPR", "forensynths", "image", "npr", "Tan et al., CVPR'24",
25
+ "official-weights", {"acc": 91.83, "map": 87.09}, "ForenSynths-8; official ProGAN weights"),
26
+ ("aide", "AIDE", "forensynths", "image", "aide", "Yan et al., ICLR'25",
27
+ "official-weights", {"map": 92.08}, "ForenSynths-8; mAP reproduces, acc@0.5 miscalibrated (single-view vs official 5-view DCT)"),
28
+ ("clip", "UnivFD / CLIP", "forensynths", "image", "clip", "Ojha et al., CVPR'23",
29
+ "frozen-probe", {"map": 97.2, "auroc": 97.0}, "ForenSynths; frozen CLIP ViT-L/14 probe (ProGAN)"),
30
+ ("cnn", "CNNDetection", "forensynths", "image", "cnn", "Wang et al., CVPR'20",
31
+ "from-scratch", {"map": 96.8, "auroc": 96.6}, "ForenSynths; ResNet-50 fine-tune (ProGAN)"),
32
+ ("dinov2", "DINOv2 probe", "forensynths", "image", "dinov2", "Oquab et al., 2023",
33
+ "frozen-probe", {"map": 95.03, "auroc": 94.86}, "ForenSynths; frozen DINOv2 ViT-L/14 probe"),
34
+ ("safe", "SAFE", "forensynths", "image", "safe", "Li et al., KDD'25",
35
+ "from-scratch", {"map": 94.13, "auroc": 93.68}, "ForenSynths; trained from scratch"),
36
+ ("co_spy_scratch", "CO-SPY (from scratch)", "forensynths", "image", "co_spy", "Cheng et al., CVPR'25",
37
+ "from-scratch", {"map": 96.98, "auroc": 96.79}, "ForenSynths; SynthScope re-implementation trained on ProGAN"),
38
+ # --- GenImage SD-v1.4 (image) ---
39
+ ("spai_official", "SPAI (official weights)", "genimage-sdv1.4", "image", "spai", "Karageorgiou et al., CVPR'25",
40
+ "official-weights", {"auroc": 98.45, "ap": 94.01}, "GenImage SD-v1.4; vendored official architecture, fixed-res 2x2x224"),
41
+ ("vib_net", "VIB-Net", "genimage-sdv1.4", "image", "vib_net", "Zhang et al., CVPR'25",
42
+ "from-scratch", {"map": 99.33, "auroc": 99.33}, "GenImage SD-v1.4 single real/fake pool (mAP == AUROC by construction)"),
43
+ ("spai_scratch", "SPAI (from scratch)", "genimage-sdv1.4", "image", "spai", "Karageorgiou et al., CVPR'25",
44
+ "from-scratch", {"auroc": 97.66}, "DMID Latent-Diffusion vs COCO; SynthScope fixed-resolution variant"),
45
+ # --- GenVideo-Val (video) ---
46
+ ("d3", "D3", "genvideo-val", "video", "d3", "ICCV'25",
47
+ "training-free", {"ap": 95.6, "auroc": 93.6}, "Training-free frozen CLIP 2nd-order trajectory"),
48
+ ("restrav", "ReStraV", "genvideo-val", "video", "restrav", "2025",
49
+ "frozen-probe", {"ap": 96.67, "auroc": 97.06}, "Frozen DINOv2 trajectory geometry + MLP"),
50
+ ]
51
+
52
+ METRIC_KEYS = ["acc", "map", "ap", "auroc"]
53
+
54
+
55
+ def main() -> None:
56
+ SUB.mkdir(parents=True, exist_ok=True)
57
+ for slug, method, track, modality, model_type, paper, evaluation, metrics, notes in ROWS:
58
+ full_metrics = {k: metrics.get(k) for k in METRIC_KEYS}
59
+ sub = {
60
+ "method": method, "track": track, "modality": modality, "model_type": model_type,
61
+ "paper": paper, "url": REPO, "evaluation": evaluation, "metrics": full_metrics,
62
+ "per_generator": None, "submitted_by": "SynthScope", "date": DATE,
63
+ "verified": True, "source": SOURCE, "protocol_notes": notes, "synthscope_version": "0.1.0",
64
+ }
65
+ (SUB / f"{slug}.json").write_text(json.dumps(sub, indent=2) + "\n")
66
+ print(f"Wrote {len(ROWS)} reference submissions to {SUB}")
67
+
68
+
69
+ if __name__ == "__main__":
70
+ main()
benchmark/submissions/aide.json ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "method": "AIDE",
3
+ "track": "forensynths",
4
+ "modality": "image",
5
+ "model_type": "aide",
6
+ "paper": "Yan et al., ICLR'25",
7
+ "url": "https://github.com/SMSD75/SynthScope",
8
+ "evaluation": "official-weights",
9
+ "metrics": {
10
+ "acc": null,
11
+ "map": 92.08,
12
+ "ap": null,
13
+ "auroc": null
14
+ },
15
+ "per_generator": null,
16
+ "submitted_by": "SynthScope",
17
+ "date": "2026-06-02",
18
+ "verified": true,
19
+ "source": "SynthScope reproduction (logged Test Metrics); see repro/FINAL_RESULTS.md",
20
+ "protocol_notes": "ForenSynths-8; mAP reproduces, acc@0.5 miscalibrated (single-view vs official 5-view DCT)",
21
+ "synthscope_version": "0.1.0"
22
+ }
benchmark/submissions/clip.json ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "method": "UnivFD / CLIP",
3
+ "track": "forensynths",
4
+ "modality": "image",
5
+ "model_type": "clip",
6
+ "paper": "Ojha et al., CVPR'23",
7
+ "url": "https://github.com/SMSD75/SynthScope",
8
+ "evaluation": "frozen-probe",
9
+ "metrics": {
10
+ "acc": null,
11
+ "map": 97.2,
12
+ "ap": null,
13
+ "auroc": 97.0
14
+ },
15
+ "per_generator": null,
16
+ "submitted_by": "SynthScope",
17
+ "date": "2026-06-02",
18
+ "verified": true,
19
+ "source": "SynthScope reproduction (logged Test Metrics); see repro/FINAL_RESULTS.md",
20
+ "protocol_notes": "ForenSynths; frozen CLIP ViT-L/14 probe (ProGAN)",
21
+ "synthscope_version": "0.1.0"
22
+ }
benchmark/submissions/cnn.json ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "method": "CNNDetection",
3
+ "track": "forensynths",
4
+ "modality": "image",
5
+ "model_type": "cnn",
6
+ "paper": "Wang et al., CVPR'20",
7
+ "url": "https://github.com/SMSD75/SynthScope",
8
+ "evaluation": "from-scratch",
9
+ "metrics": {
10
+ "acc": null,
11
+ "map": 96.8,
12
+ "ap": null,
13
+ "auroc": 96.6
14
+ },
15
+ "per_generator": null,
16
+ "submitted_by": "SynthScope",
17
+ "date": "2026-06-02",
18
+ "verified": true,
19
+ "source": "SynthScope reproduction (logged Test Metrics); see repro/FINAL_RESULTS.md",
20
+ "protocol_notes": "ForenSynths; ResNet-50 fine-tune (ProGAN)",
21
+ "synthscope_version": "0.1.0"
22
+ }
benchmark/submissions/co_spy_official.json ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "method": "CO-SPY (official weights)",
3
+ "track": "forensynths",
4
+ "modality": "image",
5
+ "model_type": "co_spy",
6
+ "paper": "Cheng et al., CVPR'25",
7
+ "url": "https://github.com/SMSD75/SynthScope",
8
+ "evaluation": "official-weights",
9
+ "metrics": {
10
+ "acc": 95.12,
11
+ "map": 98.71,
12
+ "ap": null,
13
+ "auroc": null
14
+ },
15
+ "per_generator": null,
16
+ "submitted_by": "SynthScope",
17
+ "date": "2026-06-02",
18
+ "verified": true,
19
+ "source": "SynthScope reproduction (logged Test Metrics); see repro/FINAL_RESULTS.md",
20
+ "protocol_notes": "ForenSynths-8; vendored official architecture",
21
+ "synthscope_version": "0.1.0"
22
+ }