proto modular guiders

Signed-off-by: Vladimir Mandic <mandic00@live.com>
This commit is contained in:
Vladimir Mandic
2026-08-29 15:33:47 +02:00
parent 34a3155f96
commit a0dceebd57
3 changed files with 71 additions and 39 deletions
+36 -25
View File
@@ -1,27 +1,21 @@
import inspect
import diffusers
from modules import shared, errors, processing
from modules import errors, shared, processing
from modules.logger import log
# ['Default', 'CFG', 'Zero', 'PAG', 'APG', 'SLG', 'SEG', 'TCFG', 'FDG']
guiders = {
# 'None': { 'cls': None, 'args': {}, },
'Default': { 'cls': None, 'args': {}, },
'CFG: ClassifierFreeGuidance': { 'cls': diffusers.ClassifierFreeGuidance, 'args': {} },
'Auto: AutoGuidance': { 'cls': diffusers.AutoGuidance, 'args': { 'dropout': 1.0, 'auto_guidance_layers': [7, 8, 9], 'auto_guidance_config': None } },
'Zero: ClassifierFreeZeroStar': { 'cls': diffusers.ClassifierFreeZeroStarGuidance, 'args': { 'zero_init_steps': 1 } },
'PAG: PerturbedAttentionGuidance': { 'cls': diffusers.PerturbedAttentionGuidance, 'args': { 'perturbed_guidance_scale': 2.8, 'perturbed_guidance_start': 0.01, 'perturbed_guidance_stop': 0.2, 'perturbed_guidance_layers': [7, 8, 9], 'perturbed_guidance_config': None } },
'APG: AdaptiveProjectedGuidance': { 'cls': diffusers.AdaptiveProjectedGuidance, 'args': { 'adaptive_projected_guidance_momentum': -1, 'adaptive_projected_guidance_rescale': 15.0 } },
'SLG: SkipLayerGuidance': { 'cls': diffusers.SkipLayerGuidance, 'args': { 'skip_layer_guidance_scale': 2.8, 'skip_layer_guidance_start': 0.01, 'skip_layer_guidance_stop': 0.2, 'skip_layer_guidance_layers': [7, 8, 9], 'skip_layer_config': None } },
'SEG: SmoothedEnergyGuidance': { 'cls': diffusers.SmoothedEnergyGuidance, 'args': { 'seg_guidance_scale': 3.0, 'seg_blur_sigma': 9999999.0, 'seg_blur_threshold_inf': 9999.0, 'seg_guidance_start': 0.0, 'seg_guidance_stop': 1.0, 'seg_guidance_layers': [7, 8, 9], 'seg_guidance_config': None } },
'Auto: AutoGuidance': { 'cls': diffusers.AutoGuidance, 'args': {} },
'Zero: ClassifierFreeZeroStar': { 'cls': diffusers.ClassifierFreeZeroStarGuidance, 'args': {} },
'PAG: PerturbedAttentionGuidance': { 'cls': diffusers.PerturbedAttentionGuidance, 'args': {} },
'APG: AdaptiveProjectedGuidance': { 'cls': diffusers.AdaptiveProjectedGuidance, 'args': {} },
'SLG: SkipLayerGuidance': { 'cls': diffusers.SkipLayerGuidance, 'args': {} },
'SEG: SmoothedEnergyGuidance': { 'cls': diffusers.SmoothedEnergyGuidance, 'args': {} },
'TCFG: TangentialClassifierFreeGuidance': { 'cls': diffusers.TangentialClassifierFreeGuidance, 'args': {} },
'FDG: FrequencyDecoupledGuidance': { 'cls': diffusers.FrequencyDecoupledGuidance, 'args': { 'guidance_scales': [10.0, 5.0], 'parallel_weights': 1.0, 'guidance_rescale_space': "data" } },
}
base_args = {
'guidance_scale': 6.0,
'guidance_rescale': 0.0,
'start': 0.0,
'stop': 1.0,
'FDG: FrequencyDecoupledGuidance': { 'cls': diffusers.FrequencyDecoupledGuidance, 'args': {} },
}
@@ -50,20 +44,35 @@ def set_guider(p: processing.StableDiffusionProcessing):
guider_args = {k: v for k, v in guider_info.config.items() if not k.startswith('_') and v is not None}
else:
guider_args = {}
log.info(f'Guider: name={guidance_name} cls={guider_cls.__name__ if guider_cls is not None else None} args={guider_args}')
log.info(f'Guider: name="{guidance_name}" cls={guider_cls.__name__ if guider_cls is not None else None} args={guider_args}')
return
if guidance_name == 'None':
shared.sd_model.update_components(guider=None) # breaks the pipeline
log.info(f'Guider: name={guidance_name}')
log.info(f'Guider: name="{guidance_name}"')
return
guider_info = guiders[guidance_name]
guider_cls = guider_info['cls']
guider_args = {}
for k, v in base_args.items():
if isinstance(v, float):
guider_args[k] = v
log.warning('Guiders: partially implemented') # TODO: guiders
possible = list(inspect.signature(guider_cls.__init__).parameters) if guider_cls is not None else []
if p.guidance_scale >= 0.0 and 'guidance_scale' in possible:
guider_args['guidance_scale'] = float(p.guidance_scale)
if p.guidance_rescale >= 0.0 and 'guidance_rescale' in possible:
guider_args['guidance_rescale'] = float(p.guidance_rescale)
if p.guidance_start >= 0.0 and 'start' in possible:
guider_args['start'] = float(p.guidance_start)
if p.guidance_stop >= 0.0 and 'stop' in possible:
guider_args['stop'] = float(p.guidance_stop)
"""
import modules.ui_guidance
for k, v in modules.ui_guidance.get_modular_args().items():
log.trace(f'Guiders: arg={k} value={v}')
"""
log.warning('Guiders: advanced parameters are not yet implemented') # TODO: guiders
"""
for k, v in guider_info['args'].items():
try:
if k is None:
@@ -86,13 +95,15 @@ def set_guider(p: processing.StableDiffusionProcessing):
log.error(f'Guiders: arg={k} value={v} error={e}')
errors.display(e, 'Guiders')
# guider_args.update(guider_info['args'])
"""
if guider_cls is not None:
try:
guider_instance = guider_cls(**guider_args)
log.info(f'Guider: name={guidance_name} cls={guider_cls.__name__} args={guider_args}')
guider_instance: diffusers.BaseGuidance = guider_cls(**guider_args)
log.info(f'Guider: name="{guidance_name}" cls={guider_cls.__name__} args={guider_args}')
shared.sd_model.update_components(guider=guider_instance)
except Exception as e:
log.error(f'Guider: name={guidance_name} cls={guider_cls.__name__} args={guider_args} {e}')
log.error(f'Guider: name="{guidance_name}" cls={guider_cls.__name__} args={guider_args} {e}')
errors.display(e, 'Guiders')
return
else:
log.warning(f'Guider: name={guidance_name} cls=None args={guider_args}')
log.warning(f'Guider: name="{guidance_name}" cls=None args={guider_args}')