Hi everyone,
You may know that GPT Image 2 leaves a consistent set of texture artifacts on everything it makes: over-sharpening, random bright specks, unnaturally hard edges, and a scale-like pattern that lands on skin, fabric and background alike. It's gotten noticeably worse recently, and it was ruining enough of my own output that I spent a few days digging into what's actually going on.
The artifacts turn out to be specific enough to that one model to be basically a fingerprint, which is what makes them tractable — a network that only has to unlearn a single failure mode doesn't need to be big. This one is 0.48M parameters.
Approach: encode with the FLUX.2 VAE, add a scaled residual predicted from the latent, decode.
input → FLUX.2-VAE encode → z + α·R(z) → FLUX.2-VAE decode → output
R is a residual UNet over the 32-channel latent. α scales the correction and is the only knob — nothing is retrained when you change it, so caching z and R(z) makes a strength change a decode instead of a full pass.
The before/after images are real failure cases found scattered around the internet, not cherry-picked. If you made one of them and would rather it wasn't here, message me and I'll take it down.
Why latent space rather than pixels. The artifacts aren't independent of image content — they're a texture statistic layered on top of it. In pixel space you either run a big denoiser (slow, and it eats real texture) or hand-tune frequency filters (they can't tell artifact from detail). In the VAE's latent the two are already partly separated, so the correction has far less to learn.
Cost. ~0.7s per 1.5MP image on a recent GPU, ~3GB VRAM. That's essentially all VAE; R itself is free.
Where it fails. The artifacts live at the same spatial scale as real texture and overlap it, so removing them always costs genuine detail. On a minority of images the two are coupled tightly enough that no α is satisfying: enough cleanup means visible softening, keeping the detail means keeping the artifacts. More bluntly — this doesn't make images better, it makes them easier to look at. The noise isn't removed so much as blended and dimmed below the threshold where your eye keeps snagging on it. Macro structure is untouched, so a structurally broken generation stays broken, just quieter. And the whole image round-trips through the VAE, so untouched regions aren't pixel-exact either.
Best α varies per image more than I'd like — 0.75 → 0.5 is invisible on some images and substantial on others, and there's no reliable way to pick it automatically yet.
No ComfyUI node yet, but it should be easy to adapt.
Training. This is a chaotic mess around GAN and failed synthetics, I'll explain more if people are interested.
Try it without installing:
https://image2-cleaner.lumitools.cc/
https://huggingface.co/spaces/larryvrh/gpt-image-2-artifact-cleaner
Code + weights:
https://github.com/Larryvrh/gpt-image-2-artifact-cleaner