sd-forge-layerdiffuse icon indicating copy to clipboard operation
sd-forge-layerdiffuse copied to clipboard

Transparency with Highres Fix Doesn't work anymore

Open MimoletteRobot opened this issue 1 year ago • 12 comments

Hello

When i'm using Highres Fix, the image doesn't get transparency. That worked few day ago with the same setting.

I got this error (i don't know if this related) :

Error running postprocess_image_after_composite: /content/drive/MyDrive/stable-diffusion-webui-forge/extensions/sd-forge-layerdiffuse/scripts/forge_layerdiffusion.py Traceback (most recent call last): File "/content/drive/MyDrive/stable-diffusion-webui-forge/modules/scripts.py", line 956, in postprocess_image_after_composite script.postprocess_image_after_composite(p, pp, *script_args) File "/content/drive/MyDrive/stable-diffusion-webui-forge/extensions/sd-forge-layerdiffuse/scripts/forge_layerdiffusion.py", line 376, in postprocess_image_after_composite png, vis = vae_transparent_decoder.decode(latent, pixel) File "/usr/local/lib/python3.10/dist-packages/torch/utils/_contextlib.py", line 115, in decorate_context return func(*args, **kwargs) File "/content/drive/MyDrive/stable-diffusion-webui-forge/extensions/sd-forge-layerdiffuse/lib_layerdiffusion/models.py", line 278, in decode y = self.estimate_augmented(pixel, latent) File "/usr/local/lib/python3.10/dist-packages/torch/utils/_contextlib.py", line 115, in decorate_context return func(*args, **kwargs) File "/content/drive/MyDrive/stable-diffusion-webui-forge/extensions/sd-forge-layerdiffuse/lib_layerdiffusion/models.py", line 259, in estimate_augmented eps = self.estimate_single_pass(feed_pixel, feed_latent).clip(0, 1) File "/usr/local/lib/python3.10/dist-packages/torch/utils/_contextlib.py", line 115, in decorate_context return func(*args, **kwargs) File "/content/drive/MyDrive/stable-diffusion-webui-forge/extensions/sd-forge-layerdiffuse/lib_layerdiffusion/models.py", line 237, in estimate_single_pass y = self.model.model(pixel, latent) File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/module.py", line 1532, in _wrapped_call_impl return self._call_impl(*args, **kwargs) File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/module.py", line 1541, in _call_impl return forward_call(*args, **kwargs) File "/content/drive/MyDrive/stable-diffusion-webui-forge/extensions/sd-forge-layerdiffuse/lib_layerdiffusion/models.py", line 159, in forward sample_latent = self.latent_conv_in(latent) File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/module.py", line 1532, in _wrapped_call_impl return self._call_impl(*args, **kwargs) File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/module.py", line 1541, in _call_impl return forward_call(*args, **kwargs) File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/conv.py", line 460, in forward return self._conv_forward(input, self.weight, self.bias) File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/conv.py", line 456, in _conv_forward return F.conv2d(input, weight, bias, self.stride, RuntimeError: Given groups=1, weight of size [64, 4, 1, 1], expected input[1, 3, 268, 268] to have 4 channels, but got 3 channels instead

MimoletteRobot avatar Aug 03 '24 08:08 MimoletteRobot

are you doing higher than 1024/1024 res?

D-a-r-n-o-l-d avatar Aug 11 '24 22:08 D-a-r-n-o-l-d

With Highres Fix yes : 2048/2048 (upscale 2), with original generation at 1024/1024. This setting worked perfectly with transparency before. Now i have just grey background.

MimoletteRobot avatar Aug 12 '24 10:08 MimoletteRobot

ive never had a gen work higher than 1024/1024

D-a-r-n-o-l-d avatar Aug 19 '24 19:08 D-a-r-n-o-l-d

I have thousand of generation in 2048/2048 with transparency, working with SDXL/Pony/SDXL Lighting.

00270-4088350647 00040-1453487442

MimoletteRobot avatar Aug 20 '24 09:08 MimoletteRobot

The creator of layerdiffusion knows that it could be used with Highres fix? Its strange that i'm the only one with this problem, and I can't contact him directly it's sad

MimoletteRobot avatar Aug 20 '24 16:08 MimoletteRobot

The creator of layerdiffusion knows that it could be used with Highres fix? Its strange that i'm the only one with this problem, and I can't contact him directly it's sad

Hello,

You're not the only one who encountered this problem; I faced it as well.

I don't fully understand how this works, but as far as I can tell, the main issue is that TransparentVAEDecoder expects 4 channels as input, while after Hires.Fix, only 3 channels are provided.

I fixed it by setting 4 channels in this section:

diff --git a/scripts/forge_layerdiffusion.py b/scripts/forge_layerdiffusion.py
index 7efba7b..05567b4 100644
--- a/scripts/forge_layerdiffusion.py
+++ b/scripts/forge_layerdiffusion.py
@@ -370,6 +370,11 @@ class LayerDiffusionForForge(scripts.Script):
             lC, lH, lW = latent.shape
             if lH != pixel.height // 8 or lW != pixel.width // 8:
                 print('[LayerDiffuse] VAE zero latent mode.')
+
+                if lC < 4:
+                    print('[LayerDiffuse] VAE expecting 4 channels.')
+                    lC = 4
+
                 latent = torch.zeros((lC, pixel.height // 8, pixel.width // 8)).to(latent)

             png, vis = vae_transparent_decoder.decode(latent, pixel)

This fixes the issue, but I haven't tested it in all possible cases. So, use this code at your own risk.

Thank you.

srg91 avatar Aug 23 '24 11:08 srg91

Thanks to you ! it's Work !

MimoletteRobot avatar Aug 23 '24 14:08 MimoletteRobot

Since The last Update, Here we Go again. With the update, layer diffusion seem to make the same think than before with channel, and the last fix on this thread doesn't work anymore.

MimoletteRobot avatar Sep 01 '24 08:09 MimoletteRobot

Since The last Update, Here we Go again. With the update, layer diffusion seem to make the same think than before with channel, and the last fix on this thread doesn't work anymore.

My fix still works, you just need to apply it again after the update. It's more of a patch than a full fix.

And please don't close the issue, let the author see the problem too.

Thank you.

srg91 avatar Sep 01 '24 09:09 srg91

Yes it's work ! i made this the first time (false manipulation i guess) but having transparency at random place , i dit it again and now that's fine. I'm new to Github and Join for this Issue, I didn't know what to do with the thread, i let it open. The Author should do a Ko-Fi or Github a System of Tips so lllyasviel can Delegate thing like that or tips can get moving people to share, and people with no coding skill like me can participate and fuel the process.

MimoletteRobot avatar Sep 02 '24 07:09 MimoletteRobot

The creator of layerdiffusion knows that it could be used with Highres fix? Its strange that i'm the only one with this problem, and I can't contact him directly it's sad

Hello,

You're not the only one who encountered this problem; I faced it as well.

I don't fully understand how this works, but as far as I can tell, the main issue is that TransparentVAEDecoder expects 4 channels as input, while after Hires.Fix, only 3 channels are provided.

I fixed it by setting 4 channels in this section:

diff --git a/scripts/forge_layerdiffusion.py b/scripts/forge_layerdiffusion.py
index 7efba7b..05567b4 100644
--- a/scripts/forge_layerdiffusion.py
+++ b/scripts/forge_layerdiffusion.py
@@ -370,6 +370,11 @@ class LayerDiffusionForForge(scripts.Script):
             lC, lH, lW = latent.shape
             if lH != pixel.height // 8 or lW != pixel.width // 8:
                 print('[LayerDiffuse] VAE zero latent mode.')
+
+                if lC < 4:
+                    print('[LayerDiffuse] VAE expecting 4 channels.')
+                    lC = 4
+
                 latent = torch.zeros((lC, pixel.height // 8, pixel.width // 8)).to(latent)

             png, vis = vae_transparent_decoder.decode(latent, pixel)

This fixes the issue, but I haven't tested it in all possible cases. So, use this code at your own risk.

Thank you.

i got this

[LayerDiffuse] VAE zero latent mode. *** Error running postprocess_image_after_composite: D:\sdwebui\webui_forge_cu121_torch21a\webui\extensions\sd-forge-layerdiffuse\scripts\forge_layerdiffusion.py Traceback (most recent call last): File "D:\sdwebui\webui_forge_cu121_torch21a\webui\modules\scripts.py", line 956, in postprocess_image_after_composite script.postprocess_image_after_composite(p, pp, *script_args) File "D:\sdwebui\webui_forge_cu121_torch21a\webui\extensions\sd-forge-layerdiffuse\scripts\forge_layerdiffusion.py", line 374, in postprocess_image_after_composite if IC < 4: UnboundLocalError: local variable 'IC' referenced before assignment

zffffff avatar Sep 25 '24 05:09 zffffff

Same issue, can you post the modified forge_layerdiffusion.py to work with upscalers somewhere? I'm too dumb to understand the changes

banjorae avatar Dec 03 '24 15:12 banjorae