mirror of
https://github.com/vladmandic/automatic
synced 2026-09-19 09:14:35 +02:00
@@ -486,7 +486,7 @@ class StableDiffusionProcessingImg2Img(StableDiffusionProcessing):
|
||||
image = images.resize_image(self.resize_mode, image, self.width, self.height, upscaler_name=self.resize_name, context=self.resize_context)
|
||||
self.width = image.width
|
||||
self.height = image.height
|
||||
if self.image_mask is not None and shared.opts.mask_apply_overlay:
|
||||
if self.image_mask is not None and shared.opts.mask_apply_overlay and not hasattr(self, 'xyz'):
|
||||
image_masked = Image.new('RGBa', (image.width, image.height))
|
||||
image_to_paste = image.convert("RGBA").convert("RGBa")
|
||||
image_to_mask = ImageOps.invert(self.mask_for_overlay.convert('L')) if self.mask_for_overlay is not None else None
|
||||
|
||||
@@ -393,8 +393,8 @@ def sample_dpmpp_2s_ancestral(model, x, sigmas, extra_args=None, callback=None,
|
||||
extra_args = {} if extra_args is None else extra_args
|
||||
noise_sampler = default_noise_sampler(x) if noise_sampler is None else noise_sampler
|
||||
s_in = x.new_ones([x.shape[0]])
|
||||
sigma_fn = lambda t: t.neg().exp()
|
||||
t_fn = lambda sigma: sigma.log().neg()
|
||||
sigma_fn = lambda t: t.neg().exp() # pylint: disable=C3001
|
||||
t_fn = lambda sigma: sigma.log().neg() # pylint: disable=C3001
|
||||
|
||||
for i in trange(len(sigmas) - 1, disable=disable):
|
||||
denoised = model(x, sigmas[i] * s_in, **extra_args)
|
||||
@@ -430,8 +430,8 @@ def sample_dpmpp_sde(model, x, sigmas, extra_args=None, callback=None, disable=N
|
||||
noise_sampler = BrownianTreeNoiseSampler(x, sigma_min, sigma_max) if noise_sampler is None else noise_sampler
|
||||
extra_args = {} if extra_args is None else extra_args
|
||||
s_in = x.new_ones([x.shape[0]])
|
||||
sigma_fn = lambda t: t.neg().exp()
|
||||
t_fn = lambda sigma: sigma.log().neg()
|
||||
sigma_fn = lambda t: t.neg().exp() # pylint: disable=C3001
|
||||
t_fn = lambda sigma: sigma.log().neg() # pylint: disable=C3001
|
||||
|
||||
for i in trange(len(sigmas) - 1, disable=disable):
|
||||
denoised = model(x, sigmas[i] * s_in, **extra_args)
|
||||
@@ -472,8 +472,8 @@ def sample_dpmpp_2m(model, x, sigmas, extra_args=None, callback=None, disable=No
|
||||
"""DPM-Solver++(2M)."""
|
||||
extra_args = {} if extra_args is None else extra_args
|
||||
s_in = x.new_ones([x.shape[0]])
|
||||
sigma_fn = lambda t: t.neg().exp()
|
||||
t_fn = lambda sigma: sigma.log().neg()
|
||||
sigma_fn = lambda t: t.neg().exp() # pylint: disable=C3001
|
||||
t_fn = lambda sigma: sigma.log().neg() # pylint: disable=C3001
|
||||
old_denoised = None
|
||||
|
||||
for i in trange(len(sigmas) - 1, disable=disable):
|
||||
|
||||
@@ -449,6 +449,9 @@ def move_model(model, device=None, force=False):
|
||||
devices.torch_gc()
|
||||
return
|
||||
|
||||
if hasattr(model, 'pipe'):
|
||||
move_model(model.pipe, device, force)
|
||||
|
||||
fn = f'{sys._getframe(2).f_code.co_name}:{sys._getframe(1).f_code.co_name}' # pylint: disable=protected-access
|
||||
if getattr(model, 'vae', None) is not None and get_diffusers_task(model) != DiffusersTaskType.TEXT_2_IMAGE:
|
||||
if device == devices.device and model.vae.device.type != "meta": # force vae back to gpu if not in txt2img mode
|
||||
@@ -476,7 +479,8 @@ def move_model(model, device=None, force=False):
|
||||
try:
|
||||
t0 = time.time()
|
||||
try:
|
||||
model.to(device)
|
||||
if hasattr(model, 'to'):
|
||||
model.to(device)
|
||||
if hasattr(model, "prior_pipe"):
|
||||
model.prior_pipe.to(device)
|
||||
except Exception as e0:
|
||||
@@ -486,7 +490,8 @@ def move_model(model, device=None, force=False):
|
||||
if hasattr(component, 'modules'):
|
||||
for module in component.modules():
|
||||
try:
|
||||
module.to(device)
|
||||
if hasattr(module, 'to'):
|
||||
module.to(device)
|
||||
except Exception as e2:
|
||||
if 'Cannot copy out of meta tensor' in str(e2):
|
||||
if os.environ.get('SD_MOVE_DEBUG', None):
|
||||
|
||||
@@ -2,6 +2,9 @@ import gradio as gr
|
||||
from modules import scripts, processing, shared, sd_models
|
||||
|
||||
|
||||
registered = False
|
||||
|
||||
|
||||
class Script(scripts.Script):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
@@ -24,6 +27,10 @@ class Script(scripts.Script):
|
||||
return [eta, momentum, threshold]
|
||||
|
||||
def register(self): # register xyz grid elements
|
||||
global registered # pylint: disable=global-statement
|
||||
if registered:
|
||||
return
|
||||
registered = True
|
||||
def apply_field(field):
|
||||
def fun(p, x, xs): # pylint: disable=unused-argument
|
||||
setattr(p, field, x)
|
||||
|
||||
+19
-10
@@ -9,13 +9,15 @@ from modules import shared, devices, errors, scripts, processing, processing_hel
|
||||
|
||||
debug = os.environ.get('SD_PULID_DEBUG', None) is not None
|
||||
direct = False
|
||||
registered = False
|
||||
uploaded_images = []
|
||||
|
||||
|
||||
class Script(scripts.Script):
|
||||
def __init__(self):
|
||||
self.images = []
|
||||
self.pulid = None
|
||||
self.cache = None
|
||||
self.mask_apply_overlay = shared.opts.mask_apply_overlay
|
||||
super().__init__()
|
||||
self.register() # pulid is script with processing override so xyz doesnt execute
|
||||
|
||||
@@ -33,6 +35,10 @@ class Script(scripts.Script):
|
||||
install('pydantic==1.10.15', 'pydantic', ignore=False, reinstall=True)
|
||||
|
||||
def register(self): # register xyz grid elements
|
||||
global registered # pylint: disable=global-statement
|
||||
if registered:
|
||||
return
|
||||
registered = True
|
||||
def apply_field(field):
|
||||
def fun(p, x, xs): # pylint: disable=unused-argument
|
||||
setattr(p, field, x)
|
||||
@@ -52,7 +58,7 @@ class Script(scripts.Script):
|
||||
|
||||
|
||||
def load_images(self, files):
|
||||
self.images = []
|
||||
uploaded_images.clear()
|
||||
for file in files or []:
|
||||
try:
|
||||
if isinstance(file, str):
|
||||
@@ -66,10 +72,10 @@ class Script(scripts.Script):
|
||||
image = Image.open(file.name) # _TemporaryFileWrapper from gr.Files
|
||||
else:
|
||||
raise ValueError(f'IP adapter unknown input: {file}')
|
||||
self.images.append(image)
|
||||
uploaded_images.append(image)
|
||||
except Exception as e:
|
||||
shared.log.warning(f'IP adapter failed to load image: {e}')
|
||||
return gr.update(value=self.images, visible=len(self.images) > 0)
|
||||
return gr.update(value=uploaded_images, visible=len(uploaded_images) > 0)
|
||||
|
||||
# return signature is array of gradio components
|
||||
def ui(self, _is_img2img):
|
||||
@@ -95,7 +101,7 @@ class Script(scripts.Script):
|
||||
try:
|
||||
if len(gallery) == 0:
|
||||
from modules.api.api import decode_base64_to_image
|
||||
images = getattr(p, 'pulid_images', self.images)
|
||||
images = getattr(p, 'pulid_images', uploaded_images)
|
||||
images = [decode_base64_to_image(image) if isinstance(image, str) else image for image in images]
|
||||
else:
|
||||
images = [Image.open(f['name']) if isinstance(f, dict) else f for f in gallery]
|
||||
@@ -134,6 +140,8 @@ class Script(scripts.Script):
|
||||
ortho = getattr(p, 'pulid_ortho', ortho)
|
||||
sampler = getattr(p, 'pulid_sampler', sampler)
|
||||
sampler_fn = getattr(self.pulid.sampling, f'sample_{sampler}', None)
|
||||
self.mask_apply_overlay = shared.opts.mask_apply_overlay
|
||||
shared.opts.data['mask_apply_overlay'] = False
|
||||
if sampler_fn is None:
|
||||
sampler_fn = self.pulid.sampling.sample_dpmpp_2m_sde
|
||||
|
||||
@@ -149,7 +157,7 @@ class Script(scripts.Script):
|
||||
)
|
||||
shared.sd_model.no_recurse = True
|
||||
sd_models.copy_diffuser_options(shared.sd_model, shared.sd_model.pipe)
|
||||
# sd_models.move_model(shared.sd_model, devices.device) # move pipeline to device
|
||||
sd_models.move_model(shared.sd_model, devices.device) # move pipeline to device
|
||||
sd_models.set_diffuser_options(shared.sd_model, vae=None, op='model')
|
||||
devices.torch_gc()
|
||||
except Exception as e:
|
||||
@@ -204,11 +212,12 @@ class Script(scripts.Script):
|
||||
|
||||
def after(self, p: processing.StableDiffusionProcessing, processed: processing.Processed, *args): # pylint: disable=unused-argument
|
||||
_strength, _zero, _sampler, _ortho, _gallery, cache = args
|
||||
cache = getattr(p, 'pulid_cache', cache)
|
||||
if cache:
|
||||
shared.log.debug(f'PuLID cache: class={shared.sd_model.__class__.__name__}')
|
||||
return processed
|
||||
if hasattr(shared.sd_model, 'pipe') and shared.sd_model_type == "sdxl":
|
||||
shared.opts.data['mask_apply_overlay'] = self.mask_apply_overlay
|
||||
cache = getattr(p, 'pulid_cache', cache)
|
||||
if cache:
|
||||
shared.log.debug(f'PuLID cache: class={shared.sd_model.__class__.__name__}')
|
||||
return processed
|
||||
if hasattr(shared.sd_model, 'app'):
|
||||
shared.sd_model.app = None
|
||||
shared.sd_model.ip_adapter = None
|
||||
|
||||
@@ -136,6 +136,7 @@ axis_options = [
|
||||
AxisOption("[Postprocess] Upscaler", str, apply_upscaler, cost=0.4, choices=lambda: [x.name for x in shared.sd_upscalers][1:]),
|
||||
AxisOption("[Postprocess] Context", str, apply_context, choices=lambda: ["Add with forward", "Remove with forward", "Add with backward", "Remove with backward"]),
|
||||
AxisOption("[Postprocess] Detailer", str, apply_detailer, fmt=format_value_add_label),
|
||||
AxisOption("[Postprocess] Detailer strength", str, apply_field("detailer_strength")),
|
||||
AxisOption("[HDR] Mode", int, apply_field("hdr_mode")),
|
||||
AxisOption("[HDR] Brightness", float, apply_field("hdr_brightness")),
|
||||
AxisOption("[HDR] Color", float, apply_field("hdr_color")),
|
||||
|
||||
Reference in New Issue
Block a user