Files

2.8 KiB

Source-pipeline classification

classify_source is the earlier, opt-in, metadata-free pixel classifier for images that still resemble an original provider export. It returns openai, google, or an explicit unknown abstention.

This is not a SynthID detector. It does not decode or verify a watermark payload, and it must not be used to claim that SynthID is present or absent. The model describes the complete source/export pipeline, where renderer, geometry, encoding, post-processing, and watermark state can be confounded.

Install the lightweight runtime:

uv add "remove-ai-watermarks[source-classify]"

Call the Python API explicitly:

import remove_ai_watermarks as raiw

result = raiw.classify_source("metadata-stripped.png")
print(result.label)       # "openai" | "google" | "unknown"
print(result.reason)      # "classified" | "abstained" | "feature_unavailable"
print(result.margins)     # provider margins before thresholding
print(result.thresholds)  # frozen provider thresholds

feature_unavailable is returned for images below the required 256x256 geometry or for a degenerate feature vector. abstained means neither provider cleared its independent calibrated margin. Both are honest unknown results.

The first call downloads the exact pinned revision of wiltodelta/raiw-source-classify. Set RAIW_SOURCE_CLASSIFY_WEIGHTS to the NPZ itself or a directory containing source-pipeline-mlp.npz for an offline deployment.

The model is useful as a routing suggestion for a processing workflow or as one probabilistic signal in a broader forensic report. Do not use it as evidence of authorship, fraud, policy compliance, provenance, or watermark presence. The published model card records the evaluation and robustness limits.

New image-source classifier

classify_image_source is a separate, frozen model that incorporates selected spectral and spatial evidence from the earlier research. It does not silently change classify_source or its thresholds. Call it explicitly:

result = raiw.classify_image_source("metadata-stripped.png")
print(result.label)             # "openai" | "google" | "unknown"
print(result.reason)            # "classified" | "abstained" | "conflict" | "feature_unavailable"
print(result.watermark_truth)   # always "unknown"

Its first call downloads a hash-verified artifact from the immutable revision of wiltodelta/openai-google-image-source-classifier. For offline use, set RAIW_IMAGE_SOURCE_WEIGHTS to the NPZ file or its directory. It classifies likely export-source patterns in decoded pixels, not SynthID presence. The model card records its aggregate tests and limitations.