mirror of
https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
synced 2025-12-25 04:16:12 -08:00
Compare commits
4 Commits
Authentica
...
compact-So
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c7fbcb5789 | ||
|
|
28cc18cbdf | ||
|
|
9a042c907b | ||
|
|
36fb876da6 |
@@ -3,6 +3,9 @@ import gradio as gr
|
|||||||
import math
|
import math
|
||||||
from modules.ui_components import InputAccordion
|
from modules.ui_components import InputAccordion
|
||||||
import modules.scripts as scripts
|
import modules.scripts as scripts
|
||||||
|
from modules import infotext_utils
|
||||||
|
|
||||||
|
infotext_utils.register_info_json('Soft Inpainting')
|
||||||
|
|
||||||
|
|
||||||
class SoftInpaintingSettings:
|
class SoftInpaintingSettings:
|
||||||
@@ -21,13 +24,14 @@ class SoftInpaintingSettings:
|
|||||||
self.composite_difference_contrast = composite_difference_contrast
|
self.composite_difference_contrast = composite_difference_contrast
|
||||||
|
|
||||||
def add_generation_params(self, dest):
|
def add_generation_params(self, dest):
|
||||||
dest[enabled_gen_param_label] = True
|
dest['Soft Inpainting'] = {
|
||||||
dest[gen_param_labels.mask_blend_power] = self.mask_blend_power
|
'sb': self.mask_blend_power,
|
||||||
dest[gen_param_labels.mask_blend_scale] = self.mask_blend_scale
|
'ps': self.mask_blend_scale,
|
||||||
dest[gen_param_labels.inpaint_detail_preservation] = self.inpaint_detail_preservation
|
'tcb': self.inpaint_detail_preservation,
|
||||||
dest[gen_param_labels.composite_mask_influence] = self.composite_mask_influence
|
'mi': self.composite_mask_influence,
|
||||||
dest[gen_param_labels.composite_difference_threshold] = self.composite_difference_threshold
|
'dt': self.composite_difference_threshold,
|
||||||
dest[gen_param_labels.composite_difference_contrast] = self.composite_difference_contrast
|
'dc': self.composite_difference_contrast,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# ------------------- Methods -------------------
|
# ------------------- Methods -------------------
|
||||||
@@ -625,13 +629,21 @@ class Script(scripts.Script):
|
|||||||
- **High values**: Ghosting will be less common, but transitions may be very sudden.
|
- **High values**: Ghosting will be less common, but transitions may be very sudden.
|
||||||
""")
|
""")
|
||||||
|
|
||||||
self.infotext_fields = [(soft_inpainting_enabled, enabled_gen_param_label),
|
def get_element_value(generation_params: dict, old_key, new_key):
|
||||||
(power, gen_param_labels.mask_blend_power),
|
if 'Soft Inpainting' in generation_params:
|
||||||
(scale, gen_param_labels.mask_blend_scale),
|
return generation_params['Soft Inpainting'].get(new_key, True)
|
||||||
(detail, gen_param_labels.inpaint_detail_preservation),
|
else:
|
||||||
(mask_inf, gen_param_labels.composite_mask_influence),
|
return generation_params.get(old_key)
|
||||||
(dif_thresh, gen_param_labels.composite_difference_threshold),
|
|
||||||
(dif_contr, gen_param_labels.composite_difference_contrast)]
|
self.infotext_fields = [
|
||||||
|
(soft_inpainting_enabled, lambda d: get_element_value(d, enabled_gen_param_label, None)),
|
||||||
|
(power, lambda d: get_element_value(d, gen_param_labels.mask_blend_power, 'sb')),
|
||||||
|
(scale, lambda d: get_element_value(d, gen_param_labels.mask_blend_scale, 'ps')),
|
||||||
|
(detail, lambda d: get_element_value(d, gen_param_labels.inpaint_detail_preservation, 'tcb')),
|
||||||
|
(mask_inf, lambda d: get_element_value(d, gen_param_labels.composite_mask_influence, 'mi')),
|
||||||
|
(dif_thresh, lambda d: get_element_value(d, gen_param_labels.composite_difference_threshold, 'dt')),
|
||||||
|
(dif_contr, lambda d: get_element_value(d, gen_param_labels.composite_difference_contrast, 'dc'))
|
||||||
|
]
|
||||||
|
|
||||||
self.paste_field_names = []
|
self.paste_field_names = []
|
||||||
for _, field_name in self.infotext_fields:
|
for _, field_name in self.infotext_fields:
|
||||||
|
|||||||
@@ -18,6 +18,34 @@ re_param = re.compile(re_param_code)
|
|||||||
re_imagesize = re.compile(r"^(\d+)x(\d+)$")
|
re_imagesize = re.compile(r"^(\d+)x(\d+)$")
|
||||||
re_hypernet_hash = re.compile("\(([0-9a-f]+)\)$")
|
re_hypernet_hash = re.compile("\(([0-9a-f]+)\)$")
|
||||||
type_of_gr_update = type(gr.update())
|
type_of_gr_update = type(gr.update())
|
||||||
|
quote_swap = str.maketrans('\'"', '"\'')
|
||||||
|
info_json_keys = set()
|
||||||
|
|
||||||
|
|
||||||
|
def info_json_dumps(data):
|
||||||
|
"""encode data into json string, but swap single and double quotes to reduce escaping issues"""
|
||||||
|
return json.dumps(data, ensure_ascii=False, separators=(',', ':')).translate(quote_swap)
|
||||||
|
|
||||||
|
|
||||||
|
def info_json_loads(info_json):
|
||||||
|
"""decode json string into info data, but swap single and double quotes to reduce escaping issues"""
|
||||||
|
return json.loads(info_json.translate(quote_swap))
|
||||||
|
|
||||||
|
|
||||||
|
def build_infotext(info: dict):
|
||||||
|
for info_json_key in info_json_keys:
|
||||||
|
if info_json_key in info:
|
||||||
|
info[info_json_key] = info_json_dumps(info[info_json_key])
|
||||||
|
return ", ".join([k if k == v else f'{k}: {quote(v)}' for k, v in info.items() if v is not None])
|
||||||
|
|
||||||
|
|
||||||
|
def register_info_json(key):
|
||||||
|
"""register an infotext key as infojson
|
||||||
|
after a key is registered, a json compatible data structure like dict or list can be used as a value in
|
||||||
|
generation_parameters and extra_generation_parameters
|
||||||
|
"""
|
||||||
|
global info_json_keys
|
||||||
|
info_json_keys.add(key)
|
||||||
|
|
||||||
|
|
||||||
class ParamBinding:
|
class ParamBinding:
|
||||||
@@ -356,6 +384,13 @@ Steps: 20, Sampler: Euler a, CFG scale: 7, Seed: 965400086, Size: 512x512, Model
|
|||||||
if "Cache FP16 weight for LoRA" not in res and res["FP8 weight"] != "Disable":
|
if "Cache FP16 weight for LoRA" not in res and res["FP8 weight"] != "Disable":
|
||||||
res["Cache FP16 weight for LoRA"] = False
|
res["Cache FP16 weight for LoRA"] = False
|
||||||
|
|
||||||
|
for key in info_json_keys:
|
||||||
|
if key in res:
|
||||||
|
try:
|
||||||
|
res[key] = info_json_loads(res[key])
|
||||||
|
except Exception:
|
||||||
|
print(f'Error parsing "{key}: {res[key]}"')
|
||||||
|
|
||||||
infotext_versions.backcompat(res)
|
infotext_versions.backcompat(res)
|
||||||
|
|
||||||
for key in skip_fields:
|
for key in skip_fields:
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ def run_postprocessing(extras_mode, image, image_folder, input_dir, output_dir,
|
|||||||
basename = ''
|
basename = ''
|
||||||
forced_filename = None
|
forced_filename = None
|
||||||
|
|
||||||
infotext = ", ".join([k if k == v else f'{k}: {infotext_utils.quote(v)}' for k, v in pp.info.items() if v is not None])
|
infotext = infotext_utils.build_infotext(pp.info)
|
||||||
|
|
||||||
if opts.enable_pnginfo:
|
if opts.enable_pnginfo:
|
||||||
pp.image.info = existing_pnginfo
|
pp.image.info = existing_pnginfo
|
||||||
|
|||||||
@@ -747,7 +747,7 @@ def create_infotext(p, all_prompts, all_seeds, all_subseeds, comments=None, iter
|
|||||||
"User": p.user if opts.add_user_name_to_info else None,
|
"User": p.user if opts.add_user_name_to_info else None,
|
||||||
}
|
}
|
||||||
|
|
||||||
generation_params_text = ", ".join([k if k == v else f'{k}: {infotext_utils.quote(v)}' for k, v in generation_params.items() if v is not None])
|
generation_params_text = infotext_utils.build_infotext(generation_params)
|
||||||
|
|
||||||
prompt_text = p.main_prompt if use_main_prompt else all_prompts[index]
|
prompt_text = p.main_prompt if use_main_prompt else all_prompts[index]
|
||||||
negative_prompt_text = f"\nNegative prompt: {p.main_negative_prompt if use_main_prompt else all_negative_prompts[index]}" if all_negative_prompts[index] else ""
|
negative_prompt_text = f"\nNegative prompt: {p.main_negative_prompt if use_main_prompt else all_negative_prompts[index]}" if all_negative_prompts[index] else ""
|
||||||
|
|||||||
Reference in New Issue
Block a user