[build-system] requires = ["setuptools>=64", "wheel"] build-backend = "setuptools.build_meta" [project] name = "synthscope" version = "0.1.0" description = "A unified library and benchmark for AI-generated image & video detection." readme = "README.md" requires-python = ">=3.10" license = { text = "Apache-2.0" } authors = [{ name = "Seyed Salehi Dehnavi", email = "s.salehidehnavi@uva.nl" }] keywords = [ "deepfake-detection", "ai-generated-images", "synthetic-image-detection", "ai-generated-video", "forensics", "benchmark", "pytorch", ] classifiers = [ "Development Status :: 3 - Alpha", "Intended Audience :: Science/Research", "License :: OSI Approved :: Apache Software License", "Programming Language :: Python :: 3", "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Scientific/Engineering :: Image Recognition", ] # Core runtime: everything the public API (`import synthscope`) pulls at import/inference time. # `interface.backend.{engine,media}` import the repo decoders at module load, so torch/ # torchvision/decord/matplotlib are genuinely required, not optional. dependencies = [ "torch>=2.0", "torchvision>=0.15", "numpy", "Pillow", "matplotlib", "decord>=0.6", "tqdm", "hydra-core>=1.3,<2", "omegaconf>=2.3", "huggingface-hub>=0.20", "accelerate>=0.27", "transformers>=4.38", "torchmetrics>=1.0", "timm>=0.9", "open_clip_torch>=2.24", "diffusers>=0.27", "pytorch_wavelets>=1.3", "PyWavelets>=1.9", "opencv-python-headless", # CuRe preprocessing (JPEG round-trips, resizing) "setuptools<81", # pytorch_wavelets (SAFE) still imports pkg_resources, removed in setuptools 81 ] [project.optional-dependencies] # FastAPI + React web demo (interface/). Not imported by `import synthscope`. web = ["fastapi>=0.110", "uvicorn[standard]>=0.27", "python-multipart>=0.0.9"] # Training + dataset auto-download stack. train = ["wandb>=0.16", "gdown>=5"] # Gradio demo (demo/app.py, Hugging Face Spaces). demo = ["gradio>=4"] # Tooling for contributors / CI. dev = ["ruff>=0.4", "pytest>=7", "build>=1", "twine>=5"] all = [ "fastapi>=0.110", "uvicorn[standard]>=0.27", "python-multipart>=0.0.9", "wandb>=0.16", "gdown>=5", "gradio>=4", ] [project.urls] Homepage = "https://github.com/SMSD75/SynthScope" Repository = "https://github.com/SMSD75/SynthScope" Issues = "https://github.com/SMSD75/SynthScope/issues" [project.scripts] synthscope = "synthscope.cli:main" agid = "synthscope.cli:main" # deprecated alias # Flat (research) layout: top-level modules + the model/interface/synthscope packages. Editable # install (`pip install -e .`) is the supported path — it puts the repo root on sys.path so # the existing flat imports (dataset, trainer, models.*, config_utils, interface.*) all resolve. [tool.setuptools] py-modules = ["main", "trainer", "dataset", "metrics", "transformations", "logger", "config_utils", "_synthscope_env"] [tool.setuptools.packages.find] include = ["synthscope*", "agid*", "models*", "interface*", "conf*"] exclude = ["tests*", "outputs*", "wandb*", "docs*", "experiments*", "interface.frontend*"] namespaces = true # Non-Python files the library needs at run time: Hydra configs (conf/), model data (STALL statistics, D3 calibration), # the web page and its vendored scripts, and the leaderboard data. Without this a regular (non-editable) # install, e.g. `pip install git+https://github.com/SMSD75/SynthScope.git`, cannot build any detector. [tool.setuptools.package-data] "*" = ["*.yaml", "*.json", "*.npz", "*.html", "*.js", "*.css"] [tool.ruff] line-length = 110 target-version = "py310" # Heavy research / vendored model code is not held to the package lint bar; CI lints `synthscope`. extend-exclude = ["models", "outputs", "wandb", "experiments", "docs", "interface/frontend", ".cache"] [tool.ruff.lint] # Start conservative: real errors (pyflakes F + a few correctness rules), not style churn. select = ["E9", "F"] ignore = ["F401", "F403", "F405"] # research modules use re-export / star-import patterns