FreeU_V2
The SDXL-friendly second version that fixed FreeU's halo problem
- model
- MODEL
FreeU_V2 is the second draft of the FreeU trick, and the difference is basically "stop being so heavy-handed." The original FreeU boosted the backbone features by a flat multiplier, which made SDXL images sharper but also gave them that telltale crunchy, haloed look. V2 keeps the same two-stage idea - amplify the backbone, filter the skip connections - but scales the backbone boost by the spatial average of the hidden features instead of applying it uniformly. Areas of the image that already have strong structure get less amplification; flat, underexposed areas get more. The result is a sharper image that doesn't ring.
Like the original, V2 is an SD 1.5/SDXL-era patch that has quietly aged out of the modern workflow. Reddit chatter about FreeU in any flavor peaked in early 2024 and is now a handful of threads a year. If your model is a DiT - Z-Image, Flux, Wan, any 2025+ architecture - there's no UNet block layout for the patch to hook, so it does nothing. On Illustrious, Pony, or plain SDXL it's still a legit, free one-node quality bump, and V2 is the one to reach for.
How it works
The node patches the UNet's decoder output blocks at two stages, keyed off the model's channel count. At each stage it does two things: multiply the backbone half of the hidden channels by a boost factor, and run the skip-connection half through a Fourier filter that suppresses low-frequency content (which is where redundant, detail-muddying signal lives).
The V2 change is in the boost step. Instead of h * b, it computes the mean over channels for each spatial position, normalizes that mean, and boosts as h * ((b-1) * normalized_mean + 1). Flat regions get the full boost; structured regions get less. That's the fix for the halo artifact - the amplification now follows the image content instead of hitting everything equally.
Inputs and what to set
Same four floats as the original, with defaults tuned higher for SDXL:
b1(default 1.3) /b2(default 1.4) - the content-scaled backbone boost at the two patched stages.s1(default 0.9) /s2(default 0.2) - low-frequency suppression on the skip connections.
For SD 1.5 the classic FreeU values were b1 1.2, b2 1.4, s1 0.9, s2 0.2 - the defaults here lean slightly stronger on the backbone for SDXL's bigger channel counts. Output is the patched MODEL. It's in ComfyUI core; nothing to download.
Common issues & troubleshooting
Still no effect on modern DiT models. Same trap as FreeU. If your model isn't a convolutional UNet, this patch attaches to nothing. Verify what you're actually running before adding it.
If you see halos anyway, back off b1/b2, not the filter. V2 tames the halo but doesn't eliminate the possibility. Lower the b values toward 1.0 (the "no boost" floor) before touching s1/s2.
One of the two FreeU nodes is enough. They do the same job two ways; stacking them is meaningless and slightly wasteful. On SDXL pick V2; on SD 1.5 either works, and V2's content-scaled boost is generally safer.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| b1 | FLOAT | 1.300–10 | — |
| b2 | FLOAT | 1.400–10 | — |
| s1 | FLOAT | 0.900–10 | — |
| s2 | FLOAT | 0.200–10 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | — |