mirror of
https://github.com/vladmandic/automatic
synced 2026-09-20 01:31:13 +02:00
enhance metadata handling
This commit is contained in:
@@ -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:
|
||||
|
||||
+5
-4
@@ -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']
|
||||
|
||||
@@ -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)
|
||||
|
||||
+1
-1
@@ -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']}),
|
||||
|
||||
+26
-11
@@ -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'
|
||||
# <pre>seq, uuid<br>date, datetime, job_timestamp<br>generation_number, batch_number<br>model, model_shortname<br>model_hash, model_name<br>sampler, seed, steps, cfg<br>clip_skip, denoising<br>hasprompt, prompt, styles<br>prompt_hash, prompt_no_styles<br>prompt_spaces, prompt_words<br>height, width, image_hash<br></pre>
|
||||
if 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
|
||||
|
||||
Reference in New Issue
Block a user