Files
remove-ai-watermarks/docs/synthid-removal-research.md
T
Victor Kuznetsov 99146cf2de Split SynthID campaign docs by detector, classifiers, and removal
Keep Model 1 as a research AI-versus-camera result outside the library.
Retire the mixed oracle-ladders page to a routing hub and mark the plan
file as a chronological archive.
2026-08-22 21:04:06 -07:00

5.9 KiB

SynthID mark removal research

Research archive for pixel-only SynthID removal, not diffusion regeneration. Not a statement of current product capability. Shipped invisible removal is lossy regeneration: known limitations.

Sister pages: SynthID local detector, classifier models, mechanism reference.

Result

The quality-preserving OpenAI SynthID remover hunt closed 2026-08-20. Bayer, VNG demosaic, upscale-then-Bayer, barrel distortion, and scanline jitter closed 2026-08-22: they leave the official oracle detected.

Working residual kills on photographs cost about 19-24 dB:

  • 16-32 px phase scramble (s1 24.6 dB, fish 24.3 dB, s2 19.0 dB)
  • Gaussian blur sigma 7 (23.8 dB), holds 3/3 versus sigma 6
  • Additive 16-32 jam only at a=24 / 18.6 dB, worse than scramble

JPEG q5, noise sigma 16, grayscale, rot90, flip, 5°, downscale 0.20x, median 7, posterize 4, VAE round-trip, and white pad to 40% linear stay detected. Elastic warp is not a stable kill (s3 still detected at 22.0 dB).

The product remainder is diffusion regeneration (qwen-zimage / sdxl-zimage), which does not decode and delete a payload. Defeating the verifier does not restore forensic deniability; see synthid.md.

Official not_detected on collage, photo-pad, and two-panel layouts is a presentation gate, not residual damage. Those rungs are in detector research.

Closed quiet removers

Attack Close Notes
Quality-preserving photo remover 2026-08-20 Every residual not_detected that is not a collage is below usable quality
Additive in-band jam as a quiet remover 2026-08-21 Fish flips only at 18.6 dB; 4-8 px at the same PSNR stays detected
Bayer bilinear / VNG / upscale-Bayer 2026-08-22 s1/s2 still detected; VNG on s2 is dirtier than scramble (18.5 vs 19.0 dB) and the mark remains
Barrel k1=0.06 and scanline ±0.8 px 2026-08-22 s1/s2 detected even at 14-20 dB barrel
TrustMark-style micro-warp 2026-08-21 0.25 px / 32 dB still 100% detect on TrustMark P; OpenAI elastic ~21 dB unreplicated

Oracle: verify_openai_synthid after AI-metadata strip. Seeds s1, s2, s3 as in detector research. Raw files: .local-eval/synthid/prc-oklab-attack-2026-08-15/.

Band that actually carries the mark

Phase-randomize one octave at a time, preserve energy (E2, s1, replicated p16_32 on s2 and s3):

Octave (period px) Verdict
2-4 detected
4-8 detected
8-16 detected
16-32 not_detected
32-64 detected
64-128 detected

Destroying only 16-32 px periods silences the official decoder. The lattice band 8-16 px does not. On a marked gray flat the same scramble is 51.1 dB not_detected because the band is almost empty. On a photograph the band holds the scene (24.3 dB). Replacing native 16-32 with a 2x-pyramid prediction is 48.4 dB and still detected.

Fish additive jam, luma RMS a:

Band a PSNR Verdict
16-32 0.06-4.0 51.2-33.6 detected
16-32 8 27.7 detected
16-32 16 21.9 detected
16-32 24 18.6 not_detected
4-8 16 21.9 detected
4-8 24 18.6 detected

Preregistered close a*_photo < 0.53 failed (a* > 16).

Bayer and geometry (2026-08-22)

Frozen one-pass batch. Lattice scores on these OpenAI sources are already indeterminate and are not the label. s3 and the fish photo were queued after an OpenAI 429.

Attack s1 PSNR / oracle s2 PSNR / oracle
source detected detected
Bayer bilinear 32.7 detected 28.4 detected
Bayer VNG 25.0 detected 18.5 detected
upscale 1.15 then Bayer 33.9 detected 29.8 detected
barrel k1=0.06 19.9 detected 14.2 detected
scanline ±0.8 px 31.5 detected 26.7 detected
shift 2 px 23.1 detected (429, not submitted)
16-32 phase scramble 24.6 not_detected 19.0 not_detected

Camera pipeline and mild geometry do not hit the decoder basis. A 2 px shift, which kills pipeline_lattice, left s1 detected. .local-eval/synthid/prc-oklab-attack-2026-08-15/bayer-geometry-2026-08-22/.

Attack ladders (OpenAI oracle)

Pilot 2026-08-17 (n=3): JPEG q40, 0.5x, noise8+jpeg85, 0.35x+jpeg50 all detected (s2 0.35x+jpeg50 at 20.1 dB still detected).

Kill and flip (s1), then replication 3/3:

Rung s1 s2 s3
blur sigma 6 detected detected detected
blur sigma 7 not_detected not_detected not_detected
keep 0.50 linear detected detected detected
keep 0.40 linear not_detected not_detected not_detected
elastic ~24 dB detected 24.6 detected 17.9 detected 26.1
elastic ~21 dB not_detected 20.8 not_detected 14.8 detected 22.0
pad white 40% linear detected detected detected
hstack with photo not_detected not_detected not_detected
blend 25% marked detected detected detected
inset native 1:1 on 2x photo not_detected not_detected not_detected
JPEG q5 detected detected detected

Holds on 3/3: blur 6 vs 7, crop keep 0.50 vs 0.40, white pad 40% detected, hstack not_detected, blend 25% detected, JPEG q5 detected. Elastic at ~21 dB does not hold. Crop keep-0.40 and hstack are presentation or support, not a quiet residual wipe.

Surround: photo fill at the white-pad geometries is not_detected on 3/3; white pad at those sizes was detected. Unmarked photo strip flips between 25% width (detected) and 35% (not_detected). Photo frame 15% each side is not_detected on 3/3; 12% does not hold.

Product remainder for removal

Invisible removal in this package regenerates through qwen-zimage or sdxl-zimage. It is lossy. There is no shipped pixel-only OpenAI or Google SynthID wipe. Do not add Bayer or geometry as remover arms.