scanner / README.md
github-actions[bot]
Deploy from GitHub 39b3777315c11d9c8bcd39ad7bf034f2a88a7379 (filtered: code + Dockerfile + README + NOTICES only)
2e175db
|
Raw
History Blame Contribute Delete
5.73 kB
---
title: DeepFakeScanner
sdk: docker
app_port: 7860
pinned: false
license: apache-2.0
short_description: AI-generated & manipulated image detection (v0.4.0)
---
# DeepFakeScanner
A commercial deepfake / AI-generated image detection service.
## What it is
A FastAPI web service that scans an uploaded image and returns a structured
verdict: `authentic`, `ai_generated`, `deepfake`, `edited`, or `uncertain` β€”
with per-class probabilities, per-detector signals, and a C2PA provenance
check.
## Live
| | URL |
|---|---|
| Frontend | https://veridicate.com |
| API | https://api.veridicate.com |
| Source (HF mirror) | https://huggingface.co/spaces/veridicate/scanner |
## Status
**Stage 2 deployed (`v0.3.0-stage2`).** The CLIP classifier head was
fine-tuned on a 100k commercially-licensed dataset (50k Open Images +
50k Flux.1-schnell) and is currently serving real predictions in
production.
In-distribution test-set metrics (10k held-out images):
- Accuracy: **98.44%**
- Precision (AI class): 98.25%, recall: 98.64%, F1: 98.44%
**Stage 3A wired + verified 2026-05-30 (`v0.4.0-stage3a`); ships to
production on merge of `feat/akila-20260515 β†’ main`.** Multi-generator
dataset built: 50k Flux + 20k SDXL + 20k SD 3.5 Medium + 10k AuraFlow
on the AI side, matched authentic from Open Images V7. SDXL held out of
training so the heldout split is a true generalisation test. The trained
head (`head_v3a.pt`) is published to the private HF Hub repo, the runtime
config now defaults to it (`config.py`), and a filtered, test-gated
GitHub Action deploys the inference service on merge. Headline verified
numbers vs the Stage 2 baseline:
| Split | Baseline | Candidate | Ξ” |
|---|---|---|---|
| heldout SDXL (UNSEEN in training) | 83.93% | **89.48%** | **+5.55 pp** |
| test (in-distribution) | 96.47% | 98.43% | +1.96 pp |
| test_augmented (robustness) | 93.96% | 98.41% | +4.46 pp |
The +5.55 pp on the SDXL holdout is the load-bearing number β€” SDXL was
held entirely out of training, so it's the closest available proxy for
how the model will behave on generators it never saw. The
family-fingerprint approach (train on a diverse mix of open
generators, inherit coverage of closed generators) is validated.
Detailed audit trail in
[`docs/stage3a-implementation.md`](docs/stage3a-implementation.md).
**Known limitation (until the Stage 3A merge deploys):** the live
model is still the Stage 2 head, trained on Flux.1-schnell only. Other
generators (Gemini/Imagen 3, DALL-E 3, Midjourney, Grok, Stable
Diffusion) are out-of-distribution for the *currently-live* model and
it often returns `uncertain` verdicts. The Stage 3A head (queued to
ship) closes most of this gap. Rollback is a one-line env override
(`MODEL_VERSION` + `HEAD_CHECKPOINT_HF_FILENAME`) β€” both heads live in
the same private HF Hub repo.
## Roadmap at a glance
| Stage | What it delivers | Status |
|---|---|---|
| **1** | Working website, API, deploy pipeline. Detector returns random guesses. | βœ… Done |
| **2** | A trained classifier β€” 98% accurate on Flux-family AI images. | βœ… Done, live (`v0.3.0-stage2`) |
| **3A** | Broad coverage across the AI image-generation landscape β€” CLIP head retrained on Flux + SDXL + SD 3.5 + AuraFlow. | βœ… Wired + verified 2026-05-30 (`v0.4.0-stage3a`); ships on merge to `main` |
| **3B** | Frequency-artifact detector (FFT/DCT, generator-agnostic) brought online. | πŸ”­ Queued after Stage 3A ships |
| **4** | Production scale: faster hosting, paid tier, user accounts. | ⏸️ After Stage 3 |
| **5** | Enterprise capability: licensed paid-API training data, face-swap detection, adversarial robustness. | πŸ”­ Future |
Full roadmap with per-stage strengths, weaknesses, and how each
weakness gets fixed: [`docs/plan.md`](docs/plan.md). Plain-English
summary up front; technical detail below; glossary at the end for
non-technical readers.
## Quick start
```bash
# CPU PyTorch first (lean install)
pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu
pip install -r requirements.txt
pip install -e .
# Pre-download CLIP weights
python scripts/download_weights.py
# Run the server
uvicorn deepfake_scanner.api.v1:app --reload --port 7860
```
Then:
```bash
curl -F "file=@some_image.jpg" http://localhost:7860/v1/scan/image | jq
```
Or against the live API:
```bash
curl -F "file=@some_image.jpg" https://api.veridicate.com/v1/scan/image | jq
```
Dataset-generation dependencies are documented in the optional GPU section of
[`requirements.txt`](requirements.txt). Keep those packages out of the
production inference image.
## API
- `GET /health` β€” liveness probe
- `GET /v1/info` β€” model + config metadata
- `POST /v1/scan/image` β€” scan an image (multipart/form-data, max 10 MB,
JPEG/PNG/WebP)
See [`ARCHITECTURE.md`](ARCHITECTURE.md) for the full response schema.
## Privacy
Visitor uploads are processed in-memory and **never persisted**. Only scan
metadata (verdict, confidence, latency, model version) is recorded.
## Documentation
- [`docs/plan.md`](docs/plan.md) β€” **product roadmap** with per-stage
strengths, weaknesses, and fix paths. Written so a non-technical
reader can follow the strategy, with deeper technical detail and a
glossary inline.
- [`ARCHITECTURE.md`](ARCHITECTURE.md) β€” technical design of the
detection pipeline + API contract
- [`docs/decisions.md`](docs/decisions.md) β€” running decision log
(good context if picking up this project later)
- [`NOTICES.md`](NOTICES.md) β€” third-party licensing record
- [`CLAUDE.md`](CLAUDE.md) β€” project context (auto-loaded by Claude Code)
- [`scripts/dataset/README.md`](scripts/dataset/README.md) β€” dataset curation pipeline
## License
Apache 2.0.