From 026e8e2e25ec6a5919aa050fb4d7c3370d7f6601 Mon Sep 17 00:00:00 2001 From: Yu Chen Date: Wed, 6 Mar 2024 14:08:21 +0000 Subject: [PATCH 1/4] unofficial fix of the broken txt2img API for AnimateDiff + ControlNet --- scripts/animatediff_utils.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/scripts/animatediff_utils.py b/scripts/animatediff_utils.py index 4b95e65c..8cf0c785 100644 --- a/scripts/animatediff_utils.py +++ b/scripts/animatediff_utils.py @@ -9,7 +9,6 @@ from scripts.animatediff_logger import logger_animatediff as logger - def generate_random_hash(length=8): import hashlib import secrets @@ -40,6 +39,7 @@ def get_animatediff_arg(p: StableDiffusionProcessing): if isinstance(animatediff_arg, dict): from scripts.animatediff_ui import AnimateDiffProcess animatediff_arg = AnimateDiffProcess(**animatediff_arg) + p.script_args = list(p.script_args) p.script_args[script.args_from] = animatediff_arg return animatediff_arg @@ -55,7 +55,20 @@ def get_controlnet_units(p: StableDiffusionProcessing): for script in p.scripts.alwayson_scripts: if script.title().lower() == "controlnet": cn_units = p.script_args[script.args_from:script.args_to] - return [x for x in cn_units if x.enabled] + #print(cn_units) + if p.is_api and len(cn_units) > 0 and isinstance(cn_units[0], dict): + from scripts import external_code + from scripts.batch_hijack import InputMode + cn_units = external_code.get_all_units_in_processing(p) + for cn_unit in cn_units: + setattr(cn_unit, "input_mode", InputMode.BATCH) + setattr(cn_unit, "batch_images", None) + setattr(cn_unit, "batch_mask_dir", None) + setattr(cn_unit, "batch_input_gallery", None) + setattr(cn_unit, "batch_modifiers", []) + setattr(cn_unit, "animatediff_batch", True) + p.script_args[script.args_from:script.args_to] = cn_units + return [x for x in cn_units if x.enabled] if not p.is_api else cn_units return [] From d1791040f5497321e72df8e0adb98849ff809150 Mon Sep 17 00:00:00 2001 From: Yu Chen Date: Wed, 6 Mar 2024 14:18:11 +0000 Subject: [PATCH 2/4] minor cleaning --- scripts/animatediff_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/animatediff_utils.py b/scripts/animatediff_utils.py index 8cf0c785..90c056ea 100644 --- a/scripts/animatediff_utils.py +++ b/scripts/animatediff_utils.py @@ -55,7 +55,7 @@ def get_controlnet_units(p: StableDiffusionProcessing): for script in p.scripts.alwayson_scripts: if script.title().lower() == "controlnet": cn_units = p.script_args[script.args_from:script.args_to] - #print(cn_units) + if p.is_api and len(cn_units) > 0 and isinstance(cn_units[0], dict): from scripts import external_code from scripts.batch_hijack import InputMode From 9d300b3ebca5907532d69965c2c523dc8cfe2ede Mon Sep 17 00:00:00 2001 From: Yu Chen Date: Thu, 21 Mar 2024 14:18:52 +0000 Subject: [PATCH 3/4] improved api fix and now it also can handle ip-adapter which uses single image controlnet input --- scripts/animatediff_ui.py | 2 +- scripts/animatediff_utils.py | 33 ++++++++++++++++++++++----------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/scripts/animatediff_ui.py b/scripts/animatediff_ui.py index a0b78770..df2c6c0d 100644 --- a/scripts/animatediff_ui.py +++ b/scripts/animatediff_ui.py @@ -186,7 +186,7 @@ def set_p(self, p: StableDiffusionProcessing): cn_unit.batch_mask_dir = self.mask_path # find minimun control images in CN batch - cn_unit_batch_params = cn_unit.batch_images.split('\n') + cn_unit_batch_params = cn_unit.batch_images.split('\n') if cn_unit.batch_images is not None else [] if cn_unit.input_mode.name == 'BATCH': cn_unit.animatediff_batch = True # for A1111 sd-webui-controlnet if not any([cn_param.startswith("keyframe:") for cn_param in cn_unit_batch_params[1:]]): diff --git a/scripts/animatediff_utils.py b/scripts/animatediff_utils.py index 90c056ea..737f1520 100644 --- a/scripts/animatediff_utils.py +++ b/scripts/animatediff_utils.py @@ -57,17 +57,28 @@ def get_controlnet_units(p: StableDiffusionProcessing): cn_units = p.script_args[script.args_from:script.args_to] if p.is_api and len(cn_units) > 0 and isinstance(cn_units[0], dict): - from scripts import external_code - from scripts.batch_hijack import InputMode - cn_units = external_code.get_all_units_in_processing(p) - for cn_unit in cn_units: - setattr(cn_unit, "input_mode", InputMode.BATCH) - setattr(cn_unit, "batch_images", None) - setattr(cn_unit, "batch_mask_dir", None) - setattr(cn_unit, "batch_input_gallery", None) - setattr(cn_unit, "batch_modifiers", []) - setattr(cn_unit, "animatediff_batch", True) - p.script_args[script.args_from:script.args_to] = cn_units + from scripts import external_code + from scripts.batch_hijack import InputMode + cn_units_dataclass = external_code.get_all_units_in_processing(p) + for cn_unit_dict, cn_unit_dataclass in zip(cn_units, cn_units_dataclass): + # NB: Unfortunately this setattr section is required because those attributes don't exist + # in the default ControlNetUnit class defined in sd-webui-controlnet library. + # So we have to use this hack to append extra batch processing related attributes to the object + # until sd-webui-controlnet makes an update. + setattr(cn_unit_dataclass, "input_mode", InputMode.SIMPLE) + setattr(cn_unit_dataclass, "batch_images", None) + setattr(cn_unit_dataclass, "batch_mask_dir", None) + setattr(cn_unit_dataclass, "batch_input_gallery", None) + setattr(cn_unit_dataclass, "batch_modifiers", []) + setattr(cn_unit_dataclass, "animatediff_batch", False) + + if cn_unit_dataclass.image is None: + cn_unit_dataclass.input_mode = InputMode.BATCH + cn_unit_dataclass.batch_images = cn_unit_dict.get("batch_images", None) + cn_unit_dataclass.animatediff_batch = True + + p.script_args[script.args_from:script.args_to] = cn_units_dataclass + cn_units = cn_units_dataclass return [x for x in cn_units if x.enabled] if not p.is_api else cn_units return [] From 5fd6bea5d13719ccc5ada63c091e5d458d783721 Mon Sep 17 00:00:00 2001 From: Yu Chen Date: Tue, 16 Apr 2024 10:14:13 +0100 Subject: [PATCH 4/4] fix the 'UiControlNetUnit' object has no attribute 'get' --- scripts/animatediff_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/animatediff_utils.py b/scripts/animatediff_utils.py index ddb3b10c..87b96823 100644 --- a/scripts/animatediff_utils.py +++ b/scripts/animatediff_utils.py @@ -74,7 +74,7 @@ def get_controlnet_units(p: StableDiffusionProcessing): if cn_unit_dataclass.image is None: cn_unit_dataclass.input_mode = InputMode.BATCH - cn_unit_dataclass.batch_images = cn_unit_dict.get("batch_images", None) + cn_unit_dataclass.batch_images = getattr(cn_unit_dict, "batch_images", None) cn_unit_dataclass.animatediff_batch = True p.script_args[script.args_from:script.args_to] = cn_units_dataclass