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,
mask_alpha: float,
mask_blend_power: float,
mask_blend_scale: float,
mask_blend_offset: float,
inpaint_detail_preservation: float,
inpainting_fill: int,
n_iter: int,
batch_size: int,
......@@ -216,7 +216,7 @@ def img2img(id_task: str,
mask_blur=mask_blur,
mask_blend_power=mask_blend_power,
mask_blend_scale=mask_blend_scale,
mask_blend_offset=mask_blend_offset,
inpaint_detail_preservation=inpaint_detail_preservation,
inpainting_fill=inpainting_fill,
resize_mode=resize_mode,
denoising_strength=denoising_strength,
......@@ -237,9 +237,9 @@ def img2img(id_task: str,
if mask:
p.extra_generation_params["Mask blur"] = mask_blur
p.extra_generation_params["Mask blend power"] = mask_blend_power
p.extra_generation_params["Mask blend scale"] = mask_blend_scale
p.extra_generation_params["Mask blend offset"] = mask_blend_offset
p.extra_generation_params["Mask blending bias"] = mask_blend_power
p.extra_generation_params["Mask blending preservation"] = mask_blend_scale
p.extra_generation_params["Mask blending detail boost"] = inpaint_detail_preservation
with closing(p):
if is_batch:
......
......@@ -1351,7 +1351,7 @@ class StableDiffusionProcessingImg2Img(StableDiffusionProcessing):
mask_blur: int = None
mask_blend_power: float = 1
mask_blend_scale: float = 1
mask_blend_offset: float = 0
inpaint_detail_preservation: float = 16
inpainting_fill: int = 0
inpaint_full_res: bool = True
inpaint_full_res_padding: int = 0
......
......@@ -45,7 +45,7 @@ class CFGDenoiser(torch.nn.Module):
self.nmask = None
self.mask_blend_power = 1
self.mask_blend_scale = 1
self.mask_blend_offset = 0
self.inpaint_detail_preservation = 16
self.init_latent = None
self.steps = None
"""number of steps as specified by user in UI"""
......@@ -105,14 +105,13 @@ class CFGDenoiser(torch.nn.Module):
# Record the original latent vector magnitudes.
# 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.
detail_preservation = 32
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) ** detail_preservation
a_magnitude = torch.norm(a, p=2, dim=1).to(torch.float64) ** self.inpaint_detail_preservation
b_magnitude = torch.norm(b, p=2, dim=1).to(torch.float64) ** self.inpaint_detail_preservation
one_minus_t = 1 - t
# 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.
image_interp = a * one_minus_t + b * t
......@@ -142,7 +141,7 @@ class CFGDenoiser(torch.nn.Module):
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:
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.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_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.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)
......
......@@ -732,9 +732,9 @@ def create_ui():
with FormRow():
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_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_scale = gr.Slider(label='Mask blend scale', minimum=0, maximum=8, step=0.1, 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")
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='Blending preservation', minimum=0, maximum=8, step=0.05, value=1, elem_id="img2img_mask_blend_scale")
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():
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_blend_power,
mask_blend_scale,
mask_blend_offset,
inpaint_detail_preservation,
inpainting_fill,
batch_count,
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()),
(denoising_strength, "Denoising strength"),
(mask_blur, "Mask blur"),
(mask_blend_power, "Mask blend power"),
(mask_blend_scale, "Mask blend scale"),
(mask_blend_offset, "Mask blend offset"),
(mask_blend_power, "Mask blending bias"),
(mask_blend_scale, "Mask blending preservation"),
(inpaint_detail_preservation, "Mask blending detail boost"),
*scripts.scripts_img2img.infotext_fields
]
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"))
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_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_offset = gr.Slider(label='Mask blend scale', minimum=-4, maximum=4, step=0.1, value=1, elem_id=self.elem_id("mask_blend_offset"))
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='Blending preservation', minimum=0, maximum=8, step=0.1, value=1, elem_id=self.elem_id("mask_blend_scale"))
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"))
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"))
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]
process_width = p.width
......@@ -172,7 +172,7 @@ class Script(scripts.Script):
p.mask_blur_y = mask_blur_y*4
p.mask_blend_power = mask_blend_power
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]
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"))
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_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_offset = gr.Slider(label='Mask blend offset', minimum=-4, maximum=4, step=0.1, value=0, elem_id=self.elem_id("mask_blend_offset"))
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='Blending preservation', minimum=0, maximum=8, step=0.1, value=1, elem_id=self.elem_id("mask_blend_scale"))
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"))
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_info = None
p.mask_blur = mask_blur * 2
p.mask_blend_power = mask_blend_power
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.inpaint_full_res = False
......
......@@ -26,7 +26,7 @@ def simple_img2img_request(img2img_basic_image_base64):
"mask_blur": 4,
"mask_blend_power": 1,
"mask_blend_scale": 1,
"mask_blend_offset": 0,
"inpaint_detail_preservation": 16,
"n_iter": 1,
"negative_prompt": "",
"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