add an option to use old hiresfix width/height behavior
add a visual effect to inactive hires fix elements
This commit is contained in:
parent
8850fc23b6
commit
d4fd2418ef
25
javascript/hires_fix.js
Normal file
25
javascript/hires_fix.js
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
|
||||||
|
function setInactive(elem, inactive){
|
||||||
|
console.log(elem)
|
||||||
|
if(inactive){
|
||||||
|
elem.classList.add('inactive')
|
||||||
|
} else{
|
||||||
|
elem.classList.remove('inactive')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function onCalcResolutionHires(enable, width, height, hr_scale, hr_resize_x, hr_resize_y){
|
||||||
|
console.log(enable, width, height, hr_scale, hr_resize_x, hr_resize_y)
|
||||||
|
|
||||||
|
hrUpscaleBy = gradioApp().getElementById('txt2img_hr_scale')
|
||||||
|
hrResizeX = gradioApp().getElementById('txt2img_hr_resize_x')
|
||||||
|
hrResizeY = gradioApp().getElementById('txt2img_hr_resize_y')
|
||||||
|
|
||||||
|
gradioApp().getElementById('txt2img_hires_fix_row2').style.display = opts.use_old_hires_fix_width_height ? "none" : ""
|
||||||
|
|
||||||
|
setInactive(hrUpscaleBy, opts.use_old_hires_fix_width_height || hr_resize_x > 0 || hr_resize_y > 0)
|
||||||
|
setInactive(hrResizeX, opts.use_old_hires_fix_width_height || hr_resize_x == 0)
|
||||||
|
setInactive(hrResizeY, opts.use_old_hires_fix_width_height || hr_resize_y == 0)
|
||||||
|
|
||||||
|
return [enable, width, height, hr_scale, hr_resize_x, hr_resize_y]
|
||||||
|
}
|
|
@ -197,6 +197,15 @@ def restore_old_hires_fix_params(res):
|
||||||
firstpass_width = res.get('First pass size-1', None)
|
firstpass_width = res.get('First pass size-1', None)
|
||||||
firstpass_height = res.get('First pass size-2', None)
|
firstpass_height = res.get('First pass size-2', None)
|
||||||
|
|
||||||
|
if shared.opts.use_old_hires_fix_width_height:
|
||||||
|
hires_width = int(res.get("Hires resize-1", None))
|
||||||
|
hires_height = int(res.get("Hires resize-2", None))
|
||||||
|
|
||||||
|
if hires_width is not None and hires_height is not None:
|
||||||
|
res['Size-1'] = hires_width
|
||||||
|
res['Size-2'] = hires_height
|
||||||
|
return
|
||||||
|
|
||||||
if firstpass_width is None or firstpass_height is None:
|
if firstpass_width is None or firstpass_height is None:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -205,12 +214,8 @@ def restore_old_hires_fix_params(res):
|
||||||
height = int(res.get("Size-2", 512))
|
height = int(res.get("Size-2", 512))
|
||||||
|
|
||||||
if firstpass_width == 0 or firstpass_height == 0:
|
if firstpass_width == 0 or firstpass_height == 0:
|
||||||
# old algorithm for auto-calculating first pass size
|
from modules import processing
|
||||||
desired_pixel_count = 512 * 512
|
firstpass_width, firstpass_height = processing.old_hires_fix_first_pass_dimensions(width, height)
|
||||||
actual_pixel_count = width * height
|
|
||||||
scale = math.sqrt(desired_pixel_count / actual_pixel_count)
|
|
||||||
firstpass_width = math.ceil(scale * width / 64) * 64
|
|
||||||
firstpass_height = math.ceil(scale * height / 64) * 64
|
|
||||||
|
|
||||||
res['Size-1'] = firstpass_width
|
res['Size-1'] = firstpass_width
|
||||||
res['Size-2'] = firstpass_height
|
res['Size-2'] = firstpass_height
|
||||||
|
|
|
@ -687,6 +687,18 @@ def process_images_inner(p: StableDiffusionProcessing) -> Processed:
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
def old_hires_fix_first_pass_dimensions(width, height):
|
||||||
|
"""old algorithm for auto-calculating first pass size"""
|
||||||
|
|
||||||
|
desired_pixel_count = 512 * 512
|
||||||
|
actual_pixel_count = width * height
|
||||||
|
scale = math.sqrt(desired_pixel_count / actual_pixel_count)
|
||||||
|
width = math.ceil(scale * width / 64) * 64
|
||||||
|
height = math.ceil(scale * height / 64) * 64
|
||||||
|
|
||||||
|
return width, height
|
||||||
|
|
||||||
|
|
||||||
class StableDiffusionProcessingTxt2Img(StableDiffusionProcessing):
|
class StableDiffusionProcessingTxt2Img(StableDiffusionProcessing):
|
||||||
sampler = None
|
sampler = None
|
||||||
|
|
||||||
|
@ -703,16 +715,26 @@ class StableDiffusionProcessingTxt2Img(StableDiffusionProcessing):
|
||||||
self.hr_upscale_to_y = hr_resize_y
|
self.hr_upscale_to_y = hr_resize_y
|
||||||
|
|
||||||
if firstphase_width != 0 or firstphase_height != 0:
|
if firstphase_width != 0 or firstphase_height != 0:
|
||||||
print("firstphase_width/firstphase_height no longer supported; use hr_scale", file=sys.stderr)
|
self.hr_upscale_to_x = self.width
|
||||||
self.hr_scale = self.width / firstphase_width
|
self.hr_upscale_to_y = self.height
|
||||||
self.width = firstphase_width
|
self.width = firstphase_width
|
||||||
self.height = firstphase_height
|
self.height = firstphase_height
|
||||||
|
|
||||||
self.truncate_x = 0
|
self.truncate_x = 0
|
||||||
self.truncate_y = 0
|
self.truncate_y = 0
|
||||||
|
self.applied_old_hires_behavior_to = None
|
||||||
|
|
||||||
def init(self, all_prompts, all_seeds, all_subseeds):
|
def init(self, all_prompts, all_seeds, all_subseeds):
|
||||||
if self.enable_hr:
|
if self.enable_hr:
|
||||||
|
if opts.use_old_hires_fix_width_height and self.applied_old_hires_behavior_to != (self.width, self.height):
|
||||||
|
self.hr_resize_x = self.width
|
||||||
|
self.hr_resize_y = self.height
|
||||||
|
self.hr_upscale_to_x = self.width
|
||||||
|
self.hr_upscale_to_y = self.height
|
||||||
|
|
||||||
|
self.width, self.height = old_hires_fix_first_pass_dimensions(self.width, self.height)
|
||||||
|
self.applied_old_hires_behavior_to = (self.width, self.height)
|
||||||
|
|
||||||
if self.hr_resize_x == 0 and self.hr_resize_y == 0:
|
if self.hr_resize_x == 0 and self.hr_resize_y == 0:
|
||||||
self.extra_generation_params["Hires upscale"] = self.hr_scale
|
self.extra_generation_params["Hires upscale"] = self.hr_scale
|
||||||
self.hr_upscale_to_x = int(self.width * self.hr_scale)
|
self.hr_upscale_to_x = int(self.width * self.hr_scale)
|
||||||
|
|
|
@ -398,6 +398,7 @@ options_templates.update(options_section(('sd', "Stable Diffusion"), {
|
||||||
options_templates.update(options_section(('compatibility', "Compatibility"), {
|
options_templates.update(options_section(('compatibility', "Compatibility"), {
|
||||||
"use_old_emphasis_implementation": OptionInfo(False, "Use old emphasis implementation. Can be useful to reproduce old seeds."),
|
"use_old_emphasis_implementation": OptionInfo(False, "Use old emphasis implementation. Can be useful to reproduce old seeds."),
|
||||||
"use_old_karras_scheduler_sigmas": OptionInfo(False, "Use old karras scheduler sigmas (0.1 to 10)."),
|
"use_old_karras_scheduler_sigmas": OptionInfo(False, "Use old karras scheduler sigmas (0.1 to 10)."),
|
||||||
|
"use_old_hires_fix_width_height": OptionInfo(False, "For hires fix, use width/height sliders to set final resolution rather than first pass (disables Upscale by, Resize width/height to)."),
|
||||||
}))
|
}))
|
||||||
|
|
||||||
options_templates.update(options_section(('interrogate', "Interrogate Options"), {
|
options_templates.update(options_section(('interrogate', "Interrogate Options"), {
|
||||||
|
|
|
@ -267,7 +267,7 @@ def calc_resolution_hires(enable, width, height, hr_scale, hr_resize_x, hr_resiz
|
||||||
with devices.autocast():
|
with devices.autocast():
|
||||||
p.init([""], [0], [0])
|
p.init([""], [0], [0])
|
||||||
|
|
||||||
return f"resize: from <span class='resolution'>{width}x{height}</span> to <span class='resolution'>{p.hr_upscale_to_x}x{p.hr_upscale_to_y}</span>"
|
return f"resize: from <span class='resolution'>{p.width}x{p.height}</span> to <span class='resolution'>{p.hr_resize_x or p.hr_upscale_to_x}x{p.hr_resize_y or p.hr_upscale_to_y}</span>"
|
||||||
|
|
||||||
|
|
||||||
def apply_styles(prompt, prompt_neg, style1_name, style2_name):
|
def apply_styles(prompt, prompt_neg, style1_name, style2_name):
|
||||||
|
@ -745,15 +745,20 @@ def create_ui():
|
||||||
custom_inputs = modules.scripts.scripts_txt2img.setup_ui()
|
custom_inputs = modules.scripts.scripts_txt2img.setup_ui()
|
||||||
|
|
||||||
hr_resolution_preview_inputs = [enable_hr, width, height, hr_scale, hr_resize_x, hr_resize_y]
|
hr_resolution_preview_inputs = [enable_hr, width, height, hr_scale, hr_resize_x, hr_resize_y]
|
||||||
hr_resolution_preview_args = dict(
|
|
||||||
fn=calc_resolution_hires,
|
|
||||||
inputs=hr_resolution_preview_inputs,
|
|
||||||
outputs=[hr_final_resolution],
|
|
||||||
show_progress=False
|
|
||||||
)
|
|
||||||
|
|
||||||
for input in hr_resolution_preview_inputs:
|
for input in hr_resolution_preview_inputs:
|
||||||
input.change(**hr_resolution_preview_args)
|
input.change(
|
||||||
|
fn=calc_resolution_hires,
|
||||||
|
inputs=hr_resolution_preview_inputs,
|
||||||
|
outputs=[hr_final_resolution],
|
||||||
|
show_progress=False,
|
||||||
|
)
|
||||||
|
input.change(
|
||||||
|
None,
|
||||||
|
_js="onCalcResolutionHires",
|
||||||
|
inputs=hr_resolution_preview_inputs,
|
||||||
|
outputs=[],
|
||||||
|
show_progress=False,
|
||||||
|
)
|
||||||
|
|
||||||
txt2img_gallery, generation_info, html_info, html_log = create_output_panel("txt2img", opts.outdir_txt2img_samples)
|
txt2img_gallery, generation_info, html_info, html_log = create_output_panel("txt2img", opts.outdir_txt2img_samples)
|
||||||
parameters_copypaste.bind_buttons({"txt2img": txt2img_paste}, None, txt2img_prompt)
|
parameters_copypaste.bind_buttons({"txt2img": txt2img_paste}, None, txt2img_prompt)
|
||||||
|
|
|
@ -670,6 +670,10 @@ footer {
|
||||||
min-width: auto;
|
min-width: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.inactive{
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
/* The following handles localization for right-to-left (RTL) languages like Arabic.
|
/* The following handles localization for right-to-left (RTL) languages like Arabic.
|
||||||
The rtl media type will only be activated by the logic in javascript/localization.js.
|
The rtl media type will only be activated by the logic in javascript/localization.js.
|
||||||
If you change anything above, you need to make sure it is RTL compliant by just running
|
If you change anything above, you need to make sure it is RTL compliant by just running
|
||||||
|
|
Loading…
Reference in New Issue
Block a user