chore: mark controlnet pipeline + GFPGAN restore-faces as experimental

Both content-preservation features are now flagged EXPERIMENTAL and opt-in.
--pipeline controlnet was already opt-in (default=default); --restore-faces
flips from on-by-default to OFF by default, matching the repo's prior pattern
for experimental preservation passes (the removed protect_text/protect_faces).

- cli.py: --restore-faces/--no-restore-faces default False; EXPERIMENTAL in the
  --restore-faces / --controlnet-scale / --pipeline help; batch default False.
- invisible_engine.py: remove_watermark restore_faces default False + docstring.
- CLAUDE.md / README.md / docs/synthid.md: label both experimental/opt-in.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Victor Kuznetsov
2026-06-03 16:59:28 -07:00
co-authored by Claude Opus 4.8
parent 411ef16ec3
commit 5ec8269949
5 changed files with 31 additions and 25 deletions
+7 -3
View File
@@ -379,14 +379,18 @@ the payload, reconstituting SynthID in text. The lesson held and shaped the
current design: **content is preserved by REGENERATING it under structural
conditioning, never by copying original pixels.**
- **Text + structure:** `--pipeline controlnet` (SDXL img2img + a canny ControlNet)
conditions the regeneration on the edge map, so text and structure stay sharp
Both preservation features below are **EXPERIMENTAL and opt-in (off by default)**;
the plain `default` SDXL img2img pass is the shippable path.
- **Text + structure:** `--pipeline controlnet` (SDXL img2img + a canny ControlNet,
experimental/opt-in) conditions the regeneration on the edge map, so text and
structure stay sharp
while every pixel is still regenerated -- SynthID is removed everywhere. Verified
better than plain img2img at the same strength (text stays legible where plain
garbles it), and the controlnet background scrub reads clean on the oracle.
- **Face identity:** canny holds face *structure* but not *identity*. Shipped as the
optional `--restore-faces` GFPGAN post-pass (`face_restore.py`, the `restore`
extra, ON by default, auto when faces present). It runs GFPGAN on the ORIGINAL
extra, experimental/opt-in, off by default). It runs GFPGAN on the ORIGINAL
faces and feather-composites the restored face REGIONS into the cleaned image:
GFPGAN RE-SYNTHESIZES each face from a StyleGAN2 prior (GAN pixels, not original
-> scrubs SynthID) at a low fidelity weight (`--restore-faces-weight`, default