From d302ffbfa4b8e8b267e35d54ff83379111c363db Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 11 Jun 2024 08:55:04 -0400 Subject: [PATCH] fix sampler defaults, facehires strength check --- CHANGELOG.md | 10 ++++++---- cli/simple-txt2img.py | 2 ++ modules/sd_samplers_diffusers.py | 13 ++++++++++++- scripts/face-details.py | 2 ++ 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95b6ea8aa..3b71d6394 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ - StableDiffusion 3 -## Update for 2024-06-08 +## Update for 2024-06-11 *Note*: New features require `diffusers==0.29.0.dev` @@ -72,12 +72,14 @@ ## Fixes -- cumulative fixes since the last release +- cumulative fixes since the last release - fix apply/unapply hidiffusion for sd15 - fix controlnet reference enabled check - fix face-hires with control batch count -- install pynvml on-demand -- apply rollback-vae option to latest torch versions, thanks @Iaotle +- install pynvml on-demand +- apply rollback-vae option to latest torch versions, thanks @Iaotle +- face hires skip if strength is 0 +- restore all sampler configuration on sampler change ## Update for 2024-06-02 diff --git a/cli/simple-txt2img.py b/cli/simple-txt2img.py index 53565690c..d3287ee46 100755 --- a/cli/simple-txt2img.py +++ b/cli/simple-txt2img.py @@ -48,6 +48,7 @@ def generate(args): # pylint: disable=redefined-outer-name options['sampler_name'] = args.sampler options['width'] = int(args.width) options['height'] = int(args.height) + options['restore_faces'] = args.faces data = post('/sdapi/v1/txt2img', options) t1 = time.time() if 'images' in data: @@ -71,6 +72,7 @@ if __name__ == "__main__": parser.add_argument('--height', required=False, default=512, help='image height') parser.add_argument('--steps', required=False, default=20, help='number of steps') parser.add_argument('--seed', required=False, default=-1, help='initial seed') + parser.add_argument('--faces', action='store_true', help='restore faces') parser.add_argument('--sampler', required=False, default='Euler a', help='sampler name') parser.add_argument('--output', required=False, default=None, help='output image file') parser.add_argument('--model', required=False, help='model name') diff --git a/modules/sd_samplers_diffusers.py b/modules/sd_samplers_diffusers.py index d7c2e5d0f..4d100fc35 100644 --- a/modules/sd_samplers_diffusers.py +++ b/modules/sd_samplers_diffusers.py @@ -111,13 +111,22 @@ class DiffusionSampler: return for key, value in config.get('All', {}).items(): # apply global defaults self.config[key] = value + debug(f'Sampler: all="{self.config}"') if hasattr(model.scheduler, 'scheduler_config'): # find model defaults orig_config = model.scheduler.scheduler_config else: orig_config = model.scheduler.config + if not hasattr(model, 'orig_scheduler'): # store settings from initial scheduler + model.orig_scheduler = orig_config.copy() + else: + for key, value in model.orig_scheduler.items(): # apply scheduler defaults + if key in self.config: + self.config[key] = value + debug(f'Sampler: original="{model.orig_scheduler}"') for key, value in orig_config.items(): # apply model defaults if key in self.config: self.config[key] = value + debug(f'Sampler: default="{self.config}"') for key, value in config.get(name, {}).items(): # apply diffusers per-scheduler defaults self.config[key] = value for key, value in kwargs.items(): # apply user args, if any @@ -168,11 +177,13 @@ class DiffusionSampler: # validate all config params signature = inspect.signature(constructor, follow_wrapped=True) possible = signature.parameters.keys() - debug(f'Sampler: sampler="{name}" config={self.config} signature={possible}') for key in self.config.copy().keys(): if key not in possible: shared.log.warning(f'Sampler: sampler="{name}" config={self.config} invalid={key}') del self.config[key] + debug(f'Sampler: name="{name}"') + debug(f'Sampler: config={self.config}') + debug(f'Sampler: signature={possible}') # shared.log.debug(f'Sampler: sampler="{name}" config={self.config}') self.sampler = constructor(**self.config) # shared.log.debug(f'Sampler: class="{self.sampler.__class__.__name__}" config={self.sampler.config}') diff --git a/scripts/face-details.py b/scripts/face-details.py index 3fd77fe69..3604ecb47 100644 --- a/scripts/face-details.py +++ b/scripts/face-details.py @@ -137,6 +137,8 @@ class FaceRestorerYolo(FaceRestoration): 'width': resolution, 'height': resolution, } + if args['denoising_strength'] == 0: + shared.log.debug('Face HiRes skip: strength=0') control_pipeline = None if getattr(p, 'is_control', False): from modules.control import run