2022-09-30 01:46:23 +03:00
import datetime
2022-09-03 12:08:45 +03:00
import json
import os
2023-07-08 16:45:59 +03:00
import re
2022-09-30 01:46:23 +03:00
import sys
2023-05-11 23:46:45 +03:00
import threading
2022-10-30 12:01:01 +03:00
import time
2023-06-30 13:24:17 +03:00
import logging
2022-09-30 01:46:23 +03:00
2022-09-03 12:08:45 +03:00
import gradio as gr
2023-06-01 07:28:13 +03:00
import torch
2022-09-08 16:37:13 +03:00
import tqdm
2022-09-03 12:08:45 +03:00
2022-09-11 18:48:36 +03:00
import modules . interrogate
2022-09-17 07:49:31 +03:00
import modules . memmon
2022-09-30 01:46:23 +03:00
import modules . styles
2022-10-04 11:24:35 +03:00
import modules . devices as devices
2023-03-25 16:05:12 +03:00
from modules import localization , script_loading , errors , ui_components , shared_items , cmd_args
2023-05-10 09:02:23 +03:00
from modules . paths_internal import models_path , script_path , data_path , sd_configs_path , sd_default_config , sd_model_file , default_sd_model_file , extensions_dir , extensions_builtin_dir # noqa: F401
2023-05-02 09:08:00 +03:00
from ldm . models . diffusion . ddpm import LatentDiffusion
2023-05-20 03:57:12 +03:00
from typing import Optional
2022-11-27 11:52:53 +03:00
2023-06-30 13:24:17 +03:00
log = logging . getLogger ( __name__ )
2022-11-27 11:52:53 +03:00
demo = None
2023-03-25 16:05:12 +03:00
parser = cmd_args . parser
2023-01-21 18:47:54 +03:00
2023-03-25 16:05:12 +03:00
script_loading . preload_extensions ( extensions_dir , parser )
script_loading . preload_extensions ( extensions_builtin_dir , parser )
2022-10-02 20:23:40 +03:00
2023-03-11 21:22:52 +03:00
if os . environ . get ( ' IGNORE_CMD_ARGS_ERRORS ' , None ) is None :
cmd_opts = parser . parse_args ( )
else :
cmd_opts , _ = parser . parse_known_args ( )
2022-11-08 19:03:56 +03:00
2023-03-25 16:05:12 +03:00
2022-10-26 11:47:07 +03:00
restricted_opts = {
2022-10-16 20:08:23 +03:00
" samples_filename_pattern " ,
2022-10-24 14:03:58 +03:00
" directories_filename_pattern " ,
2022-10-16 20:08:23 +03:00
" outdir_samples " ,
" outdir_txt2img_samples " ,
" outdir_img2img_samples " ,
" outdir_extras_samples " ,
" outdir_grids " ,
" outdir_txt2img_grids " ,
" outdir_save " ,
2023-04-06 19:42:26 +03:00
" outdir_init_images "
2022-10-26 11:47:07 +03:00
}
2022-10-04 11:24:35 +03:00
2023-03-25 23:11:41 +03:00
# https://huggingface.co/datasets/freddyaboulton/gradio-theme-subdomains/resolve/main/subdomains.json
gradio_hf_hub_themes = [
" gradio/glass " ,
" gradio/monochrome " ,
" gradio/seafoam " ,
" gradio/soft " ,
" freddyaboulton/dracula_revamped " ,
" gradio/dracula_test " ,
" abidlabs/dracula_test " ,
" abidlabs/pakistan " ,
" dawood/microsoft_windows " ,
" ysharma/steampunk "
]
2022-11-14 23:07:13 +03:00
cmd_opts . disable_extension_access = ( cmd_opts . share or cmd_opts . listen or cmd_opts . server_name ) and not cmd_opts . enable_insecure_extension_access
2022-10-31 18:33:44 +03:00
2022-12-03 18:06:33 +03:00
devices . device , devices . device_interrogate , devices . device_gfpgan , devices . device_esrgan , devices . device_codeformer = \
( devices . cpu if any ( y in cmd_opts . use_cpu for y in [ x , ' all ' ] ) else devices . get_optimal_device ( ) for x in [ ' sd ' , ' interrogate ' , ' gfpgan ' , ' esrgan ' , ' codeformer ' ] )
2022-10-04 11:24:35 +03:00
2023-06-01 07:28:13 +03:00
devices . dtype = torch . float32 if cmd_opts . no_half else torch . float16
devices . dtype_vae = torch . float32 if cmd_opts . no_half or cmd_opts . no_half_vae else torch . float16
2022-10-04 11:24:35 +03:00
device = devices . device
2022-10-14 20:03:41 +03:00
weight_load_location = None if cmd_opts . lowram else " cpu "
2022-09-11 08:11:27 +03:00
2022-09-03 12:08:45 +03:00
batch_cond_uncond = cmd_opts . always_batch_cond_uncond or not ( cmd_opts . lowvram or cmd_opts . medvram )
2022-09-06 23:10:12 +03:00
parallel_processing_allowed = not cmd_opts . lowvram and not cmd_opts . medvram
2022-10-08 16:20:41 +03:00
xformers_available = False
2022-09-12 09:44:45 +03:00
config_filename = cmd_opts . ui_settings_file
2022-09-07 12:32:28 +03:00
2022-10-12 07:01:20 +03:00
os . makedirs ( cmd_opts . hypernetwork_dir , exist_ok = True )
2022-11-26 16:10:46 +03:00
hypernetworks = { }
2023-01-21 08:36:07 +03:00
loaded_hypernetworks = [ ]
2022-10-07 10:17:52 +03:00
2022-11-26 16:10:46 +03:00
2022-10-11 14:53:02 +03:00
def reload_hypernetworks ( ) :
2022-11-26 16:10:46 +03:00
from modules . hypernetworks import hypernetwork
2022-10-11 14:53:02 +03:00
global hypernetworks
hypernetworks = hypernetwork . list_hypernetworks ( cmd_opts . hypernetwork_dir )
2023-01-15 18:50:56 +03:00
2022-09-03 12:08:45 +03:00
class State :
2022-10-05 06:56:30 +03:00
skipped = False
2022-09-03 12:08:45 +03:00
interrupted = False
job = " "
2022-09-06 02:09:01 +03:00
job_no = 0
job_count = 0
2023-01-04 23:56:43 +03:00
processing_has_refined_job_count = False
2022-09-27 04:26:13 +03:00
job_timestamp = ' 0 '
2022-09-06 02:09:01 +03:00
sampling_step = 0
sampling_steps = 0
2022-09-06 19:33:51 +03:00
current_latent = None
current_image = None
2022-09-06 23:10:12 +03:00
current_image_sampling_step = 0
2023-01-15 18:50:56 +03:00
id_live_preview = 0
2022-10-02 15:03:39 +03:00
textinfo = None
2022-10-30 12:01:01 +03:00
time_start = None
2023-01-14 19:18:05 +03:00
server_start = None
2023-05-11 23:46:45 +03:00
_server_command_signal = threading . Event ( )
2023-05-20 08:43:03 +03:00
_server_command : Optional [ str ] = None
2023-05-11 23:46:45 +03:00
@property
def need_restart ( self ) - > bool :
# Compatibility getter for need_restart.
return self . server_command == " restart "
@need_restart.setter
def need_restart ( self , value : bool ) - > None :
# Compatibility setter for need_restart.
if value :
self . server_command = " restart "
@property
def server_command ( self ) :
return self . _server_command
@server_command.setter
2023-05-20 03:57:12 +03:00
def server_command ( self , value : Optional [ str ] ) - > None :
2023-05-11 23:46:45 +03:00
"""
Set the server command to ` value ` and signal that it ' s been set.
"""
self . _server_command = value
self . _server_command_signal . set ( )
2023-05-20 08:43:03 +03:00
def wait_for_server_command ( self , timeout : Optional [ float ] = None ) - > Optional [ str ] :
2023-05-11 23:46:45 +03:00
"""
Wait for server command to get set ; return and clear the value and signal .
"""
if self . _server_command_signal . wait ( timeout ) :
self . _server_command_signal . clear ( )
req = self . _server_command
self . _server_command = None
return req
return None
def request_restart ( self ) - > None :
self . interrupt ( )
2023-05-17 23:11:33 +03:00
self . server_command = " restart "
2023-06-30 13:24:17 +03:00
log . info ( " Received restart request " )
2022-09-06 23:10:12 +03:00
2022-10-05 06:56:30 +03:00
def skip ( self ) :
self . skipped = True
2023-06-30 13:24:17 +03:00
log . info ( " Received skip request " )
2022-10-05 06:56:30 +03:00
2022-09-03 12:08:45 +03:00
def interrupt ( self ) :
self . interrupted = True
2023-06-30 13:24:17 +03:00
log . info ( " Received interrupt request " )
2022-09-03 12:08:45 +03:00
2022-09-06 02:09:01 +03:00
def nextjob ( self ) :
2023-01-14 16:29:23 +03:00
if opts . live_previews_enable and opts . show_progress_every_n_steps == - 1 :
2022-11-02 19:24:42 +03:00
self . do_set_current_image ( )
2022-11-04 21:36:47 +03:00
2022-09-06 02:09:01 +03:00
self . job_no + = 1
self . sampling_step = 0
2022-09-06 23:10:12 +03:00
self . current_image_sampling_step = 0
2022-10-18 19:01:22 +03:00
2022-10-30 00:04:29 +03:00
def dict ( self ) :
2022-10-26 17:33:45 +03:00
obj = {
" skipped " : self . skipped ,
2022-12-31 03:41:47 +03:00
" interrupted " : self . interrupted ,
2022-10-26 17:33:45 +03:00
" job " : self . job ,
" job_count " : self . job_count ,
2022-12-24 12:45:16 +03:00
" job_timestamp " : self . job_timestamp ,
2022-10-26 17:33:45 +03:00
" job_no " : self . job_no ,
" sampling_step " : self . sampling_step ,
" sampling_steps " : self . sampling_steps ,
}
2022-10-30 00:04:29 +03:00
return obj
2022-10-26 17:33:45 +03:00
2023-06-30 13:11:31 +03:00
def begin ( self , job : str = " (unknown) " ) :
2022-10-30 09:10:22 +03:00
self . sampling_step = 0
self . job_count = - 1
2023-01-04 23:56:43 +03:00
self . processing_has_refined_job_count = False
2022-10-30 09:10:22 +03:00
self . job_no = 0
self . job_timestamp = datetime . datetime . now ( ) . strftime ( " % Y % m %d % H % M % S " )
self . current_latent = None
self . current_image = None
self . current_image_sampling_step = 0
2023-01-15 18:50:56 +03:00
self . id_live_preview = 0
2022-10-30 09:10:22 +03:00
self . skipped = False
self . interrupted = False
self . textinfo = None
2022-10-30 12:01:01 +03:00
self . time_start = time . time ( )
2023-06-30 13:11:31 +03:00
self . job = job
2022-10-30 09:10:22 +03:00
devices . torch_gc ( )
2023-06-30 13:24:17 +03:00
log . info ( " Starting job %s " , job )
2022-10-30 09:10:22 +03:00
def end ( self ) :
2023-06-30 13:24:17 +03:00
duration = time . time ( ) - self . time_start
log . info ( " Ending job %s ( %.2f seconds) " , self . job , duration )
2022-10-30 09:10:22 +03:00
self . job = " "
self . job_count = 0
devices . torch_gc ( )
2022-09-06 10:11:25 +03:00
2022-11-02 12:12:32 +03:00
def set_current_image ( self ) :
2023-01-15 18:50:56 +03:00
""" sets self.current_image from self.current_latent if enough sampling steps have been made after the last call to this """
2023-01-04 16:05:42 +03:00
if not parallel_processing_allowed :
return
2023-01-15 19:56:24 +03:00
if self . sampling_step - self . current_image_sampling_step > = opts . show_progress_every_n_steps and opts . live_previews_enable and opts . show_progress_every_n_steps != - 1 :
2022-11-02 19:24:42 +03:00
self . do_set_current_image ( )
def do_set_current_image ( self ) :
if self . current_latent is None :
return
2022-11-04 21:36:47 +03:00
2022-11-26 16:10:46 +03:00
import modules . sd_samplers
2022-11-02 19:24:42 +03:00
if opts . show_progress_grid :
2023-01-15 18:50:56 +03:00
self . assign_current_image ( modules . sd_samplers . samples_to_image_grid ( self . current_latent ) )
2022-11-02 19:24:42 +03:00
else :
2023-01-15 18:50:56 +03:00
self . assign_current_image ( modules . sd_samplers . sample_to_image ( self . current_latent ) )
2022-11-02 12:12:32 +03:00
2022-11-02 19:24:42 +03:00
self . current_image_sampling_step = self . sampling_step
2022-09-06 02:09:01 +03:00
2023-01-15 18:50:56 +03:00
def assign_current_image ( self , image ) :
self . current_image = image
self . id_live_preview + = 1
2022-09-06 10:11:25 +03:00
2022-09-03 12:08:45 +03:00
state = State ( )
2023-01-14 19:18:05 +03:00
state . server_start = time . time ( )
2022-09-03 12:08:45 +03:00
2022-09-14 01:18:07 +03:00
styles_filename = cmd_opts . styles_file
2022-09-14 17:56:21 +03:00
prompt_styles = modules . styles . StyleDatabase ( styles_filename )
2022-09-03 12:08:45 +03:00
2022-09-11 18:48:36 +03:00
interrogator = modules . interrogate . InterrogateModels ( " interrogate " )
2022-09-09 23:16:02 +03:00
face_restorers = [ ]
2022-10-08 13:38:57 +03:00
2023-05-14 10:02:51 +03:00
2022-09-22 20:41:22 +03:00
class OptionInfo :
2023-05-14 10:02:51 +03:00
def __init__ ( self , default = None , label = " " , component = None , component_args = None , onchange = None , section = None , refresh = None , comment_before = ' ' , comment_after = ' ' ) :
2022-09-22 20:41:22 +03:00
self . default = default
self . label = label
self . component = component
self . component_args = component_args
self . onchange = onchange
2022-10-22 19:18:56 +03:00
self . section = section
2022-10-13 19:22:41 +03:00
self . refresh = refresh
2022-09-22 20:41:22 +03:00
2023-05-14 10:02:51 +03:00
self . comment_before = comment_before
""" HTML text that will be added after label in UI """
self . comment_after = comment_after
""" HTML text that will be added before label in UI """
def link ( self , label , url ) :
self . comment_before + = f " [<a href= ' { url } ' target= ' _blank ' > { label } </a>] "
return self
def js ( self , label , js_func ) :
self . comment_before + = f " [<a onclick= ' { js_func } (); return false ' > { label } </a>] "
return self
def info ( self , info ) :
self . comment_after + = f " <span class= ' info ' >( { info } )</span> "
return self
2023-06-04 10:56:48 +03:00
def html ( self , html ) :
self . comment_after + = html
return self
2023-05-14 11:04:21 +03:00
def needs_restart ( self ) :
self . comment_after + = " <span class= ' info ' >(requires restart)</span> "
return self
2022-09-22 20:41:22 +03:00
2022-10-08 22:12:24 +03:00
def options_section ( section_identifier , options_dict ) :
2023-05-10 11:37:18 +03:00
for v in options_dict . values ( ) :
2022-10-08 22:12:24 +03:00
v . section = section_identifier
2022-09-22 20:41:22 +03:00
return options_dict
2022-09-25 13:56:32 +03:00
2022-11-26 16:10:46 +03:00
def list_checkpoint_tiles ( ) :
import modules . sd_models
return modules . sd_models . checkpoint_tiles ( )
def refresh_checkpoints ( ) :
import modules . sd_models
return modules . sd_models . list_models ( )
def list_samplers ( ) :
import modules . sd_samplers
return modules . sd_samplers . all_samplers
2022-09-24 16:29:20 +03:00
hide_dirs = { " visible " : not cmd_opts . hide_ui_dir_config }
2023-02-19 17:21:44 +03:00
tab_names = [ ]
2022-09-22 20:41:22 +03:00
options_templates = { }
2022-09-22 21:32:44 +03:00
options_templates . update ( options_section ( ( ' saving-images ' , " Saving images/grids " ) , {
" samples_save " : OptionInfo ( True , " Always save all generated images " ) ,
" samples_format " : OptionInfo ( ' png ' , ' File format for images ' ) ,
2023-05-14 10:02:51 +03:00
" samples_filename_pattern " : OptionInfo ( " " , " Images filename pattern " , component_args = hide_dirs ) . link ( " wiki " , " https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Custom-Images-Filename-Name-and-Subdirectory " ) ,
2022-10-24 14:03:58 +03:00
" save_images_add_number " : OptionInfo ( True , " Add number to filename when saving " , component_args = hide_dirs ) ,
2022-09-22 21:32:44 +03:00
" grid_save " : OptionInfo ( True , " Always save all generated image grids " ) ,
" grid_format " : OptionInfo ( ' png ' , ' File format for grids ' ) ,
" grid_extended_filename " : OptionInfo ( False , " Add extended info (seed, prompt) to filename when saving grid " ) ,
" grid_only_if_multiple " : OptionInfo ( True , " Do not save grids consisting of one picture " ) ,
2022-10-14 18:06:51 +03:00
" grid_prevent_empty_spots " : OptionInfo ( False , " Prevent empty spots in grid (when set to autodetect) " ) ,
2023-05-24 18:17:02 +03:00
" grid_zip_filename_pattern " : OptionInfo ( " " , " Archive filename pattern " , component_args = hide_dirs ) . link ( " wiki " , " https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Custom-Images-Filename-Name-and-Subdirectory " ) ,
2022-09-22 21:32:44 +03:00
" n_rows " : OptionInfo ( - 1 , " Grid row count; use -1 for autodetect and 0 for it to be same as batch size " , gr . Slider , { " minimum " : - 1 , " maximum " : 16 , " step " : 1 } ) ,
2023-06-28 16:24:57 +03:00
" font " : OptionInfo ( " " , " Font for image grids that have text " ) ,
" grid_text_active_color " : OptionInfo ( " #000000 " , " Text color for image grids " , ui_components . FormColorPicker , { } ) ,
" grid_text_inactive_color " : OptionInfo ( " #999999 " , " Inactive text color for image grids " , ui_components . FormColorPicker , { } ) ,
" grid_background_color " : OptionInfo ( " #ffffff " , " Background color for image grids " , ui_components . FormColorPicker , { } ) ,
2022-09-22 21:32:44 +03:00
2022-09-22 20:41:22 +03:00
" enable_pnginfo " : OptionInfo ( True , " Save text information about generation parameters as chunks to png files " ) ,
" save_txt " : OptionInfo ( False , " Create a text file next to every image with generation parameters. " ) ,
" save_images_before_face_restoration " : OptionInfo ( False , " Save a copy of image before doing face restoration. " ) ,
2022-11-02 12:18:21 +03:00
" save_images_before_highres_fix " : OptionInfo ( False , " Save a copy of image before applying highres fix. " ) ,
2022-11-02 12:45:03 +03:00
" save_images_before_color_correction " : OptionInfo ( False , " Save a copy of image before applying color correction to img2img results " ) ,
2023-03-22 20:51:40 +03:00
" save_mask " : OptionInfo ( False , " For inpainting, save a copy of the greyscale mask " ) ,
" save_mask_composite " : OptionInfo ( False , " For inpainting, save a masked composite " ) ,
2022-09-22 21:32:44 +03:00
" jpeg_quality " : OptionInfo ( 80 , " Quality for saved jpeg images " , gr . Slider , { " minimum " : 1 , " maximum " : 100 , " step " : 1 } ) ,
2023-02-25 06:57:18 +03:00
" webp_lossless " : OptionInfo ( False , " Use lossless compression for webp images " ) ,
2023-05-14 11:04:21 +03:00
" export_for_4chan " : OptionInfo ( True , " Save copy of large images as JPG " ) . info ( " if the file size is above the limit, or either width or height are above the limit " ) ,
2023-02-19 10:12:45 +03:00
" img_downscale_threshold " : OptionInfo ( 4.0 , " File size limit for the above option, MB " , gr . Number ) ,
" target_side_length " : OptionInfo ( 4000 , " Width/height limit for the above option, in pixels " , gr . Number ) ,
2023-05-14 11:04:21 +03:00
" img_max_size_mp " : OptionInfo ( 200 , " Maximum image size " , gr . Number ) . info ( " in megapixels " ) ,
2022-09-22 21:32:44 +03:00
2023-01-31 05:46:13 +03:00
" use_original_name_batch " : OptionInfo ( True , " Use original name for output filename during batch process in extras tab " ) ,
2022-12-17 19:59:02 +03:00
" use_upscaler_name_as_suffix " : OptionInfo ( False , " Use upscaler name as filename suffix in the extras tab " ) ,
2022-09-28 17:05:23 +03:00
" save_selected_only " : OptionInfo ( True , " When using ' Save ' button, only save a single selected image " ) ,
2023-04-07 12:13:51 +03:00
" save_init_img " : OptionInfo ( False , " Save init images when using img2img " ) ,
2022-11-27 11:52:53 +03:00
" temp_dir " : OptionInfo ( " " , " Directory for temporary images; leave empty for default " ) ,
" clean_temp_dir_at_start " : OptionInfo ( False , " Cleanup non-default temporary directory when starting webui " ) ,
2022-09-22 20:41:22 +03:00
} ) )
2022-09-22 21:32:44 +03:00
options_templates . update ( options_section ( ( ' saving-paths ' , " Paths for saving " ) , {
" outdir_samples " : OptionInfo ( " " , " Output directory for images; if empty, defaults to three directories below " , component_args = hide_dirs ) ,
2022-09-22 20:41:22 +03:00
" outdir_txt2img_samples " : OptionInfo ( " outputs/txt2img-images " , ' Output directory for txt2img images ' , component_args = hide_dirs ) ,
" outdir_img2img_samples " : OptionInfo ( " outputs/img2img-images " , ' Output directory for img2img images ' , component_args = hide_dirs ) ,
" outdir_extras_samples " : OptionInfo ( " outputs/extras-images " , ' Output directory for images from extras tab ' , component_args = hide_dirs ) ,
" outdir_grids " : OptionInfo ( " " , " Output directory for grids; if empty, defaults to two directories below " , component_args = hide_dirs ) ,
" outdir_txt2img_grids " : OptionInfo ( " outputs/txt2img-grids " , ' Output directory for txt2img grids ' , component_args = hide_dirs ) ,
" outdir_img2img_grids " : OptionInfo ( " outputs/img2img-grids " , ' Output directory for img2img grids ' , component_args = hide_dirs ) ,
" outdir_save " : OptionInfo ( " log/images " , " Directory for saving images using the Save button " , component_args = hide_dirs ) ,
2023-04-06 19:42:26 +03:00
" outdir_init_images " : OptionInfo ( " outputs/init-images " , " Directory for saving init images when using img2img " , component_args = hide_dirs ) ,
2022-09-22 20:41:22 +03:00
} ) )
2022-09-22 21:32:44 +03:00
options_templates . update ( options_section ( ( ' saving-to-dirs ' , " Saving to a directory " ) , {
2023-01-30 00:25:30 +03:00
" save_to_dirs " : OptionInfo ( True , " Save images to a subdirectory " ) ,
" grid_save_to_dirs " : OptionInfo ( True , " Save grids to a subdirectory " ) ,
2022-10-02 21:50:14 +03:00
" use_save_to_dirs_for_ui " : OptionInfo ( False , " When using \" Save \" button, save images to a subdirectory " ) ,
2023-05-14 10:02:51 +03:00
" directories_filename_pattern " : OptionInfo ( " [date] " , " Directory name pattern " , component_args = hide_dirs ) . link ( " wiki " , " https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Custom-Images-Filename-Name-and-Subdirectory " ) ,
2022-10-24 14:03:58 +03:00
" directories_max_prompt_words " : OptionInfo ( 8 , " Max prompt words for [prompt_words] pattern " , gr . Slider , { " minimum " : 1 , " maximum " : 20 , " step " : 1 , * * hide_dirs } ) ,
2022-09-22 21:32:44 +03:00
} ) )
options_templates . update ( options_section ( ( ' upscaling ' , " Upscaling " ) , {
2023-05-14 11:04:21 +03:00
" ESRGAN_tile " : OptionInfo ( 192 , " Tile size for ESRGAN upscalers. " , gr . Slider , { " minimum " : 0 , " maximum " : 512 , " step " : 16 } ) . info ( " 0 = no tiling " ) ,
" ESRGAN_tile_overlap " : OptionInfo ( 8 , " Tile overlap for ESRGAN upscalers. " , gr . Slider , { " minimum " : 0 , " maximum " : 48 , " step " : 1 } ) . info ( " Low values = visible seam " ) ,
" realesrgan_enabled_models " : OptionInfo ( [ " R-ESRGAN 4x+ " , " R-ESRGAN 4x+ Anime6B " ] , " Select which Real-ESRGAN models to show in the web UI. " , gr . CheckboxGroup , lambda : { " choices " : shared_items . realesrgan_models_names ( ) } ) ,
2022-10-03 07:57:59 +03:00
" upscaler_for_img2img " : OptionInfo ( None , " Upscaler for img2img " , gr . Dropdown , lambda : { " choices " : [ x . name for x in sd_upscalers ] } ) ,
2022-09-22 21:32:44 +03:00
} ) )
options_templates . update ( options_section ( ( ' face-restoration ' , " Face restoration " ) , {
2023-02-11 01:27:08 +03:00
" face_restoration_model " : OptionInfo ( " CodeFormer " , " Face restoration model " , gr . Radio , lambda : { " choices " : [ x . name ( ) for x in face_restorers ] } ) ,
2023-05-14 11:04:21 +03:00
" code_former_weight " : OptionInfo ( 0.5 , " CodeFormer weight " , gr . Slider , { " minimum " : 0 , " maximum " : 1 , " step " : 0.01 } ) . info ( " 0 = maximum effect; 1 = minimum effect " ) ,
2022-09-22 21:32:44 +03:00
" face_restoration_unload " : OptionInfo ( False , " Move face restoration model from VRAM into RAM after processing " ) ,
2022-09-22 20:41:22 +03:00
} ) )
2022-09-22 21:32:44 +03:00
options_templates . update ( options_section ( ( ' system ' , " System " ) , {
2023-01-18 23:04:24 +03:00
" show_warnings " : OptionInfo ( False , " Show warnings in console. " ) ,
2023-05-14 11:04:21 +03:00
" memmon_poll_rate " : OptionInfo ( 8 , " VRAM usage polls per second during generation. " , gr . Slider , { " minimum " : 0 , " maximum " : 40 , " step " : 1 } ) . info ( " 0 = disable " ) ,
2022-09-22 21:32:44 +03:00
" samples_log_stdout " : OptionInfo ( False , " Always print all generation info to standard output " ) ,
2022-10-04 14:38:45 +03:00
" multiple_tqdm " : OptionInfo ( True , " Add a second progress bar to the console that shows progress for an entire job. " ) ,
2023-01-14 10:25:21 +03:00
" print_hypernet_extra " : OptionInfo ( False , " Print extra hypernetwork information to console. " ) ,
2023-05-17 21:45:26 +03:00
" list_hidden_files " : OptionInfo ( True , " Load models/files in hidden directories " ) . info ( " directory is hidden if its name starts with \" . \" " ) ,
2023-06-27 09:19:04 +03:00
" disable_mmap_load_safetensors " : OptionInfo ( False , " Disable memmapping for loading .safetensors files. " ) . info ( " fixes very slow loading speed in some cases " ) ,
2022-09-22 20:41:22 +03:00
} ) )
2022-10-11 19:03:08 +03:00
options_templates . update ( options_section ( ( ' training ' , " Training " ) , {
2022-10-31 14:26:08 +03:00
" unload_models_when_training " : OptionInfo ( False , " Move VAE and CLIP to RAM when training if possible. Saves VRAM. " ) ,
2022-11-20 06:35:26 +03:00
" pin_memory " : OptionInfo ( False , " Turn on pin_memory for DataLoader. Makes training slightly faster but can increase memory usage. " ) ,
2023-01-03 12:26:37 +03:00
" save_optimizer_state " : OptionInfo ( False , " Saves Optimizer state as separate *.optim file. Training of embedding or HN can be resumed with the matching optim file. " ) ,
2023-01-06 08:52:06 +03:00
" save_training_settings_to_txt " : OptionInfo ( True , " Save textual inversion and hypernet settings to a text file whenever training starts. " ) ,
2022-10-12 20:49:47 +03:00
" dataset_filename_word_regex " : OptionInfo ( " " , " Filename word regex " ) ,
" dataset_filename_join_string " : OptionInfo ( " " , " Filename join string " ) ,
2022-10-14 22:43:55 +03:00
" training_image_repeats_per_epoch " : OptionInfo ( 1 , " Number of repeats for a single input image per epoch; used only for displaying epoch number " , gr . Number , { " precision " : 0 } ) ,
" training_write_csv_every " : OptionInfo ( 500 , " Save an csv containing the loss to log directory every N steps, 0 to disable " ) ,
2022-10-31 14:26:08 +03:00
" training_xattention_optimizations " : OptionInfo ( False , " Use cross attention optimizations while training " ) ,
2022-10-20 17:26:16 +03:00
" training_enable_tensorboard " : OptionInfo ( False , " Enable tensorboard logging. " ) ,
" training_tensorboard_save_images " : OptionInfo ( False , " Save generated images within tensorboard. " ) ,
" training_tensorboard_flush_every " : OptionInfo ( 120 , " How often, in seconds, to flush the pending tensorboard events and summaries to disk. " ) ,
2022-10-11 19:03:08 +03:00
} ) )
2022-09-22 21:32:44 +03:00
options_templates . update ( options_section ( ( ' sd ' , " Stable Diffusion " ) , {
2022-11-26 16:10:46 +03:00
" sd_model_checkpoint " : OptionInfo ( None , " Stable Diffusion checkpoint " , gr . Dropdown , lambda : { " choices " : list_checkpoint_tiles ( ) } , refresh = refresh_checkpoints ) ,
2022-10-14 08:00:38 +03:00
" sd_checkpoint_cache " : OptionInfo ( 0 , " Checkpoints to cache in RAM " , gr . Slider , { " minimum " : 0 , " maximum " : 10 , " step " : 1 } ) ,
2022-12-25 15:49:25 +03:00
" sd_vae_checkpoint_cache " : OptionInfo ( 0 , " VAE Checkpoints to cache in RAM " , gr . Slider , { " minimum " : 0 , " maximum " : 10 , " step " : 1 } ) ,
2023-05-14 11:04:21 +03:00
" sd_vae " : OptionInfo ( " Automatic " , " SD VAE " , gr . Dropdown , lambda : { " choices " : shared_items . sd_vae_items ( ) } , refresh = shared_items . refresh_vae_list ) . info ( " choose VAE model: Automatic = use one with same filename as checkpoint; None = use VAE from checkpoint " ) ,
2023-01-16 00:44:46 +03:00
" sd_vae_as_default " : OptionInfo ( True , " Ignore selected VAE for stable diffusion checkpoints that have their own .vae.pt next to them " ) ,
2023-05-27 15:47:33 +03:00
" sd_unet " : OptionInfo ( " Automatic " , " SD Unet " , gr . Dropdown , lambda : { " choices " : shared_items . sd_unet_items ( ) } , refresh = shared_items . refresh_unet_list ) . info ( " choose Unet model: Automatic = use one with same filename as checkpoint; None = use Unet from checkpoint " ) ,
2022-10-27 21:45:35 +03:00
" inpainting_mask_weight " : OptionInfo ( 1.0 , " Inpainting conditioning mask strength " , gr . Slider , { " minimum " : 0.0 , " maximum " : 1.0 , " step " : 0.01 } ) ,
2023-01-22 00:02:41 +03:00
" initial_noise_multiplier " : OptionInfo ( 1.0 , " Noise multiplier for img2img " , gr . Slider , { " minimum " : 0.5 , " maximum " : 1.5 , " step " : 0.01 } ) ,
2022-09-22 20:41:22 +03:00
" img2img_color_correction " : OptionInfo ( False , " Apply color correction to img2img results to match original colors. " ) ,
2023-05-14 11:04:21 +03:00
" img2img_fix_steps " : OptionInfo ( False , " With img2img, do exactly the amount of steps the slider specifies. " ) . info ( " normally you ' d do less with less denoising " ) ,
2023-01-10 23:47:02 +03:00
" img2img_background_color " : OptionInfo ( " #ffffff " , " With img2img, fill image ' s transparent parts with this color. " , ui_components . FormColorPicker , { } ) ,
2022-09-22 20:41:22 +03:00
" enable_quantization " : OptionInfo ( False , " Enable quantization in K samplers for sharper and cleaner results. This may change existing seeds. Requires restart to apply. " ) ,
2023-05-14 11:04:21 +03:00
" enable_emphasis " : OptionInfo ( True , " Enable emphasis " ) . info ( " use (text) to make model pay more attention to text and [text] to make it pay less attention " ) ,
2022-09-22 20:41:22 +03:00
" enable_batch_seeds " : OptionInfo ( True , " Make K-diffusion samplers produce same images in a batch as when making a single image " ) ,
2023-05-14 11:04:21 +03:00
" comma_padding_backtrack " : OptionInfo ( 20 , " Prompt word wrap length limit " , gr . Slider , { " minimum " : 0 , " maximum " : 74 , " step " : 1 } ) . info ( " in tokens - for texts shorter than specified, if they don ' t fit into 75 token limit, move them to the next 75 token chunk " ) ,
2023-06-09 22:59:27 +03:00
" CLIP_stop_at_last_layers " : OptionInfo ( 1 , " Clip skip " , gr . Slider , { " minimum " : 1 , " maximum " : 12 , " step " : 1 } ) . link ( " wiki " , " https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#clip-skip " ) . info ( " ignore last layers of CLIP network; 1 ignores none, 2 ignores one layer " ) ,
2023-01-25 08:23:10 +03:00
" upcast_attn " : OptionInfo ( False , " Upcast cross attention layer to float32 " ) ,
2023-05-28 18:39:00 +03:00
" randn_source " : OptionInfo ( " GPU " , " Random number generator source. " , gr . Radio , { " choices " : [ " GPU " , " CPU " ] } ) . info ( " changes seeds drastically; use CPU to produce the same picture across different videocard vendors " ) ,
2023-05-17 20:22:38 +03:00
} ) )
options_templates . update ( options_section ( ( ' optimizations ' , " Optimizations " ) , {
2023-05-18 22:48:28 +03:00
" cross_attention_optimization " : OptionInfo ( " Automatic " , " Cross attention optimization " , gr . Dropdown , lambda : { " choices " : shared_items . cross_attention_optimizations ( ) } ) ,
2023-05-30 03:17:25 +03:00
" s_min_uncond " : OptionInfo ( 0.0 , " Negative Guidance minimum sigma " , gr . Slider , { " minimum " : 0.0 , " maximum " : 4.0 , " step " : 0.01 } ) . link ( " PR " , " https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/9177 " ) . info ( " skip negative prompt for some steps when the image is almost ready; 0=disable, higher=faster " ) ,
2023-05-14 10:02:51 +03:00
" token_merging_ratio " : OptionInfo ( 0.0 , " Token merging ratio " , gr . Slider , { " minimum " : 0.0 , " maximum " : 0.9 , " step " : 0.1 } ) . link ( " PR " , " https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/9256 " ) . info ( " 0=disable, higher=faster " ) ,
2023-05-17 20:22:38 +03:00
" token_merging_ratio_img2img " : OptionInfo ( 0.0 , " Token merging ratio for img2img " , gr . Slider , { " minimum " : 0.0 , " maximum " : 0.9 , " step " : 0.1 } ) . info ( " only applies if non-zero and overrides above " ) ,
" token_merging_ratio_hr " : OptionInfo ( 0.0 , " Token merging ratio for high-res pass " , gr . Slider , { " minimum " : 0.0 , " maximum " : 0.9 , " step " : 0.1 } ) . info ( " only applies if non-zero and overrides above " ) ,
2023-05-22 00:13:53 +03:00
" pad_cond_uncond " : OptionInfo ( False , " Pad prompt/negative prompt to be same length " ) . info ( " improves performance when prompt and negative prompt have different lengths; changes seeds " ) ,
2023-06-08 07:53:02 +03:00
" experimental_persistent_cond_cache " : OptionInfo ( False , " persistent cond cache " ) . info ( " Experimental, keep cond caches across jobs, reduce overhead. " ) ,
2022-09-22 20:41:22 +03:00
} ) )
2023-01-01 09:51:37 +03:00
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_karras_scheduler_sigmas " : OptionInfo ( False , " Use old karras scheduler sigmas (0.1 to 10). " ) ,
2023-02-11 05:12:16 +03:00
" no_dpmpp_sde_batch_determinism " : OptionInfo ( False , " Do not make DPM++ SDE deterministic across different batch sizes. " ) ,
2023-01-09 14:57:47 +03:00
" 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). " ) ,
2023-04-17 04:06:22 +03:00
" dont_fix_second_order_samplers_schedule " : OptionInfo ( False , " Do not fix prompt schedule for second order samplers. " ) ,
2023-06-04 13:07:22 +03:00
" hires_fix_use_firstpass_conds " : OptionInfo ( False , " For hires fix, calculate conds of second pass using extra networks of first pass. " ) ,
2023-01-01 09:51:37 +03:00
} ) )
2022-10-12 09:00:07 +03:00
options_templates . update ( options_section ( ( ' interrogate ' , " Interrogate Options " ) , {
2023-05-14 11:04:21 +03:00
" interrogate_keep_models_in_memory " : OptionInfo ( False , " Keep models in VRAM " ) ,
" interrogate_return_ranks " : OptionInfo ( False , " Include ranks of model tags matches in results. " ) . info ( " booru only " ) ,
" interrogate_clip_num_beams " : OptionInfo ( 1 , " BLIP: num_beams " , gr . Slider , { " minimum " : 1 , " maximum " : 16 , " step " : 1 } ) ,
" interrogate_clip_min_length " : OptionInfo ( 24 , " BLIP: minimum description length " , gr . Slider , { " minimum " : 1 , " maximum " : 128 , " step " : 1 } ) ,
" interrogate_clip_max_length " : OptionInfo ( 48 , " BLIP: maximum description length " , gr . Slider , { " minimum " : 1 , " maximum " : 256 , " step " : 1 } ) ,
" interrogate_clip_dict_limit " : OptionInfo ( 1500 , " CLIP: maximum number of lines in text file " ) . info ( " 0 = No limit " ) ,
2023-01-23 20:29:23 +03:00
" interrogate_clip_skip_categories " : OptionInfo ( [ ] , " CLIP: skip inquire categories " , gr . CheckboxGroup , lambda : { " choices " : modules . interrogate . category_types ( ) } , refresh = modules . interrogate . category_types ) ,
2023-05-14 11:04:21 +03:00
" interrogate_deepbooru_score_threshold " : OptionInfo ( 0.5 , " deepbooru: score threshold " , gr . Slider , { " minimum " : 0 , " maximum " : 1 , " step " : 0.01 } ) ,
" deepbooru_sort_alpha " : OptionInfo ( True , " deepbooru: sort tags alphabetically " ) . info ( " if not: sort by score " ) ,
" deepbooru_use_spaces " : OptionInfo ( True , " deepbooru: use spaces in tags " ) . info ( " if not: use underscores " ) ,
" deepbooru_escape " : OptionInfo ( True , " deepbooru: escape ( \\ ) brackets " ) . info ( " so they are used as literal brackets and not for emphasis " ) ,
" deepbooru_filter_tags " : OptionInfo ( " " , " deepbooru: filter out those tags " ) . info ( " separate by comma " ) ,
2022-10-12 09:00:07 +03:00
} ) )
2022-09-22 20:41:22 +03:00
2023-01-22 00:27:57 +03:00
options_templates . update ( options_section ( ( ' extra_networks ' , " Extra Networks " ) , {
2023-05-17 21:45:26 +03:00
" extra_networks_show_hidden_directories " : OptionInfo ( True , " Show hidden directories " ) . info ( " directory is hidden if its name starts with \" . \" . " ) ,
" extra_networks_hidden_models " : OptionInfo ( " When searched " , " Show cards for models in hidden directories " , gr . Radio , { " choices " : [ " Always " , " When searched " , " Never " ] } ) . info ( ' " When searched " option will only show the item when the search string has 4 characters or more ' ) ,
2023-01-28 17:18:47 +03:00
" extra_networks_default_view " : OptionInfo ( " cards " , " Default view for Extra Networks " , gr . Dropdown , { " choices " : [ " cards " , " thumbs " ] } ) ,
" extra_networks_default_multiplier " : OptionInfo ( 1.0 , " Multiplier for extra networks " , gr . Slider , { " minimum " : 0.0 , " maximum " : 1.0 , " step " : 0.01 } ) ,
2023-05-14 11:04:21 +03:00
" extra_networks_card_width " : OptionInfo ( 0 , " Card width for Extra Networks " ) . info ( " in pixels " ) ,
" extra_networks_card_height " : OptionInfo ( 0 , " Card height for Extra Networks " ) . info ( " in pixels " ) ,
" extra_networks_add_text_separator " : OptionInfo ( " " , " Extra networks separator " ) . info ( " extra text to add before <...> when adding extra network to prompt " ) ,
2023-05-18 20:16:09 +03:00
" ui_extra_networks_tab_reorder " : OptionInfo ( " " , " Extra networks tab order " ) . needs_restart ( ) ,
2023-05-11 13:30:33 +03:00
" sd_hypernetwork " : OptionInfo ( " None " , " Add hypernetwork to prompt " , gr . Dropdown , lambda : { " choices " : [ " None " , * hypernetworks ] } , refresh = reload_hypernetworks ) ,
2023-01-22 00:27:57 +03:00
} ) )
2022-09-22 21:32:44 +03:00
options_templates . update ( options_section ( ( ' ui ' , " User interface " ) , {
2023-05-14 11:04:21 +03:00
" localization " : OptionInfo ( " None " , " Localization " , gr . Dropdown , lambda : { " choices " : [ " None " ] + list ( localization . localizations . keys ( ) ) } , refresh = lambda : localization . list_localizations ( cmd_opts . localizations_dir ) ) . needs_restart ( ) ,
" gradio_theme " : OptionInfo ( " Default " , " Gradio theme " , ui_components . DropdownEditable , lambda : { " choices " : [ " Default " ] + gradio_hf_hub_themes } ) . needs_restart ( ) ,
2023-05-17 23:42:01 +03:00
" img2img_editor_height " : OptionInfo ( 720 , " img2img: height of image editor " , gr . Slider , { " minimum " : 80 , " maximum " : 1600 , " step " : 1 } ) . info ( " in pixels " ) . needs_restart ( ) ,
2022-09-22 21:32:44 +03:00
" return_grid " : OptionInfo ( True , " Show grid in results for web " ) ,
2023-03-22 20:51:40 +03:00
" return_mask " : OptionInfo ( False , " For inpainting, include the greyscale mask in results for web " ) ,
" return_mask_composite " : OptionInfo ( False , " For inpainting, include masked composite in results for web " ) ,
2022-10-04 17:23:48 +03:00
" do_not_show_images " : OptionInfo ( False , " Do not show any images in results for web " ) ,
2022-10-29 09:57:22 +03:00
" send_seed " : OptionInfo ( True , " Send seed when sending prompt or image to other interface " ) ,
2022-12-05 14:41:36 +03:00
" send_size " : OptionInfo ( True , " Send size when sending prompt or image to another interface " ) ,
2022-09-22 21:32:44 +03:00
" js_modal_lightbox " : OptionInfo ( True , " Enable full page image viewer " ) ,
2022-10-08 22:12:24 +03:00
" js_modal_lightbox_initially_zoomed " : OptionInfo ( True , " Show images zoomed in by default in full page image viewer " ) ,
2023-05-18 23:59:31 +03:00
" js_modal_lightbox_gamepad " : OptionInfo ( False , " Navigate image viewer with gamepad " ) ,
2023-05-07 07:16:51 +03:00
" js_modal_lightbox_gamepad_repeat " : OptionInfo ( 250 , " Gamepad repeat period, in milliseconds " ) ,
2022-10-06 03:35:07 +03:00
" show_progress_in_title " : OptionInfo ( True , " Show generation progress in window title. " ) ,
2023-05-14 11:04:21 +03:00
" samplers_in_dropdown " : OptionInfo ( True , " Use dropdown for sampler selection instead of radio group " ) . needs_restart ( ) ,
" dimensions_and_batch_together " : OptionInfo ( True , " Show Width/Height and Batch sliders in same row " ) . needs_restart ( ) ,
2023-01-22 08:05:21 +03:00
" keyedit_precision_attention " : OptionInfo ( 0.1 , " Ctrl+up/down precision when editing (attention:1.1) " , gr . Slider , { " minimum " : 0.01 , " maximum " : 0.2 , " step " : 0.001 } ) ,
" keyedit_precision_extra " : OptionInfo ( 0.05 , " Ctrl+up/down precision when editing <extra networks:0.9> " , gr . Slider , { " minimum " : 0.01 , " maximum " : 0.2 , " step " : 0.001 } ) ,
2023-05-08 15:38:25 +03:00
" keyedit_delimiters " : OptionInfo ( " ., \\ /!? % ^*;: {} =`~() " , " Ctrl+up/down word delimiters " ) ,
2023-07-08 16:15:28 +03:00
" keyedit_move " : OptionInfo ( True , " Alt+left/right moves prompt elements " ) ,
2023-05-14 11:04:21 +03:00
" quicksettings_list " : OptionInfo ( [ " sd_model_checkpoint " ] , " Quicksettings list " , ui_components . DropdownMulti , lambda : { " choices " : list ( opts . data_labels . keys ( ) ) } ) . js ( " info " , " settingsHintsShowQuicksettings " ) . info ( " setting entries that appear at the top of page rather than in settings tab " ) . needs_restart ( ) ,
2023-05-17 23:11:33 +03:00
" ui_tab_order " : OptionInfo ( [ ] , " UI tab order " , ui_components . DropdownMulti , lambda : { " choices " : list ( tab_names ) } ) . needs_restart ( ) ,
2023-05-14 11:04:21 +03:00
" hidden_tabs " : OptionInfo ( [ ] , " Hidden UI tabs " , ui_components . DropdownMulti , lambda : { " choices " : list ( tab_names ) } ) . needs_restart ( ) ,
2023-05-31 23:05:44 +03:00
" ui_reorder_list " : OptionInfo ( [ ] , " txt2img/img2img UI item order " , ui_components . DropdownMulti , lambda : { " choices " : list ( shared_items . ui_reorder_categories ( ) ) } ) . info ( " selected items appear first " ) . needs_restart ( ) ,
2023-05-18 20:16:09 +03:00
" hires_fix_show_sampler " : OptionInfo ( False , " Hires fix: show hires sampler selection " ) . needs_restart ( ) ,
" hires_fix_show_prompts " : OptionInfo ( False , " Hires fix: show hires prompt and negative prompt " ) . needs_restart ( ) ,
2023-05-21 23:20:50 +03:00
" disable_token_counters " : OptionInfo ( False , " Disable prompt token counters " ) . needs_restart ( ) ,
2022-09-22 21:32:44 +03:00
} ) )
2023-05-08 15:26:23 +03:00
options_templates . update ( options_section ( ( ' infotext ' , " Infotext " ) , {
" add_model_hash_to_info " : OptionInfo ( True , " Add model hash to generation information " ) ,
" add_model_name_to_info " : OptionInfo ( True , " Add model name to generation information " ) ,
2023-06-15 18:55:53 +03:00
" add_user_name_to_info " : OptionInfo ( False , " Add user name to generation information when authenticated " ) ,
2023-05-08 15:26:23 +03:00
" add_version_to_infotext " : OptionInfo ( True , " Add program version to generation information " ) ,
2023-06-04 10:56:48 +03:00
" disable_weights_auto_swap " : OptionInfo ( True , " Disregard checkpoint information from pasted infotext " ) . info ( " when reading generation parameters from text into UI " ) ,
" infotext_styles " : OptionInfo ( " Apply if any " , " Infer styles from prompts of pasted infotext " , gr . Radio , { " choices " : [ " Ignore " , " Apply " , " Discard " , " Apply if any " ] } ) . info ( " when reading generation parameters from text into UI) " ) . html ( """ <ul style= ' margin-left: 1.5em ' >
< li > Ignore : keep prompt and styles dropdown as it is . < / li >
< li > Apply : remove style text from prompt , always replace styles dropdown value with found styles ( even if none are found ) . < / li >
< li > Discard : remove style text from prompt , keep styles dropdown as it is . < / li >
< li > Apply if any : remove style text from prompt ; if any styles are found in prompt , put them into styles dropdown , otherwise keep it as it is . < / li >
< / ul > """ ),
2023-05-08 15:26:23 +03:00
} ) )
2023-01-14 16:29:23 +03:00
options_templates . update ( options_section ( ( ' ui ' , " Live previews " ) , {
2023-01-16 12:56:30 +03:00
" show_progressbar " : OptionInfo ( True , " Show progressbar " ) ,
2023-01-14 16:29:23 +03:00
" live_previews_enable " : OptionInfo ( True , " Show live previews of the created image " ) ,
2023-05-14 11:15:15 +03:00
" live_previews_image_format " : OptionInfo ( " png " , " Live preview file format " , gr . Radio , { " choices " : [ " jpeg " , " png " , " webp " ] } ) ,
2023-01-15 18:50:56 +03:00
" show_progress_grid " : OptionInfo ( True , " Show previews of all images generated in a batch as a grid " ) ,
2023-05-14 11:04:21 +03:00
" show_progress_every_n_steps " : OptionInfo ( 10 , " Live preview display period " , gr . Slider , { " minimum " : - 1 , " maximum " : 32 , " step " : 1 } ) . info ( " in sampling steps - show new live preview image every N sampling steps; -1 = only show after completion of batch " ) ,
2023-05-17 09:26:26 +03:00
" show_progress_type " : OptionInfo ( " Approx NN " , " Live preview method " , gr . Radio , { " choices " : [ " Full " , " Approx NN " , " Approx cheap " , " TAESD " ] } ) . info ( " Full = slow but pretty; Approx NN and TAESD = fast but low quality; Approx cheap = super fast but terrible otherwise " ) ,
2023-01-14 16:29:23 +03:00
" live_preview_content " : OptionInfo ( " Prompt " , " Live preview subject " , gr . Radio , { " choices " : [ " Combined " , " Prompt " , " Negative prompt " ] } ) ,
2023-05-14 11:04:21 +03:00
" live_preview_refresh_period " : OptionInfo ( 1000 , " Progressbar and preview update period " ) . info ( " in milliseconds " ) ,
2023-01-14 16:29:23 +03:00
} ) )
2022-09-26 10:00:11 +03:00
options_templates . update ( options_section ( ( ' sampler-params ' , " Sampler parameters " ) , {
2023-05-14 11:04:21 +03:00
" hide_samplers " : OptionInfo ( [ ] , " Hide samplers in user interface " , gr . CheckboxGroup , lambda : { " choices " : [ x . name for x in list_samplers ( ) ] } ) . needs_restart ( ) ,
" eta_ddim " : OptionInfo ( 0.0 , " Eta for DDIM " , gr . Slider , { " minimum " : 0.0 , " maximum " : 1.0 , " step " : 0.01 } ) . info ( " noise multiplier; higher = more unperdictable results " ) ,
" eta_ancestral " : OptionInfo ( 1.0 , " Eta for ancestral samplers " , gr . Slider , { " minimum " : 0.0 , " maximum " : 1.0 , " step " : 0.01 } ) . info ( " noise multiplier; applies to Euler a and other samplers that have a in them " ) ,
2022-10-06 12:08:48 +03:00
" ddim_discretize " : OptionInfo ( ' uniform ' , " img2img DDIM discretize " , gr . Radio , { " choices " : [ ' uniform ' , ' quad ' ] } ) ,
' s_churn ' : OptionInfo ( 0.0 , " sigma churn " , gr . Slider , { " minimum " : 0.0 , " maximum " : 1.0 , " step " : 0.01 } ) ,
' s_tmin ' : OptionInfo ( 0.0 , " sigma tmin " , gr . Slider , { " minimum " : 0.0 , " maximum " : 1.0 , " step " : 0.01 } ) ,
' s_noise ' : OptionInfo ( 1.0 , " sigma noise " , gr . Slider , { " minimum " : 0.0 , " maximum " : 1.0 , " step " : 0.01 } ) ,
2023-05-27 19:53:09 +03:00
' k_sched_type ' : OptionInfo ( " Automatic " , " scheduler type " , gr . Dropdown , { " choices " : [ " Automatic " , " karras " , " exponential " , " polyexponential " ] } ) . info ( " lets you override the noise schedule for k-diffusion samplers; choosing Automatic disables the three parameters below " ) ,
' sigma_min ' : OptionInfo ( 0.0 , " sigma min " , gr . Number ) . info ( " 0 = default (~0.03); minimum noise strength for k-diffusion noise scheduler " ) ,
' sigma_max ' : OptionInfo ( 0.0 , " sigma max " , gr . Number ) . info ( " 0 = default (~14.6); maximum noise strength for k-diffusion noise schedule " ) ,
' rho ' : OptionInfo ( 0.0 , " rho " , gr . Number ) . info ( " 0 = default (7 for karras, 1 for polyexponential); higher values result in a more steep noise schedule (decreases faster) " ) ,
2023-05-14 11:04:21 +03:00
' eta_noise_seed_delta ' : OptionInfo ( 0 , " Eta noise seed delta " , gr . Number , { " precision " : 0 } ) . info ( " ENSD; does not improve anything, just produces different results for ancestral samplers - only useful for reproducing images " ) ,
' always_discard_next_to_last_sigma ' : OptionInfo ( False , " Always discard next-to-last sigma " ) . link ( " PR " , " https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/6044 " ) ,
2023-03-11 03:56:14 +03:00
' uni_pc_variant ' : OptionInfo ( " bh1 " , " UniPC variant " , gr . Radio , { " choices " : [ " bh1 " , " bh2 " , " vary_coeff " ] } ) ,
2023-02-10 16:27:05 +03:00
' uni_pc_skip_type ' : OptionInfo ( " time_uniform " , " UniPC skip type " , gr . Radio , { " choices " : [ " time_uniform " , " time_quadratic " , " logSNR " ] } ) ,
2023-05-14 11:04:21 +03:00
' uni_pc_order ' : OptionInfo ( 3 , " UniPC order " , gr . Slider , { " minimum " : 1 , " maximum " : 50 , " step " : 1 } ) . info ( " must be < sampling steps " ) ,
2023-02-10 16:27:05 +03:00
' uni_pc_lower_order_final ' : OptionInfo ( True , " UniPC lower order final " ) ,
2022-09-26 10:00:11 +03:00
} ) )
2022-09-03 12:08:45 +03:00
2023-01-23 09:24:43 +03:00
options_templates . update ( options_section ( ( ' postprocessing ' , " Postprocessing " ) , {
2023-01-26 23:29:27 +03:00
' postprocessing_enable_in_main_ui ' : OptionInfo ( [ ] , " Enable postprocessing operations in txt2img and img2img tabs " , ui_components . DropdownMulti , lambda : { " choices " : [ x . name for x in shared_items . postprocessing_scripts ( ) ] } ) ,
' postprocessing_operation_order ' : OptionInfo ( [ ] , " Postprocessing operation order " , ui_components . DropdownMulti , lambda : { " choices " : [ x . name for x in shared_items . postprocessing_scripts ( ) ] } ) ,
2023-01-23 09:24:43 +03:00
' upscaling_max_images_in_cache ' : OptionInfo ( 5 , " Maximum number of images in upscaling cache " , gr . Slider , { " minimum " : 0 , " maximum " : 10 , " step " : 1 } ) ,
} ) )
2022-10-31 17:36:45 +03:00
options_templates . update ( options_section ( ( None , " Hidden options " ) , {
2023-03-27 19:04:45 +03:00
" disabled_extensions " : OptionInfo ( [ ] , " Disable these extensions " ) ,
2023-03-27 19:44:49 +03:00
" disable_all_extensions " : OptionInfo ( " none " , " Disable all extensions (preserves the list of disabled extensions) " , gr . Radio , { " choices " : [ " none " , " extra " , " all " ] } ) ,
2023-03-30 00:46:03 +03:00
" restore_config_state_file " : OptionInfo ( " " , " Config state file to restore from, under ' config-states/ ' folder " ) ,
2023-01-14 15:55:40 +03:00
" sd_checkpoint_hash " : OptionInfo ( " " , " SHA256 hash of the current checkpoint " ) ,
2022-10-31 17:36:45 +03:00
} ) )
2023-04-02 06:18:35 +03:00
2022-10-31 17:36:45 +03:00
options_templates . update ( )
2022-10-06 12:08:48 +03:00
2022-09-22 20:41:22 +03:00
class Options :
2022-09-03 12:08:45 +03:00
data = None
2022-09-22 20:41:22 +03:00
data_labels = options_templates
2022-09-23 17:27:30 +03:00
typemap = { int : float }
2022-09-03 12:08:45 +03:00
def __init__ ( self ) :
self . data = { k : v . default for k , v in self . data_labels . items ( ) }
def __setattr__ ( self , key , value ) :
if self . data is not None :
2022-10-31 17:36:45 +03:00
if key in self . data or key in self . data_labels :
2022-11-04 09:42:25 +03:00
assert not cmd_opts . freeze_settings , " changing settings is disabled "
2022-11-04 16:48:40 +03:00
info = opts . data_labels . get ( key , None )
comp_args = info . component_args if info else None
2022-11-04 09:42:25 +03:00
if isinstance ( comp_args , dict ) and comp_args . get ( ' visible ' , True ) is False :
raise RuntimeError ( f " not possible to set { key } because it is restricted " )
if cmd_opts . hide_ui_dir_config and key in restricted_opts :
raise RuntimeError ( f " not possible to set { key } because it is restricted " )
2022-09-03 12:08:45 +03:00
self . data [ key ] = value
2022-10-31 17:36:45 +03:00
return
2022-09-03 12:08:45 +03:00
return super ( Options , self ) . __setattr__ ( key , value )
def __getattr__ ( self , item ) :
if self . data is not None :
if item in self . data :
return self . data [ item ]
if item in self . data_labels :
return self . data_labels [ item ] . default
return super ( Options , self ) . __getattribute__ ( item )
2022-11-19 15:15:24 +03:00
def set ( self , key , value ) :
""" sets an option and calls its onchange callback, returning True if the option changed and False otherwise """
oldval = self . data . get ( key , None )
if oldval == value :
return False
try :
setattr ( self , key , value )
except RuntimeError :
return False
if self . data_labels [ key ] . onchange is not None :
2023-01-04 12:35:07 +03:00
try :
self . data_labels [ key ] . onchange ( )
except Exception as e :
errors . display ( e , f " changing setting { key } to { value } " )
setattr ( self , key , oldval )
return False
2022-11-19 15:15:24 +03:00
return True
2023-03-11 12:09:36 +03:00
def get_default ( self , key ) :
""" returns the default value for the key """
data_label = self . data_labels . get ( key )
if data_label is None :
return None
return data_label . default
2022-09-03 12:08:45 +03:00
def save ( self , filename ) :
2022-11-04 09:42:25 +03:00
assert not cmd_opts . freeze_settings , " saving settings is disabled "
2022-09-03 12:08:45 +03:00
with open ( filename , " w " , encoding = " utf8 " ) as file :
2022-10-24 09:14:34 +03:00
json . dump ( self . data , file , indent = 4 )
2022-09-03 12:08:45 +03:00
2022-09-23 17:27:30 +03:00
def same_type ( self , x , y ) :
if x is None or y is None :
return True
2022-09-23 09:15:00 +03:00
2022-09-23 17:27:30 +03:00
type_x = self . typemap . get ( type ( x ) , type ( x ) )
type_y = self . typemap . get ( type ( y ) , type ( y ) )
2022-09-23 09:15:00 +03:00
2022-09-23 17:27:30 +03:00
return type_x == type_y
2022-09-23 09:15:00 +03:00
2022-09-23 17:27:30 +03:00
def load ( self , filename ) :
with open ( filename , " r " , encoding = " utf8 " ) as file :
self . data = json . load ( file )
2022-09-23 09:15:00 +03:00
2023-05-09 12:14:12 +03:00
# 1.1.1 quicksettings list migration
if self . data . get ( ' quicksettings ' ) is not None and self . data . get ( ' quicksettings_list ' ) is None :
self . data [ ' quicksettings_list ' ] = [ i . strip ( ) for i in self . data . get ( ' quicksettings ' ) . split ( ' , ' ) ]
2023-05-31 20:31:17 +03:00
# 1.4.0 ui_reorder
2023-05-31 23:05:44 +03:00
if isinstance ( self . data . get ( ' ui_reorder ' ) , str ) and self . data . get ( ' ui_reorder ' ) and " ui_reorder_list " not in self . data :
self . data [ ' ui_reorder_list ' ] = [ i . strip ( ) for i in self . data . get ( ' ui_reorder ' ) . split ( ' , ' ) ]
2023-05-31 20:31:17 +03:00
2022-09-23 09:15:00 +03:00
bad_settings = 0
for k , v in self . data . items ( ) :
info = self . data_labels . get ( k , None )
2022-09-23 17:27:30 +03:00
if info is not None and not self . same_type ( info . default , v ) :
2022-09-23 09:15:00 +03:00
print ( f " Warning: bad setting value: { k } : { v } ( { type ( v ) . __name__ } ; expected { type ( info . default ) . __name__ } ) " , file = sys . stderr )
bad_settings + = 1
if bad_settings > 0 :
print ( f " The program is likely to not work with bad settings. \n Settings file: { filename } \n Either fix the file, or delete it and restart. " , file = sys . stderr )
2022-10-30 17:54:31 +03:00
def onchange ( self , key , func , call = True ) :
2022-09-17 12:05:04 +03:00
item = self . data_labels . get ( key )
item . onchange = func
2022-10-30 17:54:31 +03:00
if call :
func ( )
2022-10-13 20:12:37 +03:00
2022-09-18 22:25:18 +03:00
def dumpjson ( self ) :
2023-05-14 10:02:51 +03:00
d = { k : self . data . get ( k , v . default ) for k , v in self . data_labels . items ( ) }
d [ " _comments_before " ] = { k : v . comment_before for k , v in self . data_labels . items ( ) if v . comment_before is not None }
d [ " _comments_after " ] = { k : v . comment_after for k , v in self . data_labels . items ( ) if v . comment_after is not None }
2022-09-18 22:25:18 +03:00
return json . dumps ( d )
2022-10-22 19:18:56 +03:00
def add_option ( self , key , info ) :
self . data_labels [ key ] = info
def reorder ( self ) :
""" reorder settings so that all items related to section always go together """
section_ids = { }
settings_items = self . data_labels . items ( )
2023-05-10 11:37:18 +03:00
for _ , item in settings_items :
2022-10-22 19:18:56 +03:00
if item . section not in section_ids :
section_ids [ item . section ] = len ( section_ids )
2023-05-10 11:05:02 +03:00
self . data_labels = dict ( sorted ( settings_items , key = lambda x : section_ids [ x [ 1 ] . section ] ) )
2022-10-22 19:18:56 +03:00
2023-01-30 00:25:30 +03:00
def cast_value ( self , key , value ) :
""" casts an arbitrary to the same type as this setting ' s value with key
Example : cast_value ( " eta_noise_seed_delta " , " 12 " ) - > returns 12 ( an int rather than str )
"""
if value is None :
return None
default_value = self . data_labels [ key ] . default
if default_value is None :
default_value = getattr ( self , key , None )
if default_value is None :
return None
expected_type = type ( default_value )
if expected_type == bool and value == " False " :
value = False
else :
value = expected_type ( value )
return value
2022-09-03 12:08:45 +03:00
opts = Options ( )
if os . path . exists ( config_filename ) :
opts . load ( config_filename )
2023-05-02 09:08:00 +03:00
class Shared ( sys . modules [ __name__ ] . __class__ ) :
"""
this class is here to provide sd_model field as a property , so that it can be created and loaded on demand rather than
at program startup .
"""
sd_model_val = None
@property
def sd_model ( self ) :
import modules . sd_models
return modules . sd_models . model_data . get_sd_model ( )
@sd_model.setter
def sd_model ( self , value ) :
import modules . sd_models
modules . sd_models . model_data . set_sd_model ( value )
sd_model : LatentDiffusion = None # this var is here just for IDE's type checking; it cannot be accessed because the class field above will be accessed instead
sys . modules [ __name__ ] . __class__ = Shared
2023-01-30 00:25:30 +03:00
settings_components = None
2023-05-02 09:08:00 +03:00
""" assinged from ui.py, a mapping on setting names to gradio components repsponsible for those settings """
2023-01-30 00:25:30 +03:00
2023-01-02 19:42:10 +03:00
latent_upscale_default_mode = " Latent "
latent_upscale_modes = {
2023-01-04 13:12:06 +03:00
" Latent " : { " mode " : " bilinear " , " antialias " : False } ,
" Latent (antialiased) " : { " mode " : " bilinear " , " antialias " : True } ,
" Latent (bicubic) " : { " mode " : " bicubic " , " antialias " : False } ,
2023-01-04 13:36:18 +03:00
" Latent (bicubic antialiased) " : { " mode " : " bicubic " , " antialias " : True } ,
2023-01-04 13:12:06 +03:00
" Latent (nearest) " : { " mode " : " nearest " , " antialias " : False } ,
2023-01-05 18:17:39 +03:00
" Latent (nearest-exact) " : { " mode " : " nearest-exact " , " antialias " : False } ,
2023-01-02 19:42:10 +03:00
}
2022-09-04 18:54:12 +03:00
sd_upscalers = [ ]
2022-09-03 12:08:45 +03:00
2022-10-16 18:53:56 +03:00
clip_model = None
2022-09-05 23:08:06 +03:00
2022-09-08 16:37:13 +03:00
progress_print_out = sys . stdout
2022-09-05 23:08:06 +03:00
2023-03-25 23:11:41 +03:00
gradio_theme = gr . themes . Base ( )
def reload_gradio_theme ( theme_name = None ) :
global gradio_theme
if not theme_name :
theme_name = opts . gradio_theme
2023-05-13 15:57:32 +03:00
default_theme_args = dict (
font = [ " Source Sans Pro " , ' ui-sans-serif ' , ' system-ui ' , ' sans-serif ' ] ,
font_mono = [ ' IBM Plex Mono ' , ' ui-monospace ' , ' Consolas ' , ' monospace ' ] ,
)
2023-03-25 23:11:41 +03:00
if theme_name == " Default " :
2023-05-13 15:57:32 +03:00
gradio_theme = gr . themes . Default ( * * default_theme_args )
2023-03-25 23:11:41 +03:00
else :
try :
gradio_theme = gr . themes . ThemeClass . from_hub ( theme_name )
2023-05-10 07:14:13 +03:00
except Exception as e :
errors . display ( e , " changing gradio theme " )
2023-05-13 15:57:32 +03:00
gradio_theme = gr . themes . Default ( * * default_theme_args )
2023-03-25 23:11:41 +03:00
2022-09-08 16:37:13 +03:00
class TotalTQDM :
def __init__ ( self ) :
self . _tqdm = None
def reset ( self ) :
self . _tqdm = tqdm . tqdm (
desc = " Total progress " ,
total = state . job_count * state . sampling_steps ,
position = 1 ,
file = progress_print_out
)
def update ( self ) :
2022-10-02 20:23:40 +03:00
if not opts . multiple_tqdm or cmd_opts . disable_console_progressbars :
2022-09-08 16:37:13 +03:00
return
if self . _tqdm is None :
self . reset ( )
self . _tqdm . update ( )
2022-09-24 08:09:59 +03:00
def updateTotal ( self , new_total ) :
2022-10-02 20:23:40 +03:00
if not opts . multiple_tqdm or cmd_opts . disable_console_progressbars :
2022-09-24 08:09:59 +03:00
return
if self . _tqdm is None :
self . reset ( )
2023-01-04 23:56:43 +03:00
self . _tqdm . total = new_total
2022-09-24 08:09:59 +03:00
2022-09-08 16:37:13 +03:00
def clear ( self ) :
if self . _tqdm is not None :
2023-03-12 16:19:23 +03:00
self . _tqdm . refresh ( )
2022-09-08 16:37:13 +03:00
self . _tqdm . close ( )
self . _tqdm = None
total_tqdm = TotalTQDM ( )
2022-09-17 07:49:31 +03:00
mem_mon = modules . memmon . MemUsageMonitor ( " MemMon " , device , opts )
mem_mon . start ( )
2022-10-29 08:11:03 +03:00
2023-07-08 16:45:59 +03:00
def natural_sort_key ( s , regex = re . compile ( ' ([0-9]+) ' ) ) :
return [ int ( text ) if text . isdigit ( ) else text . lower ( ) for text in regex . split ( s ) ]
2022-10-29 08:11:03 +03:00
def listfiles ( dirname ) :
2023-07-08 16:45:59 +03:00
filenames = [ os . path . join ( dirname , x ) for x in sorted ( os . listdir ( dirname ) , key = natural_sort_key ) if not x . startswith ( " . " ) ]
2022-10-29 08:11:03 +03:00
return [ file for file in filenames if os . path . isfile ( file ) ]
2023-01-21 08:36:07 +03:00
def html_path ( filename ) :
return os . path . join ( script_path , " html " , filename )
def html ( filename ) :
path = html_path ( filename )
if os . path . exists ( path ) :
with open ( path , encoding = " utf8 " ) as file :
return file . read ( )
return " "
2023-05-08 11:33:45 +03:00
def walk_files ( path , allowed_extensions = None ) :
if not os . path . exists ( path ) :
return
if allowed_extensions is not None :
allowed_extensions = set ( allowed_extensions )
2023-07-08 16:45:59 +03:00
items = list ( os . walk ( path , followlinks = True ) )
items = sorted ( items , key = lambda x : natural_sort_key ( x [ 0 ] ) )
for root , _ , files in items :
for filename in sorted ( files , key = natural_sort_key ) :
2023-05-08 11:33:45 +03:00
if allowed_extensions is not None :
_ , ext = os . path . splitext ( filename )
if ext not in allowed_extensions :
continue
2023-05-17 21:45:26 +03:00
if not opts . list_hidden_files and ( " /. " in root or " \\ . " in root ) :
continue
2023-05-08 11:33:45 +03:00
yield os . path . join ( root , filename )