Commit c5c7fa06 authored by CodeHatchling's avatar CodeHatchling

Added slider for detail preservation strength, removed largely needless offset...

Added slider for detail preservation strength, removed largely needless offset parameter, changed labels in UI and for saving to/pasting data from PNG files.
parent debf836f
...@@ -134,7 +134,7 @@ def img2img(id_task: str, ...@@ -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, ...@@ -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, ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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: ...@@ -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(): ...@@ -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(): ...@@ -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(): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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": {},
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment