sdas / 3-bmab /sd_bmab /parameters.py
dikdimon's picture
Upload 3-bmab using SD-Hub
c10aebf verified
import os
import json
from sd_bmab import constants
from sd_bmab.util import debug_print
def parse_args(args):
config = Parameters().load_preset(args)
ar = Parameters().get_dict(args, config)
return config, ar
class Parameters(object):
def __init__(self) -> None:
super().__init__()
self.params = [
('enabled', False),
('preprocess_checkpoint', constants.checkpoint_default),
('preprocess_vae', constants.vae_default),
('txt2img_noise_multiplier', 1),
('txt2img_extra_noise_multiplier', 0),
('module_config.preprocess_filter', 'None'),
('txt2img_filter_hresfix_before_upscale', 'None'),
('txt2img_filter_hresfix_after_upscale', 'None'),
('module_config.kohyahiresfix.enabled', False),
('module_config.kohyahiresfix.stop1', 0.15),
('module_config.kohyahiresfix.depth1', 3),
('module_config.kohyahiresfix.stop2', 0.4),
('module_config.kohyahiresfix.depth2', 4),
('module_config.kohyahiresfix.scaler', 'bicubic'),
('module_config.kohyahiresfix.downsampling', 0.5),
('module_config.kohyahiresfix.upsampling', 2.0),
('module_config.kohyahiresfix.smooth_scaling', True),
('module_config.kohyahiresfix.early_upsampling', False),
('module_config.kohyahiresfix.disable_additional_pass', True),
('resample_enabled', False),
('module_config.resample_opt.save_image', False),
('module_config.resample_opt.hiresfix_enabled', False),
('module_config.resample_opt.checkpoint', constants.checkpoint_default),
('module_config.resample_opt.vae', constants.vae_default),
('module_config.resample_opt.method', 'txt2img-1pass'),
('module_config.resample_opt.filter', 'None'),
('module_config.resample_opt.prompt', ''),
('module_config.resample_opt.negative_prompt', ''),
('module_config.resample_opt.sampler', constants.sampler_default),
('module_config.resample_opt.scheduler', constants.scheduler_default),
('module_config.resample_opt.upscaler', constants.fast_upscaler),
('module_config.resample_opt.steps', 20),
('module_config.resample_opt.cfg_scale', 7),
('module_config.resample_opt.denoising_strength', 0.75),
('module_config.resample_opt.strength', 0.5),
('module_config.resample_opt.begin', 0.0),
('module_config.resample_opt.end', 1.0),
('pretraining_enabled', False),
('module_config.pretraining_opt.hiresfix_enabled', False),
('module_config.pretraining_opt.checkpoint', constants.checkpoint_default),
('module_config.pretraining_opt.vae', constants.vae_default),
('module_config.pretraining_opt.pretraining_model', None),
('module_config.pretraining_opt.filter', 'None'),
('module_config.pretraining_opt.prompt', ''),
('module_config.pretraining_opt.negative_prompt', ''),
('module_config.pretraining_opt.sampler', constants.sampler_default),
('module_config.pretraining_opt.scheduler', constants.scheduler_default),
('module_config.pretraining_opt.steps', 20),
('module_config.pretraining_opt.cfg_scale', 7),
('module_config.pretraining_opt.denoising_strength', 0.75),
('module_config.pretraining_opt.dilation', 4),
('module_config.pretraining_opt.box_threshold', 0.35),
('edge_flavor_enabled', False),
('edge_low_threadhold', 50),
('edge_high_threadhold', 200),
('edge_strength', 0.5),
('resize_intermediate_enabled', False),
('module_config.resize_intermediate_opt.resize_by_person', True),
('module_config.resize_intermediate_opt.method', 'stretching'),
('module_config.resize_intermediate_opt.alignment', 'bottom'),
('module_config.resize_intermediate_opt.filter', 'None'),
('module_config.resize_intermediate_opt.scale', 0.85),
('module_config.resize_intermediate_opt.denoising_strength', 0.75),
('refiner_enabled', False),
('module_config.refiner_opt.checkpoint', constants.checkpoint_default),
('module_config.refiner_opt.vae', constants.vae_default),
('module_config.refiner_opt.keep_checkpoint', True),
('module_config.refiner_opt.prompt', ''),
('module_config.refiner_opt.negative_prompt', ''),
('module_config.refiner_opt.sampler', constants.sampler_default),
('module_config.refiner_opt.scheduler', constants.scheduler_default),
('module_config.refiner_opt.upscaler', constants.fast_upscaler),
('module_config.refiner_opt.steps', 20),
('module_config.refiner_opt.cfg_scale', 7),
('module_config.refiner_opt.denoising_strength', 0.75),
('module_config.refiner_opt.scale', 1),
('module_config.refiner_opt.width', 0),
('module_config.refiner_opt.height', 0),
('contrast', 1),
('brightness', 1),
('sharpeness', 1),
('color_saturation', 1),
('color_temperature', 0),
('noise_alpha', 0),
('noise_alpha_final', 0),
('input_image', None),
('blend_enabled', False),
('blend_alpha', 1),
('detect_enabled', False),
('masking_prompt', ''),
('person_detailing_enabled', False),
('module_config.person_detailing_opt.use_groudingdino', False),
('module_config.person_detailing_opt.force_1:1', False),
('module_config.person_detailing_opt.block_overscaled_image', True),
('module_config.person_detailing_opt.auto_upscale', True),
('module_config.person_detailing_opt.checkpoint', constants.checkpoint_default),
('module_config.person_detailing_opt.vae', constants.vae_default),
('module_config.person_detailing_opt.sampler', constants.sampler_default),
('module_config.person_detailing_opt.scheduler', constants.scheduler_default),
('module_config.person_detailing_opt.scale', 4),
('module_config.person_detailing_opt.dilation', 2),
('module_config.person_detailing_opt.area_ratio', 0.1),
('module_config.person_detailing_opt.limit', 1),
('module_config.person_detailing_opt.background_color', 1),
('module_config.person_detailing_opt.background_blur', 0),
('module_config.person_detailing.denoising_strength', 0.4),
('module_config.person_detailing.cfg_scale', 7),
('module_config.person_detailing.steps', 20),
('face_detailing_enabled', False),
('face_detailing_before_hiresfix_enabled', False),
('module_config.face_detailing_opt.disable_extra_networks', False),
('module_config.face_detailing_opt.sort_by', 'Score'),
('module_config.face_detailing_opt.limit', 1),
('module_config.face_detailing_opt.prompt0', ''),
('module_config.face_detailing_opt.negative_prompt0', ''),
('module_config.face_detailing_opt.prompt1', ''),
('module_config.face_detailing_opt.negative_prompt1', ''),
('module_config.face_detailing_opt.prompt2', ''),
('module_config.face_detailing_opt.negative_prompt2', ''),
('module_config.face_detailing_opt.prompt3', ''),
('module_config.face_detailing_opt.negative_prompt3', ''),
('module_config.face_detailing_opt.prompt4', ''),
('module_config.face_detailing_opt.negative_prompt4', ''),
('module_config.face_detailing_opt.override_parameter', False),
('module_config.face_detailing.width', 512),
('module_config.face_detailing.height', 512),
('module_config.face_detailing.cfg_scale', 7),
('module_config.face_detailing.steps', 20),
('module_config.face_detailing.mask_blur', 4),
('module_config.face_detailing_opt.checkpoint', constants.checkpoint_default),
('module_config.face_detailing_opt.vae', constants.vae_default),
('module_config.face_detailing_opt.sampler', constants.sampler_default),
('module_config.face_detailing_opt.scheduler', constants.scheduler_default),
('module_config.face_detailing.inpaint_full_res', 'Only masked'),
('module_config.face_detailing.inpaint_full_res_padding', 32),
('module_config.face_detailing_opt.detection_model', constants.face_detector_default),
('module_config.face_detailing.denoising_strength', 0.4),
('module_config.face_detailing_opt.dilation', 4),
('module_config.face_detailing_opt.box_threshold', 0.3),
('module_config.face_detailing_opt.skip_large_face', False),
('module_config.face_detailing_opt.large_face_pixels', 0.26),
('hand_detailing_enabled', False),
('module_config.hand_detailing_opt.block_overscaled_image', True),
('module_config.hand_detailing_opt.best_quality', False),
('module_config.hand_detailing_opt.detailing_method', 'subframe'),
('module_config.hand_detailing.prompt', ''),
('module_config.hand_detailing.negative_prompt', ''),
('module_config.hand_detailing.denoising_strength', 0.4),
('module_config.hand_detailing.cfg_scale', 7),
('module_config.hand_detailing_opt.auto_upscale', True),
('module_config.hand_detailing_opt.scale', 2),
('module_config.hand_detailing_opt.box_threshold', 0.3),
('module_config.hand_detailing_opt.dilation', 0.1),
('module_config.hand_detailing.inpaint_full_res', 'Whole picture'),
('module_config.hand_detailing.inpaint_full_res_padding', 32),
('module_config.hand_detailing_opt.additional_parameter', ''),
('module_config.controlnet.enabled', False),
('module_config.controlnet.noise', False),
('module_config.controlnet.with_refiner', False),
('module_config.controlnet.noise_strength', 0.4),
('module_config.controlnet.noise_begin', 0.1),
('module_config.controlnet.noise_end', 0.9),
('module_config.controlnet.noise_hiresfix', 'Both'),
('module_config.controlnet.pose', False),
('module_config.controlnet.pose_strength', 0.3),
('module_config.controlnet.pose_begin', 0.0),
('module_config.controlnet.pose_end', 1.0),
('module_config.controlnet.pose_face_only', False),
('module_config.controlnet.pose_selected', 'Random'),
('module_config.controlnet.ipadapter', False),
('module_config.controlnet.ipadapter_strength', 0.3),
('module_config.controlnet.ipadapter_begin', 0.0),
('module_config.controlnet.ipadapter_end', 1.0),
('module_config.controlnet.ipadapter_selected', 'Random'),
('module_config.controlnet.ipadapter_weight_type', 'normal'),
('module_config.iclight.enabled', False),
('module_config.iclight.enable_before_upscale', False),
('module_config.iclight.style', 'normal'),
('module_config.iclight.prompt', ''),
('module_config.iclight.preference', 'None'),
('module_config.iclight.blending', 0.5),
('module_config.iclight.use_background_image', False),
('resize_by_person_enabled', False),
('module_config.resize_by_person_opt.mode', constants.resize_mode_default),
('module_config.resize_by_person_opt.scale', 0.85),
('module_config.resize_by_person_opt.denoising_strength', 0.4),
('module_config.resize_by_person_opt.dilation', 10),
('upscale_enabled', False),
('detailing_after_upscale', True),
('upscaler_name', 'None'),
('upscale_ratio', 1.5),
('postprocess_final_filter', 'None'),
('module_config.watermark.enabled', False),
('module_config.watermark.font', ''),
('module_config.watermark.alignment', 5),
('module_config.watermark.text_alignment', 'left'),
('module_config.watermark.rotate', '0'),
('module_config.watermark.color', '#000000'),
('module_config.watermark.background_color', '#000000'),
('module_config.watermark.font_size', 12),
('module_config.watermark.transparency', 100),
('module_config.watermark.background_transparency', 0),
('module_config.watermark.margin', 5),
('module_config.watermark.text', ''),
('config_file', ''),
('preset', 'None'),
]
self.ext_params = [
('hand_detailing_before_hiresfix_enabled', False),
]
@staticmethod
def get_dict_from_args(args, d):
ar = {}
if d is not None:
ar = d
for p in args:
key = p[0]
value = p[1]
keys = key.split('.')
cur = ar
if len(keys) > 1:
key = keys[-1]
for k in keys[:-1]:
if k not in cur:
cur[k] = {}
cur = cur[k]
cur[key] = value
return ar
@staticmethod
def get_param_from_dict(prefix, d):
arr = []
for key, value in d.items():
if isinstance(value, dict):
prefixz = prefix + key + '.'
sub = Parameters.get_param_from_dict(prefixz, value)
arr.extend(sub)
else:
arr.append((prefix + key, value))
return arr
def get_dict(self, args, external_config):
if isinstance(args[0], dict):
default_args = Parameters.get_dict_from_args(self.params, None)
default_args.update(args[0])
return default_args
else:
if len(args) != len(self.params):
debug_print('Refresh webui first.')
raise Exception('Refresh webui first.')
if args[0]:
args_list = [(self.params[idx][0], v) for idx, v in enumerate(args)]
args_list.extend(self.ext_params)
ar = Parameters.get_dict_from_args(args_list, None)
else:
self.params.extend(self.ext_params)
ar = Parameters.get_dict_from_args(self.params, None)
if external_config:
cfgarg = Parameters.get_param_from_dict('', external_config)
ar = Parameters.get_dict_from_args(cfgarg, ar)
ar['enabled'] = True
return ar
return None
def get_default(self):
return [x[1] for x in self.params]
def get_preset(self, prompt):
config_file = None
newprompt = []
for line in prompt.split('\n'):
if line.startswith('##'):
config_file = line[2:]
continue
newprompt.append(line)
if config_file is None:
return prompt, {}
cfg_dir = os.path.join(os.path.dirname(__file__), "../preset")
json_file = os.path.join(cfg_dir, f'{config_file}.json')
if not os.path.isfile(json_file):
debug_print(f'Not found configuration file {config_file}.json')
return '\n'.join(newprompt), {}
with open(json_file) as f:
config = json.load(f)
debug_print('Loading config', json.dumps(config, indent=2))
return '\n'.join(newprompt), config
def load_preset(self, args):
name = 'None'
for (key, value), a in zip(self.params, args):
if key == 'preset':
name = a
if name == 'None':
return {}
cfg_dir = os.path.join(os.path.dirname(__file__), "../resources/preset")
json_file = os.path.join(cfg_dir, f'{name}.json')
if not os.path.isfile(json_file):
debug_print(f'Not found configuration file {name}.json')
return {}
with open(json_file) as f:
config = json.load(f)
debug_print('Loading config', json.dumps(config, indent=2))
return config
def get_save_config_name(self, args):
name = None
for (key, value), a in zip(self.params, args):
if key == 'config_file':
name = a
if name is None:
return 'noname'
return name
def load_config(self, name):
save_dir = os.path.join(os.path.dirname(__file__), "../resources/saved")
with open(os.path.join(save_dir, f'{name}.json'), 'r') as f:
loaded_dict = json.load(f)
detailing_opt = loaded_dict.get('module_config', {}).get('face_detailing_opt', {})
detection_model = detailing_opt.get('detection_model', constants.face_detector_default)
if detection_model == 'GroundingDINO(face)':
detailing_opt['detection_model'] = constants.face_detector_default
default_args = Parameters.get_dict_from_args(self.params, None)
loaded_args = Parameters.get_param_from_dict('', loaded_dict)
final_dict = Parameters.get_dict_from_args(loaded_args, default_args)
final_args = Parameters.get_param_from_dict('', final_dict)
sort_dict = {a[0]: a[1] for a in final_args}
ret = [sort_dict[key] for key, value in self.params]
return ret
def save_config(self, args):
name = 'noname'
for (key, value), a in zip(self.params, args):
if key == 'config_file':
name = a
save_dir = os.path.join(os.path.dirname(__file__), "../resources/saved")
args_list = [(self.params[idx][0], v) for idx, v in enumerate(args)]
conf = Parameters.get_dict_from_args(args_list, None)
with open(os.path.join(save_dir, f'{name}.json'), 'w') as f:
json.dump(conf, f, indent=2)
def list_config(self):
save_dir = os.path.join(os.path.dirname(__file__), "../resources/saved")
if not os.path.isdir(save_dir):
os.mkdir(save_dir)
configs = [x for x in os.listdir(save_dir) if x.endswith('.json')]
return [x[:-5] for x in configs]
def list_preset(self):
presets = ['None']
preset_dir = os.path.join(os.path.dirname(__file__), "../resources/preset")
configs = [x for x in os.listdir(preset_dir) if x.endswith('.json')]
presets.extend([x[:-5] for x in configs])
return presets
def get_config_value_by_key(self, key, configs):
for x, y in zip(self.params, configs):
if x[0] == key:
return y
return None