File size: 3,426 Bytes
cd24b4a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# Contributing to SynthScope

Thanks for your interest! SynthScope aims to be the **unified, reproducible benchmark** for
AI-generated image & video detection. The most valuable contributions are **new detectors**,
**new datasets/generators**, and **independently reproduced results**.

## Getting set up

```bash
git clone https://github.com/SMSD75/SynthScope.git
cd SynthScope
pip install -e ".[dev]"          # editable install + contributor tooling
# PyTorch: install the build matching your CUDA from https://pytorch.org if needed.
# Some detectors also need OpenAI CLIP:  pip install git+https://github.com/openai/CLIP.git
```

Before opening a PR:

```bash
ruff check synthscope                   # lint the library surface (errors only; see pyproject [tool.ruff])
python -m compileall synthscope interface models *.py
pytest tests/ -k smoke            # where data/weights are available
```

## Adding a new detector

The framework is model-agnostic: the trainer only needs a `compute_loss(batch)` method, where a
batch is `(image, label, folder_id)` and `folder_id` is the generator/source used for
per-generator metrics. To add a method `foo`:

1. **Model** β€” create `models/<image|video>/foo/foo.py` with an `nn.Module` exposing
   `compute_loss(batch) -> {"loss": ..., "outputs": ...}`. Add a short method `README.md`.
2. **Dispatch** β€” register `model_type=foo` in `SynthScopeModelTrainer._build_model` (`trainer.py`).
3. **Config** β€” add `conf/model/<modality>/foo.yaml` and `conf/trainer/<modality>/foo.yaml`.
4. **Recipe** β€” add `experiments/<modality>/foo.sh` with the env vars + launch command.
5. **(Optional) API/demo** β€” add a `ModelSpec` to `interface/backend/registry.py` so the detector
   is runnable via `synthscope.load("foo")`, the CLI, and the web demo (preprocessing, checkpoint +
   any official-weights remap, and the forward β†’ P(fake) convention).
6. **Results** β€” run it and paste the logged `Test Metrics` in the PR. New numbers should trace to
   a real run, never be estimated (see the reproduction table convention in the README).

## Adding a dataset

Add a `dataset` class + data module in `dataset.py` (auto-download β†’ common `real`/`fake` layout)
and a `conf/dataset/<modality>/<name>.yaml`. Keep paths overridable via config/env β€” no hard-coded
absolute paths.

## Submitting a benchmark result

Add one JSON file under [`benchmark/submissions/`](benchmark/submissions/) (see
[`benchmark/schema.json`](benchmark/schema.json) and the protocol in
[`benchmark/README.md`](benchmark/README.md)). Prefer `verified` results produced by
`benchmark/evaluate.py`; for `external` numbers, set `source`. Regenerate and commit the table:

```bash
python benchmark/evaluate.py --model <key> --track <track> --data <root> --out benchmark/submissions/<key>.json
python benchmark/leaderboard.py        # updates LEADERBOARD.md
python benchmark/leaderboard.py --check  # what CI runs
```

## Style

- Match the surrounding code; keep imports and helper/class definitions at module top level.
- Keep changes focused; one detector/dataset/fix per PR.
- Be honest about faithfulness: if a re-implementation diverges from the paper, document it (as the
  reproduction notes already do).

## Reporting bugs / proposing features

Use the issue templates. For questions, open a Discussion. By contributing you agree your work is
licensed under the project's [Apache-2.0 license](LICENSE).