mirror of
https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
synced 2025-01-17 11:50:18 +08:00
Added slider for detail preservation strength, removed largely needless offset parameter, changed labels in UI and for saving to/pasting data from PNG files.
This commit is contained in:
parent
debf836fcc
commit
c5c7fa06aa
@ -134,7 +134,7 @@ def img2img(id_task: str,
|
|||||||
mask_alpha: float,
|
mask_alpha: float,
|
||||||
mask_blend_power: float,
|
mask_blend_power: float,
|
||||||
mask_blend_scale: float,
|
mask_blend_scale: float,
|
||||||
mask_blend_offset: float,
|
inpaint_detail_preservation: float,
|
||||||
inpainting_fill: int,
|
inpainting_fill: int,
|
||||||
n_iter: int,
|
n_iter: int,
|
||||||
batch_size: int,
|
batch_size: int,
|
||||||
@ -216,7 +216,7 @@ def img2img(id_task: str,
|
|||||||
mask_blur=mask_blur,
|
mask_blur=mask_blur,
|
||||||
mask_blend_power=mask_blend_power,
|
mask_blend_power=mask_blend_power,
|
||||||
mask_blend_scale=mask_blend_scale,
|
mask_blend_scale=mask_blend_scale,
|
||||||
mask_blend_offset=mask_blend_offset,
|
inpaint_detail_preservation=inpaint_detail_preservation,
|
||||||
inpainting_fill=inpainting_fill,
|
inpainting_fill=inpainting_fill,
|
||||||
resize_mode=resize_mode,
|
resize_mode=resize_mode,
|
||||||
denoising_strength=denoising_strength,
|
denoising_strength=denoising_strength,
|
||||||
@ -237,9 +237,9 @@ def img2img(id_task: str,
|
|||||||
|
|
||||||
if mask:
|
if mask:
|
||||||
p.extra_generation_params["Mask blur"] = mask_blur
|
p.extra_generation_params["Mask blur"] = mask_blur
|
||||||
p.extra_generation_params["Mask blend power"] = mask_blend_power
|
p.extra_generation_params["Mask blending bias"] = mask_blend_power
|
||||||
p.extra_generation_params["Mask blend scale"] = mask_blend_scale
|
p.extra_generation_params["Mask blending preservation"] = mask_blend_scale
|
||||||
p.extra_generation_params["Mask blend offset"] = mask_blend_offset
|
p.extra_generation_params["Mask blending detail boost"] = inpaint_detail_preservation
|
||||||
|
|
||||||
with closing(p):
|
with closing(p):
|
||||||
if is_batch:
|
if is_batch:
|
||||||
|
@ -1351,7 +1351,7 @@ class StableDiffusionProcessingImg2Img(StableDiffusionProcessing):
|
|||||||
mask_blur: int = None
|
mask_blur: int = None
|
||||||
mask_blend_power: float = 1
|
mask_blend_power: float = 1
|
||||||
mask_blend_scale: float = 1
|
mask_blend_scale: float = 1
|
||||||
mask_blend_offset: float = 0
|
inpaint_detail_preservation: float = 16
|
||||||
inpainting_fill: int = 0
|
inpainting_fill: int = 0
|
||||||
inpaint_full_res: bool = True
|
inpaint_full_res: bool = True
|
||||||
inpaint_full_res_padding: int = 0
|
inpaint_full_res_padding: int = 0
|
||||||
|
@ -45,7 +45,7 @@ class CFGDenoiser(torch.nn.Module):
|
|||||||
self.nmask = None
|
self.nmask = None
|
||||||
self.mask_blend_power = 1
|
self.mask_blend_power = 1
|
||||||
self.mask_blend_scale = 1
|
self.mask_blend_scale = 1
|
||||||
self.mask_blend_offset = 0
|
self.inpaint_detail_preservation = 16
|
||||||
self.init_latent = None
|
self.init_latent = None
|
||||||
self.steps = None
|
self.steps = None
|
||||||
"""number of steps as specified by user in UI"""
|
"""number of steps as specified by user in UI"""
|
||||||
@ -105,14 +105,13 @@ class CFGDenoiser(torch.nn.Module):
|
|||||||
# Record the original latent vector magnitudes.
|
# Record the original latent vector magnitudes.
|
||||||
# We bring them to a power so that larger magnitudes are favored over smaller ones.
|
# We bring them to a power so that larger magnitudes are favored over smaller ones.
|
||||||
# 64-bit operations are used here to allow large exponents.
|
# 64-bit operations are used here to allow large exponents.
|
||||||
detail_preservation = 32
|
a_magnitude = torch.norm(a, p=2, dim=1).to(torch.float64) ** self.inpaint_detail_preservation
|
||||||
a_magnitude = torch.norm(a, p=2, dim=1).to(torch.float64) ** detail_preservation
|
b_magnitude = torch.norm(b, p=2, dim=1).to(torch.float64) ** self.inpaint_detail_preservation
|
||||||
b_magnitude = torch.norm(b, p=2, dim=1).to(torch.float64) ** detail_preservation
|
|
||||||
|
|
||||||
one_minus_t = 1 - t
|
one_minus_t = 1 - t
|
||||||
|
|
||||||
# Interpolate the powered magnitudes, then un-power them (bring them back to a power of 1).
|
# Interpolate the powered magnitudes, then un-power them (bring them back to a power of 1).
|
||||||
interp_magnitude = (a_magnitude * one_minus_t + b_magnitude * t) ** (1 / detail_preservation)
|
interp_magnitude = (a_magnitude * one_minus_t + b_magnitude * t) ** (1 / self.inpaint_detail_preservation)
|
||||||
|
|
||||||
# Linearly interpolate the image vectors.
|
# Linearly interpolate the image vectors.
|
||||||
image_interp = a * one_minus_t + b * t
|
image_interp = a * one_minus_t + b * t
|
||||||
@ -142,7 +141,7 @@ class CFGDenoiser(torch.nn.Module):
|
|||||||
|
|
||||||
NOTE: "mask" is not used
|
NOTE: "mask" is not used
|
||||||
"""
|
"""
|
||||||
return torch.pow(nmask, (_sigma ** self.mask_blend_power) * self.mask_blend_scale + self.mask_blend_offset)
|
return torch.pow(nmask, (_sigma ** self.mask_blend_power) * self.mask_blend_scale)
|
||||||
|
|
||||||
if state.interrupted or state.skipped:
|
if state.interrupted or state.skipped:
|
||||||
raise sd_samplers_common.InterruptedException
|
raise sd_samplers_common.InterruptedException
|
||||||
|
@ -279,7 +279,7 @@ class Sampler:
|
|||||||
self.model_wrap_cfg.nmask = p.nmask if hasattr(p, 'nmask') else None
|
self.model_wrap_cfg.nmask = p.nmask if hasattr(p, 'nmask') else None
|
||||||
self.model_wrap_cfg.mask_blend_power = p.mask_blend_power if hasattr(p, 'mask_blend_power') else None
|
self.model_wrap_cfg.mask_blend_power = p.mask_blend_power if hasattr(p, 'mask_blend_power') else None
|
||||||
self.model_wrap_cfg.mask_blend_scale = p.mask_blend_scale if hasattr(p, 'mask_blend_scale') else None
|
self.model_wrap_cfg.mask_blend_scale = p.mask_blend_scale if hasattr(p, 'mask_blend_scale') else None
|
||||||
self.model_wrap_cfg.mask_blend_offset = p.mask_blend_offset if hasattr(p, 'mask_blend_offset') else None
|
self.model_wrap_cfg.inpaint_detail_preservation = p.inpaint_detail_preservation if hasattr(p, 'inpaint_detail_preservation') else None
|
||||||
self.model_wrap_cfg.step = 0
|
self.model_wrap_cfg.step = 0
|
||||||
self.model_wrap_cfg.image_cfg_scale = getattr(p, 'image_cfg_scale', None)
|
self.model_wrap_cfg.image_cfg_scale = getattr(p, 'image_cfg_scale', None)
|
||||||
self.eta = p.eta if p.eta is not None else getattr(opts, self.eta_option_field, 0.0)
|
self.eta = p.eta if p.eta is not None else getattr(opts, self.eta_option_field, 0.0)
|
||||||
|
@ -732,9 +732,9 @@ def create_ui():
|
|||||||
with FormRow():
|
with FormRow():
|
||||||
mask_blur = gr.Slider(label='Mask blur', minimum=0, maximum=64, step=1, value=4, elem_id="img2img_mask_blur")
|
mask_blur = gr.Slider(label='Mask blur', minimum=0, maximum=64, step=1, value=4, elem_id="img2img_mask_blur")
|
||||||
mask_alpha = gr.Slider(label="Mask transparency", visible=False, elem_id="img2img_mask_alpha")
|
mask_alpha = gr.Slider(label="Mask transparency", visible=False, elem_id="img2img_mask_alpha")
|
||||||
mask_blend_power = gr.Slider(label='Mask blend power', minimum=0, maximum=8, step=0.1, value=1, elem_id="img2img_mask_blend_power")
|
mask_blend_power = gr.Slider(label='Blending bias', minimum=0, maximum=8, step=0.1, value=1, elem_id="img2img_mask_blend_power")
|
||||||
mask_blend_scale = gr.Slider(label='Mask blend scale', minimum=0, maximum=8, step=0.1, value=1, elem_id="img2img_mask_blend_scale")
|
mask_blend_scale = gr.Slider(label='Blending preservation', minimum=0, maximum=8, step=0.05, value=1, elem_id="img2img_mask_blend_scale")
|
||||||
mask_blend_offset = gr.Slider(label='Mask blend offset', minimum=-4, maximum=4, step=0.1, value=0, elem_id="img2img_mask_blend_offset")
|
inpaint_detail_preservation = gr.Slider(label='Blending detail boost', minimum=1, maximum=32, step=0.5, value=16, elem_id="img2img_mask_blend_offset")
|
||||||
|
|
||||||
with FormRow():
|
with FormRow():
|
||||||
inpainting_mask_invert = gr.Radio(label='Mask mode', choices=['Inpaint masked', 'Inpaint not masked'], value='Inpaint masked', type="index", elem_id="img2img_mask_mode")
|
inpainting_mask_invert = gr.Radio(label='Mask mode', choices=['Inpaint masked', 'Inpaint not masked'], value='Inpaint masked', type="index", elem_id="img2img_mask_mode")
|
||||||
@ -786,7 +786,7 @@ def create_ui():
|
|||||||
mask_alpha,
|
mask_alpha,
|
||||||
mask_blend_power,
|
mask_blend_power,
|
||||||
mask_blend_scale,
|
mask_blend_scale,
|
||||||
mask_blend_offset,
|
inpaint_detail_preservation,
|
||||||
inpainting_fill,
|
inpainting_fill,
|
||||||
batch_count,
|
batch_count,
|
||||||
batch_size,
|
batch_size,
|
||||||
@ -885,9 +885,9 @@ def create_ui():
|
|||||||
(toprow.ui_styles.dropdown, lambda d: d["Styles array"] if isinstance(d.get("Styles array"), list) else gr.update()),
|
(toprow.ui_styles.dropdown, lambda d: d["Styles array"] if isinstance(d.get("Styles array"), list) else gr.update()),
|
||||||
(denoising_strength, "Denoising strength"),
|
(denoising_strength, "Denoising strength"),
|
||||||
(mask_blur, "Mask blur"),
|
(mask_blur, "Mask blur"),
|
||||||
(mask_blend_power, "Mask blend power"),
|
(mask_blend_power, "Mask blending bias"),
|
||||||
(mask_blend_scale, "Mask blend scale"),
|
(mask_blend_scale, "Mask blending preservation"),
|
||||||
(mask_blend_offset, "Mask blend offset"),
|
(inpaint_detail_preservation, "Mask blending detail boost"),
|
||||||
*scripts.scripts_img2img.infotext_fields
|
*scripts.scripts_img2img.infotext_fields
|
||||||
]
|
]
|
||||||
parameters_copypaste.add_paste_fields("img2img", init_img, img2img_paste_fields, override_settings)
|
parameters_copypaste.add_paste_fields("img2img", init_img, img2img_paste_fields, override_settings)
|
||||||
|
@ -133,16 +133,16 @@ class Script(scripts.Script):
|
|||||||
|
|
||||||
pixels = gr.Slider(label="Pixels to expand", minimum=8, maximum=256, step=8, value=128, elem_id=self.elem_id("pixels"))
|
pixels = gr.Slider(label="Pixels to expand", minimum=8, maximum=256, step=8, value=128, elem_id=self.elem_id("pixels"))
|
||||||
mask_blur = gr.Slider(label='Mask blur', minimum=0, maximum=64, step=1, value=8, elem_id=self.elem_id("mask_blur"))
|
mask_blur = gr.Slider(label='Mask blur', minimum=0, maximum=64, step=1, value=8, elem_id=self.elem_id("mask_blur"))
|
||||||
mask_blend_power = gr.Slider(label='Mask blend power', minimum=0, maximum=8, step=0.1, value=1, elem_id=self.elem_id("mask_blend_power"))
|
mask_blend_power = gr.Slider(label='Blending bias', minimum=0, maximum=8, step=0.1, value=1, elem_id=self.elem_id("mask_blend_power"))
|
||||||
mask_blend_scale = gr.Slider(label='Mask blend scale', minimum=0, maximum=8, step=0.1, value=1, elem_id=self.elem_id("mask_blend_scale"))
|
mask_blend_scale = gr.Slider(label='Blending preservation', minimum=0, maximum=8, step=0.1, value=1, elem_id=self.elem_id("mask_blend_scale"))
|
||||||
mask_blend_offset = gr.Slider(label='Mask blend scale', minimum=-4, maximum=4, step=0.1, value=1, elem_id=self.elem_id("mask_blend_offset"))
|
inpaint_detail_preservation = gr.Slider(label='Blending detail boost', minimum=1, maximum=32, step=0.5, value=16, elem_id=self.elem_id("inpaint_detail_preservation"))
|
||||||
direction = gr.CheckboxGroup(label="Outpainting direction", choices=['left', 'right', 'up', 'down'], value=['left', 'right', 'up', 'down'], elem_id=self.elem_id("direction"))
|
direction = gr.CheckboxGroup(label="Outpainting direction", choices=['left', 'right', 'up', 'down'], value=['left', 'right', 'up', 'down'], elem_id=self.elem_id("direction"))
|
||||||
noise_q = gr.Slider(label="Fall-off exponent (lower=higher detail)", minimum=0.0, maximum=4.0, step=0.01, value=1.0, elem_id=self.elem_id("noise_q"))
|
noise_q = gr.Slider(label="Fall-off exponent (lower=higher detail)", minimum=0.0, maximum=4.0, step=0.01, value=1.0, elem_id=self.elem_id("noise_q"))
|
||||||
color_variation = gr.Slider(label="Color variation", minimum=0.0, maximum=1.0, step=0.01, value=0.05, elem_id=self.elem_id("color_variation"))
|
color_variation = gr.Slider(label="Color variation", minimum=0.0, maximum=1.0, step=0.01, value=0.05, elem_id=self.elem_id("color_variation"))
|
||||||
|
|
||||||
return [info, pixels, mask_blur, mask_blend_power, mask_blend_scale, mask_blend_offset, direction, noise_q, color_variation]
|
return [info, pixels, mask_blur, mask_blend_power, mask_blend_scale, inpaint_detail_preservation, direction, noise_q, color_variation]
|
||||||
|
|
||||||
def run(self, p, _, pixels, mask_blur, mask_blend_power, mask_blend_scale, mask_blend_offset, direction, noise_q, color_variation):
|
def run(self, p, _, pixels, mask_blur, mask_blend_power, mask_blend_scale, inpaint_detail_preservation, direction, noise_q, color_variation):
|
||||||
initial_seed_and_info = [None, None]
|
initial_seed_and_info = [None, None]
|
||||||
|
|
||||||
process_width = p.width
|
process_width = p.width
|
||||||
@ -172,7 +172,7 @@ class Script(scripts.Script):
|
|||||||
p.mask_blur_y = mask_blur_y*4
|
p.mask_blur_y = mask_blur_y*4
|
||||||
p.mask_blend_power = mask_blend_power
|
p.mask_blend_power = mask_blend_power
|
||||||
p.mask_blend_scale = mask_blend_scale
|
p.mask_blend_scale = mask_blend_scale
|
||||||
p.mask_blend_offset = mask_blend_offset
|
p.inpaint_detail_preservation = inpaint_detail_preservation
|
||||||
|
|
||||||
init_img = p.init_images[0]
|
init_img = p.init_images[0]
|
||||||
target_w = math.ceil((init_img.width + left + right) / 64) * 64
|
target_w = math.ceil((init_img.width + left + right) / 64) * 64
|
||||||
|
@ -22,22 +22,22 @@ class Script(scripts.Script):
|
|||||||
|
|
||||||
pixels = gr.Slider(label="Pixels to expand", minimum=8, maximum=256, step=8, value=128, elem_id=self.elem_id("pixels"))
|
pixels = gr.Slider(label="Pixels to expand", minimum=8, maximum=256, step=8, value=128, elem_id=self.elem_id("pixels"))
|
||||||
mask_blur = gr.Slider(label='Mask blur', minimum=0, maximum=64, step=1, value=4, elem_id=self.elem_id("mask_blur"))
|
mask_blur = gr.Slider(label='Mask blur', minimum=0, maximum=64, step=1, value=4, elem_id=self.elem_id("mask_blur"))
|
||||||
mask_blend_power = gr.Slider(label='Mask blend power', minimum=0, maximum=8, step=0.1, value=1, elem_id=self.elem_id("mask_blend_power"))
|
mask_blend_power = gr.Slider(label='Blending bias', minimum=0, maximum=8, step=0.1, value=1, elem_id=self.elem_id("mask_blend_power"))
|
||||||
mask_blend_scale = gr.Slider(label='Mask blend scale', minimum=0, maximum=8, step=0.1, value=1, elem_id=self.elem_id("mask_blend_scale"))
|
mask_blend_scale = gr.Slider(label='Blending preservation', minimum=0, maximum=8, step=0.1, value=1, elem_id=self.elem_id("mask_blend_scale"))
|
||||||
mask_blend_offset = gr.Slider(label='Mask blend offset', minimum=-4, maximum=4, step=0.1, value=0, elem_id=self.elem_id("mask_blend_offset"))
|
inpaint_detail_preservation = gr.Slider(label='Blending detail boost', minimum=1, maximum=32, step=0.5, value=16, elem_id=self.elem_id("inpaint_detail_preservation"))
|
||||||
inpainting_fill = gr.Radio(label='Masked content', choices=['fill', 'original', 'latent noise', 'latent nothing'], value='fill', type="index", elem_id=self.elem_id("inpainting_fill"))
|
inpainting_fill = gr.Radio(label='Masked content', choices=['fill', 'original', 'latent noise', 'latent nothing'], value='fill', type="index", elem_id=self.elem_id("inpainting_fill"))
|
||||||
direction = gr.CheckboxGroup(label="Outpainting direction", choices=['left', 'right', 'up', 'down'], value=['left', 'right', 'up', 'down'], elem_id=self.elem_id("direction"))
|
direction = gr.CheckboxGroup(label="Outpainting direction", choices=['left', 'right', 'up', 'down'], value=['left', 'right', 'up', 'down'], elem_id=self.elem_id("direction"))
|
||||||
|
|
||||||
return [pixels, mask_blur, mask_blend_power, mask_blend_scale, mask_blend_offset, inpainting_fill, direction]
|
return [pixels, mask_blur, mask_blend_power, mask_blend_scale, inpaint_detail_preservation, inpainting_fill, direction]
|
||||||
|
|
||||||
def run(self, p, pixels, mask_blur, mask_blend_power, mask_blend_scale, mask_blend_offset, inpainting_fill, direction):
|
def run(self, p, pixels, mask_blur, mask_blend_power, mask_blend_scale, inpaint_detail_preservation, inpainting_fill, direction):
|
||||||
initial_seed = None
|
initial_seed = None
|
||||||
initial_info = None
|
initial_info = None
|
||||||
|
|
||||||
p.mask_blur = mask_blur * 2
|
p.mask_blur = mask_blur * 2
|
||||||
p.mask_blend_power = mask_blend_power
|
p.mask_blend_power = mask_blend_power
|
||||||
p.mask_blend_scale = mask_blend_scale
|
p.mask_blend_scale = mask_blend_scale
|
||||||
p.mask_blend_offset = mask_blend_offset
|
p.inpaint_detail_preservation = inpaint_detail_preservation
|
||||||
|
|
||||||
p.inpainting_fill = inpainting_fill
|
p.inpainting_fill = inpainting_fill
|
||||||
p.inpaint_full_res = False
|
p.inpaint_full_res = False
|
||||||
|
@ -26,7 +26,7 @@ def simple_img2img_request(img2img_basic_image_base64):
|
|||||||
"mask_blur": 4,
|
"mask_blur": 4,
|
||||||
"mask_blend_power": 1,
|
"mask_blend_power": 1,
|
||||||
"mask_blend_scale": 1,
|
"mask_blend_scale": 1,
|
||||||
"mask_blend_offset": 0,
|
"inpaint_detail_preservation": 16,
|
||||||
"n_iter": 1,
|
"n_iter": 1,
|
||||||
"negative_prompt": "",
|
"negative_prompt": "",
|
||||||
"override_settings": {},
|
"override_settings": {},
|
||||||
|
Loading…
Reference in New Issue
Block a user