Spaces:
Running on CPU Upgrade
Running on CPU Upgrade
Update SynthScope Space from the GitHub repository
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- .env.example +17 -0
- .gitattributes +5 -0
- .github/ISSUE_TEMPLATE/bug_report.yml +39 -0
- .github/ISSUE_TEMPLATE/config.yml +5 -0
- .github/ISSUE_TEMPLATE/feature_request.yml +27 -0
- .github/PULL_REQUEST_TEMPLATE.md +24 -0
- .github/workflows/ci.yml +58 -0
- .gitignore +32 -0
- AGENTS.md +5 -0
- CITATION.cff +24 -0
- CODE_OF_CONDUCT.md +33 -0
- CONTRIBUTING.md +71 -0
- Dockerfile +21 -0
- LEADERBOARD.md +36 -0
- LICENSE +201 -0
- LICENSES.md +65 -0
- README.md +16 -4
- TRENDING.md +84 -0
- _synthscope_env.py +19 -0
- accelerate_config.yaml +19 -0
- agid/__init__.py +13 -0
- agid/__main__.py +5 -0
- benchmark/README.md +82 -0
- benchmark/aggregate_results.py +102 -0
- benchmark/bench_eval.py +305 -0
- benchmark/bench_eval_video.py +181 -0
- benchmark/datasets_util.py +99 -0
- benchmark/download_dataset.py +60 -0
- benchmark/evaluate.py +191 -0
- benchmark/generator_bench.py +208 -0
- benchmark/generator_runs/_test_qwen/RESULTS.md +19 -0
- benchmark/generator_runs/_test_qwen/manifest.json +29 -0
- benchmark/generator_runs/_test_qwen/results.json +145 -0
- benchmark/generator_runs/flux2_klein_4b/RESULTS.md +20 -0
- benchmark/generator_runs/flux2_klein_4b/manifest.json +611 -0
- benchmark/generator_runs/flux2_klein_4b/results.json +156 -0
- benchmark/generator_runs/flux2_klein_9b/RESULTS.md +20 -0
- benchmark/generator_runs/flux2_klein_9b/manifest.json +611 -0
- benchmark/generator_runs/flux2_klein_9b/results.json +156 -0
- benchmark/generator_runs/qwen_image_2_1/RESULTS.md +20 -0
- benchmark/generator_runs/qwen_image_2_1/manifest.json +611 -0
- benchmark/generator_runs/qwen_image_2_1/results.json +156 -0
- benchmark/generator_runs/reference/manifest.json +609 -0
- benchmark/leaderboard.py +160 -0
- benchmark/schema.json +41 -0
- benchmark/seed_reference_results.py +70 -0
- benchmark/submissions/aide.json +22 -0
- benchmark/submissions/clip.json +22 -0
- benchmark/submissions/cnn.json +22 -0
- 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:
|
| 5 |
-
colorTo:
|
| 6 |
sdk: docker
|
|
|
|
| 7 |
pinned: false
|
|
|
|
|
|
|
| 8 |
---
|
| 9 |
|
| 10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
+
}
|