diff --git a/modules/generation_parameters_copypaste.py b/modules/generation_parameters_copypaste.py index 0d6b5659a..2445e24ff 100644 --- a/modules/generation_parameters_copypaste.py +++ b/modules/generation_parameters_copypaste.py @@ -222,6 +222,8 @@ def parse_generation_parameters(infotext, no_prompt=False): prompt = infotext[:params_idx] if params_idx > 0 else infotext else: prompt = infotext[:negative_idx] + if prompt.startswith('Steps: '): + prompt = '' if negative_idx >= 0: negative = infotext[negative_idx:params_idx] if params_idx > 0 else infotext[negative_idx:] else: diff --git a/modules/images.py b/modules/images.py index acf34369c..8c47c2651 100644 --- a/modules/images.py +++ b/modules/images.py @@ -339,7 +339,10 @@ class FilenameGenerator: 'sampler': lambda self: self.p and self.p.sampler_name, 'seed': lambda self: self.seed and str(self.seed) or '', - 'steps': lambda self: self.p and self.p.steps, + 'steps': lambda self: self.p and getattr(self.p, 'steps', 0), + 'cfg': lambda self: self.p and getattr(self.p, 'cfg_scale', 0), + 'clip_skip': lambda self: self.p and getattr(self.p, 'clip_skip', 0), + 'denoising': lambda self: self.p and getattr(self.p, 'denoising_strength', 0), 'styles': lambda self: self.p and ", ".join([style for style in self.p.styles if not style == "None"]) or "None", 'uuid': lambda self: str(uuid.uuid4()), } @@ -746,9 +749,7 @@ def safe_decode_string(s: bytes): def read_info_from_image(image: Image, watermark: bool = False): items = image.info or {} - geninfo = items.pop('parameters', None) - if geninfo is None: - geninfo = items.pop('UserComment', None) + geninfo = items.pop('parameters', None) or items.pop('UserComment', None) if geninfo is not None and len(geninfo) > 0: if 'UserComment' in geninfo: geninfo = geninfo['UserComment'] diff --git a/modules/sd_models.py b/modules/sd_models.py index 6f7a3fe52..840f68af0 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -676,10 +676,7 @@ def set_diffuser_options(sd_model, vae = None, op: str = 'model'): sd_model.vae = vae shared.log.debug(f'Setting {op} VAE: name={sd_vae.loaded_vae_file}') if shared.opts.diffusers_vae_upcast != 'default': - if shared.opts.diffusers_vae_upcast == 'true': - sd_model.vae.config.force_upcast = True - else: - sd_model.vae.config.force_upcast = False + sd_model.vae.config.force_upcast = True if shared.opts.diffusers_vae_upcast == 'true' else False if shared.opts.no_half_vae: devices.dtype_vae = torch.float32 sd_model.vae.to(devices.dtype_vae) diff --git a/modules/shared.py b/modules/shared.py index f7944b5b5..f749b4d93 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -520,7 +520,7 @@ options_templates.update(options_section(('diffusers', "Diffusers Settings"), { "diffusers_generator_device": OptionInfo("GPU", "Generator device", gr.Radio, {"choices": ["GPU", "CPU", "Unset"]}), "diffusers_model_cpu_offload": OptionInfo(cmd_opts.medvram, "Model CPU offload (--medvram)"), "diffusers_seq_cpu_offload": OptionInfo(cmd_opts.lowvram, "Sequential CPU offload (--lowvram)"), - "diffusers_vae_upcast": OptionInfo("default", "VAE upcasting", gr.Radio, {"choices": ['default', 'true', 'false']}), + "diffusers_vae_upcast": OptionInfo("false", "VAE upcasting", gr.Radio, {"choices": ['default', 'true', 'false']}), "diffusers_vae_slicing": OptionInfo(True, "VAE slicing"), "diffusers_vae_tiling": OptionInfo(cmd_opts.lowvram or cmd_opts.medvram, "VAE tiling"), "diffusers_model_load_variant": OptionInfo("default", "Preferred Model variant", gr.Radio, {"choices": ['default', 'fp32', 'fp16']}), diff --git a/modules/ui_common.py b/modules/ui_common.py index 41dbb4c5c..838672920 100644 --- a/modules/ui_common.py +++ b/modules/ui_common.py @@ -89,23 +89,33 @@ def save_files(js_data, files, html_info, index): class PObject: # pylint: disable=too-few-public-methods def __init__(self, d=None): + # 'Parser': 'Full parser', 'Model': 'lyriel_v16', 'Model hash': 'ec6f68ea63', 'Backend': 'Diffusers', 'App': 'SD.Next', 'Version': '69d7fef', 'Operations': 'txt2img', 'Sampler options': 'order 2/low order', 'Pipeline': 'StableDiffusionPipeline' + #
seq, uuidif d is not None: for k, v in d.items(): setattr(self, k, v) - self.prompt = getattr(self, 'prompt', None) or getattr(self, 'Prompt', None) - self.all_prompts = getattr(self, 'all_prompts', [self.prompt]) - self.negative_prompt = getattr(self, 'negative_prompt', None) - self.all_negative_prompt = getattr(self, 'all_negative_prompts', [self.negative_prompt]) - self.seed = getattr(self, 'seed', None) or getattr(self, 'Seed', None) - self.all_seeds = getattr(self, 'all_seeds', [self.seed]) - self.subseed = getattr(self, 'subseed', None) - self.all_subseeds = getattr(self, 'all_subseeds', [self.subseed]) - self.width = getattr(self, 'width', None) - self.height = getattr(self, 'height', None) + self.prompt = getattr(self, 'prompt', None) or getattr(self, 'Prompt', None) or '' + self.negative_prompt = getattr(self, 'negative_prompt', None) or getattr(self, 'Negative_prompt', None) or '' + self.sampler = getattr(self, 'sampler', None) or getattr(self, 'Sampler', None) or '' + self.seed = getattr(self, 'seed', None) or getattr(self, 'Seed', None) or 0 + self.steps = getattr(self, 'steps', None) or getattr(self, 'Steps', None) or 0 + self.width = getattr(self, 'width', None) or getattr(self, 'Width', None) or getattr(self, 'Size-1', None) or 0 + self.height = getattr(self, 'height', None) or getattr(self, 'Height', None) or getattr(self, 'Size-2', None) or 0 + self.cfg_scale = getattr(self, 'cfg_scale', None) or getattr(self, 'CFG scale', None) or 0 + self.clip_skip = getattr(self, 'clip_skip', None) or getattr(self, 'Clip skip', None) or 1 + self.denoising_strength = getattr(self, 'denoising_strength', None) or getattr(self, 'Denoising', None) or 0 self.index_of_first_image = getattr(self, 'index_of_first_image', 0) + self.subseed = getattr(self, 'subseed', None) or getattr(self, 'Subseed', None) + self.styles = getattr(self, 'styles', None) or getattr(self, 'Styles', None) or [] + self.styles = [s.strip() for s in self.styles.split(',')] if isinstance(self.styles, str) else self.styles + + self.outpath_grids = shared.opts.outdir_grids or shared.opts.outdir_txt2img_grids self.infotexts = getattr(self, 'infotexts', [html_info]) self.infotext = self.infotexts[0] if len(self.infotexts) > 0 else html_info - self.outpath_grids = shared.opts.outdir_grids or shared.opts.outdir_txt2img_grids + self.all_negative_prompt = getattr(self, 'all_negative_prompts', [self.negative_prompt]) + self.all_prompts = getattr(self, 'all_prompts', [self.prompt]) + self.all_seeds = getattr(self, 'all_seeds', [self.seed]) + self.all_subseeds = getattr(self, 'all_subseeds', [self.subseed]) try: data = json.loads(js_data) except Exception: @@ -156,6 +166,11 @@ def save_files(js_data, files, html_info, index): info = p.infotexts[i + 1] if len(p.infotexts) > len(p.all_seeds) else p.infotexts[i] # infotexts may be offset by 1 because the first image is the grid if len(info) == 0: info = None + if (js_data is None or len(js_data) == 0) and image is not None and image.info is not None: + info = image.info.pop('parameters', None) or image.info.pop('UserComment', None) + geninfo, _ = images.read_info_from_image(image) + items = generation_parameters_copypaste.parse_generation_parameters(geninfo) + p = PObject(items) fullfn, txt_fullfn = images.save_image(image, shared.opts.outdir_save, "", seed=p.all_seeds[i], prompt=p.all_prompts[i], info=info, extension=shared.opts.samples_format, grid=is_grid, p=p) if fullfn is None: continue
date, datetime, job_timestamp
generation_number, batch_number
model, model_shortname
model_hash, model_name
sampler, seed, steps, cfg
clip_skip, denoising
hasprompt, prompt, styles
prompt_hash, prompt_no_styles
prompt_spaces, prompt_words
height, width, image_hash