Files
Victor KuznetsovandClaude Opus 5.5 1dc70df289 Upgrade to OpenCV 5 with frozen Hershey templates and tighten video marks
- Lock OpenCV 5 and cap NumPy below 2.4 through uv constraint-dependencies so
  PaddleX 3.7 keeps resolving; Dependabot ignores mirror the cap.
- OpenCV 5 draws Hershey putText glyphs differently, so the Dola and Kling
  video templates ship as committed OpenCV 4 renders with a recipe script, and
  the OpenArt alpha recipe now refuses any OpenCV but 4.x.
- Break Sora/Veo cross-matches in favor of Veo under valid Google AI-video
  provenance, and require the full Sora mascot shape for mascot-only matches.
- Let the Doubao engine detect marks tinted by saturated backgrounds.
- Share C2PA claim-generator, credential-level and vendor-platform helpers,
  JPEG suffixes and the DCT basis instead of per-module copies.
- Log model download failures, document the optional GITHUB_TOKEN, mark the
  photo and source classifier model cards archived, and refresh the lock.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 19:19:00 -07:00

3.1 KiB

license, library_name, pipeline_tag, tags
license library_name pipeline_tag tags
apache-2.0 numpy image-classification
image-forensics
source-attribution
open-set-classification

RAIW source-pipeline classifier (archived)

Archived / legacy as of 2026-09-20. Not recommended for new integrations. This model repository is retained for reproducibility and compatibility with existing users. Published weights and historical revisions remain available. The documentation and measurements below describe the archived model, not a current recommendation. No replacement model is linked at this time.

This is a compact, abstaining pixel-forensics classifier for three labels: openai, google, and unknown. It is intended for original-export-looking images whose metadata may have been removed without changing the pixels.

This model is not a SynthID detector. It does not decode or verify a watermark payload. Its labels describe complete generation and export pipelines, so renderer, geometry, encoding, post-processing, and watermark state may be confounded. unknown does not mean that SynthID is absent, and a provider label does not prove that SynthID is present.

Model

  • Input: a 124-dimensional residual/spectral forensic feature vector plus a 768-dimensional phase-free spectral vector.
  • Head: 892 -> 128 -> 64 -> 3 MLP with GELU activations.
  • Output: openai, google, or abstain as unknown using independent provider margins.
  • Artifact: source-pipeline-mlp.npz
  • SHA-256: 6430b0738869ff07b6845b7c6149c2a83bc3f3785878082886c241c6f7ca0c4a

The artifact contains only learned parameters, normalization constants, labels, and thresholds. It does not contain training images, paths, image hashes, embeddings, or a training catalog.

Evaluation

The operating point was selected on an internal calibration split. The locked internal test and the public bigdatamark/synthid-research dataset were not used for architecture, checkpoint, or threshold selection.

Evaluation Class Recall Precision
Locked internal test (5,369 images) OpenAI 60.4% 84.9%
Locked internal test (5,369 images) Google 57.6% 87.9%
Locked internal test (5,369 images) Unknown 98.6% 93.7%
Public external originals (900 images) OpenAI 68.7% 100.0%
Public external originals (900 images) Google 81.3% 98.8%
Public external originals (900 images) Unknown/Flux 99.0% 66.4%

On the public external set, a 95% resize reduced Google recall to 1.0%, and a JPEG quality-75 round trip caused the model to abstain on every image. These are expected abstentions, not evidence that a watermark was removed.

Intended use

Use this model as one probabilistic signal in a broader forensic report or to suggest an appropriate processing path. Do not use it to claim watermark presence, authorship, policy compliance, fraud, or provenance. Applications should expose the abstention and the model's narrow source-pipeline claim.

Feature extraction and inference are versioned in the remove-ai-watermarks Python project rather than in this model repository. Use its explicit classify_source API; identify does not run this model.