From 4e9e5a7ee7546947509c61df713189a524d27cf8 Mon Sep 17 00:00:00 2001 From: Danamir Date: Mon, 6 Feb 2023 10:47:21 +0100 Subject: [PATCH 1/6] Change tile size to width & height in USDUpscaler --- scripts/ultimate-upscale.py | 49 ++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/scripts/ultimate-upscale.py b/scripts/ultimate-upscale.py index ae4fd79..31c7d33 100644 --- a/scripts/ultimate-upscale.py +++ b/scripts/ultimate-upscale.py @@ -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 = 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 + self.redraw.tile_height = tile_height 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 + self.seams_fix.tile_height = tile_height 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 / tile_height) + self.cols = math.ceil(self.p.width / tile_width) + def get_factor(self, num): # Its just return, don't need elif if num == 1: @@ -117,7 +119,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 +148,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): @@ -423,7 +426,7 @@ class Script(scripts.Script): seams_fix_types = [ "None", - "Band pass", + "Band pass", "Half tile offset pass", "Half tile offset pass + intersections" ] @@ -433,7 +436,7 @@ class Script(scripts.Script): "Chess", "None" ] - + info = gr.HTML( "

Will upscale the image depending on the selected target size type

") @@ -451,7 +454,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=256, maximum=2048, step=64, label='Tile width', value=512) + tile_height = gr.Slider(minimum=256, maximum=2048, step=64, label='Tile height', value=512) 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("

Seams fix:

") @@ -497,12 +501,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_heiht, 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 +536,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_heiht) upscaler.upscale() # Drawing @@ -544,3 +548,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 "") + From 6514b80422fb19675dee833e037ec91d8cdd050c Mon Sep 17 00:00:00 2001 From: Danamir Date: Mon, 6 Feb 2023 10:48:39 +0100 Subject: [PATCH 2/6] Use tile width & height in band_pass_process --- scripts/ultimate-upscale.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/scripts/ultimate-upscale.py b/scripts/ultimate-upscale.py index 31c7d33..cd2daae 100644 --- a/scripts/ultimate-upscale.py +++ b/scripts/ultimate-upscale.py @@ -244,11 +244,11 @@ 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 @@ -257,7 +257,7 @@ class USDUSeamsFix(): row_gradient.paste(gradient.resize( (self.tile_size, self.tile_size//2), resample=Image.BICUBIC), (0, 0)) row_gradient.paste(gradient.rotate(180).resize( - (self.tile_size, self.tile_size//2), resample=Image.BICUBIC), + (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") col_gradient.paste(gradient.rotate(90).resize( @@ -346,7 +346,7 @@ class USDUSeamsFix(): return fixed_image def band_pass_process(self, p, image, cols, rows): - + self.init_draw(p) processed = None @@ -361,7 +361,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 @@ -369,14 +369,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 @@ -384,7 +384,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 From bfd34bd699d070e45c69e355a0b67ca732696dfa Mon Sep 17 00:00:00 2001 From: Danamir Date: Mon, 6 Feb 2023 11:03:47 +0100 Subject: [PATCH 3/6] Use tile width & height in half_tile_process --- scripts/ultimate-upscale.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/scripts/ultimate-upscale.py b/scripts/ultimate-upscale.py index cd2daae..b12e8da 100644 --- a/scripts/ultimate-upscale.py +++ b/scripts/ultimate-upscale.py @@ -253,17 +253,17 @@ class USDUSeamsFix(): 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 @@ -272,12 +272,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 @@ -289,12 +289,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 From 58fbb9987716c81c8629d1365bafbf22d06923a4 Mon Sep 17 00:00:00 2001 From: Danamir Date: Mon, 6 Feb 2023 11:10:41 +0100 Subject: [PATCH 4/6] Use tile width & height in half_tile_process_corners --- scripts/ultimate-upscale.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/ultimate-upscale.py b/scripts/ultimate-upscale.py index b12e8da..f5ea4d7 100644 --- a/scripts/ultimate-upscale.py +++ b/scripts/ultimate-upscale.py @@ -314,7 +314,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 @@ -324,13 +324,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 From 7ffeba134f6c2e70b46b9bfcb20bcfddc4d05936 Mon Sep 17 00:00:00 2001 From: Danamir Date: Mon, 6 Feb 2023 11:56:32 +0100 Subject: [PATCH 5/6] Use alternative tile dimension if 0 --- scripts/ultimate-upscale.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/scripts/ultimate-upscale.py b/scripts/ultimate-upscale.py index f5ea4d7..f5ab5c5 100644 --- a/scripts/ultimate-upscale.py +++ b/scripts/ultimate-upscale.py @@ -27,15 +27,15 @@ class USDUpscaler(): self.upscaler = shared.sd_upscalers[upscaler_index] self.redraw = USDURedraw() self.redraw.save = save_redraw - self.redraw.tile_width = tile_width - self.redraw.tile_height = tile_height + 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_width = tile_width - self.seams_fix.tile_height = tile_height + 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_height) - self.cols = math.ceil(self.p.width / tile_width) + self.rows = math.ceil(self.p.height / (tile_height if tile_height > 0 else tile_width)) + self.cols = math.ceil(self.p.width / (tile_width if tile_width > 0 else tile_height)) def get_factor(self, num): # Its just return, don't need elif @@ -112,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}") @@ -454,8 +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_width = gr.Slider(minimum=256, maximum=2048, step=64, label='Tile width', value=512) - tile_height = gr.Slider(minimum=256, maximum=2048, step=64, label='Tile height', 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("

Seams fix:

") From bd664197f57a67497d960ab924c0bf2522728eda Mon Sep 17 00:00:00 2001 From: Danamir Date: Mon, 6 Feb 2023 17:59:02 +0100 Subject: [PATCH 6/6] Corrections to tiles with & height code --- scripts/ultimate-upscale.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/ultimate-upscale.py b/scripts/ultimate-upscale.py index f5ab5c5..ba1082a 100644 --- a/scripts/ultimate-upscale.py +++ b/scripts/ultimate-upscale.py @@ -34,8 +34,8 @@ class USDUpscaler(): 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_height if tile_height > 0 else tile_width)) - self.cols = math.ceil(self.p.width / (tile_width if tile_width > 0 else tile_height)) + 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 @@ -506,7 +506,7 @@ class Script(scripts.Script): 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_width, tile_heiht, mask_blur, padding, seams_fix_width, seams_fix_denoise, seams_fix_padding, + 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): @@ -537,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_width, tile_heiht) + upscaler = USDUpscaler(p, init_img, upscaler_index, save_upscaled_image, save_seams_fix_image, tile_width, tile_height) upscaler.upscale() # Drawing