mirror of
https://github.com/wiltodelta/remove-ai-watermarks.git
synced 2026-08-09 23:50:40 +02:00
The shipped profile was certified by one oracle row, but only noise_std was pinned: long_side and fps -- two thirds of what the verifier was actually shown -- could move with a green suite. The test now derives the pin from data/evaluations/video-synthid-oracle.csv, so a default without a certifying row fails. The certified profile is a perturbation-to-signal ratio, not a bare noise_std. sd-vae-ft-mse publishes no scaling_factor key, so 0.18215 comes from the AutoencoderKL class default under an upper-unbounded diffusers pin. The loader now gates that value, carries it on VideoVaeRuntime, and passes it into encode and decode so the validated value is the applied value. video_synthid_sweep.py loads through the same function: the harness producing the certified rows was the one path exempt from the gate it exists to feed. psnr_db is measured against the already-resized frame and before the encoder, so it cannot see the downscale, the decimation, or the codec, and no in-loop metric can. scripts/video_fidelity_probe.py scores the delivered file end to end, streaming the way the engine does and sharing its frame-selection rule rather than copying it -- a frame-count check cannot catch a rule that reorders frames without changing how many. The manifest gains source geometry, vae, track, verbatim verdict and session fields. The two 2026-07-31 rows keep them empty: they were never recorded and are not recoverable. Verdicts now have four states, because the verifier's unclear reading logged as not_detected is the silent regression the manifest exists to prevent. docs/video-synthid-quality-research.md records the research behind this: the noise axis is worth about 2 dB and is nearly exhausted, resolution is the real prize but is an uncertified destruction axis rather than a free win, and every proposed autoencoder swap was refuted. First local measurements included. Verified: engine output is byte-identical before and after the refactor on a locally built clip, at noise_std 0.00 and 0.15. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2.4 KiB
2.4 KiB
Documentation
This documentation is split by purpose. Start with the user guides if you want to run the tool. Use the maintainer references only when changing the code.
User guides
| Page | Use it when |
|---|---|
| Installation | You need the CLI, an optional model backend, or a development environment. |
| CLI guide | You want a command for an image, video metadata or visible marks, a directory, or a specific watermark type. |
| Python API | You want to call the package from Python. |
| Supported signals | You need to know which visible marks, metadata formats, and invisible signals are covered. |
| Known limitations | You need the quality, device, format, or verification boundaries. |
| Scope, safety, and legal notes | You need the intended use and legal context. |
Maintainer references
| Page | Purpose |
|---|---|
| Module internals | Current architecture, invariants, and regression guards by module. |
| Development | Environment setup, dependency recovery, CI behavior, and fixture policy. |
| Code provenance | Required notices for licensed derivative work. |
| Verification plan | Verification methods, completed measurements, and remaining validation gaps. |
| Release and distribution | PyPI, Homebrew, Hugging Face Space, and release workflow. |
| Watermarking landscape | Vendor signals and detection approaches. |
| SynthID technical reference | Mechanism, detector access, robustness, and implications for this project. |
Research archive
These pages record experiments and the evidence behind past decisions. They are not command references and may describe prototypes that were later removed. The current behavior is defined by the code, tests, README, and user guides.