@ -20,6 +20,7 @@ from PIL import Image, PngImagePlugin
from modules . call_queue import wrap_gradio_gpu_call , wrap_queued_call , wrap_gradio_call
from modules import sd_hijack , sd_models , localization , script_callbacks , ui_extensions , deepbooru
from modules . ui_components import FormRow , FormGroup , ToolButton
from modules . paths import script_path
from modules . shared import opts , cmd_opts , restricted_opts
@ -80,7 +81,6 @@ css_hide_progressbar = """
# Important that they exactly match script.js for tooltip to work.
random_symbol = ' \U0001f3b2 \ufe0f ' # 🎲️
reuse_symbol = ' \u267b \ufe0f ' # ♻️
art_symbol = ' \U0001f3a8 ' # 🎨
paste_symbol = ' \u2199 \ufe0f ' # ↙
folder_symbol = ' \U0001f4c2 ' # 📂
refresh_symbol = ' \U0001f504 ' # 🔄
@ -159,7 +159,7 @@ def save_files(js_data, images, do_make_zip, index):
zip_file . writestr ( filenames [ i ] , f . read ( ) )
fullfns . insert ( 0 , zip_filepath )
return gr . File . update ( value = fullfns , visible = True ) , ' ' , ' ' , plaintext_to_html ( f " Saved: { filenames [ 0 ] } " )
return gr . File . update ( value = fullfns , visible = True ) , plaintext_to_html ( f " Saved: { filenames [ 0 ] } " )
@ -234,13 +234,6 @@ def check_progress_call_initial(id_part):
return check_progress_call ( id_part )
def roll_artist ( prompt ) :
allowed_cats = set ( [ x for x in shared . artist_db . categories ( ) if len ( opts . random_artist_categories ) == 0 or x in opts . random_artist_categories ] )
artist = random . choice ( [ x for x in shared . artist_db . artists if x . category in allowed_cats ] )
return prompt + " , " + artist . name if prompt != ' ' else artist . name
def visit ( x , func , path = " " ) :
if hasattr ( x , ' children ' ) :
for c in x . children :
@ -280,35 +273,31 @@ def interrogate_deepbooru(image):
return gr_show ( True ) if prompt is None else prompt
def create_seed_inputs ( ) :
with gr . Row ( ) :
with gr . Box ( ) :
with gr . Row ( elem_id = ' seed_row ' ) :
seed = ( gr . Textbox if cmd_opts . use_textbox_seed else gr . Number ) ( label = ' Seed ' , value = - 1 )
seed . style ( container = False )
random_seed = gr . Button ( random_symbol , elem_id = ' random_seed ' )
reuse_seed = gr . Button ( reuse_symbol , elem_id = ' reuse_seed ' )
def create_seed_inputs ( target_interface ) :
with FormRow ( elem_id = target_interface + ' _seed_row ' ) :
seed = ( gr . Textbox if cmd_opts . use_textbox_seed else gr . Number ) ( label = ' Seed ' , value = - 1 , elem_id = target_interface + ' _seed ' )
seed . style ( container = False )
random_seed = gr . Button ( random_symbol , elem_id = target_interface + ' _random_seed ' )
reuse_seed = gr . Button ( reuse_symbol , elem_id = target_interface + ' _reuse_seed ' )
with gr . Box( elem_id = ' subseed_show_box' ) :
seed_checkbox = gr . Checkbox ( label = ' Extra ' , elem_id = ' subseed_show' , value = False )
with gr . Group ( elem_id = target_interface + ' _subseed_show_box ' ) :
seed_checkbox = gr . Checkbox ( label = ' Extra ' , elem_id = target_interface + ' _ subseed_show' , value = False )
# Components to show/hide based on the 'Extra' checkbox
seed_extras = [ ]
with gr. Row ( visible = False ) as seed_extra_row_1 :
with FormRow( visible = False , elem_id = target_interface + ' _subseed_row ' ) as seed_extra_row_1 :
seed_extras . append ( seed_extra_row_1 )
with gr . Box ( ) :
with gr . Row ( elem_id = ' subseed_row ' ) :
subseed = gr . Number ( label = ' Variation seed ' , value = - 1 )
subseed . style ( container = False )
random_subseed = gr . Button ( random_symbol , elem_id = ' random_subseed ' )
reuse_subseed = gr . Button ( reuse_symbol , elem_id = ' reuse_subseed ' )
subseed_strength = gr . Slider ( label = ' Variation strength ' , value = 0.0 , minimum = 0 , maximum = 1 , step = 0.01 )
with gr . Row ( visible = False ) as seed_extra_row_2 :
subseed = gr . Number ( label = ' Variation seed ' , value = - 1 , elem_id = target_interface + ' _subseed ' )
subseed . style ( container = False )
random_subseed = gr . Button ( random_symbol , elem_id = target_interface + ' _random_subseed ' )
reuse_subseed = gr . Button ( reuse_symbol , elem_id = target_interface + ' _reuse_subseed ' )
subseed_strength = gr . Slider ( label = ' Variation strength ' , value = 0.0 , minimum = 0 , maximum = 1 , step = 0.01 , elem_id = target_interface + ' _subseed_strength ' )
with FormRow ( visible = False ) as seed_extra_row_2 :
seed_extras . append ( seed_extra_row_2 )
seed_resize_from_w = gr . Slider ( minimum = 0 , maximum = 2048 , step = 8 , label = " Resize seed from width " , value = 0 )
seed_resize_from_h = gr . Slider ( minimum = 0 , maximum = 2048 , step = 8 , label = " Resize seed from height " , value = 0 )
seed_resize_from_w = gr . Slider ( minimum = 0 , maximum = 2048 , step = 8 , label = " Resize seed from width " , value = 0 , elem_id = target_interface + ' _seed_resize_from_w ' )
seed_resize_from_h = gr . Slider ( minimum = 0 , maximum = 2048 , step = 8 , label = " Resize seed from height " , value = 0 , elem_id = target_interface + ' _seed_resize_from_h ' )
random_seed . click ( fn = lambda : - 1 , show_progress = False , inputs = [ ] , outputs = [ seed ] )
random_subseed . click ( fn = lambda : - 1 , show_progress = False , inputs = [ ] , outputs = [ subseed ] )
@ -403,7 +392,6 @@ def create_toprow(is_img2img):
)
with gr . Column ( scale = 1 , elem_id = " roll_col " ) :
roll = gr . Button ( value = art_symbol , elem_id = " roll " , visible = len ( shared . artist_db . artists ) > 0 )
paste = gr . Button ( value = paste_symbol , elem_id = " paste " )
save_style = gr . Button ( value = save_style_symbol , elem_id = " style_create " )
prompt_style_apply = gr . Button ( value = apply_style_symbol , elem_id = " style_apply " )
@ -452,7 +440,7 @@ def create_toprow(is_img2img):
prompt_style2 = gr . Dropdown ( label = " Style 2 " , elem_id = f " { id_part } _style2_index " , choices = [ k for k , v in shared . prompt_styles . styles . items ( ) ] , value = next ( iter ( shared . prompt_styles . styles . keys ( ) ) ) )
prompt_style2 . save_to_config = True
return prompt , roll, prompt_style, negative_prompt , prompt_style2 , submit , button_interrogate , button_deepbooru , prompt_style_apply , save_style , paste , token_counter , token_button
return prompt , prompt_style, negative_prompt , prompt_style2 , submit , button_interrogate , button_deepbooru , prompt_style_apply , save_style , paste , token_counter , token_button
def setup_progressbar ( progressbar , preview , id_part , textinfo = None ) :
@ -500,7 +488,7 @@ def apply_setting(key, value):
return
valtype = type ( opts . data_labels [ key ] . default )
oldval = opts . data [ key ]
oldval = opts . data . get ( key , None )
opts . data [ key ] = valtype ( value ) if valtype != type ( None ) else value
if oldval != value and opts . data_labels [ key ] . onchange is not None :
opts . data_labels [ key ] . onchange ( )
@ -532,7 +520,7 @@ def create_refresh_button(refresh_component, refresh_method, refreshed_args, ele
return gr . update ( * * ( args or { } ) )
refresh_button = gr. Button( value = refresh_symbol , elem_id = elem_id )
refresh_button = Tool Button( value = refresh_symbol , elem_id = elem_id )
refresh_button . click (
fn = refresh ,
inputs = [ ] ,
@ -570,13 +558,14 @@ Requested path was: {f}
generation_info = None
with gr . Column ( ) :
with gr . Row ( ) :
with gr . Row ( elem_id = f " image_buttons_ { tabname } " ) :
open_folder_button = gr . Button ( folder_symbol , elem_id = " hidden_element " if shared . cmd_opts . hide_ui_dir_config else ' open_folder ' )
if tabname != " extras " :
save = gr . Button ( ' Save ' , elem_id = f ' save_ { tabname } ' )
save_zip = gr . Button ( ' Zip ' , elem_id = f ' save_zip_ { tabname } ' )
buttons = parameters_copypaste . create_buttons ( [ " img2img " , " inpaint " , " extras " ] )
button_id = " hidden_element " if shared . cmd_opts . hide_ui_dir_config else ' open_folder '
open_folder_button = gr . Button ( folder_symbol , elem_id = button_id )
open_folder_button . click (
fn = lambda : open_folder ( opts . outdir_samples or outdir ) ,
@ -585,14 +574,13 @@ Requested path was: {f}
)
if tabname != " extras " :
with gr . Row ( ) :
do_make_zip = gr . Checkbox ( label = " Make Zip when Save? " , value = False )
with gr . Row ( ) :
download_files = gr . File ( None , file_count = " multiple " , interactive = False , show_label = False , visible = False )
with gr . Group ( ) :
html_info = gr . HTML ( )
html_log = gr . HTML ( )
generation_info = gr . Textbox ( visible = False )
if tabname == ' txt2img ' or tabname == ' img2img ' :
generation_info_button = gr . Button ( visible = False , elem_id = f " { tabname } _generation_info_button " )
@ -606,25 +594,61 @@ Requested path was: {f}
save . click (
fn = wrap_gradio_call ( save_files ) ,
_js = " (x, y, z, w) => [x, y, z , selected_gallery_index()]" ,
_js = " (x, y, z, w) => [x, y, false , selected_gallery_index()]" ,
inputs = [
generation_info ,
result_gallery ,
do_make_zip ,
html_info ,
html_info ,
] ,
outputs = [
download_files ,
html_log ,
]
)
save_zip . click (
fn = wrap_gradio_call ( save_files ) ,
_js = " (x, y, z, w) => [x, y, true, selected_gallery_index()] " ,
inputs = [
generation_info ,
result_gallery ,
html_info ,
html_info ,
html_info ,
] ,
outputs = [
download_files ,
html_log ,
]
)
else :
html_info_x = gr . HTML ( )
html_info = gr . HTML ( )
html_log = gr . HTML ( )
parameters_copypaste . bind_buttons ( buttons , result_gallery , " txt2img " if tabname == " txt2img " else None )
return result_gallery , generation_info if tabname != " extras " else html_info_x , html_info
return result_gallery , generation_info if tabname != " extras " else html_info_x , html_info , html_log
def create_sampler_and_steps_selection ( choices , tabname ) :
if opts . samplers_in_dropdown :
with FormRow ( elem_id = f " sampler_selection_ { tabname } " ) :
sampler_index = gr . Dropdown ( label = ' Sampling method ' , elem_id = f " { tabname } _sampling " , choices = [ x . name for x in choices ] , value = choices [ 0 ] . name , type = " index " )
steps = gr . Slider ( minimum = 1 , maximum = 150 , step = 1 , elem_id = f " { tabname } _steps " , label = " Sampling Steps " , value = 20 )
else :
with FormGroup ( elem_id = f " sampler_selection_ { tabname } " ) :
steps = gr . Slider ( minimum = 1 , maximum = 150 , step = 1 , elem_id = f " { tabname } _steps " , label = " Sampling Steps " , value = 20 )
sampler_index = gr . Radio ( label = ' Sampling method ' , elem_id = f " { tabname } _sampling " , choices = [ x . name for x in choices ] , value = choices [ 0 ] . name , type = " index " )
return steps , sampler_index
def ordered_ui_categories ( ) :
user_order = { x . strip ( ) : i for i , x in enumerate ( shared . opts . ui_reorder . split ( " , " ) ) }
for i , category in sorted ( enumerate ( shared . ui_reorder_categories ) , key = lambda x : user_order . get ( x [ 1 ] , x [ 0 ] + 1000 ) ) :
yield category
def create_ui ( ) :
@ -639,14 +663,11 @@ def create_ui():
modules . scripts . scripts_txt2img . initialize_scripts ( is_img2img = False )
with gr . Blocks ( analytics_enabled = False ) as txt2img_interface :
txt2img_prompt , roll, txt2img_prompt_style, txt2img_negative_prompt , txt2img_prompt_style2 , submit , _ , _ , txt2img_prompt_style_apply , txt2img_save_style , txt2img_paste , token_counter , token_button = create_toprow ( is_img2img = False )
txt2img_prompt , txt2img_prompt_style, txt2img_negative_prompt , txt2img_prompt_style2 , submit , _ , _ , txt2img_prompt_style_apply , txt2img_save_style , txt2img_paste , token_counter , token_button = create_toprow ( is_img2img = False )
dummy_component = gr . Label ( visible = False )
txt_prompt_img = gr . File ( label = " " , elem_id = " txt2img_prompt_image " , file_count = " single " , type = " bytes " , visible = False )
with gr . Row ( elem_id = ' txt2img_progress_row ' ) :
with gr . Column ( scale = 1 ) :
pass
@ -658,42 +679,57 @@ def create_ui():
with gr . Row ( ) . style ( equal_height = False ) :
with gr . Column ( variant = ' panel ' , elem_id = " txt2img_settings " ) :
steps = gr . Slider ( minimum = 1 , maximum = 150 , step = 1 , label = " Sampling Steps " , value = 20 )
sampler_index = gr . Radio ( label = ' Sampling method ' , elem_id = " txt2img_sampling " , choices = [ x . name for x in samplers ] , value = samplers [ 0 ] . name , type = " index " )
with gr . Group ( ) :
width = gr . Slider ( minimum = 64 , maximum = 2048 , step = 8 , label = " Width " , value = 512 )
height = gr . Slider ( minimum = 64 , maximum = 2048 , step = 8 , label = " Height " , value = 512 )
with gr . Row ( ) :
restore_faces = gr . Checkbox ( label = ' Restore faces ' , value = False , visible = len ( shared . face_restorers ) > 1 )
tiling = gr . Checkbox ( label = ' Tiling ' , value = False )
enable_hr = gr . Checkbox ( label = ' Highres. fix ' , value = False )
with gr . Row ( visible = False ) as hr_options :
firstphase_width = gr . Slider ( minimum = 0 , maximum = 1024 , step = 8 , label = " Firstpass width " , value = 0 )
firstphase_height = gr . Slider ( minimum = 0 , maximum = 1024 , step = 8 , label = " Firstpass height " , value = 0 )
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 ) :
batch_count = gr . Slider ( minimum = 1 , step = 1 , label = ' Batch count ' , value = 1 )
batch_size = gr . Slider ( minimum = 1 , maximum = 8 , step = 1 , label = ' Batch size ' , value = 1 )
cfg_scale = gr . Slider ( minimum = 1.0 , maximum = 30.0 , step = 0.5 , label = ' CFG Scale ' , value = 7.0 )
seed , reuse_seed , subseed , reuse_subseed , subseed_strength , seed_resize_from_h , seed_resize_from_w , seed_checkbox = create_seed_inputs ( )
with gr . Group ( ) :
custom_inputs = modules . scripts . scripts_txt2img . setup_ui ( )
txt2img_gallery , generation_info , html_info = create_output_panel ( " txt2img " , opts . outdir_txt2img_samples )
for category in ordered_ui_categories ( ) :
if category == " sampler " :
steps , sampler_index = create_sampler_and_steps_selection ( samplers , " txt2img " )
elif category == " dimensions " :
with FormRow ( ) :
with gr . Column ( elem_id = " txt2img_column_size " , scale = 4 ) :
width = gr . Slider ( minimum = 64 , maximum = 2048 , step = 8 , label = " Width " , value = 512 , elem_id = " txt2img_width " )
height = gr . Slider ( minimum = 64 , maximum = 2048 , step = 8 , label = " Height " , value = 512 , elem_id = " txt2img_height " )
if opts . dimensions_and_batch_together :
with gr . Column ( elem_id = " txt2img_column_batch " ) :
batch_count = gr . Slider ( minimum = 1 , step = 1 , label = ' Batch count ' , value = 1 , elem_id = " txt2img_batch_count " )
batch_size = gr . Slider ( minimum = 1 , maximum = 8 , step = 1 , label = ' Batch size ' , value = 1 , elem_id = " txt2img_batch_size " )
elif category == " cfg " :
cfg_scale = gr . Slider ( minimum = 1.0 , maximum = 30.0 , step = 0.5 , label = ' CFG Scale ' , value = 7.0 , elem_id = " txt2img_cfg_scale " )
elif category == " seed " :
seed , reuse_seed , subseed , reuse_subseed , subseed_strength , seed_resize_from_h , seed_resize_from_w , seed_checkbox = create_seed_inputs ( ' txt2img ' )
elif category == " checkboxes " :
with FormRow ( elem_id = " txt2img_checkboxes " ) :
restore_faces = gr . Checkbox ( label = ' Restore faces ' , value = False , visible = len ( shared . face_restorers ) > 1 , elem_id = " txt2img_restore_faces " )
tiling = gr . Checkbox ( label = ' Tiling ' , value = False , elem_id = " txt2img_tiling " )
enable_hr = gr . Checkbox ( label = ' Hires. fix ' , value = False , elem_id = " txt2img_enable_hr " )
elif category == " hires_fix " :
with FormRow ( visible = False , elem_id = " txt2img_hires_fix " ) as hr_options :
hr_upscaler = gr . Dropdown ( label = " Upscaler " , elem_id = " txt2img_hr_upscaler " , choices = [ * shared . latent_upscale_modes , * [ x . name for x in shared . sd_upscalers ] ] , value = shared . latent_upscale_default_mode )
hr_scale = gr . Slider ( minimum = 1.0 , maximum = 4.0 , step = 0.05 , label = " Upscale by " , value = 2.0 , elem_id = " txt2img_hr_scale " )
denoising_strength = gr . Slider ( minimum = 0.0 , maximum = 1.0 , step = 0.01 , label = ' Denoising strength ' , value = 0.7 , elem_id = " txt2img_denoising_strength " )
elif category == " batch " :
if not opts . dimensions_and_batch_together :
with FormRow ( elem_id = " txt2img_column_batch " ) :
batch_count = gr . Slider ( minimum = 1 , step = 1 , label = ' Batch count ' , value = 1 , elem_id = " txt2img_batch_count " )
batch_size = gr . Slider ( minimum = 1 , maximum = 8 , step = 1 , label = ' Batch size ' , value = 1 , elem_id = " txt2img_batch_size " )
elif category == " scripts " :
with FormGroup ( elem_id = " txt2img_script_container " ) :
custom_inputs = modules . scripts . scripts_txt2img . setup_ui ( )
txt2img_gallery , generation_info , html_info , html_log = create_output_panel ( " txt2img " , opts . outdir_txt2img_samples )
parameters_copypaste . bind_buttons ( { " txt2img " : txt2img_paste } , None , txt2img_prompt )
connect_reuse_seed ( seed , reuse_seed , generation_info , dummy_component , is_subseed = False )
connect_reuse_seed ( subseed , reuse_subseed , generation_info , dummy_component , is_subseed = True )
txt2img_args = dict (
fn = wrap_gradio_gpu_call ( modules . txt2img . txt2img ) ,
fn = wrap_gradio_gpu_call ( modules . txt2img . txt2img , extra_outputs = [ None , ' ' , ' ' ] ),
_js = " submit " ,
inputs = [
txt2img_prompt ,
@ -713,14 +749,15 @@ def create_ui():
width ,
enable_hr ,
denoising_strength ,
firstphase_width ,
firstphase_height ,
hr_scale ,
hr_upscaler ,
] + custom_inputs ,
outputs = [
txt2img_gallery ,
generation_info ,
html_info
html_info ,
html_log ,
] ,
show_progress = False ,
)
@ -745,17 +782,6 @@ def create_ui():
outputs = [ hr_options ] ,
)
roll . click (
fn = roll_artist ,
_js = " update_txt2img_tokens " ,
inputs = [
txt2img_prompt ,
] ,
outputs = [
txt2img_prompt ,
]
)
txt2img_paste_fields = [
( txt2img_prompt , " Prompt " ) ,
( txt2img_negative_prompt , " Negative prompt " ) ,
@ -774,8 +800,8 @@ def create_ui():
( denoising_strength , " Denoising strength " ) ,
( enable_hr , lambda d : " Denoising strength " in d ) ,
( hr_options , lambda d : gr . Row . update ( visible = " Denoising strength " in d ) ) ,
( firstphase_width, " First pass size-1 " ) ,
( firstphase_height, " First pass size-2 " ) ,
( hr_scale, " Hires upscale " ) ,
( hr_upscaler, " Hires upscaler " ) ,
* modules . scripts . scripts_txt2img . infotext_fields
]
parameters_copypaste . add_paste_fields ( " txt2img " , None , txt2img_paste_fields )
@ -797,8 +823,7 @@ def create_ui():
modules . scripts . scripts_img2img . initialize_scripts ( is_img2img = True )
with gr . Blocks ( analytics_enabled = False ) as img2img_interface :
img2img_prompt , roll , img2img_prompt_style , img2img_negative_prompt , img2img_prompt_style2 , submit , img2img_interrogate , img2img_deepbooru , img2img_prompt_style_apply , img2img_save_style , img2img_paste , token_counter , token_button = create_toprow ( is_img2img = True )
img2img_prompt , img2img_prompt_style , img2img_negative_prompt , img2img_prompt_style2 , submit , img2img_interrogate , img2img_deepbooru , img2img_prompt_style_apply , img2img_save_style , img2img_paste , token_counter , token_button = create_toprow ( is_img2img = True )
with gr . Row ( elem_id = ' img2img_progress_row ' ) :
img2img_prompt_img = gr . File ( label = " " , elem_id = " img2img_prompt_image " , file_count = " single " , type = " bytes " , visible = False )
@ -811,14 +836,14 @@ def create_ui():
img2img_preview = gr . Image ( elem_id = ' img2img_preview ' , visible = False )
setup_progressbar ( progressbar , img2img_preview , ' img2img ' )
with gr. Row( ) . style ( equal_height = False ) :
with Form Row( ) . style ( equal_height = False ) :
with gr . Column ( variant = ' panel ' , elem_id = " img2img_settings " ) :
with gr . Tabs ( elem_id = " mode_img2img " ) as tabs_img2img_mode :
with gr . TabItem ( ' img2img ' , id = ' img2img ' ):
with gr . TabItem ( ' img2img ' , id = ' img2img ' , elem_id = " img2img_img2img_tab " ):
init_img = gr . Image ( label = " Image for img2img " , elem_id = " img2img_image " , show_label = False , source = " upload " , interactive = True , type = " pil " , tool = cmd_opts . gradio_img2img_tool , image_mode = " RGBA " ) . style ( height = 480 )
with gr . TabItem ( ' Inpaint ' , id = ' inpaint ' ):
with gr . TabItem ( ' Inpaint ' , id = ' inpaint ' , elem_id = " img2img_inpaint_tab " ):
init_img_with_mask = gr . Image ( label = " Image for inpainting with mask " , show_label = False , elem_id = " img2maskimg " , source = " upload " , interactive = True , type = " pil " , tool = cmd_opts . gradio_inpaint_tool , image_mode = " RGBA " ) . style ( height = 480 )
init_img_with_mask_orig = gr . State ( None )
@ -836,54 +861,72 @@ def create_ui():
init_img_inpaint = gr . Image ( label = " Image for img2img " , show_label = False , source = " upload " , interactive = True , type = " pil " , visible = False , elem_id = " img_inpaint_base " )
init_mask_inpaint = gr . Image ( label = " Mask " , source = " upload " , interactive = True , type = " pil " , visible = False , elem_id = " img_inpaint_mask " )
with gr . Row ( ) :
mask_blur = gr . Slider ( label = ' Mask blur ' , minimum = 0 , maximum = 64 , step = 1 , value = 4 )
mask_alpha = gr . Slider ( label = " Mask transparency " , interactive = use_color_sketch , visible = use_color_sketch )
with FormRow ( ) :
mask_blur = gr . Slider ( label = ' Mask blur ' , minimum = 0 , maximum = 64 , step = 1 , value = 4 , elem_id = " img2img_mask_blur " )
mask_alpha = gr . Slider ( label = " Mask transparency " , interactive = use_color_sketch , visible = use_color_sketch , elem_id = " img2img_mask_alpha " )
with FormRow ( ) :
mask_mode = gr . Radio ( label = " Mask source " , choices = [ " Draw mask " , " Upload mask " ] , type = " index " , value = " Draw mask " , elem_id = " mask_mode " )
inpainting_mask_invert = gr . Radio ( label = ' Mask mode ' , choices = [ ' Inpaint masked ' , ' Inpaint not masked ' ] , value = ' Inpaint masked ' , type = " index " , elem_id = " img2img_mask_mode " )
with gr . Row ( ) :
mask_mode = gr . Radio ( label = " Mask mode " , show_label = False , choices = [ " Draw mask " , " Upload mask " ] , type = " index " , value = " Draw mask " , elem_id = " mask_mode " )
inpainting_mask_invert = gr . Radio ( label = ' Masking mode ' , show_label = False , choices = [ ' Inpaint masked ' , ' Inpaint not masked ' ] , value = ' Inpaint masked ' , type = " index " )
with FormRow ( ) :
inpainting_fill = gr . Radio ( label = ' Masked content ' , choices = [ ' fill ' , ' original ' , ' latent noise ' , ' latent nothing ' ] , value = ' original ' , type = " index " , elem_id = " img2img_inpainting_fill " )
inpainting_fill = gr . Radio ( label = ' Masked content ' , choices = [ ' fill ' , ' original ' , ' latent noise ' , ' latent nothing ' ] , value = ' original ' , type = " index " )
with FormRow ( ) :
with gr . Column ( ) :
inpaint_full_res = gr . Radio ( label = " Inpaint area " , choices = [ " Whole picture " , " Only masked " ] , type = " index " , value = " Whole picture " , elem_id = " img2img_inpaint_full_res " )
with gr . Row ( ) :
inpaint_full_res = gr . Checkbox ( label = ' Inpaint at full resolution ' , value = False )
inpaint_full_res_padding = gr . Slider ( label = ' Inpaint at full resolution padding, pixels ' , minimum = 0 , maximum = 256 , step = 4 , value = 32 )
with gr . Column ( scale = 4 ) :
inpaint_full_res_padding = gr . Slider ( label = ' Only masked padding, pixels ' , minimum = 0 , maximum = 256 , step = 4 , value = 32 , elem_id = " img2img_inpaint_full_res_padding " )
with gr . TabItem ( ' Batch img2img ' , id = ' batch ' ):
with gr . TabItem ( ' Batch img2img ' , id = ' batch ' , elem_id = " img2img_batch_tab " ):
hidden = ' <br>Disabled when launched with --hide-ui-dir-config. ' if shared . cmd_opts . hide_ui_dir_config else ' '
gr . HTML ( f " <p class= \" text-gray-500 \" >Process images in a directory on the same machine where the server is running.<br>Use an empty output directory to save pictures normally instead of writing to the output directory. { hidden } </p> " )
img2img_batch_input_dir = gr . Textbox ( label = " Input directory " , * * shared . hide_dirs )
img2img_batch_output_dir = gr . Textbox ( label = " Output directory " , * * shared . hide_dirs )
with gr . Row ( ) :
resize_mode = gr . Radio ( label = " Resize mode " , elem_id = " resize_mode " , show_label = False , choices = [ " Just resize " , " Crop and resize " , " Resize and fill " , " Just resize (latent upscale) " ] , type = " index " , value = " Just resize " )
steps = gr . Slider ( minimum = 1 , maximum = 150 , step = 1 , label = " Sampling Steps " , value = 20 )
sampler_index = gr . Radio ( label = ' Sampling method ' , choices = [ x . name for x in samplers_for_img2img ] , value = samplers_for_img2img [ 0 ] . name , type = " index " )
with gr . Group ( ) :
width = gr . Slider ( minimum = 64 , maximum = 2048 , step = 8 , label = " Width " , value = 512 , elem_id = " img2img_width " )
height = gr . Slider ( minimum = 64 , maximum = 2048 , step = 8 , label = " Height " , value = 512 , elem_id = " img2img_height " )
with gr . Row ( ) :
restore_faces = gr . Checkbox ( label = ' Restore faces ' , value = False , visible = len ( shared . face_restorers ) > 1 )
tiling = gr . Checkbox ( label = ' Tiling ' , value = False )
with gr . Row ( ) :
batch_count = gr . Slider ( minimum = 1 , step = 1 , label = ' Batch count ' , value = 1 )
batch_size = gr . Slider ( minimum = 1 , maximum = 8 , step = 1 , label = ' Batch size ' , value = 1 )
with gr . Group ( ) :
cfg_scale = gr . Slider ( minimum = 1.0 , maximum = 30.0 , step = 0.5 , label = ' CFG Scale ' , value = 7.0 )
denoising_strength = gr . Slider ( minimum = 0.0 , maximum = 1.0 , step = 0.01 , label = ' Denoising strength ' , value = 0.75 )
seed , reuse_seed , subseed , reuse_subseed , subseed_strength , seed_resize_from_h , seed_resize_from_w , seed_checkbox = create_seed_inputs ( )
with gr . Group ( ) :
custom_inputs = modules . scripts . scripts_img2img . setup_ui ( )
img2img_gallery , generation_info , html_info = create_output_panel ( " img2img " , opts . outdir_img2img_samples )
img2img_batch_input_dir = gr . Textbox ( label = " Input directory " , * * shared . hide_dirs , elem_id = " img2img_batch_input_dir " )
img2img_batch_output_dir = gr . Textbox ( label = " Output directory " , * * shared . hide_dirs , elem_id = " img2img_batch_output_dir " )
with FormRow ( ) :
resize_mode = gr . Radio ( label = " Resize mode " , elem_id = " resize_mode " , choices = [ " Just resize " , " Crop and resize " , " Resize and fill " , " Just resize (latent upscale) " ] , type = " index " , value = " Just resize " )
for category in ordered_ui_categories ( ) :
if category == " sampler " :
steps , sampler_index = create_sampler_and_steps_selection ( samplers_for_img2img , " img2img " )
elif category == " dimensions " :
with FormRow ( ) :
with gr . Column ( elem_id = " img2img_column_size " , scale = 4 ) :
width = gr . Slider ( minimum = 64 , maximum = 2048 , step = 8 , label = " Width " , value = 512 , elem_id = " img2img_width " )
height = gr . Slider ( minimum = 64 , maximum = 2048 , step = 8 , label = " Height " , value = 512 , elem_id = " img2img_height " )
if opts . dimensions_and_batch_together :
with gr . Column ( elem_id = " img2img_column_batch " ) :
batch_count = gr . Slider ( minimum = 1 , step = 1 , label = ' Batch count ' , value = 1 , elem_id = " img2img_batch_count " )
batch_size = gr . Slider ( minimum = 1 , maximum = 8 , step = 1 , label = ' Batch size ' , value = 1 , elem_id = " img2img_batch_size " )
elif category == " cfg " :
with FormGroup ( ) :
cfg_scale = gr . Slider ( minimum = 1.0 , maximum = 30.0 , step = 0.5 , label = ' CFG Scale ' , value = 7.0 , elem_id = " img2img_cfg_scale " )
denoising_strength = gr . Slider ( minimum = 0.0 , maximum = 1.0 , step = 0.01 , label = ' Denoising strength ' , value = 0.75 , elem_id = " img2img_denoising_strength " )
elif category == " seed " :
seed , reuse_seed , subseed , reuse_subseed , subseed_strength , seed_resize_from_h , seed_resize_from_w , seed_checkbox = create_seed_inputs ( ' img2img ' )
elif category == " checkboxes " :
with FormRow ( elem_id = " img2img_checkboxes " ) :
restore_faces = gr . Checkbox ( label = ' Restore faces ' , value = False , visible = len ( shared . face_restorers ) > 1 , elem_id = " img2img_restore_faces " )
tiling = gr . Checkbox ( label = ' Tiling ' , value = False , elem_id = " img2img_tiling " )
elif category == " batch " :
if not opts . dimensions_and_batch_together :
with FormRow ( elem_id = " img2img_column_batch " ) :
batch_count = gr . Slider ( minimum = 1 , step = 1 , label = ' Batch count ' , value = 1 , elem_id = " img2img_batch_count " )
batch_size = gr . Slider ( minimum = 1 , maximum = 8 , step = 1 , label = ' Batch size ' , value = 1 , elem_id = " img2img_batch_size " )
elif category == " scripts " :
with FormGroup ( elem_id = " img2img_script_container " ) :
custom_inputs = modules . scripts . scripts_img2img . setup_ui ( )
img2img_gallery , generation_info , html_info , html_log = create_output_panel ( " img2img " , opts . outdir_img2img_samples )
parameters_copypaste . bind_buttons ( { " img2img " : img2img_paste } , None , img2img_prompt )
connect_reuse_seed ( seed , reuse_seed , generation_info , dummy_component , is_subseed = False )
@ -915,7 +958,7 @@ def create_ui():
)
img2img_args = dict (
fn = wrap_gradio_gpu_call ( modules . img2img . img2img ),
fn = wrap_gradio_gpu_call ( modules . img2img . img2img , extra_outputs = [ None , ' ' , ' ' ] ),
_js = " submit_img2img " ,
inputs = [
dummy_component ,
@ -954,7 +997,8 @@ def create_ui():
outputs = [
img2img_gallery ,
generation_info ,
html_info
html_info ,
html_log ,
] ,
show_progress = False ,
)
@ -974,18 +1018,6 @@ def create_ui():
outputs = [ img2img_prompt ] ,
)
roll . click (
fn = roll_artist ,
_js = " update_img2img_tokens " ,
inputs = [
img2img_prompt ,
] ,
outputs = [
img2img_prompt ,
]
)
prompts = [ ( txt2img_prompt , txt2img_negative_prompt ) , ( img2img_prompt , img2img_negative_prompt ) ]
style_dropdowns = [ ( txt2img_prompt_style , txt2img_prompt_style2 ) , ( img2img_prompt_style , img2img_prompt_style2 ) ]
style_js_funcs = [ " update_txt2img_tokens " , " update_img2img_tokens " ]
@ -1038,50 +1070,50 @@ def create_ui():
with gr . Row ( ) . style ( equal_height = False ) :
with gr . Column ( variant = ' panel ' ) :
with gr . Tabs ( elem_id = " mode_extras " ) :
with gr . TabItem ( ' Single Image ' ):
extras_image = gr . Image ( label = " Source " , source = " upload " , interactive = True , type = " pil " )
with gr . TabItem ( ' Single Image ' , elem_id = " extras_single_tab " ):
extras_image = gr . Image ( label = " Source " , source = " upload " , interactive = True , type = " pil " , elem_id = " extras_image " )
with gr . TabItem ( ' Batch Process ' ):
image_batch = gr . File ( label = " Batch Process " , file_count = " multiple " , interactive = True , type = " file " )
with gr . TabItem ( ' Batch Process ' , elem_id = " extras_batch_process_tab " ):
image_batch = gr . File ( label = " Batch Process " , file_count = " multiple " , interactive = True , type = " file " , elem_id = " extras_image_batch " )
with gr . TabItem ( ' Batch from Directory ' ):
extras_batch_input_dir = gr . Textbox ( label = " Input directory " , * * shared . hide_dirs , placeholder = " A directory on the same machine where the server is running. " )
extras_batch_output_dir = gr . Textbox ( label = " Output directory " , * * shared . hide_dirs , placeholder = " Leave blank to save images to the default path. " )
show_extras_results = gr . Checkbox ( label = ' Show result images ' , value = True )
with gr . TabItem ( ' Batch from Directory ' , elem_id = " extras_batch_directory_tab " ):
extras_batch_input_dir = gr . Textbox ( label = " Input directory " , * * shared . hide_dirs , placeholder = " A directory on the same machine where the server is running. " , elem_id = " extras_batch_input_dir " )
extras_batch_output_dir = gr . Textbox ( label = " Output directory " , * * shared . hide_dirs , placeholder = " Leave blank to save images to the default path. " , elem_id = " extras_batch_output_dir " )
show_extras_results = gr . Checkbox ( label = ' Show result images ' , value = True , elem_id = " extras_show_extras_results " )
submit = gr . Button ( ' Generate ' , elem_id = " extras_generate " , variant = ' primary ' )
with gr . Tabs ( elem_id = " extras_resize_mode " ) :
with gr . TabItem ( ' Scale by ' ):
upscaling_resize = gr . Slider ( minimum = 1.0 , maximum = 8.0 , step = 0.05 , label = " Resize " , value = 4 )
with gr . TabItem ( ' Scale to ' ):
with gr . TabItem ( ' Scale by ' , elem_id = " extras_scale_by_tab " ):
upscaling_resize = gr . Slider ( minimum = 1.0 , maximum = 8.0 , step = 0.05 , label = " Resize " , value = 4 , elem_id = " extras_upscaling_resize " )
with gr . TabItem ( ' Scale to ' , elem_id = " extras_scale_to_tab " ):
with gr . Group ( ) :
with gr . Row ( ) :
upscaling_resize_w = gr . Number ( label = " Width " , value = 512 , precision = 0 )
upscaling_resize_h = gr . Number ( label = " Height " , value = 512 , precision = 0 )
upscaling_crop = gr . Checkbox ( label = ' Crop to fit ' , value = True )
upscaling_resize_w = gr . Number ( label = " Width " , value = 512 , precision = 0 , elem_id = " extras_upscaling_resize_w " )
upscaling_resize_h = gr . Number ( label = " Height " , value = 512 , precision = 0 , elem_id = " extras_upscaling_resize_h " )
upscaling_crop = gr . Checkbox ( label = ' Crop to fit ' , value = True , elem_id = " extras_upscaling_crop " )
with gr . Group ( ) :
extras_upscaler_1 = gr . Radio ( label = ' Upscaler 1 ' , elem_id = " extras_upscaler_1 " , choices = [ x . name for x in shared . sd_upscalers ] , value = shared . sd_upscalers [ 0 ] . name , type = " index " )
with gr . Group ( ) :
extras_upscaler_2 = gr . Radio ( label = ' Upscaler 2 ' , elem_id = " extras_upscaler_2 " , choices = [ x . name for x in shared . sd_upscalers ] , value = shared . sd_upscalers [ 0 ] . name , type = " index " )
extras_upscaler_2_visibility = gr . Slider ( minimum = 0.0 , maximum = 1.0 , step = 0.001 , label = " Upscaler 2 visibility " , value = 1 )
extras_upscaler_2_visibility = gr . Slider ( minimum = 0.0 , maximum = 1.0 , step = 0.001 , label = " Upscaler 2 visibility " , value = 1 , elem_id = " extras_upscaler_2_visibility " )
with gr . Group ( ) :
gfpgan_visibility = gr . Slider ( minimum = 0.0 , maximum = 1.0 , step = 0.001 , label = " GFPGAN visibility " , value = 0 , interactive = modules . gfpgan_model . have_gfpgan )
gfpgan_visibility = gr . Slider ( minimum = 0.0 , maximum = 1.0 , step = 0.001 , label = " GFPGAN visibility " , value = 0 , interactive = modules . gfpgan_model . have_gfpgan , elem_id = " extras_gfpgan_visibility " )
with gr . Group ( ) :
codeformer_visibility = gr . Slider ( minimum = 0.0 , maximum = 1.0 , step = 0.001 , label = " CodeFormer visibility " , value = 0 , interactive = modules . codeformer_model . have_codeformer )
codeformer_weight = gr . Slider ( minimum = 0.0 , maximum = 1.0 , step = 0.001 , label = " CodeFormer weight (0 = maximum effect, 1 = minimum effect) " , value = 0 , interactive = modules . codeformer_model . have_codeformer )
codeformer_visibility = gr . Slider ( minimum = 0.0 , maximum = 1.0 , step = 0.001 , label = " CodeFormer visibility " , value = 0 , interactive = modules . codeformer_model . have_codeformer , elem_id = " extras_codeformer_visibility " )
codeformer_weight = gr . Slider ( minimum = 0.0 , maximum = 1.0 , step = 0.001 , label = " CodeFormer weight (0 = maximum effect, 1 = minimum effect) " , value = 0 , interactive = modules . codeformer_model . have_codeformer , elem_id = " extras_codeformer_weight " )
with gr . Group ( ) :
upscale_before_face_fix = gr . Checkbox ( label = ' Upscale Before Restoring Faces ' , value = False )
upscale_before_face_fix = gr . Checkbox ( label = ' Upscale Before Restoring Faces ' , value = False , elem_id = " extras_upscale_before_face_fix " )
result_images , html_info_x , html_info = create_output_panel ( " extras " , opts . outdir_extras_samples )
result_images , html_info_x , html_info , html_log = create_output_panel ( " extras " , opts . outdir_extras_samples )
submit . click (
fn = wrap_gradio_gpu_call ( modules . extras . run_extras ),
fn = wrap_gradio_gpu_call ( modules . extras . run_extras , extra_outputs = [ None , ' ' ] ),
_js = " get_extras_tab_index " ,
inputs = [
dummy_component ,
@ -1123,7 +1155,7 @@ def create_ui():
with gr . Column ( variant = ' panel ' ) :
html = gr . HTML ( )
generation_info = gr . Textbox ( visible = False )
generation_info = gr . Textbox ( visible = False , elem_id = " pnginfo_generation_info " )
html2 = gr . HTML ( )
with gr . Row ( ) :
buttons = parameters_copypaste . create_buttons ( [ " txt2img " , " img2img " , " inpaint " , " extras " ] )
@ -1142,23 +1174,27 @@ def create_ui():
with gr . Row ( ) :
primary_model_name = gr . Dropdown ( modules . sd_models . checkpoint_tiles ( ) , elem_id = " modelmerger_primary_model_name " , label = " Primary model (A) " )
create_refresh_button ( primary_model_name , modules . sd_models . list_models , lambda : { " choices " : modules . sd_models . checkpoint_tiles ( ) } , " refresh_checkpoint_A " )
secondary_model_name = gr . Dropdown ( modules . sd_models . checkpoint_tiles ( ) , elem_id = " modelmerger_secondary_model_name " , label = " Secondary model (B) " )
create_refresh_button ( secondary_model_name , modules . sd_models . list_models , lambda : { " choices " : modules . sd_models . checkpoint_tiles ( ) } , " refresh_checkpoint_B " )
tertiary_model_name = gr . Dropdown ( modules . sd_models . checkpoint_tiles ( ) , elem_id = " modelmerger_tertiary_model_name " , label = " Tertiary model (C) " )
custom_name = gr . Textbox ( label = " Custom Name (Optional) " )
interp_amount = gr . Slider ( minimum = 0.0 , maximum = 1.0 , step = 0.05 , label = ' Multiplier (M) - set to 0 to get model A ' , value = 0.3 )
interp_method = gr . Radio ( choices = [ " Weighted sum " , " Add difference " ] , value = " Weighted sum " , label = " Interpolation Method " )
create_refresh_button ( tertiary_model_name , modules . sd_models . list_models , lambda : { " choices " : modules . sd_models . checkpoint_tiles ( ) } , " refresh_checkpoint_C " )
custom_name = gr . Textbox ( label = " Custom Name (Optional) " , elem_id = " modelmerger_custom_name " )
interp_amount = gr . Slider ( minimum = 0.0 , maximum = 1.0 , step = 0.05 , label = ' Multiplier (M) - set to 0 to get model A ' , value = 0.3 , elem_id = " modelmerger_interp_amount " )
interp_method = gr . Radio ( choices = [ " Weighted sum " , " Add difference " ] , value = " Weighted sum " , label = " Interpolation Method " , elem_id = " modelmerger_interp_method " )
with gr . Row ( ) :
checkpoint_format = gr . Radio ( choices = [ " ckpt " , " safetensors " ] , value = " ckpt " , label = " Checkpoint format " )
save_as_half = gr . Checkbox ( value = False , label = " Save as float16 " )
checkpoint_format = gr . Radio ( choices = [ " ckpt " , " safetensors " ] , value = " ckpt " , label = " Checkpoint format " , elem_id = " modelmerger_checkpoint_format " )
save_as_half = gr . Checkbox ( value = False , label = " Save as float16 " , elem_id = " modelmerger_save_as_half " )
modelmerger_merge = gr . Button ( elem_id = " modelmerger_merge " , label = " Merge " , variant = ' primary ' )
with gr . Column ( variant = ' panel ' ) :
submit_result = gr . Textbox ( elem_id = " modelmerger_result " , show_label = False )
sd_hijack . model_hijack . embedding_db . load_textual_inversion_embeddings ( )
with gr . Blocks ( analytics_enabled = False ) as train_interface :
with gr . Row ( ) . style ( equal_height = False ) :
gr . HTML ( value = " <p style= ' margin-bottom: 0.7em ' >See <b><a href= \" https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Textual-Inversion \" >wiki</a></b> for detailed explanation.</p> " )
@ -1167,58 +1203,58 @@ def create_ui():
with gr . Tabs ( elem_id = " train_tabs " ) :
with gr . Tab ( label = " Create embedding " ) :
new_embedding_name = gr . Textbox ( label = " Name " )
initialization_text = gr . Textbox ( label = " Initialization text " , value = " * " )
nvpt = gr . Slider ( label = " Number of vectors per token " , minimum = 1 , maximum = 75 , step = 1 , value = 1 )
overwrite_old_embedding = gr . Checkbox ( value = False , label = " Overwrite Old Embedding " )
new_embedding_name = gr . Textbox ( label = " Name " , elem_id = " train_new_embedding_name " )
initialization_text = gr . Textbox ( label = " Initialization text " , value = " * " , elem_id = " train_initialization_text " )
nvpt = gr . Slider ( label = " Number of vectors per token " , minimum = 1 , maximum = 75 , step = 1 , value = 1 , elem_id = " train_nvpt " )
overwrite_old_embedding = gr . Checkbox ( value = False , label = " Overwrite Old Embedding " , elem_id = " train_overwrite_old_embedding " )
with gr . Row ( ) :
with gr . Column ( scale = 3 ) :
gr . HTML ( value = " " )
with gr . Column ( ) :
create_embedding = gr . Button ( value = " Create embedding " , variant = ' primary ' )
create_embedding = gr . Button ( value = " Create embedding " , variant = ' primary ' , elem_id = " train_create_embedding " )
with gr . Tab ( label = " Create hypernetwork " ) :
new_hypernetwork_name = gr . Textbox ( label = " Name " )
new_hypernetwork_sizes = gr . CheckboxGroup ( label = " Modules " , value = [ " 768 " , " 320 " , " 640 " , " 1280 " ] , choices = [ " 768 " , " 1024 " , " 320 " , " 640 " , " 1280 " ] )
new_hypernetwork_layer_structure = gr . Textbox ( " 1, 2, 1 " , label = " Enter hypernetwork layer structure " , placeholder = " 1st and last digit must be 1. ex: ' 1, 2, 1 ' " )
new_hypernetwork_activation_func = gr . Dropdown ( value = " linear " , label = " Select activation function of hypernetwork. Recommended : Swish / Linear(none) " , choices = modules . hypernetworks . ui . keys )
new_hypernetwork_initialization_option = gr . Dropdown ( value = " Normal " , label = " Select Layer weights initialization. Recommended: Kaiming for relu-like, Xavier for sigmoid-like, Normal otherwise " , choices = [ " Normal " , " KaimingUniform " , " KaimingNormal " , " XavierUniform " , " XavierNormal " ] )
new_hypernetwork_add_layer_norm = gr . Checkbox ( label = " Add layer normalization " )
new_hypernetwork_use_dropout = gr . Checkbox ( label = " Use dropout " )
overwrite_old_hypernetwork = gr . Checkbox ( value = False , label = " Overwrite Old Hypernetwork " )
new_hypernetwork_name = gr . Textbox ( label = " Name " , elem_id = " train_new_hypernetwork_name " )
new_hypernetwork_sizes = gr . CheckboxGroup ( label = " Modules " , value = [ " 768 " , " 320 " , " 640 " , " 1280 " ] , choices = [ " 768 " , " 1024 " , " 320 " , " 640 " , " 1280 " ] , elem_id = " train_new_hypernetwork_sizes " )
new_hypernetwork_layer_structure = gr . Textbox ( " 1, 2, 1 " , label = " Enter hypernetwork layer structure " , placeholder = " 1st and last digit must be 1. ex: ' 1, 2, 1 ' " , elem_id = " train_new_hypernetwork_layer_structure " )
new_hypernetwork_activation_func = gr . Dropdown ( value = " linear " , label = " Select activation function of hypernetwork. Recommended : Swish / Linear(none) " , choices = modules . hypernetworks . ui . keys , elem_id = " train_new_hypernetwork_activation_func " )
new_hypernetwork_initialization_option = gr . Dropdown ( value = " Normal " , label = " Select Layer weights initialization. Recommended: Kaiming for relu-like, Xavier for sigmoid-like, Normal otherwise " , choices = [ " Normal " , " KaimingUniform " , " KaimingNormal " , " XavierUniform " , " XavierNormal " ] , elem_id = " train_new_hypernetwork_initialization_option " )
new_hypernetwork_add_layer_norm = gr . Checkbox ( label = " Add layer normalization " , elem_id = " train_new_hypernetwork_add_layer_norm " )
new_hypernetwork_use_dropout = gr . Checkbox ( label = " Use dropout " , elem_id = " train_new_hypernetwork_use_dropout " )
overwrite_old_hypernetwork = gr . Checkbox ( value = False , label = " Overwrite Old Hypernetwork " , elem_id = " train_overwrite_old_hypernetwork " )
with gr . Row ( ) :
with gr . Column ( scale = 3 ) :
gr . HTML ( value = " " )
with gr . Column ( ) :
create_hypernetwork = gr . Button ( value = " Create hypernetwork " , variant = ' primary ' )
create_hypernetwork = gr . Button ( value = " Create hypernetwork " , variant = ' primary ' , elem_id = " train_create_hypernetwork " )
with gr . Tab ( label = " Preprocess images " ) :
process_src = gr . Textbox ( label = ' Source directory ' )
process_dst = gr . Textbox ( label = ' Destination directory ' )
process_width = gr . Slider ( minimum = 64 , maximum = 2048 , step = 8 , label = " Width " , value = 512 )
process_height = gr . Slider ( minimum = 64 , maximum = 2048 , step = 8 , label = " Height " , value = 512 )
preprocess_txt_action = gr . Dropdown ( label = ' Existing Caption txt Action ' , value = " ignore " , choices = [ " ignore " , " copy " , " prepend " , " append " ] )
process_src = gr . Textbox ( label = ' Source directory ' , elem_id = " train_process_src " )
process_dst = gr . Textbox ( label = ' Destination directory ' , elem_id = " train_process_dst " )
process_width = gr . Slider ( minimum = 64 , maximum = 2048 , step = 8 , label = " Width " , value = 512 , elem_id = " train_process_width " )
process_height = gr . Slider ( minimum = 64 , maximum = 2048 , step = 8 , label = " Height " , value = 512 , elem_id = " train_process_height " )
preprocess_txt_action = gr . Dropdown ( label = ' Existing Caption txt Action ' , value = " ignore " , choices = [ " ignore " , " copy " , " prepend " , " append " ] , elem_id = " train_preprocess_txt_action " )
with gr . Row ( ) :
process_flip = gr . Checkbox ( label = ' Create flipped copies ' )
process_split = gr . Checkbox ( label = ' Split oversized images ' )
process_focal_crop = gr . Checkbox ( label = ' Auto focal point crop ' )
process_caption = gr . Checkbox ( label = ' Use BLIP for caption ' )
process_caption_deepbooru = gr . Checkbox ( label = ' Use deepbooru for caption ' , visible = True )
process_flip = gr . Checkbox ( label = ' Create flipped copies ' , elem_id = " train_process_flip " )
process_split = gr . Checkbox ( label = ' Split oversized images ' , elem_id = " train_process_split " )
process_focal_crop = gr . Checkbox ( label = ' Auto focal point crop ' , elem_id = " train_process_focal_crop " )
process_caption = gr . Checkbox ( label = ' Use BLIP for caption ' , elem_id = " train_process_caption " )
process_caption_deepbooru = gr . Checkbox ( label = ' Use deepbooru for caption ' , visible = True , elem_id = " train_process_caption_deepbooru " )
with gr . Row ( visible = False ) as process_split_extra_row :
process_split_threshold = gr . Slider ( label = ' Split image threshold ' , value = 0.5 , minimum = 0.0 , maximum = 1.0 , step = 0.05 )
process_overlap_ratio = gr . Slider ( label = ' Split image overlap ratio ' , value = 0.2 , minimum = 0.0 , maximum = 0.9 , step = 0.05 )
process_split_threshold = gr . Slider ( label = ' Split image threshold ' , value = 0.5 , minimum = 0.0 , maximum = 1.0 , step = 0.05 , elem_id = " train_process_split_threshold " )
process_overlap_ratio = gr . Slider ( label = ' Split image overlap ratio ' , value = 0.2 , minimum = 0.0 , maximum = 0.9 , step = 0.05 , elem_id = " train_process_overlap_ratio " )
with gr . Row ( visible = False ) as process_focal_crop_row :
process_focal_crop_face_weight = gr . Slider ( label = ' Focal point face weight ' , value = 0.9 , minimum = 0.0 , maximum = 1.0 , step = 0.05 )
process_focal_crop_entropy_weight = gr . Slider ( label = ' Focal point entropy weight ' , value = 0.15 , minimum = 0.0 , maximum = 1.0 , step = 0.05 )
process_focal_crop_edges_weight = gr . Slider ( label = ' Focal point edges weight ' , value = 0.5 , minimum = 0.0 , maximum = 1.0 , step = 0.05 )
process_focal_crop_debug = gr . Checkbox ( label = ' Create debug image ' )
process_focal_crop_face_weight = gr . Slider ( label = ' Focal point face weight ' , value = 0.9 , minimum = 0.0 , maximum = 1.0 , step = 0.05 , elem_id = " train_process_focal_crop_face_weight " )
process_focal_crop_entropy_weight = gr . Slider ( label = ' Focal point entropy weight ' , value = 0.15 , minimum = 0.0 , maximum = 1.0 , step = 0.05 , elem_id = " train_process_focal_crop_entropy_weight " )
process_focal_crop_edges_weight = gr . Slider ( label = ' Focal point edges weight ' , value = 0.5 , minimum = 0.0 , maximum = 1.0 , step = 0.05 , elem_id = " train_process_focal_crop_edges_weight " )
process_focal_crop_debug = gr . Checkbox ( label = ' Create debug image ' , elem_id = " train_process_focal_crop_debug " )
with gr . Row ( ) :
with gr . Column ( scale = 3 ) :
@ -1226,8 +1262,8 @@ def create_ui():
with gr . Column ( ) :
with gr . Row ( ) :
interrupt_preprocessing = gr . Button ( " Interrupt " )
run_preprocess = gr . Button ( value = " Preprocess " , variant = ' primary ' )
interrupt_preprocessing = gr . Button ( " Interrupt " , elem_id = " train_interrupt_preprocessing " )
run_preprocess = gr . Button ( value = " Preprocess " , variant = ' primary ' , elem_id = " train_run_preprocess " )
process_split . change (
fn = lambda show : gr_show ( show ) ,
@ -1250,31 +1286,31 @@ def create_ui():
train_hypernetwork_name = gr . Dropdown ( label = ' Hypernetwork ' , elem_id = " train_hypernetwork " , choices = [ x for x in shared . hypernetworks . keys ( ) ] )
create_refresh_button ( train_hypernetwork_name , shared . reload_hypernetworks , lambda : { " choices " : sorted ( [ x for x in shared . hypernetworks . keys ( ) ] ) } , " refresh_train_hypernetwork_name " )
with gr . Row ( ) :
embedding_learn_rate = gr . Textbox ( label = ' Embedding Learning rate ' , placeholder = " Embedding Learning rate " , value = " 0.005 " )
hypernetwork_learn_rate = gr . Textbox ( label = ' Hypernetwork Learning rate ' , placeholder = " Hypernetwork Learning rate " , value = " 0.00001 " )
batch_size = gr . Number ( label = ' Batch size ' , value = 1 , precision = 0 )
gradient_step = gr . Number ( label = ' Gradient accumulation steps ' , value = 1 , precision = 0 )
dataset_directory = gr . Textbox ( label = ' Dataset directory ' , placeholder = " Path to directory with input images " )
log_directory = gr . Textbox ( label = ' Log directory ' , placeholder = " Path to directory where to write outputs " , value = " textual_inversion " )
template_file = gr . Textbox ( label = ' Prompt template file ' , value = os . path . join ( script_path , " textual_inversion_templates " , " style_filewords.txt " ) )
training_width = gr . Slider ( minimum = 64 , maximum = 2048 , step = 8 , label = " Width " , value = 512 )
training_height = gr . Slider ( minimum = 64 , maximum = 2048 , step = 8 , label = " Height " , value = 512 )
steps = gr . Number ( label = ' Max steps ' , value = 100000 , precision = 0 )
create_image_every = gr . Number ( label = ' Save an image to log directory every N steps, 0 to disable ' , value = 500 , precision = 0 )
save_embedding_every = gr . Number ( label = ' Save a copy of embedding to log directory every N steps, 0 to disable ' , value = 500 , precision = 0 )
save_image_with_stored_embedding = gr . Checkbox ( label = ' Save images with embedding in PNG chunks ' , value = True )
preview_from_txt2img = gr . Checkbox ( label = ' Read parameters (prompt, etc...) from txt2img tab when making previews ' , value = False )
embedding_learn_rate = gr . Textbox ( label = ' Embedding Learning rate ' , placeholder = " Embedding Learning rate " , value = " 0.005 " , elem_id = " train_embedding_learn_rate " )
hypernetwork_learn_rate = gr . Textbox ( label = ' Hypernetwork Learning rate ' , placeholder = " Hypernetwork Learning rate " , value = " 0.00001 " , elem_id = " train_hypernetwork_learn_rate " )
batch_size = gr . Number ( label = ' Batch size ' , value = 1 , precision = 0 , elem_id = " train_batch_size " )
gradient_step = gr . Number ( label = ' Gradient accumulation steps ' , value = 1 , precision = 0 , elem_id = " train_gradient_step " )
dataset_directory = gr . Textbox ( label = ' Dataset directory ' , placeholder = " Path to directory with input images " , elem_id = " train_dataset_directory " )
log_directory = gr . Textbox ( label = ' Log directory ' , placeholder = " Path to directory where to write outputs " , value = " textual_inversion " , elem_id = " train_log_directory " )
template_file = gr . Textbox ( label = ' Prompt template file ' , value = os . path . join ( script_path , " textual_inversion_templates " , " style_filewords.txt " ) , elem_id = " train_template_file " )
training_width = gr . Slider ( minimum = 64 , maximum = 2048 , step = 8 , label = " Width " , value = 512 , elem_id = " train_training_width " )
training_height = gr . Slider ( minimum = 64 , maximum = 2048 , step = 8 , label = " Height " , value = 512 , elem_id = " train_training_height " )
steps = gr . Number ( label = ' Max steps ' , value = 100000 , precision = 0 , elem_id = " train_steps " )
create_image_every = gr . Number ( label = ' Save an image to log directory every N steps, 0 to disable ' , value = 500 , precision = 0 , elem_id = " train_create_image_every " )
save_embedding_every = gr . Number ( label = ' Save a copy of embedding to log directory every N steps, 0 to disable ' , value = 500 , precision = 0 , elem_id = " train_save_embedding_every " )
save_image_with_stored_embedding = gr . Checkbox ( label = ' Save images with embedding in PNG chunks ' , value = True , elem_id = " train_save_image_with_stored_embedding " )
preview_from_txt2img = gr . Checkbox ( label = ' Read parameters (prompt, etc...) from txt2img tab when making previews ' , value = False , elem_id = " train_preview_from_txt2img " )
with gr . Row ( ) :
shuffle_tags = gr . Checkbox ( label = " Shuffle tags by ' , ' when creating prompts. " , value = False )
tag_drop_out = gr . Slider ( minimum = 0 , maximum = 1 , step = 0.1 , label = " Drop out tags when creating prompts. " , value = 0 )
shuffle_tags = gr . Checkbox ( label = " Shuffle tags by ' , ' when creating prompts. " , value = False , elem_id = " train_shuffle_tags " )
tag_drop_out = gr . Slider ( minimum = 0 , maximum = 1 , step = 0.1 , label = " Drop out tags when creating prompts. " , value = 0 , elem_id = " train_tag_drop_out " )
with gr . Row ( ) :
latent_sampling_method = gr . Radio ( label = ' Choose latent sampling method ' , value = " once " , choices = [ ' once ' , ' deterministic ' , ' random ' ] )
latent_sampling_method = gr . Radio ( label = ' Choose latent sampling method ' , value = " once " , choices = [ ' once ' , ' deterministic ' , ' random ' ] , elem_id = " train_latent_sampling_method " )
with gr . Row ( ) :
interrupt_training = gr . Button ( value = " Interrupt " )
train_hypernetwork = gr . Button ( value = " Train Hypernetwork " , variant = ' primary ' )
train_embedding = gr . Button ( value = " Train Embedding " , variant = ' primary ' )
interrupt_training = gr . Button ( value = " Interrupt " , elem_id = " train_interrupt_training " )
train_hypernetwork = gr . Button ( value = " Train Hypernetwork " , variant = ' primary ' , elem_id = " train_train_hypernetwork " )
train_embedding = gr . Button ( value = " Train Embedding " , variant = ' primary ' , elem_id = " train_train_embedding " )
params = script_callbacks . UiTrainTabParams ( txt2img_preview_params )
@ -1447,7 +1483,7 @@ def create_ui():
res = comp ( label = info . label , value = fun ( ) , elem_id = elem_id , * * ( args or { } ) )
create_refresh_button ( res , info . refresh , info . component_args , " refresh_ " + key )
else :
with gr. Row ( variant = " compact " ) :
with FormRow( ) :
res = comp ( label = info . label , value = fun ( ) , elem_id = elem_id , * * ( args or { } ) )
create_refresh_button ( res , info . refresh , info . component_args , " refresh_ " + key )
else :
@ -1492,41 +1528,36 @@ def create_ui():
return gr . update ( value = value ) , opts . dumpjson ( )
with gr . Blocks ( analytics_enabled = False ) as settings_interface :
settings_submit = gr . Button ( value = " Apply settings " , variant = ' primary ' )
result = gr . HTML ( )
with gr . Row ( ) :
with gr . Column ( scale = 6 ) :
settings_submit = gr . Button ( value = " Apply settings " , variant = ' primary ' , elem_id = " settings_submit " )
with gr . Column ( ) :
restart_gradio = gr . Button ( value = ' Reload UI ' , variant = ' primary ' , elem_id = " settings_restart_gradio " )
settings_cols = 3
items_per_col = int ( len ( opts . data_labels ) * 0.9 / settings_cols )
result = gr . HTML ( elem_id = " settings_result " )
quicksettings_names = [ x . strip ( ) for x in opts . quicksettings . split ( " , " ) ]
quicksettings_names = set ( x for x in quicksettings_names if x != ' quicksettings ' )
quicksettings_names = { x : i for i , x in enumerate ( quicksettings_names ) if x != ' quicksettings ' }
quicksettings_list = [ ]
cols_displayed = 0
items_displayed = 0
previous_section = None
c olumn = None
with gr . Row ( elem_id = " settings " ) . style ( equal_height = False ) :
current_tab = None
with gr . Tabs ( elem_id = " settings " ) :
for i , ( k , item ) in enumerate ( opts . data_labels . items ( ) ) :
section_must_be_skipped = item . section [ 0 ] is None
if previous_section != item . section and not section_must_be_skipped :
if cols_displayed < settings_cols and ( items_displayed > = items_per_col or previous_section is None ) :
if column is not None :
column . __exit__ ( )
elem_id , text = item . section
column = gr . Column ( variant = ' panel ' )
c olumn. __enter __( )
if current_tab is not None :
c urrent_tab. __exit __( )
items_displayed = 0
cols_displayed + = 1
current_tab = gr . TabItem ( elem_id = " settings_ {} " . format ( elem_id ) , label = text )
current_tab . __enter__ ( )
previous_section = item . section
elem_id , text = item . section
gr . HTML ( elem_id = " settings_header_text_ {} " . format ( elem_id ) , value = ' <h1 class= " gr-button-lg " > {} </h1> ' . format ( text ) )
if k in quicksettings_names and not shared . cmd_opts . freeze_settings :
quicksettings_list . append ( ( i , k , item ) )
components . append ( dummy_component )
@ -1536,15 +1567,21 @@ def create_ui():
component = create_setting_component ( k )
component_dict [ k ] = component
components . append ( component )
items_displayed + = 1
with gr . Row ( ) :
request_notifications = gr . Button ( value = ' Request browser notifications ' , elem_id = " request_notifications " )
download_localization = gr . Button ( value = ' Download localization template ' , elem_id = " download_localization " )
if current_tab is not None :
current_tab . __exit__ ( )
with gr . Row ( ) :
reload_script_bodies = gr . Button ( value = ' Reload custom script bodies (No ui updates, No restart) ' , variant = ' secondary ' )
restart_gradio = gr . Button ( value = ' Restart Gradio and Refresh components (Custom Scripts, ui.py, js and css only) ' , variant = ' primary ' )
with gr . TabItem ( " Actions " ) :
request_notifications = gr . Button ( value = ' Request browser notifications ' , elem_id = " request_notifications " )
download_localization = gr . Button ( value = ' Download localization template ' , elem_id = " download_localization " )
reload_script_bodies = gr . Button ( value = ' Reload custom script bodies (No ui updates, No restart) ' , variant = ' secondary ' , elem_id = " settings_reload_script_bodies " )
if os . path . exists ( " html/licenses.html " ) :
with open ( " html/licenses.html " , encoding = " utf8 " ) as file :
with gr . TabItem ( " Licenses " ) :
gr . HTML ( file . read ( ) , elem_id = " licenses " )
gr . Button ( value = " Show all pages " , elem_id = " settings_show_all_pages " )
request_notifications . click (
fn = lambda : None ,
@ -1581,9 +1618,6 @@ def create_ui():
outputs = [ ] ,
)
if column is not None :
column . __exit__ ( )
interfaces = [
( txt2img_interface , " txt2img " , " txt2img " ) ,
( img2img_interface , " img2img " , " img2img " ) ,
@ -1617,7 +1651,7 @@ def create_ui():
with gr . Blocks ( css = css , analytics_enabled = False , title = " Stable Diffusion " ) as demo :
with gr . Row ( elem_id = " quicksettings " ) :
for i , k , item in quicksettings_list :
for i , k , item in sorted ( quicksettings_list , key = lambda x : quicksettings_names . get ( x [ 1 ] , x [ 0 ] ) ) :
component = create_setting_component ( k , is_quicksettings = True )
component_dict [ k ] = component
@ -1632,6 +1666,10 @@ def create_ui():
if os . path . exists ( os . path . join ( script_path , " notification.mp3 " ) ) :
audio_notification = gr . Audio ( interactive = False , value = os . path . join ( script_path , " notification.mp3 " ) , elem_id = " audio_notification " , visible = False )
if os . path . exists ( " html/footer.html " ) :
with open ( " html/footer.html " , encoding = " utf8 " ) as file :
gr . HTML ( file . read ( ) , elem_id = " footer " )
text_settings = gr . Textbox ( elem_id = " settings_json " , value = lambda : opts . dumpjson ( ) , visible = False )
settings_submit . click (
fn = wrap_gradio_call ( run_settings , extra_outputs = [ gr . update ( ) ] ) ,
@ -1666,7 +1704,7 @@ def create_ui():
print ( " Error loading/saving model file: " , file = sys . stderr )
print ( traceback . format_exc ( ) , file = sys . stderr )
modules . sd_models . list_models ( ) # to remove the potentially missing models from the list
return [ " Error loading/saving model file. It doesn ' t exist or the name contains illegal characters " ] + [ gr . Dropdown . update ( choices = modules . sd_models . checkpoint_tiles ( ) ) for _ in range ( 3 ) ]
return [ f" Error merging checkpoints: { e } " ] + [ gr . Dropdown . update ( choices = modules . sd_models . checkpoint_tiles ( ) ) for _ in range ( 4 ) ]
return results
modelmerger_merge . click (