From 93bdca0670c15abcf5e0b227ecf7f67f983fd0ea Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Mon, 29 Sep 2025 10:56:03 -0400 Subject: [PATCH] fix image str decode and update requirements Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 3 ++- extensions-builtin/sdnext-modernui | 2 +- installer.py | 2 +- modules/processing_helpers.py | 38 +++++++++++++++++++++++------- requirements.txt | 6 +---- 5 files changed, 35 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a47fb014..f73e1bf33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log for SD.Next -## Update for 2025-09-28 +## Update for 2025-09-29 - **Models** - [WAN 2.2 14B VACE](https://huggingface.co/alibaba-pai/Wan2.2-VACE-Fun-A14B) @@ -83,6 +83,7 @@ - benchmark: remove forced sampler from system info benchmark - xyz-grid: fix xyz grid with random seeds - reference: fix download for sd15/sdxl reference models + - fix checks in init/mask image decode ## Update for 2025-09-15 diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index b189fac67..620fc402a 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit b189fac67d24bf21c9b65cf45add5b8c29f7456f +Subproject commit 620fc402ad2de2d7446ae6b2586235ee5d75bb58 diff --git a/installer.py b/installer.py index 7d111d44c..b32a26664 100644 --- a/installer.py +++ b/installer.py @@ -608,7 +608,7 @@ def check_diffusers(): if args.skip_git: install('diffusers') return - sha = '1448b035859dd57bbb565239dcdd79a025a85422' # diffusers commit hash + sha = '64a5187d96f9376c7cf5123db810f2d2da79d7d0' # diffusers commit hash pkg = pkg_resources.working_set.by_key.get('diffusers', None) minor = int(pkg.version.split('.')[1] if pkg is not None else -1) cur = opts.get('diffusers_version', '') if minor > -1 else '' diff --git a/modules/processing_helpers.py b/modules/processing_helpers.py index 7906261b9..b58f0594a 100644 --- a/modules/processing_helpers.py +++ b/modules/processing_helpers.py @@ -280,13 +280,38 @@ def validate_sample(tensor): return cast +def decode_images(image): + if isinstance(image, list): + decoded = [] + for i, img in enumerate(image): + if isinstance(img, str): + try: + decoded.append(helpers.decode_base64_to_image(img, quiet=True)) + except Exception as e: + shared.log.error(f'Decode image[{i}]: {e}') + elif isinstance(img, Image.Image): + decoded.append(img) + else: + shared.log.error(f'Decode image[{i}]: {type(img)} unknown type') + return decoded + elif isinstance(image, str): + try: + return helpers.decode_base64_to_image(image, quiet=True) + except Exception as e: + shared.log.error(f'Decode image: {e}') + elif isinstance(image, Image.Image): + return image + else: + shared.log.error(f'Decode image: {type(image)} unknown type') + return None + + def resize_init_images(p): if getattr(p, 'image', None) is not None and getattr(p, 'init_images', None) is None: p.init_images = [p.image] if getattr(p, 'init_images', None) is not None and len(p.init_images) > 0: - if isinstance(p.init_images[0], str): - p.init_images = [helpers.decode_base64_to_image(i, quiet=True) for i in p.init_images] + p.init_images = decode_images(p.init_images) vae_scale_factor = sd_vae.get_vae_scale_factor() tgt_width, tgt_height = vae_scale_factor * math.ceil(p.init_images[0].width / vae_scale_factor), vae_scale_factor * math.ceil(p.init_images[0].height / vae_scale_factor) if p.init_images[0].size != (tgt_width, tgt_height): @@ -296,16 +321,13 @@ def resize_init_images(p): p.width = tgt_width sd_hijack_hypertile.hypertile_set(p) if getattr(p, 'mask', None) is not None and p.mask is not None and p.mask.size != (tgt_width, tgt_height): - if isinstance(p.mask[0], str): - p.mask = [helpers.decode_base64_to_image(i, quiet=True) for i in p.mask] + p.mask = decode_images(p.mask) p.mask = images.resize_image(1, p.mask, tgt_width, tgt_height, upscaler_name=None) if getattr(p, 'init_mask', None) is not None and p.init_mask is not None and p.init_mask.size != (tgt_width, tgt_height): - if isinstance(p.init_mask[0], str): - p.init_mask = [helpers.decode_base64_to_image(i, quiet=True) for i in p.init_mask] + p.init_mask = decode_images(p.init_mask) p.init_mask = images.resize_image(1, p.init_mask, tgt_width, tgt_height, upscaler_name=None) if getattr(p, 'mask_for_overlay', None) is not None and p.mask_for_overlay is not None and p.mask_for_overlay.size != (tgt_width, tgt_height): - if isinstance(p.mask_for_overlay, str): - p.mask_for_overlay = helpers.decode_base64_to_image(p.mask_for_overlay, quiet=True) + p.mask_for_overlay = decode_images(p.mask_for_overlay) p.mask_for_overlay = images.resize_image(1, p.mask_for_overlay, tgt_width, tgt_height, upscaler_name=None) return tgt_width, tgt_height return p.width, p.height diff --git a/requirements.txt b/requirements.txt index cec622cb1..6ca4153e9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -44,7 +44,7 @@ tqdm==4.67.1 accelerate==1.10.1 opencv-contrib-python-headless==4.11.0.86 einops==0.8.1 -huggingface_hub==0.35.0 +huggingface_hub==0.35.3 numexpr==2.11.0 numpy==2.1.2 pandas==2.3.1 @@ -69,7 +69,3 @@ seam-carving ruff pylint pre-commit - -# block -torch!=2.5.0 -torchvision!=0.20.0