Files
remove-ai-watermarks/data/fixtures/visible
Victor Kuznetsov 08a4a8d299 Add synthetic visible-mark example gallery with canary tests
One committed example per registered mark: 12 PNG (image registry) and 6 MP4
clips (video registry), generated by scripts/render_visible_examples.py from
the committed silhouettes and detector templates -- never from user uploads.
The generator self-verifies (exit 1 when a mark misses its own example) and
tests/test_visible_examples.py holds both sides to it: registry completeness
both ways, per-engine detection on the canonical example, and the shipped
temporal selection accepting each clip.

Second tranche of measured-but-unregistered candidates parked under
scripts/assets/visible-mark-candidates/ with a README recording why none
ships yet (positives do not separate from clean negatives): samsung_en,
gemini_text, notebooklm, dola, mindvideo, higgsfield, jianying, capcut, zsky,
chromastudio, digenai, gendo.
2026-08-28 09:51:22 -07:00
..

Visible-mark example gallery

One committed example per registered visible mark, so the repository carries a working sample of everything it supports. tests/test_visible_examples.py holds both sides to it: a mark registered without an example fails the suite, and so does an engine that stops detecting its own example.

What these files are

Every example is SYNTHETIC: scripts/render_visible_examples.py composites the mark's committed silhouette (the same font-rendered asset the detector matches) onto a deterministic generated base photo at the engine's measured geometry. No user upload and no vendor asset enters the repository: corpus files under data/spaces/ are user content and stay out of git by policy, and the silhouettes themselves are our own renders (scripts/render_vendor_silhouettes.py).

The examples demonstrate DETECTION geometry and house style, not vendor raster fidelity; real-world variants (fonts, opacities, sizes) are covered by the engines' calibration cohorts, which are local-only.

Regeneration

uv run python scripts/render_visible_examples.py

The generator self-verifies: it fails (exit 1) if any registered mark does not detect on its own example, so regeneration is the fix point for drift.

Layout

<mark-key>/example.png   1536x2048..2048x2048 PNG, one per image mark
<mark-key>/example.mp4   960x540 90-frame clip, one per video mark
                        (kling carries both: it is registered in both registries)

Special cases: gemini composites the sparkle alpha map at the provider's configured position; jimeng_pill is the capture-less pill at the measured 3:4 portrait geometry; microsoft is the opaque white pill with dark text holes (the discriminator its detector keys on). Video examples composite the detector's own synthetic template on every frame; where two marks share a shape family the example carries the discriminative variant (veo the legacy text form, kling the logo-plus-wordmark pair flush to the edge), because the temporal selection resolves cross-template ties by table order.