mirror of
https://github.com/Coyote-A/ultimate-upscale-for-automatic1111.git
synced 2026-01-26 19:29:51 +00:00
Merge pull request #32 from Danamir/tile-width-height
Tile width and height instead of a single dimension
This commit is contained in:
@@ -20,21 +20,23 @@ class USDUSFMode(Enum):
|
||||
|
||||
class USDUpscaler():
|
||||
|
||||
def __init__(self, p, image, upscaler_index:int, save_redraw, save_seams_fix, tile_size) -> None:
|
||||
def __init__(self, p, image, upscaler_index:int, save_redraw, save_seams_fix, tile_width, tile_height) -> None:
|
||||
self.p:StableDiffusionProcessing = p
|
||||
self.image:Image = image
|
||||
self.scale_factor = math.ceil(max(p.width, p.height) / max(image.width, image.height))
|
||||
self.upscaler = shared.sd_upscalers[upscaler_index]
|
||||
self.redraw = USDURedraw()
|
||||
self.redraw.save = save_redraw
|
||||
self.redraw.tile_size = tile_size
|
||||
self.redraw.tile_width = tile_width if tile_width > 0 else tile_height
|
||||
self.redraw.tile_height = tile_height if tile_height > 0 else tile_width
|
||||
self.seams_fix = USDUSeamsFix()
|
||||
self.seams_fix.save = save_seams_fix
|
||||
self.seams_fix.tile_size = tile_size
|
||||
self.seams_fix.tile_width = tile_width if tile_width > 0 else tile_height
|
||||
self.seams_fix.tile_height = tile_height if tile_height > 0 else tile_width
|
||||
self.initial_info = None
|
||||
self.rows = math.ceil(self.p.height / tile_size)
|
||||
self.cols = math.ceil(self.p.width / tile_size)
|
||||
|
||||
self.rows = math.ceil(self.p.height / self.redraw.tile_height)
|
||||
self.cols = math.ceil(self.p.width / self.redraw.tile_width)
|
||||
|
||||
def get_factor(self, num):
|
||||
# Its just return, don't need elif
|
||||
if num == 1:
|
||||
@@ -110,6 +112,7 @@ class USDUpscaler():
|
||||
state.job_count = redraw_job_count + seams_job_count
|
||||
|
||||
def print_info(self):
|
||||
print(f"Tile size: {self.redraw.tile_width}x{self.redraw.tile_height}")
|
||||
print(f"Tiles amount: {self.rows * self.cols}")
|
||||
print(f"Grid: {self.rows}x{self.cols}")
|
||||
print(f"Redraw enabled: {self.redraw.enabled}")
|
||||
@@ -117,7 +120,8 @@ class USDUpscaler():
|
||||
|
||||
def add_extra_info(self):
|
||||
self.p.extra_generation_params["Ultimate SD upscale upscaler"] = self.upscaler.name
|
||||
self.p.extra_generation_params["Ultimate SD upscale tile_size"] = self.redraw.tile_size
|
||||
self.p.extra_generation_params["Ultimate SD upscale tile_width"] = self.redraw.tile_width
|
||||
self.p.extra_generation_params["Ultimate SD upscale tile_height"] = self.redraw.tile_height
|
||||
self.p.extra_generation_params["Ultimate SD upscale mask_blur"] = self.p.mask_blur
|
||||
self.p.extra_generation_params["Ultimate SD upscale padding"] = self.redraw.padding
|
||||
|
||||
@@ -145,18 +149,18 @@ class USDURedraw():
|
||||
def init_draw(self, p, width, height):
|
||||
p.inpaint_full_res = True
|
||||
p.inpaint_full_res_padding = self.padding
|
||||
p.width = math.ceil((self.tile_size+self.padding) / 64) * 64
|
||||
p.height = math.ceil((self.tile_size+self.padding) / 64) * 64
|
||||
p.width = math.ceil((self.tile_width+self.padding) / 64) * 64
|
||||
p.height = math.ceil((self.tile_height+self.padding) / 64) * 64
|
||||
mask = Image.new("L", (width, height), "black")
|
||||
draw = ImageDraw.Draw(mask)
|
||||
return mask, draw
|
||||
|
||||
def calc_rectangle(self, xi, yi):
|
||||
x1 = xi * self.tile_size
|
||||
y1 = yi * self.tile_size
|
||||
x2 = xi * self.tile_size + self.tile_size
|
||||
y2 = yi * self.tile_size + self.tile_size
|
||||
|
||||
x1 = xi * self.tile_width
|
||||
y1 = yi * self.tile_height
|
||||
x2 = xi * self.tile_width + self.tile_width
|
||||
y2 = yi * self.tile_height + self.tile_height
|
||||
|
||||
return x1, y1, x2, y2
|
||||
|
||||
def linear_process(self, p, image, rows, cols):
|
||||
@@ -241,26 +245,26 @@ class USDUSeamsFix():
|
||||
|
||||
def init_draw(self, p):
|
||||
self.initial_info = None
|
||||
p.width = math.ceil((self.tile_size+self.padding) / 64) * 64
|
||||
p.height = math.ceil((self.tile_size+self.padding) / 64) * 64
|
||||
p.width = math.ceil((self.tile_width+self.padding) / 64) * 64
|
||||
p.height = math.ceil((self.tile_height+self.padding) / 64) * 64
|
||||
|
||||
def half_tile_process(self, p, image, rows, cols):
|
||||
|
||||
|
||||
self.init_draw(p)
|
||||
processed = None
|
||||
|
||||
gradient = Image.linear_gradient("L")
|
||||
row_gradient = Image.new("L", (self.tile_size, self.tile_size), "black")
|
||||
row_gradient = Image.new("L", (self.tile_width, self.tile_height), "black")
|
||||
row_gradient.paste(gradient.resize(
|
||||
(self.tile_size, self.tile_size//2), resample=Image.BICUBIC), (0, 0))
|
||||
(self.tile_width, self.tile_height//2), resample=Image.BICUBIC), (0, 0))
|
||||
row_gradient.paste(gradient.rotate(180).resize(
|
||||
(self.tile_size, self.tile_size//2), resample=Image.BICUBIC),
|
||||
(0, self.tile_size//2))
|
||||
col_gradient = Image.new("L", (self.tile_size, self.tile_size), "black")
|
||||
(self.tile_width, self.tile_height//2), resample=Image.BICUBIC),
|
||||
(0, self.tile_height//2))
|
||||
col_gradient = Image.new("L", (self.tile_width, self.tile_height), "black")
|
||||
col_gradient.paste(gradient.rotate(90).resize(
|
||||
(self.tile_size//2, self.tile_size), resample=Image.BICUBIC), (0, 0))
|
||||
(self.tile_width//2, self.tile_height), resample=Image.BICUBIC), (0, 0))
|
||||
col_gradient.paste(gradient.rotate(270).resize(
|
||||
(self.tile_size//2, self.tile_size), resample=Image.BICUBIC), (self.tile_size//2, 0))
|
||||
(self.tile_width//2, self.tile_height), resample=Image.BICUBIC), (self.tile_width//2, 0))
|
||||
|
||||
p.denoising_strength = self.denoise
|
||||
p.mask_blur = self.mask_blur
|
||||
@@ -269,12 +273,12 @@ class USDUSeamsFix():
|
||||
for xi in range(cols):
|
||||
if state.interrupted:
|
||||
break
|
||||
p.width = self.tile_size
|
||||
p.height = self.tile_size
|
||||
p.width = self.tile_width
|
||||
p.height = self.tile_height
|
||||
p.inpaint_full_res = True
|
||||
p.inpaint_full_res_padding = self.padding
|
||||
mask = Image.new("L", (image.width, image.height), "black")
|
||||
mask.paste(row_gradient, (xi*self.tile_size, yi*self.tile_size + self.tile_size//2))
|
||||
mask.paste(row_gradient, (xi*self.tile_width, yi*self.tile_height + self.tile_height//2))
|
||||
|
||||
p.init_images = [image]
|
||||
p.image_mask = mask
|
||||
@@ -286,12 +290,12 @@ class USDUSeamsFix():
|
||||
for xi in range(cols-1):
|
||||
if state.interrupted:
|
||||
break
|
||||
p.width = self.tile_size
|
||||
p.height = self.tile_size
|
||||
p.width = self.tile_width
|
||||
p.height = self.tile_height
|
||||
p.inpaint_full_res = True
|
||||
p.inpaint_full_res_padding = self.padding
|
||||
mask = Image.new("L", (image.width, image.height), "black")
|
||||
mask.paste(col_gradient, (xi*self.tile_size+self.tile_size//2, yi*self.tile_size))
|
||||
mask.paste(col_gradient, (xi*self.tile_width+self.tile_width//2, yi*self.tile_height))
|
||||
|
||||
p.init_images = [image]
|
||||
p.image_mask = mask
|
||||
@@ -311,7 +315,7 @@ class USDUSeamsFix():
|
||||
processed = None
|
||||
self.init_draw(p)
|
||||
gradient = Image.radial_gradient("L").resize(
|
||||
(self.tile_size, self.tile_size), resample=Image.BICUBIC)
|
||||
(self.tile_width, self.tile_height), resample=Image.BICUBIC)
|
||||
gradient = ImageOps.invert(gradient)
|
||||
p.denoising_strength = self.denoise
|
||||
#p.mask_blur = 0
|
||||
@@ -321,13 +325,13 @@ class USDUSeamsFix():
|
||||
for xi in range(cols-1):
|
||||
if state.interrupted:
|
||||
break
|
||||
p.width = self.tile_size
|
||||
p.height = self.tile_size
|
||||
p.width = self.tile_width
|
||||
p.height = self.tile_height
|
||||
p.inpaint_full_res = True
|
||||
p.inpaint_full_res_padding = 0
|
||||
mask = Image.new("L", (fixed_image.width, fixed_image.height), "black")
|
||||
mask.paste(gradient, (xi*self.tile_size + self.tile_size//2,
|
||||
yi*self.tile_size + self.tile_size//2))
|
||||
mask.paste(gradient, (xi*self.tile_width + self.tile_width//2,
|
||||
yi*self.tile_height + self.tile_height//2))
|
||||
|
||||
p.init_images = [fixed_image]
|
||||
p.image_mask = mask
|
||||
@@ -343,7 +347,7 @@ class USDUSeamsFix():
|
||||
return fixed_image
|
||||
|
||||
def band_pass_process(self, p, image, cols, rows):
|
||||
|
||||
|
||||
self.init_draw(p)
|
||||
processed = None
|
||||
|
||||
@@ -358,7 +362,7 @@ class USDUSeamsFix():
|
||||
row_gradient = mirror_gradient.resize((image.width, self.width), resample=Image.BICUBIC)
|
||||
col_gradient = mirror_gradient.rotate(90).resize((self.width, image.height), resample=Image.BICUBIC)
|
||||
|
||||
for xi in range(1, cols):
|
||||
for xi in range(1, rows):
|
||||
if state.interrupted:
|
||||
break
|
||||
p.width = self.width + self.padding * 2
|
||||
@@ -366,14 +370,14 @@ class USDUSeamsFix():
|
||||
p.inpaint_full_res = True
|
||||
p.inpaint_full_res_padding = self.padding
|
||||
mask = Image.new("L", (image.width, image.height), "black")
|
||||
mask.paste(col_gradient, (xi * self.tile_size - self.width // 2, 0))
|
||||
mask.paste(col_gradient, (xi * self.tile_width - self.width // 2, 0))
|
||||
|
||||
p.init_images = [image]
|
||||
p.image_mask = mask
|
||||
processed = processing.process_images(p)
|
||||
if (len(processed.images) > 0):
|
||||
image = processed.images[0]
|
||||
for yi in range(1, rows):
|
||||
for yi in range(1, cols):
|
||||
if state.interrupted:
|
||||
break
|
||||
p.width = image.width
|
||||
@@ -381,7 +385,7 @@ class USDUSeamsFix():
|
||||
p.inpaint_full_res = True
|
||||
p.inpaint_full_res_padding = self.padding
|
||||
mask = Image.new("L", (image.width, image.height), "black")
|
||||
mask.paste(row_gradient, (0, yi * self.tile_size - self.width // 2))
|
||||
mask.paste(row_gradient, (0, yi * self.tile_height - self.width // 2))
|
||||
|
||||
p.init_images = [image]
|
||||
p.image_mask = mask
|
||||
@@ -423,7 +427,7 @@ class Script(scripts.Script):
|
||||
|
||||
seams_fix_types = [
|
||||
"None",
|
||||
"Band pass",
|
||||
"Band pass",
|
||||
"Half tile offset pass",
|
||||
"Half tile offset pass + intersections"
|
||||
]
|
||||
@@ -433,7 +437,7 @@ class Script(scripts.Script):
|
||||
"Chess",
|
||||
"None"
|
||||
]
|
||||
|
||||
|
||||
info = gr.HTML(
|
||||
"<p style=\"margin-bottom:0.75em\">Will upscale the image depending on the selected target size type</p>")
|
||||
|
||||
@@ -451,7 +455,8 @@ class Script(scripts.Script):
|
||||
value=shared.sd_upscalers[0].name, type="index")
|
||||
with gr.Row():
|
||||
redraw_mode = gr.Dropdown(label="Type", choices=[k for k in redrow_modes], type="index", value=next(iter(redrow_modes)))
|
||||
tile_size = gr.Slider(minimum=256, maximum=2048, step=64, label='Tile size', value=512)
|
||||
tile_width = gr.Slider(minimum=0, maximum=2048, step=64, label='Tile width', value=512)
|
||||
tile_height = gr.Slider(minimum=0, maximum=2048, step=64, label='Tile height', value=0)
|
||||
mask_blur = gr.Slider(label='Mask blur', minimum=0, maximum=64, step=1, value=8)
|
||||
padding = gr.Slider(label='Padding', minimum=0, maximum=128, step=1, value=32)
|
||||
gr.HTML("<p style=\"margin-bottom:0.75em\">Seams fix:</p>")
|
||||
@@ -497,12 +502,12 @@ class Script(scripts.Script):
|
||||
outputs=[custom_width, custom_height, custom_scale]
|
||||
)
|
||||
|
||||
return [info, tile_size, mask_blur, padding, seams_fix_width, seams_fix_denoise, seams_fix_padding,
|
||||
upscaler_index, save_upscaled_image, redraw_mode, save_seams_fix_image, seams_fix_mask_blur,
|
||||
return [info, tile_width, tile_height, mask_blur, padding, seams_fix_width, seams_fix_denoise, seams_fix_padding,
|
||||
upscaler_index, save_upscaled_image, redraw_mode, save_seams_fix_image, seams_fix_mask_blur,
|
||||
seams_fix_type, target_size_type, custom_width, custom_height, custom_scale]
|
||||
|
||||
def run(self, p, _, tile_size, mask_blur, padding, seams_fix_width, seams_fix_denoise, seams_fix_padding,
|
||||
upscaler_index, save_upscaled_image, redraw_mode, save_seams_fix_image, seams_fix_mask_blur,
|
||||
def run(self, p, _, tile_width, tile_height, mask_blur, padding, seams_fix_width, seams_fix_denoise, seams_fix_padding,
|
||||
upscaler_index, save_upscaled_image, redraw_mode, save_seams_fix_image, seams_fix_mask_blur,
|
||||
seams_fix_type, target_size_type, custom_width, custom_height, custom_scale):
|
||||
|
||||
# Init
|
||||
@@ -532,7 +537,7 @@ class Script(scripts.Script):
|
||||
p.height = math.ceil((init_img.height * custom_scale) / 64) * 64
|
||||
|
||||
# Upscaling
|
||||
upscaler = USDUpscaler(p, init_img, upscaler_index, save_upscaled_image, save_seams_fix_image, tile_size)
|
||||
upscaler = USDUpscaler(p, init_img, upscaler_index, save_upscaled_image, save_seams_fix_image, tile_width, tile_height)
|
||||
upscaler.upscale()
|
||||
|
||||
# Drawing
|
||||
@@ -544,3 +549,4 @@ class Script(scripts.Script):
|
||||
result_images = upscaler.result_images
|
||||
|
||||
return Processed(p, result_images, seed, upscaler.initial_info if upscaler.initial_info is not None else "")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user