remove scale latent and no-crop options from hires fix
support copy-pasting new parameters for hires fix
This commit is contained in:
parent
b382de2d77
commit
e644b5a80b
@ -506,14 +506,12 @@ class StableDiffusionProcessingTxt2Img(StableDiffusionProcessing):
|
|||||||
firstphase_width_truncated = 0
|
firstphase_width_truncated = 0
|
||||||
firstphase_height_truncated = 0
|
firstphase_height_truncated = 0
|
||||||
|
|
||||||
def __init__(self, enable_hr=False, scale_latent=True, denoising_strength=0.75, firstphase_width=512, firstphase_height=512, crop_scale=False, **kwargs):
|
def __init__(self, enable_hr=False, denoising_strength=0.75, firstphase_width=512, firstphase_height=512, **kwargs):
|
||||||
super().__init__(**kwargs)
|
super().__init__(**kwargs)
|
||||||
self.enable_hr = enable_hr
|
self.enable_hr = enable_hr
|
||||||
self.scale_latent = scale_latent
|
|
||||||
self.denoising_strength = denoising_strength
|
self.denoising_strength = denoising_strength
|
||||||
self.firstphase_width = firstphase_width
|
self.firstphase_width = firstphase_width
|
||||||
self.firstphase_height = firstphase_height
|
self.firstphase_height = firstphase_height
|
||||||
self.crop_scale = crop_scale
|
|
||||||
|
|
||||||
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:
|
||||||
@ -530,6 +528,8 @@ class StableDiffusionProcessingTxt2Img(StableDiffusionProcessing):
|
|||||||
samples = self.sampler.sample(self, x, conditioning, unconditional_conditioning)
|
samples = self.sampler.sample(self, x, conditioning, unconditional_conditioning)
|
||||||
return samples
|
return samples
|
||||||
|
|
||||||
|
self.extra_generation_params["First pass size"] = f"{self.firstphase_width}x{self.firstphase_height}"
|
||||||
|
|
||||||
x = create_random_tensors([opt_C, self.firstphase_height // opt_f, self.firstphase_width // opt_f], seeds=seeds, subseeds=subseeds, subseed_strength=self.subseed_strength, seed_resize_from_h=self.seed_resize_from_h, seed_resize_from_w=self.seed_resize_from_w, p=self)
|
x = create_random_tensors([opt_C, self.firstphase_height // opt_f, self.firstphase_width // opt_f], seeds=seeds, subseeds=subseeds, subseed_strength=self.subseed_strength, seed_resize_from_h=self.seed_resize_from_h, seed_resize_from_w=self.seed_resize_from_w, p=self)
|
||||||
samples = self.sampler.sample(self, x, conditioning, unconditional_conditioning)
|
samples = self.sampler.sample(self, x, conditioning, unconditional_conditioning)
|
||||||
|
|
||||||
@ -538,46 +538,36 @@ class StableDiffusionProcessingTxt2Img(StableDiffusionProcessing):
|
|||||||
width_ratio = self.width/self.firstphase_width
|
width_ratio = self.width/self.firstphase_width
|
||||||
height_ratio = self.height/self.firstphase_height
|
height_ratio = self.height/self.firstphase_height
|
||||||
|
|
||||||
if self.crop_scale:
|
if width_ratio > height_ratio:
|
||||||
if width_ratio > height_ratio:
|
truncate_y = int((self.width - self.firstphase_width) / width_ratio / height_ratio / opt_f)
|
||||||
#Crop to landscape
|
|
||||||
truncate_y = int((self.width - self.firstphase_width) / width_ratio / height_ratio / opt_f)
|
|
||||||
|
|
||||||
elif width_ratio < height_ratio:
|
elif width_ratio < height_ratio:
|
||||||
#Crop to portrait
|
truncate_x = int((self.height - self.firstphase_height) / width_ratio / height_ratio / opt_f)
|
||||||
truncate_x = int((self.height - self.firstphase_height) / width_ratio / height_ratio / opt_f)
|
|
||||||
|
|
||||||
samples = samples[:, :, truncate_y//2:samples.shape[2]-truncate_y//2, truncate_x//2:samples.shape[3]-truncate_x//2]
|
samples = samples[:, :, truncate_y//2:samples.shape[2]-truncate_y//2, truncate_x//2:samples.shape[3]-truncate_x//2]
|
||||||
|
|
||||||
|
decoded_samples = decode_first_stage(self.sd_model, samples)
|
||||||
|
|
||||||
|
if opts.upscaler_for_img2img is None or opts.upscaler_for_img2img == "None":
|
||||||
|
decoded_samples = torch.nn.functional.interpolate(decoded_samples, size=(self.height, self.width), mode="bilinear")
|
||||||
if self.scale_latent:
|
|
||||||
samples = torch.nn.functional.interpolate(samples, size=(self.height // opt_f, self.width // opt_f), mode="bilinear")
|
|
||||||
else:
|
else:
|
||||||
decoded_samples = decode_first_stage(self.sd_model, samples)
|
lowres_samples = torch.clamp((decoded_samples + 1.0) / 2.0, min=0.0, max=1.0)
|
||||||
|
|
||||||
if opts.upscaler_for_img2img is None or opts.upscaler_for_img2img == "None":
|
batch_images = []
|
||||||
decoded_samples = torch.nn.functional.interpolate(decoded_samples, size=(self.height, self.width), mode="bilinear")
|
for i, x_sample in enumerate(lowres_samples):
|
||||||
else:
|
x_sample = 255. * np.moveaxis(x_sample.cpu().numpy(), 0, 2)
|
||||||
lowres_samples = torch.clamp((decoded_samples + 1.0) / 2.0, min=0.0, max=1.0)
|
x_sample = x_sample.astype(np.uint8)
|
||||||
|
image = Image.fromarray(x_sample)
|
||||||
|
image = images.resize_image(0, image, self.width, self.height)
|
||||||
|
image = np.array(image).astype(np.float32) / 255.0
|
||||||
|
image = np.moveaxis(image, 2, 0)
|
||||||
|
batch_images.append(image)
|
||||||
|
|
||||||
batch_images = []
|
decoded_samples = torch.from_numpy(np.array(batch_images))
|
||||||
for i, x_sample in enumerate(lowres_samples):
|
decoded_samples = decoded_samples.to(shared.device)
|
||||||
x_sample = 255. * np.moveaxis(x_sample.cpu().numpy(), 0, 2)
|
decoded_samples = 2. * decoded_samples - 1.
|
||||||
x_sample = x_sample.astype(np.uint8)
|
|
||||||
image = Image.fromarray(x_sample)
|
|
||||||
image = images.resize_image(0, image, self.width, self.height)
|
|
||||||
image = np.array(image).astype(np.float32) / 255.0
|
|
||||||
image = np.moveaxis(image, 2, 0)
|
|
||||||
batch_images.append(image)
|
|
||||||
|
|
||||||
decoded_samples = torch.from_numpy(np.array(batch_images))
|
samples = self.sd_model.get_first_stage_encoding(self.sd_model.encode_first_stage(decoded_samples))
|
||||||
decoded_samples = decoded_samples.to(shared.device)
|
|
||||||
decoded_samples = 2. * decoded_samples - 1.
|
|
||||||
|
|
||||||
samples = self.sd_model.get_first_stage_encoding(self.sd_model.encode_first_stage(decoded_samples))
|
|
||||||
|
|
||||||
shared.state.nextjob()
|
shared.state.nextjob()
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ import modules.processing as processing
|
|||||||
from modules.ui import plaintext_to_html
|
from modules.ui import plaintext_to_html
|
||||||
|
|
||||||
|
|
||||||
def txt2img(prompt: str, negative_prompt: str, prompt_style: str, prompt_style2: str, steps: int, sampler_index: int, restore_faces: bool, tiling: bool, n_iter: int, batch_size: int, cfg_scale: float, seed: int, subseed: int, subseed_strength: float, seed_resize_from_h: int, seed_resize_from_w: int, seed_enable_extras: bool, height: int, width: int, enable_hr: bool, scale_latent: bool, denoising_strength: float, firstphase_width: int, firstphase_height: int, crop_scale: bool, *args):
|
def txt2img(prompt: str, negative_prompt: str, prompt_style: str, prompt_style2: str, steps: int, sampler_index: int, restore_faces: bool, tiling: bool, n_iter: int, batch_size: int, cfg_scale: float, seed: int, subseed: int, subseed_strength: float, seed_resize_from_h: int, seed_resize_from_w: int, seed_enable_extras: bool, height: int, width: int, enable_hr: bool, denoising_strength: float, firstphase_width: int, firstphase_height: int, *args):
|
||||||
p = StableDiffusionProcessingTxt2Img(
|
p = StableDiffusionProcessingTxt2Img(
|
||||||
sd_model=shared.sd_model,
|
sd_model=shared.sd_model,
|
||||||
outpath_samples=opts.outdir_samples or opts.outdir_txt2img_samples,
|
outpath_samples=opts.outdir_samples or opts.outdir_txt2img_samples,
|
||||||
@ -30,12 +30,9 @@ def txt2img(prompt: str, negative_prompt: str, prompt_style: str, prompt_style2:
|
|||||||
restore_faces=restore_faces,
|
restore_faces=restore_faces,
|
||||||
tiling=tiling,
|
tiling=tiling,
|
||||||
enable_hr=enable_hr,
|
enable_hr=enable_hr,
|
||||||
scale_latent=scale_latent if enable_hr else None,
|
|
||||||
denoising_strength=denoising_strength if enable_hr else None,
|
denoising_strength=denoising_strength if enable_hr else None,
|
||||||
firstphase_width=firstphase_width if enable_hr else None,
|
firstphase_width=firstphase_width if enable_hr else None,
|
||||||
firstphase_height=firstphase_height if enable_hr else None,
|
firstphase_height=firstphase_height if enable_hr else None,
|
||||||
crop_scale=crop_scale if enable_hr else None,
|
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if cmd_opts.enable_console_prompts:
|
if cmd_opts.enable_console_prompts:
|
||||||
|
@ -540,16 +540,9 @@ def create_ui(wrap_gradio_gpu_call):
|
|||||||
enable_hr = gr.Checkbox(label='Highres. fix', value=False)
|
enable_hr = gr.Checkbox(label='Highres. fix', value=False)
|
||||||
|
|
||||||
with gr.Row(visible=False) as hr_options:
|
with gr.Row(visible=False) as hr_options:
|
||||||
with gr.Column(scale=1.0):
|
firstphase_width = gr.Slider(minimum=64, maximum=1024, step=64, label="First pass width", value=512)
|
||||||
firstphase_width = gr.Slider(minimum=64, maximum=1024, step=64, label="First pass width", value=512)
|
firstphase_height = gr.Slider(minimum=64, maximum=1024, step=64, label="First pass height", value=512)
|
||||||
firstphase_height = gr.Slider(minimum=64, maximum=1024, step=64, label="First pass height", value=512)
|
denoising_strength = gr.Slider(minimum=0.0, maximum=1.0, step=0.01, label='Denoising strength', value=0.7)
|
||||||
|
|
||||||
with gr.Column(scale=1.0):
|
|
||||||
with gr.Row():
|
|
||||||
crop_scale = gr.Checkbox(label='Crop when scaling', value=False)
|
|
||||||
scale_latent = gr.Checkbox(label='Scale latent', value=False)
|
|
||||||
with gr.Row():
|
|
||||||
denoising_strength = gr.Slider(minimum=0.0, maximum=1.0, step=0.01, label='Denoising strength', value=0.7)
|
|
||||||
|
|
||||||
with gr.Row(equal_height=True):
|
with gr.Row(equal_height=True):
|
||||||
batch_count = gr.Slider(minimum=1, step=1, label='Batch count', value=1)
|
batch_count = gr.Slider(minimum=1, step=1, label='Batch count', value=1)
|
||||||
@ -610,11 +603,9 @@ def create_ui(wrap_gradio_gpu_call):
|
|||||||
height,
|
height,
|
||||||
width,
|
width,
|
||||||
enable_hr,
|
enable_hr,
|
||||||
scale_latent,
|
|
||||||
denoising_strength,
|
denoising_strength,
|
||||||
firstphase_width,
|
firstphase_width,
|
||||||
firstphase_height,
|
firstphase_height,
|
||||||
crop_scale,
|
|
||||||
] + custom_inputs,
|
] + custom_inputs,
|
||||||
outputs=[
|
outputs=[
|
||||||
txt2img_gallery,
|
txt2img_gallery,
|
||||||
@ -679,8 +670,8 @@ def create_ui(wrap_gradio_gpu_call):
|
|||||||
(denoising_strength, "Denoising strength"),
|
(denoising_strength, "Denoising strength"),
|
||||||
(enable_hr, lambda d: "Denoising strength" in d),
|
(enable_hr, lambda d: "Denoising strength" in d),
|
||||||
(hr_options, lambda d: gr.Row.update(visible="Denoising strength" in d)),
|
(hr_options, lambda d: gr.Row.update(visible="Denoising strength" in d)),
|
||||||
(firstphase_width, "First pass width"),
|
(firstphase_width, "First pass size-1"),
|
||||||
(firstphase_height, "First pass height"),
|
(firstphase_height, "First pass size-2"),
|
||||||
]
|
]
|
||||||
modules.generation_parameters_copypaste.connect_paste(paste, txt2img_paste_fields, txt2img_prompt)
|
modules.generation_parameters_copypaste.connect_paste(paste, txt2img_paste_fields, txt2img_prompt)
|
||||||
token_button.click(fn=update_token_counter, inputs=[txt2img_prompt, steps], outputs=[token_counter])
|
token_button.click(fn=update_token_counter, inputs=[txt2img_prompt, steps], outputs=[token_counter])
|
||||||
|
Loading…
Reference in New Issue
Block a user