mirror of
https://github.com/sd-webui/stable-diffusion-webui.git
synced 2024-12-15 07:12:58 +03:00
Corrected breaking issues introduced in #1136 to txt2img and
made state variables consistent with img2img. Fixed a bug where switching models after running would not reload the used model.
This commit is contained in:
parent
178e62292e
commit
4f7adcaf42
@ -164,7 +164,7 @@ def load_models(continue_prev_run = False, use_GFPGAN=False, use_RealESRGAN=Fals
|
|||||||
del st.session_state["RealESRGAN"]
|
del st.session_state["RealESRGAN"]
|
||||||
|
|
||||||
if "model" in st.session_state:
|
if "model" in st.session_state:
|
||||||
if "model" in st.session_state and st.session_state["custom_model"] == custom_model:
|
if "model" in st.session_state and st.session_state["loaded_model"] == custom_model:
|
||||||
# TODO: check if the optimized mode was changed?
|
# TODO: check if the optimized mode was changed?
|
||||||
print("Model already loaded")
|
print("Model already loaded")
|
||||||
|
|
||||||
@ -188,6 +188,7 @@ def load_models(continue_prev_run = False, use_GFPGAN=False, use_RealESRGAN=Fals
|
|||||||
st.session_state.model = model
|
st.session_state.model = model
|
||||||
st.session_state.modelCS = modelCS
|
st.session_state.modelCS = modelCS
|
||||||
st.session_state.modelFS = modelFS
|
st.session_state.modelFS = modelFS
|
||||||
|
st.session_state.loaded_model = custom_model
|
||||||
|
|
||||||
print("Model loaded.")
|
print("Model loaded.")
|
||||||
|
|
||||||
@ -882,26 +883,21 @@ def slerp(device, t, v0:torch.Tensor, v1:torch.Tensor, DOT_THRESHOLD=0.9995):
|
|||||||
return v2
|
return v2
|
||||||
|
|
||||||
#
|
#
|
||||||
def optimize_update_preview_frequency(current_chunk_speed, previous_chunk_speed_list, update_preview_frequency, update_preview_frequency_list):
|
def optimize_update_preview_frequency(current_chunk_speed, previous_chunk_speed, update_preview_frequency):
|
||||||
"""Find the optimal update_preview_frequency value maximizing
|
"""Find the optimal update_preview_frequency value maximizing
|
||||||
performance while minimizing the time between updates."""
|
performance while minimizing the time between updates."""
|
||||||
from statistics import mean
|
if current_chunk_speed >= previous_chunk_speed:
|
||||||
|
|
||||||
previous_chunk_avg_speed = mean(previous_chunk_speed_list)
|
|
||||||
|
|
||||||
previous_chunk_speed_list.append(current_chunk_speed)
|
|
||||||
current_chunk_avg_speed = mean(previous_chunk_speed_list)
|
|
||||||
|
|
||||||
if current_chunk_avg_speed >= previous_chunk_avg_speed:
|
|
||||||
#print(f"{current_chunk_speed} >= {previous_chunk_speed}")
|
#print(f"{current_chunk_speed} >= {previous_chunk_speed}")
|
||||||
update_preview_frequency_list.append(update_preview_frequency + 1)
|
update_preview_frequency +=1
|
||||||
|
previous_chunk_speed = current_chunk_speed
|
||||||
else:
|
else:
|
||||||
#print(f"{current_chunk_speed} <= {previous_chunk_speed}")
|
#print(f"{current_chunk_speed} <= {previous_chunk_speed}")
|
||||||
update_preview_frequency_list.append(update_preview_frequency - 1)
|
update_preview_frequency -=1
|
||||||
|
previous_chunk_speed = current_chunk_speed
|
||||||
update_preview_frequency = round(mean(update_preview_frequency_list))
|
|
||||||
|
return current_chunk_speed, previous_chunk_speed, update_preview_frequency
|
||||||
|
|
||||||
|
|
||||||
return current_chunk_speed, previous_chunk_speed_list, update_preview_frequency, update_preview_frequency_list
|
|
||||||
|
|
||||||
|
|
||||||
def get_font(fontsize):
|
def get_font(fontsize):
|
||||||
|
@ -30,11 +30,11 @@ except:
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
class plugin_info():
|
class plugin_info():
|
||||||
plugname = "txt2img"
|
plugname = "txt2img"
|
||||||
description = "Text to Image"
|
description = "Text to Image"
|
||||||
isTab = True
|
isTab = True
|
||||||
displayPriority = 1
|
displayPriority = 1
|
||||||
|
|
||||||
|
|
||||||
if os.path.exists(os.path.join(st.session_state['defaults'].general.GFPGAN_dir, "experiments", "pretrained_models", "GFPGANv1.3.pth")):
|
if os.path.exists(os.path.join(st.session_state['defaults'].general.GFPGAN_dir, "experiments", "pretrained_models", "GFPGANv1.3.pth")):
|
||||||
GFPGAN_available = True
|
GFPGAN_available = True
|
||||||
@ -48,12 +48,12 @@ else:
|
|||||||
|
|
||||||
#
|
#
|
||||||
def txt2img(prompt: str, ddim_steps: int, sampler_name: str, realesrgan_model_name: str,
|
def txt2img(prompt: str, ddim_steps: int, sampler_name: str, realesrgan_model_name: str,
|
||||||
n_iter: int, batch_size: int, cfg_scale: float, seed: Union[int, str, None],
|
n_iter: int, batch_size: int, cfg_scale: float, seed: Union[int, str, None],
|
||||||
height: int, width: int, separate_prompts:bool = False, normalize_prompt_weights:bool = True,
|
height: int, width: int, separate_prompts:bool = False, normalize_prompt_weights:bool = True,
|
||||||
save_individual_images: bool = True, save_grid: bool = True, group_by_prompt: bool = True,
|
save_individual_images: bool = True, save_grid: bool = True, group_by_prompt: bool = True,
|
||||||
save_as_jpg: bool = True, use_GFPGAN: bool = True, use_RealESRGAN: bool = True,
|
save_as_jpg: bool = True, use_GFPGAN: bool = True, use_RealESRGAN: bool = True,
|
||||||
RealESRGAN_model: str = "RealESRGAN_x4plus_anime_6B", fp = None, variant_amount: float = None,
|
RealESRGAN_model: str = "RealESRGAN_x4plus_anime_6B", fp = None, variant_amount: float = None,
|
||||||
variant_seed: int = None, ddim_eta:float = 0.0, write_info_files:bool = True):
|
variant_seed: int = None, ddim_eta:float = 0.0, write_info_files:bool = True):
|
||||||
|
|
||||||
outpath = st.session_state['defaults'].general.outdir_txt2img or st.session_state['defaults'].general.outdir or "outputs/txt2img-samples"
|
outpath = st.session_state['defaults'].general.outdir_txt2img or st.session_state['defaults'].general.outdir or "outputs/txt2img-samples"
|
||||||
|
|
||||||
@ -93,40 +93,40 @@ def txt2img(prompt: str, ddim_steps: int, sampler_name: str, realesrgan_model_na
|
|||||||
|
|
||||||
def sample(init_data, x, conditioning, unconditional_conditioning, sampler_name):
|
def sample(init_data, x, conditioning, unconditional_conditioning, sampler_name):
|
||||||
samples_ddim, _ = sampler.sample(S=ddim_steps, conditioning=conditioning, batch_size=int(x.shape[0]), shape=x[0].shape, verbose=False, unconditional_guidance_scale=cfg_scale,
|
samples_ddim, _ = sampler.sample(S=ddim_steps, conditioning=conditioning, batch_size=int(x.shape[0]), shape=x[0].shape, verbose=False, unconditional_guidance_scale=cfg_scale,
|
||||||
unconditional_conditioning=unconditional_conditioning, eta=ddim_eta, x_T=x, img_callback=generation_callback,
|
unconditional_conditioning=unconditional_conditioning, eta=ddim_eta, x_T=x, img_callback=generation_callback,
|
||||||
log_every_t=int(st.session_state['defaults'].general.update_preview_frequency))
|
log_every_t=int(st.session_state['defaults'].general.update_preview_frequency))
|
||||||
|
|
||||||
return samples_ddim
|
return samples_ddim
|
||||||
|
|
||||||
#try:
|
#try:
|
||||||
output_images, seed, info, stats = process_images(
|
output_images, seed, info, stats = process_images(
|
||||||
outpath=outpath,
|
outpath=outpath,
|
||||||
func_init=init,
|
func_init=init,
|
||||||
func_sample=sample,
|
func_sample=sample,
|
||||||
prompt=prompt,
|
prompt=prompt,
|
||||||
seed=seed,
|
seed=seed,
|
||||||
sampler_name=sampler_name,
|
sampler_name=sampler_name,
|
||||||
save_grid=save_grid,
|
save_grid=save_grid,
|
||||||
batch_size=batch_size,
|
batch_size=batch_size,
|
||||||
n_iter=n_iter,
|
n_iter=n_iter,
|
||||||
steps=ddim_steps,
|
steps=ddim_steps,
|
||||||
cfg_scale=cfg_scale,
|
cfg_scale=cfg_scale,
|
||||||
width=width,
|
width=width,
|
||||||
height=height,
|
height=height,
|
||||||
prompt_matrix=separate_prompts,
|
prompt_matrix=separate_prompts,
|
||||||
use_GFPGAN=use_GFPGAN,
|
use_GFPGAN=st.session_state["use_GFPGAN"],
|
||||||
use_RealESRGAN=use_RealESRGAN,
|
use_RealESRGAN=st.session_state["use_RealESRGAN"],
|
||||||
realesrgan_model_name=realesrgan_model_name,
|
realesrgan_model_name=realesrgan_model_name,
|
||||||
fp=fp,
|
fp=fp,
|
||||||
ddim_eta=ddim_eta,
|
ddim_eta=ddim_eta,
|
||||||
normalize_prompt_weights=normalize_prompt_weights,
|
normalize_prompt_weights=normalize_prompt_weights,
|
||||||
save_individual_images=save_individual_images,
|
save_individual_images=save_individual_images,
|
||||||
sort_samples=group_by_prompt,
|
sort_samples=group_by_prompt,
|
||||||
write_info_files=write_info_files,
|
write_info_files=write_info_files,
|
||||||
jpg_sample=save_as_jpg,
|
jpg_sample=save_as_jpg,
|
||||||
variant_amount=variant_amount,
|
variant_amount=variant_amount,
|
||||||
variant_seed=variant_seed,
|
variant_seed=variant_seed,
|
||||||
)
|
)
|
||||||
|
|
||||||
del sampler
|
del sampler
|
||||||
|
|
||||||
@ -176,16 +176,16 @@ def layout():
|
|||||||
help="How many images are at once in a batch.\
|
help="How many images are at once in a batch.\
|
||||||
It increases the VRAM usage a lot but if you have enough VRAM it can reduce the time it takes to finish generation as more images are generated at once.\
|
It increases the VRAM usage a lot but if you have enough VRAM it can reduce the time it takes to finish generation as more images are generated at once.\
|
||||||
Default: 1")
|
Default: 1")
|
||||||
|
|
||||||
with st.expander("Preview Settings"):
|
with st.expander("Preview Settings"):
|
||||||
st.session_state["update_preview"] = st.checkbox("Update Image Preview", value=st.session_state['defaults'].txt2img.update_preview,
|
st.session_state["update_preview"] = st.checkbox("Update Image Preview", value=st.session_state['defaults'].txt2img.update_preview,
|
||||||
help="If enabled the image preview will be updated during the generation instead of at the end. \
|
help="If enabled the image preview will be updated during the generation instead of at the end. \
|
||||||
You can use the Update Preview \Frequency option bellow to customize how frequent it's updated. \
|
You can use the Update Preview \Frequency option bellow to customize how frequent it's updated. \
|
||||||
By default this is enabled and the frequency is set to 1 step.")
|
By default this is enabled and the frequency is set to 1 step.")
|
||||||
|
|
||||||
st.session_state["update_preview_frequency"] = st.text_input("Update Image Preview Frequency", value=st.session_state['defaults'].txt2img.update_preview_frequency,
|
st.session_state["update_preview_frequency"] = st.text_input("Update Image Preview Frequency", value=st.session_state['defaults'].txt2img.update_preview_frequency,
|
||||||
help="Frequency in steps at which the the preview image is updated. By default the frequency \
|
help="Frequency in steps at which the the preview image is updated. By default the frequency \
|
||||||
is set to 1 step.")
|
is set to 1 step.")
|
||||||
|
|
||||||
with col2:
|
with col2:
|
||||||
preview_tab, gallery_tab = st.tabs(["Preview", "Gallery"])
|
preview_tab, gallery_tab = st.tabs(["Preview", "Gallery"])
|
||||||
@ -210,13 +210,13 @@ def layout():
|
|||||||
with col3:
|
with col3:
|
||||||
# If we have custom models available on the "models/custom"
|
# If we have custom models available on the "models/custom"
|
||||||
#folder then we show a menu to select which model we want to use, otherwise we use the main model for SD
|
#folder then we show a menu to select which model we want to use, otherwise we use the main model for SD
|
||||||
#if CustomModel_available:
|
if st.session_state["CustomModel_available"]:
|
||||||
custom_model = st.selectbox("Custom Model:", st.session_state['defaults'].txt2vid.custom_models_list,
|
st.session_state["custom_model"] = st.selectbox("Custom Model:", st.session_state["custom_models"],
|
||||||
index=st.session_state['defaults'].txt2vid.custom_models_list.index(st.session_state['defaults'].txt2vid.default_model),
|
index=st.session_state["custom_models"].index(st.session_state['defaults'].general.default_model),
|
||||||
help="Select the model you want to use. This option is only available if you have custom models \
|
help="Select the model you want to use. This option is only available if you have custom models \
|
||||||
on your 'models/custom' folder. The model name that will be shown here is the same as the name\
|
on your 'models/custom' folder. The model name that will be shown here is the same as the name\
|
||||||
the file for the model has on said folder, it is recommended to give the .ckpt file a name that \
|
the file for the model has on said folder, it is recommended to give the .ckpt file a name that \
|
||||||
will make it easier for you to distinguish it from other models. Default: Stable Diffusion v1.4")
|
will make it easier for you to distinguish it from other models. Default: Stable Diffusion v1.4")
|
||||||
|
|
||||||
st.session_state.sampling_steps = st.slider("Sampling Steps", value=st.session_state['defaults'].txt2img.sampling_steps, min_value=1, max_value=250)
|
st.session_state.sampling_steps = st.slider("Sampling Steps", value=st.session_state['defaults'].txt2img.sampling_steps, min_value=1, max_value=250)
|
||||||
|
|
||||||
@ -242,17 +242,20 @@ def layout():
|
|||||||
write_info_files = st.checkbox("Write Info file", value=True, help="Save a file next to the image with informartion about the generation.")
|
write_info_files = st.checkbox("Write Info file", value=True, help="Save a file next to the image with informartion about the generation.")
|
||||||
save_as_jpg = st.checkbox("Save samples as jpg", value=False, help="Saves the images as jpg instead of png.")
|
save_as_jpg = st.checkbox("Save samples as jpg", value=False, help="Saves the images as jpg instead of png.")
|
||||||
|
|
||||||
if GFPGAN_available:
|
if st.session_state["GFPGAN_available"]:
|
||||||
use_GFPGAN = st.checkbox("Use GFPGAN", value=st.session_state['defaults'].txt2img.use_GFPGAN, help="Uses the GFPGAN model to improve faces after the generation. This greatly improve the quality and consistency of faces but uses extra VRAM. Disable if you need the extra VRAM.")
|
st.session_state["use_GFPGAN"] = st.checkbox("Use GFPGAN", value=st.session_state['defaults'].txt2img.use_GFPGAN, help="Uses the GFPGAN model to improve faces after the generation.\
|
||||||
|
This greatly improve the quality and consistency of faces but uses extra VRAM. Disable if you need the extra VRAM.")
|
||||||
else:
|
else:
|
||||||
use_GFPGAN = False
|
st.session_state["use_GFPGAN"] = False
|
||||||
|
|
||||||
if RealESRGAN_available:
|
if st.session_state["RealESRGAN_available"]:
|
||||||
use_RealESRGAN = st.checkbox("Use RealESRGAN", value=st.session_state['defaults'].txt2img.use_RealESRGAN, help="Uses the RealESRGAN model to upscale the images after the generation. This greatly improve the quality and lets you have high resolution images but uses extra VRAM. Disable if you need the extra VRAM.")
|
st.session_state["use_RealESRGAN"] = st.checkbox("Use RealESRGAN", value=st.session_state['defaults'].txt2img.use_RealESRGAN,
|
||||||
RealESRGAN_model = st.selectbox("RealESRGAN model", ["RealESRGAN_x4plus", "RealESRGAN_x4plus_anime_6B"], index=0)
|
help="Uses the RealESRGAN model to upscale the images after the generation.\
|
||||||
|
This greatly improve the quality and lets you have high resolution images but uses extra VRAM. Disable if you need the extra VRAM.")
|
||||||
|
st.session_state["RealESRGAN_model"] = st.selectbox("RealESRGAN model", ["RealESRGAN_x4plus", "RealESRGAN_x4plus_anime_6B"], index=0)
|
||||||
else:
|
else:
|
||||||
use_RealESRGAN = False
|
st.session_state["use_RealESRGAN"] = False
|
||||||
RealESRGAN_model = "RealESRGAN_x4plus"
|
st.session_state["RealESRGAN_model"] = "RealESRGAN_x4plus"
|
||||||
|
|
||||||
variant_amount = st.slider("Variant Amount:", value=st.session_state['defaults'].txt2img.variant_amount, min_value=0.0, max_value=1.0, step=0.01)
|
variant_amount = st.slider("Variant Amount:", value=st.session_state['defaults'].txt2img.variant_amount, min_value=0.0, max_value=1.0, step=0.01)
|
||||||
variant_seed = st.text_input("Variant Seed:", value=st.session_state['defaults'].txt2img.seed, help="The seed to use when generating a variant, if left blank a random seed will be generated.")
|
variant_seed = st.text_input("Variant Seed:", value=st.session_state['defaults'].txt2img.seed, help="The seed to use when generating a variant, if left blank a random seed will be generated.")
|
||||||
@ -260,14 +263,15 @@ def layout():
|
|||||||
|
|
||||||
if generate_button:
|
if generate_button:
|
||||||
#print("Loading models")
|
#print("Loading models")
|
||||||
# load the models when we hit the generate button for the first time, it wont be loaded after that so dont worry.
|
# load the models when we hit the generate button for the first time, it wont be loaded after that so dont worry.
|
||||||
load_models(False, use_GFPGAN, use_RealESRGAN, RealESRGAN_model)
|
load_models(False, st.session_state["use_GFPGAN"], st.session_state["use_RealESRGAN"], st.session_state["RealESRGAN_model"], st.session_state["CustomModel_available"],
|
||||||
|
st.session_state["custom_model"])
|
||||||
|
|
||||||
try:
|
try:
|
||||||
output_images, seeds, info, stats = txt2img(prompt, st.session_state.sampling_steps, sampler_name, RealESRGAN_model, batch_count, batch_size,
|
output_images, seeds, info, stats = txt2img(prompt, st.session_state.sampling_steps, sampler_name, st.session_state["RealESRGAN_model"], batch_count, batch_size,
|
||||||
cfg_scale, seed, height, width, separate_prompts, normalize_prompt_weights, save_individual_images,
|
cfg_scale, seed, height, width, separate_prompts, normalize_prompt_weights, save_individual_images,
|
||||||
save_grid, group_by_prompt, save_as_jpg, use_GFPGAN, use_RealESRGAN, RealESRGAN_model, fp=st.session_state.defaults.general.fp,
|
save_grid, group_by_prompt, save_as_jpg, st.session_state["use_GFPGAN"], st.session_state["use_RealESRGAN"], st.session_state["RealESRGAN_model"],
|
||||||
variant_amount=variant_amount, variant_seed=variant_seed, write_info_files=write_info_files)
|
fp=st.session_state.defaults.general.fp, variant_amount=variant_amount, variant_seed=variant_seed, write_info_files=write_info_files)
|
||||||
|
|
||||||
message.success('Render Complete: ' + info + '; Stats: ' + stats, icon="✅")
|
message.success('Render Complete: ' + info + '; Stats: ' + stats, icon="✅")
|
||||||
|
|
||||||
@ -319,11 +323,11 @@ def layout():
|
|||||||
#on import run init
|
#on import run init
|
||||||
def createHTMLGallery(images,info):
|
def createHTMLGallery(images,info):
|
||||||
html3 = """
|
html3 = """
|
||||||
<div class="gallery-history" style="
|
<div class="gallery-history" style="
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
align-items: flex-start;">
|
align-items: flex-start;">
|
||||||
"""
|
"""
|
||||||
mkdwn_array = []
|
mkdwn_array = []
|
||||||
for i in images:
|
for i in images:
|
||||||
try:
|
try:
|
||||||
@ -352,7 +356,7 @@ def createHTMLGallery(images,info):
|
|||||||
#mkdwn = f"""<img src="{img_str}" alt="Image" with="200" height="200" />"""
|
#mkdwn = f"""<img src="{img_str}" alt="Image" with="200" height="200" />"""
|
||||||
mkdwn = f'''<div class="gallery" style="margin: 3px;" >
|
mkdwn = f'''<div class="gallery" style="margin: 3px;" >
|
||||||
<a href="{img_str}">
|
<a href="{img_str}">
|
||||||
<img src="{img_str}" alt="Image" width="{width}" height="{height}">
|
<img src="{img_str}" alt="Image" width="{width}" height="{height}">
|
||||||
</a>
|
</a>
|
||||||
<div class="desc" style="text-align: center; opacity: 40%;">{seed}</div>
|
<div class="desc" style="text-align: center; opacity: 40%;">{seed}</div>
|
||||||
</div>
|
</div>
|
||||||
|
Loading…
Reference in New Issue
Block a user