From fb2e2716683453e8b0ba775f7596d8c9b080177d Mon Sep 17 00:00:00 2001 From: lllyasviel Date: Fri, 9 Feb 2024 17:08:48 -0800 Subject: [PATCH] support inpaint models from fooocus put inpaint_v26.fooocus.patch in models\ControlNet, control SDXL models only To get same algorithm as Fooocus, set "Stop at" (Ending Control Step) to 0.5 Fooocus always use 0.5 but in Forge users may use other values. Results are best when stop at < 0.7. The model is not optimized with ending timesteps > 0.7 Supports inpaint_global_harmonious, inpaint_only, inpaint_only+lama. In theory the inpaint_only+lama always outperform Fooocus in object removal task (but not all tasks). --- .../lib_controlnet/global_state.py | 2 +- .../sd_forge_controlnet/scripts/controlnet.py | 2 +- .../scripts/fooocus_inpaint_head | Bin 0 -> 52602 bytes .../scripts/forge_fooocus_inpaint.py | 131 ++++++++++++++++++ ldm_patched/modules/model_management.py | 3 +- ldm_patched/modules/model_patcher.py | 6 + 6 files changed, 140 insertions(+), 4 deletions(-) create mode 100644 extensions-builtin/sd_forge_fooocus_inpaint/scripts/fooocus_inpaint_head create mode 100644 extensions-builtin/sd_forge_fooocus_inpaint/scripts/forge_fooocus_inpaint.py diff --git a/extensions-builtin/sd_forge_controlnet/lib_controlnet/global_state.py b/extensions-builtin/sd_forge_controlnet/lib_controlnet/global_state.py index 0f52ac8e..dc87dda8 100644 --- a/extensions-builtin/sd_forge_controlnet/lib_controlnet/global_state.py +++ b/extensions-builtin/sd_forge_controlnet/lib_controlnet/global_state.py @@ -7,7 +7,7 @@ from lib_controlnet.enums import StableDiffusionVersion from modules_forge.shared import controlnet_dir, supported_preprocessors -CN_MODEL_EXTS = [".pt", ".pth", ".ckpt", ".safetensors", ".bin"] +CN_MODEL_EXTS = [".pt", ".pth", ".ckpt", ".safetensors", ".bin", ".patch"] def traverse_all_files(curr_path, model_list): diff --git a/extensions-builtin/sd_forge_controlnet/scripts/controlnet.py b/extensions-builtin/sd_forge_controlnet/scripts/controlnet.py index 5b03ecc8..325eb5c4 100644 --- a/extensions-builtin/sd_forge_controlnet/scripts/controlnet.py +++ b/extensions-builtin/sd_forge_controlnet/scripts/controlnet.py @@ -417,7 +417,7 @@ class ControlNetForForgeOfficial(scripts.Script): cond = params.control_cond mask = params.control_mask - kwargs.update(dict(unit=unit, params=params)) + kwargs.update(dict(unit=unit, params=params, cond_original=cond.clone(), mask_original=mask.clone())) params.model.strength = float(unit.weight) params.model.start_percent = float(unit.guidance_start) diff --git a/extensions-builtin/sd_forge_fooocus_inpaint/scripts/fooocus_inpaint_head b/extensions-builtin/sd_forge_fooocus_inpaint/scripts/fooocus_inpaint_head new file mode 100644 index 0000000000000000000000000000000000000000..a5a3030a0521c9c08abad0a89923f226a365dfe1 GIT binary patch literal 52602 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 Y3EfY0B|c?G!or8OP~{n(|77le0XjA6y#N3J literal 0 HcmV?d00001 diff --git a/extensions-builtin/sd_forge_fooocus_inpaint/scripts/forge_fooocus_inpaint.py b/extensions-builtin/sd_forge_fooocus_inpaint/scripts/forge_fooocus_inpaint.py new file mode 100644 index 00000000..f377ccdd --- /dev/null +++ b/extensions-builtin/sd_forge_fooocus_inpaint/scripts/forge_fooocus_inpaint.py @@ -0,0 +1,131 @@ +import os +import torch +import copy + +from modules_forge.shared import add_supported_control_model +from modules_forge.supported_controlnet import ControlModelPatcher +from modules_forge.forge_sampler import sampling_prepare +from ldm_patched.modules.utils import load_torch_file +from ldm_patched.modules import model_patcher +from ldm_patched.modules.model_management import cast_to_device, LoadedModel, current_loaded_models +from ldm_patched.modules.lora import model_lora_keys_unet + + +def is_model_loaded(model): + return LoadedModel(model) in current_loaded_models + + +class InpaintHead(torch.nn.Module): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.head = torch.nn.Parameter(torch.empty(size=(320, 5, 3, 3), device="cpu")) + + def __call__(self, x): + x = torch.nn.functional.pad(x, (1, 1, 1, 1), "replicate") + return torch.nn.functional.conv2d(input=x, weight=self.head) + + +def load_fooocus_patch(lora: dict, to_load: dict): + patch_dict = {} + loaded_keys = set() + for key in to_load.values(): + if value := lora.get(key, None): + patch_dict[key] = ("fooocus", value) + loaded_keys.add(key) + + not_loaded = sum(1 for x in lora if x not in loaded_keys) + print(f"[Fooocus Patch Loader] {len(loaded_keys)} keys loaded, {not_loaded} remaining keys not found in model.") + return patch_dict + + +def calculate_weight_fooocus(weight, alpha, v): + w1 = cast_to_device(v[0], weight.device, torch.float32) + if w1.shape == weight.shape: + w_min = cast_to_device(v[1], weight.device, torch.float32) + w_max = cast_to_device(v[2], weight.device, torch.float32) + w1 = (w1 / 255.0) * (w_max - w_min) + w_min + weight += alpha * cast_to_device(w1, weight.device, weight.dtype) + else: + print(f"[Fooocus Patch Loader] weight not merged ({w1.shape} != {weight.shape})") + return weight + + +class FooocusInpaintPatcher(ControlModelPatcher): + @staticmethod + def try_build_from_state_dict(state_dict, ckpt_path): + if 'diffusion_model.time_embed.0.weight' in state_dict: + if len(state_dict['diffusion_model.time_embed.0.weight']) == 3: + return FooocusInpaintPatcher(state_dict) + + return None + + def __init__(self, state_dict): + super().__init__() + self.state_dict = state_dict + self.inpaint_head = InpaintHead().to(device=torch.device('cpu'), dtype=torch.float32) + self.inpaint_head.load_state_dict(load_torch_file(os.path.join(os.path.dirname(__file__), 'fooocus_inpaint_head'))) + + return + + def process_before_every_sampling(self, process, cond, mask, *args, **kwargs): + cond_original = kwargs['cond_original'] + mask_original = kwargs['mask_original'] + + unet_original = process.sd_model.forge_objects.unet.clone() + unet = process.sd_model.forge_objects.unet.clone() + vae = process.sd_model.forge_objects.vae + + latent_image = vae.encode(cond_original.movedim(1, -1)) + latent_image = process.sd_model.forge_objects.unet.model.latent_format.process_in(latent_image) + latent_mask = torch.nn.functional.max_pool2d(mask_original, (8, 8)).round().to(cond) + feed = torch.cat([ + latent_mask.to(device=torch.device('cpu'), dtype=torch.float32), + latent_image.to(device=torch.device('cpu'), dtype=torch.float32) + ], dim=1) + inpaint_head_feature = self.inpaint_head(feed) + + def input_block_patch(h, transformer_options): + if transformer_options["block"][1] == 0: + h = h + inpaint_head_feature.to(h) + return h + + unet.set_model_input_block_patch(input_block_patch) + + lora_keys = model_lora_keys_unet(unet.model, {}) + lora_keys.update({x: x for x in unet.model.state_dict().keys()}) + loaded_lora = load_fooocus_patch(self.state_dict, lora_keys) + + patched = unet.add_patches(loaded_lora, 1.0) + + not_patched_count = sum(1 for x in loaded_lora if x not in patched) + + if not_patched_count > 0: + print(f"[Fooocus Patch Loader] Failed to load {not_patched_count} keys") + + sigma_start = unet.model.model_sampling.percent_to_sigma(self.start_percent) + sigma_end = unet.model.model_sampling.percent_to_sigma(self.end_percent) + + def conditioning_modifier(model, x, timestep, uncond, cond, cond_scale, model_options, seed): + if timestep > sigma_start or timestep < sigma_end: + target_model = unet_original + model_options = copy.deepcopy(model_options) + if 'transformer_options' in model_options: + if 'patches' in model_options['transformer_options']: + if 'input_block_patch' in model_options['transformer_options']['patches']: + del model_options['transformer_options']['patches']['input_block_patch'] + else: + target_model = unet + + if not is_model_loaded(target_model): + sampling_prepare(target_model, x) + + return target_model.model, x, timestep, uncond, cond, cond_scale, model_options, seed + + unet.add_conditioning_modifier(conditioning_modifier) + + process.sd_model.forge_objects.unet = unet + return + + +model_patcher.extra_weight_calculators['fooocus'] = calculate_weight_fooocus +add_supported_control_model(FooocusInpaintPatcher) diff --git a/ldm_patched/modules/model_management.py b/ldm_patched/modules/model_management.py index f680ccc3..3a7caf15 100644 --- a/ldm_patched/modules/model_management.py +++ b/ldm_patched/modules/model_management.py @@ -5,7 +5,6 @@ from ldm_patched.modules.args_parser import args import ldm_patched.modules.utils import torch import sys -import os class VRAMState(Enum): DISABLED = 0 #No vram present: no need to move models to vram @@ -59,7 +58,7 @@ try: except: pass -if args.always_cpu or os.environ.get("FORGE_CQ_TEST", ""): +if args.always_cpu: cpu_state = CPUState.CPU def is_intel_xpu(): diff --git a/ldm_patched/modules/model_patcher.py b/ldm_patched/modules/model_patcher.py index dd816e52..794d06cb 100644 --- a/ldm_patched/modules/model_patcher.py +++ b/ldm_patched/modules/model_patcher.py @@ -5,6 +5,10 @@ import inspect import ldm_patched.modules.utils import ldm_patched.modules.model_management + +extra_weight_calculators = {} + + class ModelPatcher: def __init__(self, model, load_device, offload_device, size=0, current_device=None, weight_inplace_update=False): self.size = size @@ -329,6 +333,8 @@ class ModelPatcher: b2 = ldm_patched.modules.model_management.cast_to_device(v[3].flatten(start_dim=1), weight.device, torch.float32) weight += ((torch.mm(b2, b1) + torch.mm(torch.mm(weight.flatten(start_dim=1), a2), a1)) * alpha).reshape(weight.shape).type(weight.dtype) + elif patch_type in extra_weight_calculators: + weight = extra_weight_calculators[patch_type](weight, alpha, v) else: print("patch type not recognized", patch_type, key)