Merge pull request #132 from idrirap/dev/better_pixel_upscale

feat: allow to use both pixel upscale and hires generation steps fromlatent
This commit is contained in:
VALADI K JAGANATHAN
2024-03-25 19:09:31 +05:30
committed by GitHub
2 changed files with 70 additions and 1 deletions

View File

@@ -607,6 +607,19 @@ class TSC_KSampler:
store_ksampler_results("image", my_unique_id, images)
images = ImageUpscaleWithModel().upscale(pixel_upscale_model, images)[0]
images = ImageScaleBy().upscale(images, "nearest-exact", upscale_by/4)[0]
elif upscale_type == "both":
for _ in range(iterations):
if images is None:
images = vae_decode_latent(vae, samples, vae_decode)
store_ksampler_results("image", my_unique_id, images)
images = ImageUpscaleWithModel().upscale(pixel_upscale_model, images)[0]
images = ImageScaleBy().upscale(images, "nearest-exact", upscale_by/4)[0]
samples = vae_encode_image(vae, images, vae_decode)
upscaled_latent_image = latent_upscale_function().upscale(samples, latent_upscaler, 1)[0]
samples = KSampler().sample(latent_upscale_model, hires_seed, hires_steps, cfg, sampler_name, scheduler,
positive, negative, upscaled_latent_image, denoise=hires_denoise)[0]
images = None # set to None when samples is updated
# ------------------------------------------------------------------------------------------------------
# Check if "tile" exists in the script after main sampling has taken place
@@ -3999,7 +4012,7 @@ class TSC_HighRes_Fix:
@classmethod
def INPUT_TYPES(cls):
return {"required": {"upscale_type": (["latent","pixel"],),
return {"required": {"upscale_type": (["latent","pixel","both"],),
"hires_ckpt_name": (["(use same)"] + folder_paths.get_filename_list("checkpoints"),),
"latent_upscaler": (cls.latent_upscalers,),
"pixel_upscaler": (cls.pixel_upscalers,),
@@ -4099,6 +4112,17 @@ class TSC_HighRes_Fix:
elif upscale_type == "pixel":
pixel_upscale_model = UpscaleModelLoader().load_model(pixel_upscaler)[0]
elif upscale_type == "both":
latent_upscale_function = LatentUpscaleBy
latent_upscaler = self.default_latent_upscalers[0]
pixel_upscale_model = UpscaleModelLoader().load_model(pixel_upscaler)[0]
if hires_ckpt_name == "(use same)":
clear_cache(my_unique_id, 0, "ckpt")
else:
latent_upscale_model, _, _ = \
load_checkpoint(hires_ckpt_name, my_unique_id, output_vae=False, cache=1, cache_overwrite=True)
control_net = ControlNetLoader().load_controlnet(control_net_name)[0] if use_controlnet is True else None
# Construct the script output

View File

@@ -452,6 +452,51 @@ function handleHiResFixScript(node, widget) {
toggleWidget(node, findWidgetByName(node, 'preprocessor_imgs'));
toggleWidget(node, findWidgetByName(node, 'pixel_upscaler'), true);
} else if (findWidgetByName(node, 'upscale_type').value === "both") {
toggleWidget(node, findWidgetByName(node, 'pixel_upscaler'), true);
toggleWidget(node, findWidgetByName(node, 'hires_ckpt_name'), true);
toggleWidget(node, findWidgetByName(node, 'latent_upscaler'));
toggleWidget(node, findWidgetByName(node, 'use_same_seed'), true);
toggleWidget(node, findWidgetByName(node, 'hires_steps'), true);
toggleWidget(node, findWidgetByName(node, 'denoise'), true);
toggleWidget(node, findWidgetByName(node, 'iterations'), true);
ensureSeedControlExists(() => {
if (findWidgetByName(node, 'use_same_seed').value == true) {
toggleWidget(node, findWidgetByName(node, 'seed'));
toggleWidget(node, node.seedControl.lastSeedButton);
node.seedControl.lastSeedButton.disabled = true; // Disable the button
} else {
toggleWidget(node, findWidgetByName(node, 'seed'), true);
node.seedControl.lastSeedButton.disabled = false; // Enable the button
toggleWidget(node, node.seedControl.lastSeedButton, true);
}
});
if (findWidgetByName(node, 'use_controlnet').value == '_'){
toggleWidget(node, findWidgetByName(node, 'use_controlnet'));
toggleWidget(node, findWidgetByName(node, 'control_net_name'));
toggleWidget(node, findWidgetByName(node, 'strength'));
toggleWidget(node, findWidgetByName(node, 'preprocessor'));
toggleWidget(node, findWidgetByName(node, 'preprocessor_imgs'));
}
else{
toggleWidget(node, findWidgetByName(node, 'use_controlnet'), true);
if (findWidgetByName(node, 'use_controlnet').value == true){
toggleWidget(node, findWidgetByName(node, 'control_net_name'), true);
toggleWidget(node, findWidgetByName(node, 'strength'), true);
toggleWidget(node, findWidgetByName(node, 'preprocessor'), true);
toggleWidget(node, findWidgetByName(node, 'preprocessor_imgs'), true);
}
else{
toggleWidget(node, findWidgetByName(node, 'control_net_name'));
toggleWidget(node, findWidgetByName(node, 'strength'));
toggleWidget(node, findWidgetByName(node, 'preprocessor'));
toggleWidget(node, findWidgetByName(node, 'preprocessor_imgs'));
}
}
}
}