From c44b55c82b42b466a2eeb2f70e0e4c8239608790 Mon Sep 17 00:00:00 2001 From: new-sankaku Date: Tue, 16 Apr 2024 00:01:02 +0900 Subject: [PATCH 1/7] Transparent image saving process that reflects modifications made by Extension MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ・Added saving process for transparent images created by Layerdiffuse. ・Save transparent images that reflect modifications made by Extensions (Hires, ADtailer). Note: Does Hires cause an error if the image size after enlargement is not a multiple of 256? We recommend multiplying 1024*1024 by 1.5 to 1536x1536. ・When Batch count is set to 2 or more, the previous image is always included in the Image List returned by the webui side. Also, since the order is different in ascending/descending order, initialization processing is added to Layerdiffuse. It might cause some problems. --- lib_layerdiffusion/models.py | 22 ++++++++- scripts/forge_layerdiffusion.py | 80 ++++++++++++++++++++++++++++++++- 2 files changed, 99 insertions(+), 3 deletions(-) diff --git a/lib_layerdiffusion/models.py b/lib_layerdiffusion/models.py index 3d0cf82..8140c29 100644 --- a/lib_layerdiffusion/models.py +++ b/lib_layerdiffusion/models.py @@ -3,6 +3,7 @@ import cv2 import numpy as np +from PIL import Image from tqdm import tqdm from typing import Optional, Tuple from diffusers.configuration_utils import ConfigMixin, register_to_config @@ -11,6 +12,8 @@ import ldm_patched.modules.model_management as model_management from ldm_patched.modules.model_patcher import ModelPatcher +from modules import images, processing +from modules.shared import opts def zero_module(module): """ @@ -260,7 +263,7 @@ def wrapper(func, latent): fg = y[..., 1:] B, H, W, C = fg.shape - cb = checkerboard(shape=(H // 64, W // 64)) + cb = checkerboard(shape=(H // 1, W // 1)) cb = cv2.resize(cb, (W, H), interpolation=cv2.INTER_NEAREST) cb = (0.5 + (cb - 0.5) * 0.1)[None, ..., None] cb = torch.from_numpy(cb).to(fg) @@ -270,6 +273,23 @@ def wrapper(func, latent): png = torch.cat([fg, alpha], dim=3)[0] png = (png * 255.0).detach().cpu().float().numpy().clip(0, 255).astype(np.uint8) + + # Save transparent image code. + xpng = Image.fromarray(png) + + infotext = processing.Processed(p, []).infotext(p, i) + images.save_image( + image=xpng, + path=p.outpath_samples, + basename="", + seed=p.seeds[i], + prompt=p.prompts[i], + extension=getattr(opts, 'samples_format', 'png'), + info=infotext, + p=p, + suffix="-transparent" + ) + p.extra_result_images.append(png) vis_list = torch.cat(vis_list, dim=0) diff --git a/scripts/forge_layerdiffusion.py b/scripts/forge_layerdiffusion.py index d08e71b..ad6df5b 100644 --- a/scripts/forge_layerdiffusion.py +++ b/scripts/forge_layerdiffusion.py @@ -5,6 +5,9 @@ import numpy as np import copy +from PIL import Image +from modules import images +from modules import script_callbacks, shared from modules import scripts from modules.processing import StableDiffusionProcessing from lib_layerdiffusion.enums import ResizeMode @@ -19,6 +22,7 @@ from lib_layerdiffusion.attention_sharing import AttentionSharingPatcher from ldm_patched.modules import model_management +from modules.shared import opts def is_model_loaded(model): return any(model == m.model for m in current_loaded_models) @@ -50,6 +54,7 @@ def load_layer_model_state_dict(filename): class LayerDiffusionForForge(scripts.Script): + def title(self): return "LayerDiffuse" @@ -59,6 +64,7 @@ def show(self, is_img2img): def ui(self, *args, **kwargs): with gr.Accordion(open=False, label=self.title()): enabled = gr.Checkbox(label='Enabled', value=False) + enabledSaveRebuild = gr.Checkbox(label='Save rebuild image', value=True) method = gr.Dropdown(choices=[e.value for e in LayerMethod], value=LayerMethod.FG_ONLY_ATTN.value, label="Method", type='value') gr.HTML('
') # some strange gradio problems @@ -106,7 +112,7 @@ def method_changed(m): method.change(method_changed, inputs=method, outputs=[fg_image, bg_image, blend_image, resize_mode, fg_additional_prompt, bg_additional_prompt, blend_additional_prompt], show_progress=False, queue=False) - return enabled, method, weight, ending_step, fg_image, bg_image, blend_image, resize_mode, output_origin, fg_additional_prompt, bg_additional_prompt, blend_additional_prompt + return enabled, enabledSaveRebuild, method, weight, ending_step, fg_image, bg_image, blend_image, resize_mode, output_origin, fg_additional_prompt, bg_additional_prompt, blend_additional_prompt def process_before_every_sampling(self, p: StableDiffusionProcessing, *script_args, **kwargs): global vae_transparent_decoder, vae_transparent_encoder @@ -114,7 +120,7 @@ def process_before_every_sampling(self, p: StableDiffusionProcessing, *script_ar # This will be called before every sampling. # If you use highres fix, this will be called twice. - enabled, method, weight, ending_step, fg_image, bg_image, blend_image, resize_mode, output_origin, fg_additional_prompt, bg_additional_prompt, blend_additional_prompt = script_args + enabled, enabledSaveRebuild, method, weight, ending_step, fg_image, bg_image, blend_image, resize_mode, output_origin, fg_additional_prompt, bg_additional_prompt, blend_additional_prompt = script_args if not enabled: return @@ -151,6 +157,8 @@ def process_before_every_sampling(self, p: StableDiffusionProcessing, *script_ar vae = p.sd_model.forge_objects.vae.clone() clip = p.sd_model.forge_objects.clip + + if method in [LayerMethod.FG_ONLY_ATTN, LayerMethod.FG_ONLY_CONV, LayerMethod.BG_BLEND_TO_FG]: if vae_transparent_decoder is None: model_path = load_file_from_url( @@ -357,3 +365,71 @@ def conditioning_modifier(model, x, timestep, uncond, cond, cond_scale, model_op p.sd_model.forge_objects.unet = unet p.sd_model.forge_objects.vae = vae return + + + def postprocess(self, p, processed, *script_args): + """ + This function is called after processing ends for AlwaysVisible scripts. + args contains all values returned by components from ui() + + p + processed + """ + + enabled, enabledSaveRebuild, method, weight, ending_step, fg_image, bg_image, blend_image, resize_mode, output_origin, fg_additional_prompt, bg_additional_prompt, blend_additional_prompt = script_args + + if not enabled or not enabledSaveRebuild: + return + + print( f"processed:{processed}" ) + print( f"processed images :{processed.images}" ) + + + if processed.images is not None and len(processed.images) > 0: + images_copy = processed.images[:] + + if len(processed.extra_images) != len(processed.images): + # Batch Process. + images_copy.pop(0) + # if self.generatedCount % 2 == 0: + # images_copy.reverse() + # print("reverse.") + + extra_images = processed.extra_images + pil_images = [Image.fromarray(img, 'RGBA') for img in extra_images] + + for image_a, image_b in zip(pil_images, images_copy): + + image_b = image_b.convert("RGBA") + + # Create alpha mask with strict threshold + alpha_mask = image_a.getchannel('A').point(lambda x: 255 if x > 30 else 0) + + # Extract RGB channels and Alpha from image_a + r_a, g_a, b_a, a_a = image_a.split() + + # Extract RGB channels from image_b + r_b, g_b, b_b, a_b = image_b.split() + + # Use the strict alpha mask to apply image_a's RGB only where alpha is 255 + r_final = Image.composite(r_b, r_a, alpha_mask) + g_final = Image.composite(g_b, g_a, alpha_mask) + b_final = Image.composite(b_b, b_a, alpha_mask) + + # Combine the new RGB channels with the original alpha channel of image_b + final_image = Image.merge("RGBA", (r_final, g_final, b_final, a_a)) + + # Save the result + images.save_image( + image=final_image, + path=p.outpath_samples, + basename="", + extension=getattr(opts, 'samples_format', 'png'), + p=p, + suffix="-rebuild" + ) + + processed.images = [] + else: + print("processed.images is null or zero index.") + From 2c63cf34f6044d95744d4209ebcc811ac786ed10 Mon Sep 17 00:00:00 2001 From: new-sankaku Date: Tue, 16 Apr 2024 00:08:02 +0900 Subject: [PATCH 2/7] Update readme. --- 2024-04-16 000652.png | Bin 0 -> 28183 bytes README.md | 21 +++++++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 2024-04-16 000652.png diff --git a/2024-04-16 000652.png b/2024-04-16 000652.png new file mode 100644 index 0000000000000000000000000000000000000000..f5277c71e7decc57b8c01bee56f588a982aebf72 GIT binary patch literal 28183 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 VU(%{sYuh-ZOXg6sk_$H?{|kfTDNz6b literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 2b6f142..f8e56b8 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,24 @@ +Transparent image saving process that reflects modifications made by Extension. +Extensionによる修正を反映した透過画像の保存処理 + +The following files are additionally output. +XXXXXXX-transparent.png +XXXXXXX--rebuild.png + + - Added saving process for transparent images created by Layerdiffuse + - Save transparent images that reflect modifications made by Extensions (Hires, ADtailer) + Note: Does Hires cause an error if the image size after enlargement is not a multiple of 256? We recommend multiplying 1024*1024 by 1.5 to 1536x1536. + - When Batch count is set to 2 or more, the previous image is always included in the Image List returned by the webui side. Also, + since the order is different in ascending/descending order, initialization processing is added to Layerdiffuse. It might cause some problems. + - The black and white check pattern in the non-transparent image has been changed to 1pixel*1pixel for the convenience of merging corrections. + + - Layerdiffuseの作成した透過画像の保存処理を追加 + - Extensionによる修正を反映した透過画像を保存(Hires、ADetailer) + 注意:Hiresは拡大後の画像サイズが256の倍数じゃないとエラーになる?1024*1024を1.5倍して1536x1536がオススメ。 + - Batch countを2以上にするとwebui側が返すImage Listに以前のイメージが常に入る。 + また順序が昇順/降順バラバラにくるのでLayerdiffuse内に初期化処理を追加。何か問題を引き起こすかも。 + - 非透過画像の白黒のチェック柄は修正をマージする都合上、1pixel*1pixelに変更しています。 + # sd-forge-layerdiffuse Transparent Image Layer Diffusion using Latent Transparency From 98b369c769ffd94c7e8c7a50af79b83e1ce21eaa Mon Sep 17 00:00:00 2001 From: new-sankaku <133557155+new-sankaku@users.noreply.github.com> Date: Tue, 16 Apr 2024 00:16:21 +0900 Subject: [PATCH 3/7] Update README.md --- README.md | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index f8e56b8..35551cc 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,28 @@ -Transparent image saving process that reflects modifications made by Extension. -Extensionによる修正を反映した透過画像の保存処理 +![image](https://github.com/new-sankaku/sd-forge-layerdiffuse/blob/main/2024-04-16%20000652.png) + +> [!IMPORTANT] +> Transparent image saving process that reflects modifications made by Extension. +> Extensionによる修正を反映した透過画像の保存処理 The following files are additionally output. XXXXXXX-transparent.png XXXXXXX--rebuild.png - - - Added saving process for transparent images created by Layerdiffuse - - Save transparent images that reflect modifications made by Extensions (Hires, ADtailer) - Note: Does Hires cause an error if the image size after enlargement is not a multiple of 256? We recommend multiplying 1024*1024 by 1.5 to 1536x1536. - - When Batch count is set to 2 or more, the previous image is always included in the Image List returned by the webui side. Also, - since the order is different in ascending/descending order, initialization processing is added to Layerdiffuse. It might cause some problems. - - The black and white check pattern in the non-transparent image has been changed to 1pixel*1pixel for the convenience of merging corrections. - - - Layerdiffuseの作成した透過画像の保存処理を追加 - - Extensionによる修正を反映した透過画像を保存(Hires、ADetailer) - 注意:Hiresは拡大後の画像サイズが256の倍数じゃないとエラーになる?1024*1024を1.5倍して1536x1536がオススメ。 - - Batch countを2以上にするとwebui側が返すImage Listに以前のイメージが常に入る。 - また順序が昇順/降順バラバラにくるのでLayerdiffuse内に初期化処理を追加。何か問題を引き起こすかも。 - - 非透過画像の白黒のチェック柄は修正をマージする都合上、1pixel*1pixelに変更しています。 + +> [!TIP] +> - Added saving process for transparent images created by Layerdiffuse +> - Save transparent images that reflect modifications made by Extensions (Hires, ADtailer) +> Note: Does Hires cause an error if the image size after enlargement is not a multiple of 256? We recommend multiplying 1024*1024 by 1.5 to 1536x1536. +> - When Batch count is set to 2 or more, the previous image is always included in the Image List returned by the webui side. Also, +> since the order is different in ascending/descending order, initialization processing is added to Layerdiffuse. It might cause some problems. +> - The black and white check pattern in the non-transparent image has been changed to 1pixel*1pixel for the convenience of merging corrections. + +> [!TIP] +> - Layerdiffuseの作成した透過画像の保存処理を追加 +> - Extensionによる修正を反映した透過画像を保存(Hires、ADetailer) +> 注意:Hiresは拡大後の画像サイズが256の倍数じゃないとエラーになる?1024*1024を1.5倍して1536x1536がオススメ。 +> - Batch countを2以上にするとwebui側が返すImage Listに以前のイメージが常に入る。 +> また順序が昇順/降順バラバラにくるのでLayerdiffuse内に初期化処理を追加。何か問題を引き起こすかも。 +> - 非透過画像の白黒のチェック柄は修正をマージする都合上、1pixel*1pixelに変更しています。 # sd-forge-layerdiffuse From 2424080530150ed87de4943bbeadb356941000dc Mon Sep 17 00:00:00 2001 From: new-sankaku Date: Tue, 16 Apr 2024 00:17:37 +0900 Subject: [PATCH 4/7] size change, --- 2024-04-16 000652.png | Bin 28183 -> 17677 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/2024-04-16 000652.png b/2024-04-16 000652.png index f5277c71e7decc57b8c01bee56f588a982aebf72..2e30ef1d66107722cf0d4d8b6676be56158f3e51 100644 GIT binary patch literal 17677 zcmb@ubyS;Q6eZdg_fp&o6nA%Maf-V`ad!_^+({`d?k>e$gS)$1a1ZXh@S9od&6@S* z{WYu=Ajy|2-@WIYefHTm5lRYDXvl=f@7}#blaUrzdH3%9A@u(OM0n_LoS!4f&_C~8 zRHQ`Tm5&i0K%c-`e3Sq7?p+lS<;e&R`W(qoTHEE_JA&D_$NM_Vqo42IiRZ|Oe^c`` zI7x^5NvwWzJuY{9C&%uT+1Nq^D~ovgf)H5K!Q2vcLJ`FX`-%HQFf0lwBKZd-ClBZk zSwqI@S;n%yj75@+`NDv0`(x0Ut9lzi{kr5K-TSOX9cK&c7s?p&3x22(eyGza5)u;M zPVS|6xO@a!H!EsxxU)|7?gs~jSkKuPE9eW|tYakE+2j{UXma<1JXh%%aS>_6ETS;w z4bYDp;qT!hv#awk3ZiZr*{9zMWRKl={>sRRIRBcxGGzaDL0?lq;PK$iXATBgSOHiz zHswO(Iw^5}Dkhk!NoB_t{eY&oaTujJs7y~?pCNf91JdK-LiUTKvHt75v7;w^`k&ZD zfR$TaGV*Cp&)Xoo8!LPI#M7~@W93`q^Zpz5K!+e3Na@jM00P)_*4|2bYZIF)u&)Tl z5IP0aZd&#trBq2GXkU_(J;tkVeJTgDWphK{jHZYdJ`cWCqAAQH=jZ=qKi}(taXo1g z0a(_ywMDJ25n5~5(lhu3dye;F0Td9s})#3dzR6NX++)}kEzhy(0z z*FuBoapK~VBQPHQW2|cSz!$R1n}cCz-9)R8TOHZmjo@7yr@gXyxH-kKXM8`Z`kR%dG&X!tg9AH+#*l_u&BpT<5Y`&Sac~mGmG)K#2*g$NGGQeBV#nis*dHzBmIdRMBeZp`hdp9Bp6*@Umrh5fPZtuYrEWzb$v891)x#P464E^$h9jipzl~8X7lCUAd1dp zhiSPzmI8;mnY9>c)%amGgVxE!B%}M%?q!u)%Gru_!2JIYP$w+*GjJ=D$HdSUv z=yjZZ3Td&Jxzro8crVe45A88QVd&t(O^{Vn*|NuG(0juuM2-Fyhj!YWGey|plg@gF z=?_vsn&Lg#NrOhye0+Er9shp!vYA}JhpNZxY2{WYz`UZcGuih6zcQT~QeBT@m*=tpBpSE8=bfitYXaqNVR`Citj+Ygw6t{X-hbdFE^SU3e{z!yGbazx@VQ7Wyil3AzG<@ZenDo_+U2tN2Q|OT9ityM2j?EHgU#^I@{@I<{BFl z2?F2(6La$+{b-sn=T^U24N1>S8)0>hmyH>}d?V?@(LRMg*3MlZ-1?i(O}cs-fbpQ< zw6^y=pIASCVmLFNs$HZXA@02f_|h-M5YF^oX`@`Z z=`Tx6@as=W&dbOt^c7X9o&)`_dqmbf$$~Ua7&Z7_ zbtTA1GJTpi7`)Xv-GqcL&+7U*Ur5@QxQ^c0?GM0IwHTYehhALe{!IM@c6${Dt+lbV zsyK)z8E*XNkh3pwNG6NLh@7aWF)3alXH+CQU~4Bil<(OgDVysn(WE>$Ce#Yuvi|;` z6h-_*>|5>$J$oPB#Nz~N{km~S3>(#$!uh#Mi#?9ro1BKxG{J2=hCKomB0!*bTg1HK zOKG{7@;Cz~(=9%~&viVxIBi9uN>b+&U$X$;w{l zDv8Q(3i=7k)D+$u&2eyadYr6=O;O2asf0L7e*(IU+*u8bT@-mMCavI*V1+1x9x&~6 zxU-K+1iXs1a47rbR8WFGBqb+D%*=4=hb<2=&0xQnLgt!IU=T3C;Bip*zosb2evrq3 zbAko_3Z`xX#+b^u5D6Yu3>r~`6__n9Cg<$(zSr;MVU#~Z0aB3N8J5ec9V25$#N*IC zG&^(lc364aCd4V6|DsYWj{YsVf$KE0t;&OsIh2e3oxw#VnylmzByrlI zOU9%}Z|3$c|td(6(&z zj`YaA0kHTVq`{7MIfYk9;+N&ftvCXNMAW{`2K%?msq$r?{aSm^W8#0NLrc83lDmsv z^FQ8yVq=6EdTTwBm3roXLn%mg|FvKwSM(p`K{OGygSLn-fsbYVAH?ZOQu+_zVD<$s z{am$qU5N$h4!W&2DjU`~1-hga>{_>?k?$Jo!z5ykjP%3wQ8d9V*mFE67gS%X8 zEs4iy>CQYVy6~v0Y&ABX?|n@dPmTn`at0}ZYt`s&$CtgGVqs3lTE;&Pzi^VepDl)6 zU0rpgaeyJ7&^SzLYGwwv`(MxZgYY)#%N% z5{?{KpUweo_&3A&PkTX%=igof_7^SQ^(iC~YUz0T5psWuFBnCZOAi)Z%~kaOw_HiZ zx;H|sC?|UR>J!}dhz|Szc60)H_;r$v%ds-5E{aL9b?oEQ{xQ!iWaCCQ2hyQl#SSzR z{gqC6w7Y$#T4-UqHNW0R$3U;6#sf1R&MEr-<=HQmXu9&%b0U%p;T znaSH!EK)xp)eX61ed#aoW$$O$V#Ipjkr6xyYw5{)<$&B>#<1yx%9wdkrNM!5Fj+Lq zQBOg88Y@1}vyGQ?N0asHF8cL=6L`o^9+Q=xV$bJvgCs7G>@k|u2K)X(7*M}}kVwz= zXAFKpMpUU-((dp$6UdymFPlZDar*ePQ$!+}V7ajMi1^k1DjB6@j4E(>a}N`=`P>e} zYIK2$c~qo2_a8#Mln)4AA{URG_I8Km=OB_+xZRAf$vIbO;QdnYaNdto5*%W7l}{H_n3$N;Ks-PMmLzx5Jmhyqxblk^9SME+iJzm$=N|porUYwVI%v z^ok>)LNE97;8`J^4Z(K^0-sN2ZhgeT47Ar*h`a)m zQ5*FQF{T@S6z!E)93SZTb5O$uSTViMh>utOAS*Ue@8$x<7%`qt*^f%aDsZ+7t?G$T zSaH($7@Mk8p&G4UZff@}WUdD4nlaj`%q&%dpsQ5g`COmBFHwi`hM|NApq&H8BO+;1Pr4CO%a zteD!!0?E8)@N0ku7V4;u!h(X%`1st*CiL!g^uP2PU#)dY{0ccnzciTiV?iOFyU)!m zhG)xO*qz_GqguJ%`^TQ3*zoYL`N%u9K9c6tqD;qcen;;IGSv+8Boq3c@T&weHOsJQ z5G+ruYM#hNlxxI77ZTBtF)u$qJv-~3+CI5}BQYO41#ye}NheTDYU>^(93e&4iV#CI zC&gVe_rZ*qjYhZLPAZu_|5_li$y8fUkFkVWt<#1@C`$OOE%v={3;3X)RQy1NYNka| z;TlEY3~qdEZ0_v8^~|RIrNl8CIcW4{1?@||7i0x*(9=Vjp7i){cyj3lu2ngf7L%f0 zxzh1s0~wj`Lmi;;dHc)(Onp#2GQvm#a+k(@Kl*9YHOeBL+JLirUhYdO2T;cRrHob9 z`#6{`iQ9#_9ZS&*GKJGvaJkbQO?olJb)=*a++qcOxbpzESD#X#HB{(>WO`cIKhbM; zf!0n#4r+FdCKM?v&pJA>z)SyQ*EvG-4-^Sz-d18%%Hg1b0!nSzr5$vMMnqdlT=A?L zC)&ZNg@G00-JpK37z7`W^z>8Ad1Y&Ftmr6grAdD*B?p6Qe_<3})O3{zb+CH5+IyVg zN3qFGqs=1qTtaAEqBU@)8%YM?Q*A|oQySxQPO*FHUEq1p}MhDmI0KR&_7DtRNb{Sh!r_PMG8UnsV(!yH+de*VHX3N7e>v^KG7c6P z_7Z&H5g$ur;gCHwa79+lt7fk8G6aalyj#h6%9YaIMFe z+y=DURf5%FBlv&)M)s&FaO80yq$O7pM3e~p@H+v1yfs9HTOx$X=8E_A_8+4sk3-1q zfHGZTm?}%DfM~9051ugtg&ak&k65BYab=a|kCb6cM8`J0VdTJamM--oP{2vC9kAY!m_*w}FUmxkTq;A^whGr}=E zabL(4e@$L@Lsl^eXg~s|Sudf8ZKQ(Huwxm8jNBV(m=_%$rr0J4`W03rH9BjSOu6=c zbCVsEnBLD`zFje;SbjF6YVq9lg0_}{oKN{PWTku#OG}Y&74RM=pr~=!gQ@G`g4WwO zaM%;w5})tVY+bCY%T;F_W4YcGNqohNXeEZIYqbDJkIUw6_-)hT1y7^Yxo*%Y3PnYa zBT&?eN_-Y1{^+o979d1r6Grh2R@_{zkwT98#CxRDh(ERK>Iu6NLm2+92Zlf!@o0&l ze2MFs{QO4|dxota1VzS{@mCsZ_(mymh^kVNC0ZALtMu8w0zCQUYyIe?|%tlJ%lDa@H_jfXQA-ue`ug)w1(!MWLJ!qs~4D5JSGVW?Tjkh}4W(e`3&WS2i-=nu|u?Hv6 zADnF<^(LpcLPSDX*pL=EEV^qf*{TahgFS}1A^)bI1DVJSn>`n|y!vmBg2Eq9Zz@co z+bzxI0{bwH>*&|Q4xllGQ*z{ph4Q-0gR7JF=|XlBtIB=049#PjI)FYp3N3V?W{>%& zMW?8#-z}w&RP0w~^yEx*O;NKRv{$6^Lv@&ZD7cPx8Ke^>!6HIS><`NGCKI2l$i=*U zP7H5+){y@_1)T4@(Lg?nC-sMvNUtsf-L;U@vW8TyK z*^AuMm22Bx^Fny$Q#bM367ucjDHRr!N~O;p!Q?$3tvhMdeX$Upr50r4Y2ECh7ot{f@`$NlrTjx>}oP1Kk(KjKgl z0S|;->}bAAJfp)az6am?AucF^h5ww9`W6$9dx`_-LNZ*nGCNTF);)kfVL104h90zTLrT^UaRVE&{aW{F8e7_2Tt=kGV9s2O*x) zx$^!kDh3!;KX!KZD&txHyvvuJ9ON^MLWEJ-Kn(XcTswv`^$3sX5hd*q?6Jo@sox+{ zOM++zXcaa+66@lH!hN&2qn`dfly5p3i1wf_gcy1_43}Eeu!~cf-p&^upqmqspK&JC z8z=Jy;y`~;^r^!$78Jc=Fv3kuO;B(U&iTjy)QqfWIk^im z0g1G}cVW1Je4hK^#FyNjY5fiGyw1nG+`~`ZQnALb0b&EYNZ1P+P!{4*Umyb$Fx3-} zrdgIkQ~s8Sf>*WxsvC)n!ZV_R-^PpBzMA8T+RT0JA!)Dndw)Nld zw77U-)n?xhs?CNq!QJl-jSnu=@%fE8t!Mv*euDHuDm-2&jSa*=s%dK{vl!}F^u>kq z(0q+iuN4)ma729YQ?JAwy|upS{At^r>Bg;AvoTJeTvDX0KrQCDd&rn>wJi=Vvv%yR zJP|nsh2E{z>Vv#i6@bYP{~{_hPq)r8lIw^&M-jv_aX%!BNq=&&ydaZAm*H}hFv{w= zApK9ThE$$tw!cqa*UdY9nCkY5%XIgtJN|rV$+m zX{2YTLIZ?P9HKoF;m=u#uWMd!3zp_Gm5Xk9fFv{8ZSsju^DKFob|RT#WAH#&&`BP9 z?Ep8dM~%$jjvdZw%e46tuqeq)I|LMRt%&UB7;lS&nl?hhKy`IKWC+FoTZPAK2vNmJ z^cg&cn5il3Py%y|7s}HPlz|I`l3+6>$|Qzpgn{T3YG10i(jScc>d@l6W^*aOr=(d><8M8ROxv51~YJro=j_!;hh8zBe4J z=PVZ+CcB^R{P;y(&~DG0^`Faq3D@2EbAu@;L-g+uj+xLaSc+u7m`qVl#UUBKqXZfm zKJPpX_|;ji;b;2Y3!OGy;-Vg}qonpc8umBDBH8tR-Cw?x_gQ%)Nxm>DAST0l_9Nv+ z2D-H%RDhm5^t`YCHWm!;(BBx!5(&A!>hD8t7#bgMQeBCK8p1Nje8yUC@0{AWq7-vE z-aG~d&Fr7&I?MA2`(-3I_|ATput>b;mt3d2eMP76NW^aq%rp`Y5R7!pLMaGOGC9_Z&Tq+fAy(M*9 zz7>5^nLZ)p-BLzpFF}QfG-4n(>v?f#K1oR-NNh82*QEdffbNZo%Ec-G>+LW)3Gm-i zHAXRUaYG|Oe_Q}0f zGk*Fapl^kH?g|E>wn#}ySP|5t-9obPsY~-#3!;)PJ!!(l=Jz7ry^+3XgX6 zp7$-n-BXe^%t_ zj}Qq^Mv|~iJMvfqMHZM^UhI*Z$#HfkG3{e#K@3q*BkR8wms?WpH5GAQUCQ@Y8l{@D z6HfMkL+t+eI|m|{K7S!TQtYTGiP1xKb-@+`Hv;?S7wc=*dkFjx9Xkp0$>z>unc43g zxvu-1Up|g0vGAh!>)5!TLCZ^l5Ph>QsJ&$V~OU6(I zbB+2~U_(6j(eEVEEhk4b|{C7h8W77nk#qn;80=wf(y{`p^GYs?8Cl#7e|%H|eC&e<{Rhz|k9T zJy5ltT5%Q$e|;40NHz({@!XICMGbKHD5P+fgjsRyl{j^tROmN+OUPU*U!g)SfdL6T4qg+31J4D} zV%xT!9hR$5Zr5E>CCP41mi>)Ms5@3&`sEwJb42Ikdl`~?w*LSJJ41gZ4t`TPPP^&P z&|0ljW+aRQYctxMTJ>p6eK-)E)_o%?(N8|eLM<-(Qli|nn&kY6|9hM8SwN6ugFR9r zqEV>j7*G7vuZ#mRaV=UEc5!J<3$Rus#(Ot2cJ2D` z#iA-KE;S*u2ivy%gH41}$!9>F+lc%5MBDL3XZY!0{ag{4w zxlqGxb-mfmdZW-NmsMXpE<$|-zCyFm{D{@>SgMG7R##aWN>b3S)>(-l>=y@Ya5 z4(l3ft89zt-TNa`8C>4)C1aDrTkJuYcH(z@V=WrNk74ALoNQ5>JM1bL@e{lva;>U> zC+ulRe1X+nt9E=SKo3gA^%jik#xcWx6ne!SC4BUd`yqMzdxycv>XADotG}l{_C%+c zysL+^9!~7V^rkhWh~ZJYLV-y>nn=j~6Su=Mb7%kpR|!>CHa@q@9!phbE^-Ss@B{l>fC zI;$NPi?=ZEy(X{sxwh*8SXDIR7d*;1+B#rE+5;YZ!zvQMg zu4#YL0+W*Vv5YK561K6YR4EN&yoe^{d5OPf;A`h+dAgu9LK> zsi@E@+GnxGMIM90{cZ9F`CHJ*Bx-4haCY#WcgKP>qksQ%!rBzbC}LSVXVfjPV2*h> z;t2PtO|_qYqxo3Vu&pr*&sSUGoYut#7HhQ)?eK5GJP(Aj7hN4+P>C}Gr+W1cXEPAv zU(quo7vu7X1*f=h+eldw9Av=9-OJ4Y-#dbg$6+j5x;}*No45L}3(FJS->ClL`Dhu{ zUyxPcz)}s~qRrgFay2#~EuFMi`ijrizhthOe5#mS$m3V(53;RS~y z;9Xy!gadA@t}AazuD8ZBzZl;f%H8Zyv{QhZa2EPseYbW#ByvZ71r&+`hvOeaKp7L%!!h}(j zP^Z#A?gz^?NhJ1qpA*Wy9tsFyc7D8nfsxj&Ms1%_3r=7`@QCk21no#ZkA=%fo5FS+ zpJi!rBq2gO zyGoY6UyeGD#Ou4oP$i}y^@mkf6byvA@(-oyCbZH`Lhi^|dwd^og5NUTC|sD<{1G}S z=hpKb&yP7WIxlX%$;pUJxCmt6+izycCnG%J_ucmwz}g5v5<5!|4*k*KML44NxXU3o zFA2qPO_Lxo`6gqxZjJco+?*#cNG0L1!>;CEmu~G{`s}%k+1C9b_s)W=cffK>qXBw+ zTVM2E?u6P8vApP0mRqUT?KGz4jn(#Ue{Wo1g^EPu;aq5`q+8>1T|kQjM_vy zb>C%f1;6QJ4jzm2Dd>w?+9I!BGRgmp2NX2s7j~e!*NQFJK62g38QBCx`h$7tI{_=G` z!y(?sUE9=UrS30|t<5s_z~x^T&MU&moWm1eo$C8da^k)kCEhqT*p|CNSq{lOeD%}N z>w9rrf9*F!?4O_-oZ{fNCClUNek^|RDiocD!+`k-uQ2B;P$eV?wsz|Z7AcYv0215f zbBla8Evwdvf@`G#&Ci^~zaPbed?>No7FaRAl!HBs=)(h%i3%mQ8zb>y+p#JvO}_x@0yo@vKu&Z)1AsjK|-AAGnF-w1RLTNH}f z)YwP09)Qo@TiADZ6v$&3o{<)kLrvnGw2|~*0~V2K#3N`Y^dvD7Z^Z-x{}8PyeA)3y z-jeAThr9VET%A#>jnydekCPzM0Wo`D8I|ttgV=avnB-4HVluiEx-~jDjksznE5C}& zz@w49s*I14#XNcm7Hqa8T4VZIaT}g@a;+v_bEDPRBY)IDmKQCjz<cq1WN@; zNA9M}oZM+AR*Oo(33PBCD3Cvk3QMuoX=HXlIlfcDrQtUxSTvwnL{e=r5~?Y#3zwfI z?Tc+F9IDnm(@7znot<=Xzp}Zt8Tq5BL_MU%Yx*aG91d!icA|gKZOjg%?BZJk1AMvv zRY60YHWAUDxS;3&H5bwN|5Pb0=nx$Z=4h8qcIZQ0&hXfnWG*gw=b5TC4rf^N#H$b(4Rb;K2xhy?B6mgy&{ zcaE7E^bUQ+_rbgTZB`nWl0uqf0u7J&cw|rp7ck{hJ@*i!t8R%D;&D`;{_>cUP7{sP zj}>3_y0O{u2eeX4a9L$CZ;+RtZzD9Rti0h}1|(4wH&$`Z+Ll2l5sri=jqn8uU3O%G zuCR*~7fw}dG#RZ{|8+oF&I9K+_-PXb#ii797p`r6RM+EYMME@B0HbC-C$x$dl}k~} z#x`j=m-k+;`ZRhGh1F@u)^@2H?TE)tB3);e&1#95u0>(jP7|Y1BL)_lMt^#|A?biJ zJ#1b}dOdh7p~ySK`+led!nl`s%>9wGM^z?!q%)FbkUu5`YJe>#}--f04}tMnhLk_#9BN+?hzxpuyziQZ+f{_cG@W-)|{5q zBloDQ@H%j{#EbH}$0O=?RO*Mv;lg*+cX&eyOjKqRZY2M+$3IHmZG5zthQv5Se|yj4 zz{+jbW<5RPonB=ov5X#JAy)XQqASg2s*sKlEh#Sb zzX93Y4s@$TXS@rHIv{o;V}}2=?Me4XiQ{P`ud2DO^hnG3L}zw(_y%^ZNv{SFXztHr zrKTvjKDWP64mT9BC+n0ypPsfo{xFwl2scNLZHLS@tX`o(aEZ$}Z8g_sdQXTJr&+FL z-~gjrXHHoMEz+Gy{GRbpY5b4ef$sQ0Q*3#2pZQW%Rjffmo_`E$ZfwK?3Be>SH(6#i zq5PS*l0X6x65WQg8S$zTq`yjXtw+!eYSecuk@82Q-N(vyrBxp;ee(p$LLD@^q7*~5 zC=yVW2nh;qSw~Jj1DEpgL%F6UZCa)imW3tz;tNa|<{@$%|Dm;W>RU-jFB<#qM4PeO zySTf%OJYP3P<546Q&WS9iRstXvcse~a>}g1s3DQ!_#A`)>|pA92bW=V7Vh}Ue^p-7 zs|(y_V1rQ#*Vb)v&VT0kFcGC7BQLSYp6{9xD&f}`^47sqg-J!zf6_{d=%yT~mHsc% z&=G%}hcO61aV5p<&Aj>u5CepJYgj!PpUJbwhHmz!2YfCJ!&k@Osvh`oqM5W5DZ>`Q z;u4bB(v>JoGb6hNUpY)tfoNRm|COo&!PgI036^Wm;#Iq4lZClTCNsrW2lOLVY%fxQ zDboMRH#Rqz#^T~O!($`GtpV_Y8SxnJhNC{9aLs0Fe3f%m`w{y#W_*9__J%-Xs2sO= z^Zbc6Nl6wC+q!xGZSY2EBwgJrh?p3uimxNU4@g{@JMv|P4{vRUI^FzePrSq(YK4|e zFS!}L@Bh02X}(GC$L2*i0O@#esJ;jQCP zY3Y2U?mnh~Vi!dn9e!@xCBh_r?>CCFKb8u<02TaHtz3SPxBaJMCgg2*L#fVy;!81i z_jJ?{_?=gac1pYJX!?!0;|p>B#8>eb$)pRuF@u@&u)NHx36Z(i#cdHT1y5_Q*S zdEI)Wu_uWl-If9cGJ%Y6q%P^%YkEhUH^f(_R~)Dizp|G! z?PF?W06GcmSeCrI+o-H$Eqf!j@6O{ZCUznf0J?+z-LdH{RX--#p*$QDD~-d0?@f$B z(8+Qw;s_mY=Uzhp#rXXCH0rVl08KH89R?bKl!PXD2>Se^G?}FdftVL9W2KpVETnEa z0DdT=7cINgFn91`=o57xm5?+1H?ic`*ss`MK*i-YZx%liq4!V^Em8cNiq&#}<*hRQ z0FI1`>ivOvyTdSVNz(04LYZ(ved0s=#buXe?jAi36Vp8oh;@XyJmC9W?C$W9oYvqU ze#(%mnrWWrS zbKkH(-dR1xQoVI7)YTdvM)O$<+OAij2$+d*+pU%_E6RNrZR4+V)kn623MpnkYE|3j zN8%gtIxmehNf$X!>1GJ}a+^nDUU-2rid0)d!}YlI++_s#GI;eBz@|y~#Gsh;ydwcz zVWIijD^wgQ=2ER}!S4yt^JZ7Jejj1XpYjfx)9I^U>57ZBn#_e_BM}5G2N1u6H&(ZW zp%O*Ns9KP7CtyZ7Cp9=mNHRj@^I3hWx$tgW!GmsrM=l#|?17yohSfeejD~@&+ zYUNt*OY>vJ4>|~D7od6k&|jt)sHGjfTo7~r)0C>nFRQlI6t-*f8g}=&>>k&u^dyLk zAlE36qg!l<0gy2MaewjZaTtJXX94P9{k@8Vls}y^P+}=8yF6djqFytL^>&xi_VcT@ zws$%|>Gs~0=r$w}lC+`&iG^Z&WfQ@Vo!!r&;b|3a#^=5_I~V|A0*Q@wfefxNe*CIU zr^_@(-73Pt!Qwmnb5`4hS~z*ax$c<*mu=qA!|Maj`uh`x@pZ*+$pd~DT*kggb(>jT zV05(7xBHz22%(oT5uENEAD;nK8B37pVGaCE^)w%dr93n+Fk@2SB;XM6N?fs8sl02k z`4eAr{gqSCpYkcD#sK-OK?J=QyGi)|*iW*?6O9QAA|oTC4k^4HItn`JxVHK_{VP8X zmjowE-^u&VvI48^`t>ZcESn=Zf?Wrl{PK4&wvX zkDAP|W3DHyet?u2&jpC-`ni3!dD-mUt@5JhPm~uO>a`6XRa!mMp33p|o1mi0UD`CG zv-(vc1ac$@x> zkDor3P;h(hS1dJsMCKJ+?lkE0IpAy}DV)X#ePr8+a;P&om?-}%3Ck<^b>ZL^Dp2O; zmgK)@Y<=CNSz<=rygs;X0w~()a>pz9rnyu5#AsIlg}X7f?$t}Q49?Ol!bW3j4OUa` z_TwvhKJw+bc{>Y+1A$Vtu4<^syXC;ZG(1uu0yLfl(1F+>7pX#5cXX%28s)eql-j@$ z_)aCZuZaC>E)6>>i|{Up!uYHoxy%em*p&9m;`yK_Fk(CaN5aZ#!VgzAi*uj!`v82= zlR7uoHkj~{#P{YCN>}^OY{n+WN(E|kIIQ(%k8@0pYB#{;FM6+|r)_bJ#y!5L4Ee-97n zkRq9?%=W}0w5b5C%C0Lal0WK*|AwbdW|;qRdQC^fcg2@)1OXSq_-^-juffbT5CG;uB@5W&% zVX>2XdbT@=L0@-0UHo`RM^7f`3t6jGOEk)mNn6j*SNzBA_P-dgin*d6S2C#4(xfZq zV^N4IMx~oOic@Iw`vdrbNoG=4A2-Ne4`bb?$Q^C%A=T=QdpD_*TCLT?%vPlapCiH% zyJP0v<{a0f{Jp;eQynz5TTMd@zVaCQbLnu}d|A`;wQ31zUZEnPU%onBc9@F2fy&%x z!^Nlj(A0itmK#)%w?IM5Ru#foXUrD)7#=uK)a|>k3*Mn{8WN$ZoAqoDhoY;P%fWfY z{tTu+;OhN#2i<@Rj2Nbmg3oFFN~>8|M%eZ?HclTjP=_$E92M=52YR~gDKx6bK9?`s z_b~Ce_Tsbc55U|GKvtdN5k2Lv>C+vl(IyyJK;jLZCS+Xh6yC zv7q8I#4ks_Z=y;WK?;E8br0BnvX#vqbkD!yy~jkK=GE!T%)B)W{vj|uT!7=VXUDT~ z(BD#w&>;MaHQC!xvs}B->^5@pp{Ukhip|o#xt)P9WMIdLfzL#;TsPC*FQBIbBR!_R z6VzRqf$QO$O^0yhG%sh8N;^xfO0=`qYk0w>6H>0~h5C8-Cefp(`(ZD?PTl#u<1i5sgYXk0Ij7bK3kYx#B&~MA$?gtucW@ z-7OU}J%EiC1Ffb83VGjdZgh4VuSEYoDrF*Veq~;9I=bGckQ83doaY`t5povB$1x>h z|NRvv%6IUHmgKhgdf& z4_Cc#u-CX|Hm+ZxH#n?^korD=%Sg#Ao%MIV~B7) z^WPeQVtY--TRkbPKhgISFr`GLwF~3se3-(VTEnlC)!n?zO)>`*96@C*o0S5L|Y_MX1(d}u(uUvaivG_yjAWs4VKv@g=4kJ|W z^#d~lJo9sB9MvLpjYM&yQV)1Vy?%0Cb-IoWxjM*q0bMVAAU7p6HVOde#dY(iOXJ;k z-g9xR=fs6K!k{5A7dq|d-0fLASeXYXZVA+f+hcW@?(q} z*$Aa`Yx+TkxZTYgGCdaYmlQL#GX!%KPm{b9gJdvpEs^19ZKT(z*Wh&~_h#rp5%HF} z7db_D$Jt&1@B4d;+T0u-@r3~X3`tgO#+OFoNy-&-m#RuWcl?p02vx;s77jgJM$S%A z#m#wiDa+aF;shc-z;E-I#Ie7oy;UBu-Zk-2Q8BYh`m&If{mB}vqKscZJ+=e)FV~Ll zuDWl}w{vfg0RN^Jg&WG2Eog9wa!HjcPG3c#`hfv{p&patoOBA{EGCk9GtTXLr>_g2QX^5* zcefqnF&l5H!Ll52LdK}{cDUuTYs>{I`Z#|w%v1x`R(ZZIF8XDgr;oKeN(Xj5{qb~f z%h!Lr1`s*4J+#gZ-#GPzrU4Av=yxpwk6<%XSNbKZc9Wi<+UVV-dE2%dYc<)4FMU+Q z8pXFmV?P76xU!KAybqw|Vfd?)SkUXe6PFG#FY|XxSIqL)p-cb18bzT%O+z2tL|047 zwG$uxJ`-2i#K<8;%ow3An{doDgH=PZ^$fwiv(2Gl{v!N6VQz%ImdlpyKQ*;#5uX-5 zrzgXNu{JKpcBZzpDUvF$Ii|PX1n^E1e==T%Jo#N^Hk_ZPzRnP%*FW!O4I~EDOO?9} z+x=nI{|+lC?;=2KIpL_)y$F1|2|4M_h6Qis<=_vk`@IB6A`d4r1(CHs;6o4UAu|fS zrr~85^bRc-O6vepJPmv&YsTL}5ilGX`ke~n;>T-Ax~(hjWF?OCR5C~+-b;RjK{|i^ zY!CKYwc9Y-d=btF+m7E>O!eiCLwE%5l{D|^<0`P5Q#(?Wg}pFBp>xIMQT`AP^q`># zc}KJPj3FG?oCrq3BoN(nY31z-E*7{HBa477HU1=u*yFnZ@*pSXE@*CE*`jBU z7Q~;9-1d&T+mR6{^R@MC`rwKn(&G0tlojQa`wl@Y2WDTl{&o)kzxA2X^(?OKfma(av zXrS*RqSixa(R&F<&dDkkIy#|%h1OkOTe0yp(BFo&qf!!1Gy-Ok)%NqGnsz6JdK#cfj|=8lQy$`Z$}7ufWC)oE}(G25({=ZCH*tw>hXDt9*@dQCrAB=Cx{Vync4u^mKa z54xA7+I$Hx$+l&2KSzCL%jr1QthW%|8Pa+Ey;FK^Fg`Yw%~2I?Bos@=aV7IU$74NP zUe=DLP#EBU_1#6R0(jdYfaD{Wk}J(>J9J~LJ2`C9MohG)McpvSPtcBTFB@9iM9NW; z_)n{Bac1@93|(j~pMCUUA%Rnmw|=lW?Vls{YSjwYR@;10MwXxjJb1f*7;A&?tzXMo_8VgwBd5woUciI44J$W@79gPzLd#&=N=2}$Ci;Z5X=tPyM z;|{K-GZ8klYGdD$r}Fbpp5{q%jRis2C)Vl=!)IA}YrP#uvDc9DAZXfr==ia}B;ttk z)=*ywms01Mt(sfW+V8 zL(#5yPDC2KuXHx*I@j@U(;p|>?PS})fhXN|YNV*+gFj8#;ilfsJy=iRY|_|dl{_o7OpFB?zBwU@ zYrU_^#(iu;;>eMZ^~*)gAWn*oUyxq-kYw<9+uF0{5A^eic>jJZ;8W(Bg+H}rBPt1- zj@Y5svjU4bzECb@r)eDu((@5{x1<$2A*E2L6L*%$khG$nt!sv;uYu@#9+cfHmhxzq z#ye|vi=y6>%S&Fk0nV@YCY%U3&fD?8?h?K-`P|8!=A}o$g*NgXcP{%`inA}CRLd^s z$`1z$`2=-S`B?rEfq8nxz&|xlN|lK_(ZP8sHnkw)=ek;BX{ptRGTCX~W2sWURo@%{ z>n~zZ@-`aqvv0A}E42FZT~rjB0nbRS`6ny~h)L1P0NIWFNH{Q|y&ox?sIRv#S2P1C%w-^CJZ#AgwOS8rrG z^cx*ERzG(FQOD#vgO_khk}Z?93x!|Cp~N?9vk0(U+5sXlzDr=s@x;IDt?qLLu911l^h%$YQ6o&K`U zo-g}PS=e)ZIUwxx{SL4_f7st>v&}#8pqBQZhaaWaRL%vPS;N@wJ|}ixW`EJy=}s2~ z&%JJq-~&z@9xAFiDm#DCq3tmrbItCoI0@NL${^^Y)>r5=i%I4Lj7xHyU1n&W<0+r7_vGz|_Lf_XuOZH|;8ME4_kSvMwlq)k!P`iXa}#4Y h2yHN($oixH%f>Z34di6M0*^3Z@O1TaS?83{1OQMGJ(U0e literal 28183 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 VU(%{sYuh-ZOXg6sk_$H?{|kfTDNz6b From a5ae5de0499e532320eb7c99961c0093de04e8ba Mon Sep 17 00:00:00 2001 From: new-sankaku Date: Tue, 16 Apr 2024 01:44:47 +0900 Subject: [PATCH 5/7] Problem where rebuild image is not created due to an error in Controlnet (I tried to prevent the error from occurring, but it does not become a transparent image. Only the error is avoided once) --- scripts/forge_layerdiffusion.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/scripts/forge_layerdiffusion.py b/scripts/forge_layerdiffusion.py index ad6df5b..ba9ad04 100644 --- a/scripts/forge_layerdiffusion.py +++ b/scripts/forge_layerdiffusion.py @@ -388,18 +388,23 @@ def postprocess(self, p, processed, *script_args): if processed.images is not None and len(processed.images) > 0: images_copy = processed.images[:] - if len(processed.extra_images) != len(processed.images): + if len(processed.extra_images) != len(processed.images) and len(images_copy) != 1 : # Batch Process. images_copy.pop(0) - # if self.generatedCount % 2 == 0: - # images_copy.reverse() - # print("reverse.") extra_images = processed.extra_images - pil_images = [Image.fromarray(img, 'RGBA') for img in extra_images] - for image_a, image_b in zip(pil_images, images_copy): + pil_images = [] + for img in extra_images: + if img.shape[2] == 3: # RGB + pil_image = Image.fromarray(img, 'RGB') + pil_image = pil_image.convert("RGBA") + elif img.shape[2] == 4: # RGBA + pil_image = Image.fromarray(img, 'RGBA') + pil_images.append(pil_image) + + for image_a, image_b in zip(pil_images, images_copy): image_b = image_b.convert("RGBA") # Create alpha mask with strict threshold @@ -419,6 +424,7 @@ def postprocess(self, p, processed, *script_args): # Combine the new RGB channels with the original alpha channel of image_b final_image = Image.merge("RGBA", (r_final, g_final, b_final, a_a)) + print("save rebuild.") # Save the result images.save_image( image=final_image, From 3202ff8475563cfa4ce063310631025741a3dad6 Mon Sep 17 00:00:00 2001 From: new-sankaku Date: Tue, 16 Apr 2024 22:18:22 +0900 Subject: [PATCH 6/7] Controle net rebuild. --- lib_layerdiffusion/models.py | 4 +++- scripts/forge_layerdiffusion.py | 33 +++++++++++++++++++-------------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/lib_layerdiffusion/models.py b/lib_layerdiffusion/models.py index 8140c29..59866ec 100644 --- a/lib_layerdiffusion/models.py +++ b/lib_layerdiffusion/models.py @@ -237,7 +237,7 @@ def estimate_augmented(self, pixel, latent): median = torch.median(result, dim=0).values return median - def patch(self, p, vae_patcher, output_origin): + def patch(self, p, vae_patcher, output_origin, transparentImages): @torch.no_grad() def wrapper(func, latent): pixel = func(latent).movedim(-1, 1).to(device=self.load_device, dtype=self.dtype) @@ -278,6 +278,8 @@ def wrapper(func, latent): xpng = Image.fromarray(png) infotext = processing.Processed(p, []).infotext(p, i) + + transparentImages.append(xpng) images.save_image( image=xpng, path=p.outpath_samples, diff --git a/scripts/forge_layerdiffusion.py b/scripts/forge_layerdiffusion.py index ba9ad04..25df429 100644 --- a/scripts/forge_layerdiffusion.py +++ b/scripts/forge_layerdiffusion.py @@ -55,6 +55,8 @@ def load_layer_model_state_dict(filename): class LayerDiffusionForForge(scripts.Script): + transparentImages = [] + def title(self): return "LayerDiffuse" @@ -167,7 +169,7 @@ def process_before_every_sampling(self, p: StableDiffusionProcessing, *script_ar file_name='vae_transparent_decoder.safetensors' ) vae_transparent_decoder = TransparentVAEDecoder(load_torch_file(model_path)) - vae_transparent_decoder.patch(p, vae.patcher, output_origin) + vae_transparent_decoder.patch(p, vae.patcher, output_origin, self.transparentImages) if vae_transparent_encoder is None: model_path = load_file_from_url( @@ -190,7 +192,7 @@ def process_before_every_sampling(self, p: StableDiffusionProcessing, *script_ar vae_transparent_decoder.mod_number = 3 if method == LayerMethod.BG_TO_FG_SD15: vae_transparent_decoder.mod_number = 2 - vae_transparent_decoder.patch(p, vae.patcher, output_origin) + vae_transparent_decoder.patch(p, vae.patcher, output_origin, self.transparentImages) if vae_transparent_encoder is None: model_path = load_file_from_url( @@ -381,30 +383,31 @@ def postprocess(self, p, processed, *script_args): if not enabled or not enabledSaveRebuild: return - print( f"processed:{processed}" ) + # print( f"processed:{processed}" ) print( f"processed images :{processed.images}" ) + print( f"self.transparentImages :{self.transparentImages}" ) if processed.images is not None and len(processed.images) > 0: images_copy = processed.images[:] - if len(processed.extra_images) != len(processed.images) and len(images_copy) != 1 : + if len(self.transparentImages) != len(processed.images) and len(images_copy) != 1 : # Batch Process. images_copy.pop(0) - extra_images = processed.extra_images + # extra_images = processed.extra_images - pil_images = [] - for img in extra_images: - if img.shape[2] == 3: # RGB - pil_image = Image.fromarray(img, 'RGB') - pil_image = pil_image.convert("RGBA") - elif img.shape[2] == 4: # RGBA - pil_image = Image.fromarray(img, 'RGBA') - pil_images.append(pil_image) + # pil_images = [] + # for img in extra_images: + # if img.shape[2] == 3: # RGB + # pil_image = Image.fromarray(img, 'RGB') + # pil_image = pil_image.convert("RGBA") + # elif img.shape[2] == 4: # RGBA + # pil_image = Image.fromarray(img, 'RGBA') + # pil_images.append(pil_image) - for image_a, image_b in zip(pil_images, images_copy): + for image_a, image_b in zip(self.transparentImages, images_copy): image_b = image_b.convert("RGBA") # Create alpha mask with strict threshold @@ -435,7 +438,9 @@ def postprocess(self, p, processed, *script_args): suffix="-rebuild" ) + self.transparentImages =[] processed.images = [] else: print("processed.images is null or zero index.") + From fe21e676c78f9c876be3b0568d0e7853c8867f71 Mon Sep 17 00:00:00 2001 From: new-sankaku <133557155+new-sankaku@users.noreply.github.com> Date: Sun, 21 Apr 2024 17:25:11 +0900 Subject: [PATCH 7/7] Update README.md --- README.md | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/README.md b/README.md index 35551cc..2b6f142 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,3 @@ -![image](https://github.com/new-sankaku/sd-forge-layerdiffuse/blob/main/2024-04-16%20000652.png) - -> [!IMPORTANT] -> Transparent image saving process that reflects modifications made by Extension. -> Extensionによる修正を反映した透過画像の保存処理 - -The following files are additionally output. -XXXXXXX-transparent.png -XXXXXXX--rebuild.png - -> [!TIP] -> - Added saving process for transparent images created by Layerdiffuse -> - Save transparent images that reflect modifications made by Extensions (Hires, ADtailer) -> Note: Does Hires cause an error if the image size after enlargement is not a multiple of 256? We recommend multiplying 1024*1024 by 1.5 to 1536x1536. -> - When Batch count is set to 2 or more, the previous image is always included in the Image List returned by the webui side. Also, -> since the order is different in ascending/descending order, initialization processing is added to Layerdiffuse. It might cause some problems. -> - The black and white check pattern in the non-transparent image has been changed to 1pixel*1pixel for the convenience of merging corrections. - -> [!TIP] -> - Layerdiffuseの作成した透過画像の保存処理を追加 -> - Extensionによる修正を反映した透過画像を保存(Hires、ADetailer) -> 注意:Hiresは拡大後の画像サイズが256の倍数じゃないとエラーになる?1024*1024を1.5倍して1536x1536がオススメ。 -> - Batch countを2以上にするとwebui側が返すImage Listに以前のイメージが常に入る。 -> また順序が昇順/降順バラバラにくるのでLayerdiffuse内に初期化処理を追加。何か問題を引き起こすかも。 -> - 非透過画像の白黒のチェック柄は修正をマージする都合上、1pixel*1pixelに変更しています。 - # sd-forge-layerdiffuse Transparent Image Layer Diffusion using Latent Transparency