Files
remove-ai-watermarks/scripts
Victor KuznetsovandClaude Sonnet 5 83be3a8926 Add generic bare "AI生成" text-mark detector (brand-less TC260 fallback)
Every existing text-mark engine (Doubao, Jimeng, Qwen, Baidu, Kling,
Yuanbao) is tuned to one vendor's exact wordmark silhouette, so none of
them match a bare "AI生成" strip with no brand name in front of it.
Confirmed on raiw-app production: a free `visible` run left a bottom-right
"AI生成" watermark completely unremoved because no detector fired.

Research found the wording is not tied to one dominant generator: vivo's
own support documentation confirms its Gallery stamps a bare "AI生成"
label after AI消除/AI扩图/大片模式 editing, and independent reporting
documents the same watermark on Xiaomi Gallery's AI-edit output. Since
the label is a GB 45438-2025/TC260 compliance stamp rather than one
vendor's brand mark, this adds one generic fallback (`generic_ai_label`)
instead of another per-OEM tuned config.

The detection silhouette is font-rendered (no logo element to capture)
via the shared scripts/render_vendor_silhouettes.py pipeline already
used for Qwen/Baidu/Kling/Yuanbao's own text-only marks. Calibration is
synthetic-only (no real captured generator screenshot was available);
the module docstring and DETECT_NCC_THRESHOLD comment carry that caveat
explicitly and this should be recalibrated once real captures exist.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-21 22:01:10 -07:00
..
2026-09-15 22:36:34 -07:00

Maintainer scripts

These scripts are development and evaluation tools, not installed CLI commands. Run them from the repository root with uv run python scripts/<name>.py --help. Inputs under .local-eval/ and generated reports remain untracked unless a data README explicitly names a tracked canonical result.

Audits and release checks

Script Purpose
corpus_gap_scan.py Inventory identify, metadata markers, normalized C2PA review fields, unattributed outcomes, errors, and gap candidates over a full or date-bounded corpus. Its schema-versioned checkpoint resumes safely after interruption.
detection_timing.py Record per-method metadata and verdict timings.
detection_timing_report.py Aggregate timing records by method and segment.
fidelity_metrics.py Compute objective image-fidelity metrics for paired outputs.
invisible_quality_audit.py Pair originals and invisible-removal outputs for quality review.
metadata_removal_audit.py Check metadata detection/removal parity over a corpus.
pill_gate_audit.py Measure the Jimeng pill detector on the product path.
provider_oracle_web.py Implement isolated Playwright submissions for the unified provider-oracle runner.
provider_oracle_microsoft.py Call Microsoft's Content Provenance API with hash-bound public media and Azure CLI authentication.
provider_oracles.py Plan API-first and drive hash-bound Google, OpenAI, Microsoft, and Meta oracle checks.
real_examples_e2e.py Run end-to-end confidence checks over local examples.
record_parity_audit.py Compare record-based and file-based identification.
resource_ceilings.py Measure peak RSS and runtime for fill backends.
robustness_suite.py Exercise CLI failures on adversarial and degenerate inputs.
sidecar_regression.py Compare current identification with recorded sidecars.
smoke_matrix.py Exercise CLI parameter choices on real local data.
video_fidelity_probe.py Compare delivered video fidelity with its source.
visible_eval.py Benchmark the adjudicated registry subset and expose unmeasured marks as scope-zero rows.
visible_removal_audit.py Audit visible-removal results over a local corpus.
watermark_benchmark.py Run hash-pinned image cases while keeping detection, removal observation, and fidelity separate.
watermark_benchmark_report.py Aggregate repeated benchmark results with artifact-aware counts and separate cold/warm timing.
watermark_benchmark_resources.py Measure fresh-process wall time and absolute peak RSS for benchmark manifests.

Calibration and corpus preparation

Script Purpose
contentseal_transforms.py Reproduce and hash-check deterministic Content Seal variants.
detector_response.py Measure detector response over mark size, contrast, background, and aspect.
fill_quality.py Measure visible-fill quality against constructed ground truth.
ladder_headroom.py Measure recall cost from the coarse scale ladder.
registered_mark_calibrate.py Measure a registered detector without conflating visual positives, metadata cohorts, adjudicated negatives, and unlabeled controls.
synthid_corpus.py Ingest and inspect the local SynthID reference corpus.
vendor_cohort_harvest.py Partition TC260 carriers by producer code.
vendor_mark_calibrate.py Calibrate a candidate vendor text detector.
visible_alpha_solve.py Rebuild visible-watermark alpha assets from controlled captures and the cleared Qwen symbol fixture.
visible_groundtruth.py Consolidate blinded contact-sheet labels into ground truth.
visible_positives.py Resumably scan registered marks plus metadata cohorts, and build blinded native-detail bands for uncovered and unbiased quiet samples.
visible_recall_sample.py Build an unbiased blinded sample for recall measurement.
visible_sheets.py Build blinded contact sheets for relaxation candidates.
watermark_benchmark_cohort.py Build the deterministic synthetic DWT-DCT and TrustMark cohort consumed by watermark_benchmark.py.
spectral_pipeline_probe.py Measure a prompt-grouped, phase-free spectral source-pipeline hypothesis without presenting it as SynthID detection.
source_pipeline_classifier.py Train or run an abstaining OpenAI/Google/unknown source-export classifier; research-only and not SynthID detection.
watermark_benchmark_real_cohort.py Build a publication-cleared, provider-paired and content-stratified real-image cohort.
retrain_photo_classify.py CPU-retrain the 2026-08-31 photo heads from a sha256-keyed cache pack, no images.
publish_photo_classify_hf.py Upload the photo-classify card and freeze weights to Hugging Face wiltodelta/raiw-photo-classify. Manual; the Action publish-photo-classify-hf.yml is the write-token path.
publish_source_classify_hf.py Upload the derivative source-pipeline model and its public card to Hugging Face wiltodelta/raiw-source-classify. Manual; the Action publish-source-classify-hf.yml is the write-token path.
verify_engine_selection_fixtures.py Verify hashes, dimensions, and prompt pairing in the tracked auto-engine content matrix.

Research and diagnostic prototypes

Script Purpose
cjk_tail_probe.py Test a generic template for otherwise uncovered CJK labels.
controlnet_sweep.py Sweep the historical ControlNet removal prototype.
analyze_engine_selection_study.py Reduce engine-study output to paired deltas and exact sign tests.
infer_text_lines.py Draft stable source-text lines without modifying pixels.
qwen_scrub_prototype.py Probe low-strength Qwen regeneration on a GPU.
selective_text_restoration.py Evaluate text restoration over a scrubbed image.
synthid_pixel_probe.py Run the experimental local SynthID carrier probe.
video_synthid_sweep.py Build oracle-gated video regeneration candidates.

Generated assets

Script Purpose
render_pill_silhouette.py Render the synthetic Jimeng pill silhouette.
render_vendor_silhouettes.py Render synthetic vendor text-mark silhouettes.
sync_c2pa_soft_bindings.py Validate the official C2PA soft-binding registry and refresh its pinned runtime snapshot.

maintain.sh and the CI lint job run sync_c2pa_soft_bindings.py --check, so an upstream registry change fails with the refresh command instead of silently leaving new algorithms unnamed. The check and runtime parser are read-only; running the sync command without --check is the explicit snapshot update.

Shared helpers

_plain_console.py provides plain-text fallbacks for Rich output, and _text_eval.py contains normalization helpers shared by text-evaluation scripts. hf_publish.py owns the common authenticated, allowlisted Hugging Face model repository upload used by the two model publishers. engine_selection_manifest.py owns the content-matrix schema and validation shared by its integrity check and the real-image benchmark builder.