Spaces:
Running
on
Zero
Running
on
Zero
Upload 3 files
Browse files- app.py +69 -27
- modutils.py +83 -3
- tagger.py +8 -0
app.py
CHANGED
@@ -413,8 +413,10 @@ from tagger import (
|
|
413 |
insert_recom_prompt,
|
414 |
compose_prompt_to_copy,
|
415 |
translate_prompt,
|
|
|
416 |
)
|
417 |
from modutils import (
|
|
|
418 |
get_t2i_model_info,
|
419 |
get_tupled_model_list,
|
420 |
save_gallery_images,
|
@@ -424,6 +426,8 @@ from modutils import (
|
|
424 |
set_lora_prompt,
|
425 |
get_lora_tupled_list,
|
426 |
apply_lora_prompt,
|
|
|
|
|
427 |
set_textual_inversion_prompt,
|
428 |
get_model_pipeline,
|
429 |
set_optimization,
|
@@ -873,7 +877,8 @@ with gr.Blocks(theme="NoCrypt/miku", elem_id="main", css=CSS) as app:
|
|
873 |
with gr.Tab("Generation"):
|
874 |
v2b = V2UI()
|
875 |
with gr.Column(scale=2):
|
876 |
-
|
|
|
877 |
task_gui = gr.Dropdown(label="Task", choices=sdxl_task, value=task_model_list[0])
|
878 |
model_name_gui = gr.Dropdown(label="Model", info="You can enter a huggingface model repo_id to want to use.", choices=get_tupled_model_list(model_list), value="votepurchase/animagine-xl-3.1", allow_custom_value=True)
|
879 |
model_info_gui = gr.Markdown()
|
@@ -881,12 +886,13 @@ with gr.Blocks(theme="NoCrypt/miku", elem_id="main", css=CSS) as app:
|
|
881 |
quick_model_type_gui = gr.Radio(label="Model Type", choices=["None", "Animagine", "Pony"], value="None", interactive=True)
|
882 |
quick_genre_gui = gr.Radio(label="Genre", choices=["Anime", "Photo"], value="Anime", interactive=True)
|
883 |
quick_speed_gui = gr.Radio(label="Speed", choices=["Fast", "Standard", "Heavy"], value="Standard", interactive=True)
|
884 |
-
quick_aspect_gui = gr.Radio(label="Aspect Ratio", choices=["1:1", "3:4"], value="
|
885 |
-
|
886 |
-
|
887 |
-
|
888 |
-
|
889 |
-
|
|
|
890 |
input_image_gui = gr.Image(label="Input image", type="pil", sources=["upload", "clipboard"], height=256)
|
891 |
with gr.Accordion(label="Advanced options", open=False):
|
892 |
general_threshold_gui = gr.Slider(label="Threshold", minimum=0.0, maximum=1.0, value=0.3, step=0.01, interactive=True)
|
@@ -898,16 +904,17 @@ with gr.Blocks(theme="NoCrypt/miku", elem_id="main", css=CSS) as app:
|
|
898 |
generate_from_image_btn_gui = gr.Button(value="GENERATE TAGS FROM IMAGE", size="lg", variant="primary")
|
899 |
with gr.Group():
|
900 |
prompt_gui = gr.Textbox(lines=6, placeholder="1girl, solo, ...", label="Prompt", show_copy_button=True)
|
901 |
-
with gr.Accordion("Negative prompt, etc.", open=False):
|
902 |
neg_prompt_gui = gr.Textbox(lines=3, placeholder="lowres, (bad), ...", label="Negative prompt", show_copy_button=True)
|
903 |
translate_prompt_button = gr.Button(value="Translate prompt to English", size="sm", variant="secondary")
|
904 |
-
|
905 |
-
|
906 |
-
|
|
|
907 |
with gr.Row():
|
908 |
character_dbt = gr.Textbox(lines=1, placeholder="kafuu chino, ...", label="Character names")
|
909 |
series_dbt = gr.Textbox(lines=1, placeholder="Is the order a rabbit?, ...", label="Series names")
|
910 |
-
|
911 |
model_name_dbt = gr.Dropdown(label="Model", choices=list(V2_ALL_MODELS.keys()), value=list(V2_ALL_MODELS.keys())[0], visible=False)
|
912 |
aspect_ratio_dbt = gr.Radio(label="Aspect ratio", choices=list(V2_ASPECT_RATIO_OPTIONS), value="square", visible=False)
|
913 |
length_dbt = gr.Radio(label="Length", choices=list(V2_LENGTH_OPTIONS), value="very_long", visible=False)
|
@@ -915,7 +922,8 @@ with gr.Blocks(theme="NoCrypt/miku", elem_id="main", css=CSS) as app:
|
|
915 |
ban_tags_dbt = gr.Textbox(label="Ban tags", placeholder="alternate costumen, ...", value="futanari, censored, furry, furrification", visible=False)
|
916 |
elapsed_time_dbt = gr.Markdown(label="Elapsed time", value="", visible=False)
|
917 |
copy_button_dbt = gr.Button(value="Copy to clipboard", visible=False)
|
918 |
-
|
|
|
919 |
with gr.Row():
|
920 |
set_params_gui = gr.Button(value="↙️")
|
921 |
clear_prompt_gui = gr.Button(value="🗑️")
|
@@ -951,7 +959,7 @@ with gr.Blocks(theme="NoCrypt/miku", elem_id="main", css=CSS) as app:
|
|
951 |
|
952 |
actual_task_info = gr.HTML()
|
953 |
|
954 |
-
with gr.Accordion("Generation settings", open=False, visible=True):
|
955 |
steps_gui = gr.Slider(minimum=1, maximum=100, step=1, value=28, label="Steps")
|
956 |
cfg_gui = gr.Slider(minimum=0, maximum=30, step=0.5, value=7.0, label="CFG")
|
957 |
sampler_gui = gr.Dropdown(label="Sampler", choices=scheduler_names, value="Euler a")
|
@@ -1043,7 +1051,7 @@ with gr.Blocks(theme="NoCrypt/miku", elem_id="main", css=CSS) as app:
|
|
1043 |
prompt_syntax_gui = gr.Dropdown(label="Prompt Syntax", choices=prompt_s_options, value=prompt_s_options[1][1])
|
1044 |
vae_model_gui = gr.Dropdown(label="VAE Model", choices=vae_model_list)
|
1045 |
|
1046 |
-
with gr.Accordion("Hires fix", open=False, visible=True):
|
1047 |
|
1048 |
upscaler_keys = list(upscaler_dict_gui.keys())
|
1049 |
|
@@ -1057,7 +1065,7 @@ with gr.Blocks(theme="NoCrypt/miku", elem_id="main", css=CSS) as app:
|
|
1057 |
hires_prompt_gui = gr.Textbox(label="Hires Prompt", placeholder="Main prompt will be use", lines=3)
|
1058 |
hires_negative_prompt_gui = gr.Textbox(label="Hires Negative Prompt", placeholder="Main negative prompt will be use", lines=3)
|
1059 |
|
1060 |
-
with gr.Accordion("LoRA", open=False, visible=True):
|
1061 |
lora1_gui = gr.Dropdown(label="Lora1", choices=get_lora_tupled_list(lora_model_list), allow_custom_value=True)
|
1062 |
lora_scale_1_gui = gr.Slider(minimum=-2, maximum=2, step=0.01, value=1.00, label="Lora Scale 1")
|
1063 |
with gr.Row():
|
@@ -1102,6 +1110,12 @@ with gr.Blocks(theme="NoCrypt/miku", elem_id="main", css=CSS) as app:
|
|
1102 |
[text_lora],
|
1103 |
[lora1_gui, lora2_gui, lora3_gui, lora4_gui, lora5_gui]
|
1104 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
1105 |
|
1106 |
with gr.Accordion("From Local", open=True, visible=True):
|
1107 |
file_output_lora = gr.File(label="Uploaded LoRA", file_types=['.ckpt', '.pt', '.pth', '.safetensors', '.bin'], file_count="multiple", interactive=False, visible=False)
|
@@ -1111,8 +1125,8 @@ with gr.Blocks(theme="NoCrypt/miku", elem_id="main", css=CSS) as app:
|
|
1111 |
[file_output_lora],
|
1112 |
[lora1_gui, lora2_gui, lora3_gui, lora4_gui, lora5_gui]
|
1113 |
)
|
1114 |
-
|
1115 |
-
with gr.Accordion("IP-Adapter", open=False, visible=True):##############
|
1116 |
|
1117 |
IP_MODELS = sorted(list(set(IP_ADAPTERS_SD + IP_ADAPTERS_SDXL)))
|
1118 |
MODE_IP_OPTIONS = ["original", "style", "layout", "style+layout"]
|
@@ -1130,7 +1144,7 @@ with gr.Blocks(theme="NoCrypt/miku", elem_id="main", css=CSS) as app:
|
|
1130 |
mode_ip2 = gr.Dropdown(value="style", label="Mode", choices=MODE_IP_OPTIONS)
|
1131 |
scale_ip2 = gr.Slider(minimum=0., maximum=2., step=0.01, value=0.7, label="Scale")
|
1132 |
|
1133 |
-
with gr.Accordion("ControlNet / Img2img / Inpaint", open=False, visible=True):
|
1134 |
image_control = gr.Image(label="Image ControlNet/Inpaint/Img2img", type="filepath")
|
1135 |
image_mask_gui = gr.Image(label="Image Mask", type="filepath")
|
1136 |
strength_gui = gr.Slider(
|
@@ -1162,12 +1176,12 @@ with gr.Blocks(theme="NoCrypt/miku", elem_id="main", css=CSS) as app:
|
|
1162 |
control_net_start_threshold_gui = gr.Slider(minimum=0, maximum=1, step=0.01, value=0, label="ControlNet Start Threshold (%)")
|
1163 |
control_net_stop_threshold_gui = gr.Slider(minimum=0, maximum=1, step=0.01, value=1, label="ControlNet Stop Threshold (%)")
|
1164 |
|
1165 |
-
with gr.Accordion("T2I adapter", open=False, visible=True):
|
1166 |
t2i_adapter_preprocessor_gui = gr.Checkbox(value=True, label="T2i Adapter Preprocessor")
|
1167 |
adapter_conditioning_scale_gui = gr.Slider(minimum=0, maximum=5., step=0.1, value=1, label="Adapter Conditioning Scale")
|
1168 |
adapter_conditioning_factor_gui = gr.Slider(minimum=0, maximum=1., step=0.01, value=0.55, label="Adapter Conditioning Factor (%)")
|
1169 |
|
1170 |
-
with gr.Accordion("Styles", open=False, visible=True):
|
1171 |
|
1172 |
try:
|
1173 |
style_names_found = sd_gen.model.STYLE_NAMES
|
@@ -1195,17 +1209,15 @@ with gr.Blocks(theme="NoCrypt/miku", elem_id="main", css=CSS) as app:
|
|
1195 |
|
1196 |
style_button.click(load_json_style_file, [style_json_gui], [style_prompt_gui])
|
1197 |
|
1198 |
-
|
1199 |
-
with gr.Accordion("Textual inversion", open=False, visible=True):
|
1200 |
active_textual_inversion_gui = gr.Checkbox(value=False, label="Active Textual Inversion in prompt")
|
1201 |
use_textual_inversion_gui = gr.CheckboxGroup(choices=get_embed_list(get_model_pipeline(model_name_gui.value)) if active_textual_inversion_gui.value else [], value=None, label="Use Textual Invertion in prompt")
|
1202 |
def update_textual_inversion_gui(active_textual_inversion_gui, model_name_gui):
|
1203 |
return gr.update(choices=get_embed_list(get_model_pipeline(model_name_gui)) if active_textual_inversion_gui else [])
|
1204 |
active_textual_inversion_gui.change(update_textual_inversion_gui, [active_textual_inversion_gui, model_name_gui], [use_textual_inversion_gui])
|
1205 |
model_name_gui.change(update_textual_inversion_gui, [active_textual_inversion_gui, model_name_gui], [use_textual_inversion_gui])
|
1206 |
-
## END MOD
|
1207 |
|
1208 |
-
with gr.Accordion("Detailfix", open=False, visible=True):
|
1209 |
|
1210 |
# Adetailer Inpaint Only
|
1211 |
adetailer_inpaint_only_gui = gr.Checkbox(label="Inpaint only", value=True)
|
@@ -1243,7 +1255,7 @@ with gr.Blocks(theme="NoCrypt/miku", elem_id="main", css=CSS) as app:
|
|
1243 |
mask_blur_b_gui = gr.Number(label="Mask blur:", value=4, minimum=1)
|
1244 |
mask_padding_b_gui = gr.Number(label="Mask padding:", value=32, minimum=1)
|
1245 |
|
1246 |
-
with gr.Accordion("Other settings", open=False, visible=True):
|
1247 |
image_previews_gui = gr.Checkbox(value=True, label="Image Previews")
|
1248 |
hires_before_adetailer_gui = gr.Checkbox(value=False, label="Hires Before Adetailer")
|
1249 |
hires_after_adetailer_gui = gr.Checkbox(value=True, label="Hires After Adetailer")
|
@@ -1262,7 +1274,6 @@ with gr.Blocks(theme="NoCrypt/miku", elem_id="main", css=CSS) as app:
|
|
1262 |
retain_hires_model_previous_load_gui = gr.Checkbox(value=False, label="Retain Hires Model Previous Load")
|
1263 |
xformers_memory_efficient_attention_gui = gr.Checkbox(value=False, label="Xformers Memory Efficient Attention")
|
1264 |
|
1265 |
-
## BEGIN MOD
|
1266 |
with gr.Accordion("Examples and help", open=True, visible=True):
|
1267 |
gr.Examples(
|
1268 |
examples=[
|
@@ -1596,6 +1607,12 @@ with gr.Blocks(theme="NoCrypt/miku", elem_id="main", css=CSS) as app:
|
|
1596 |
btn_send.click(send_img, [img_source, img_result], [image_control, image_mask_gui])
|
1597 |
|
1598 |
## BEGIN MOD
|
|
|
|
|
|
|
|
|
|
|
|
|
1599 |
model_name_gui.change(get_t2i_model_info, [model_name_gui], [model_info_gui])
|
1600 |
|
1601 |
quick_model_type_gui.change(
|
@@ -1653,6 +1670,26 @@ with gr.Blocks(theme="NoCrypt/miku", elem_id="main", css=CSS) as app:
|
|
1653 |
lora3_copy_button.click(apply_lora_prompt, [prompt_gui, lora3_trigger_gui], [prompt_gui])
|
1654 |
lora4_copy_button.click(apply_lora_prompt, [prompt_gui, lora4_trigger_gui], [prompt_gui])
|
1655 |
lora5_copy_button.click(apply_lora_prompt, [prompt_gui, lora5_trigger_gui], [prompt_gui])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1656 |
|
1657 |
use_textual_inversion_gui.change(set_textual_inversion_prompt, [use_textual_inversion_gui, prompt_gui, neg_prompt_gui, prompt_syntax_gui], [prompt_gui, neg_prompt_gui])
|
1658 |
|
@@ -1699,6 +1736,8 @@ with gr.Blocks(theme="NoCrypt/miku", elem_id="main", css=CSS) as app:
|
|
1699 |
outputs=[prompt_gui],
|
1700 |
)
|
1701 |
|
|
|
|
|
1702 |
generate_db_random_button.click(
|
1703 |
parse_upsampling_output(v2b.on_generate),
|
1704 |
inputs=[
|
@@ -1848,6 +1887,7 @@ with gr.Blocks(theme="NoCrypt/miku", elem_id="main", css=CSS) as app:
|
|
1848 |
with gr.Group():
|
1849 |
input_character = gr.Textbox(label="Character tags", placeholder="hatsune miku")
|
1850 |
input_copyright = gr.Textbox(label="Copyright tags", placeholder="vocaloid")
|
|
|
1851 |
input_general = gr.TextArea(label="General tags", lines=4, placeholder="1girl, ...", value="")
|
1852 |
input_tags_to_copy = gr.Textbox(value="", visible=False)
|
1853 |
copy_input_btn = gr.Button(value="Copy to clipboard", size="sm", interactive=False)
|
@@ -1913,6 +1953,8 @@ with gr.Blocks(theme="NoCrypt/miku", elem_id="main", css=CSS) as app:
|
|
1913 |
gradio_copy_text, inputs=[input_tags_to_copy], js=COPY_ACTION_JS,
|
1914 |
)
|
1915 |
|
|
|
|
|
1916 |
generate_btn.click(
|
1917 |
parse_upsampling_output(v2.on_generate),
|
1918 |
inputs=[
|
|
|
413 |
insert_recom_prompt,
|
414 |
compose_prompt_to_copy,
|
415 |
translate_prompt,
|
416 |
+
select_random_character,
|
417 |
)
|
418 |
from modutils import (
|
419 |
+
change_interface_mode,
|
420 |
get_t2i_model_info,
|
421 |
get_tupled_model_list,
|
422 |
save_gallery_images,
|
|
|
426 |
set_lora_prompt,
|
427 |
get_lora_tupled_list,
|
428 |
apply_lora_prompt,
|
429 |
+
search_civitai_lora,
|
430 |
+
select_civitai_lora,
|
431 |
set_textual_inversion_prompt,
|
432 |
get_model_pipeline,
|
433 |
set_optimization,
|
|
|
877 |
with gr.Tab("Generation"):
|
878 |
v2b = V2UI()
|
879 |
with gr.Column(scale=2):
|
880 |
+
interface_mode_gui = gr.Radio(label="Quick settings", choices=["Simple", "Standard", "Fast", "LoRA"], value="Standard")
|
881 |
+
with gr.Accordion("Model and Task", open=False) as menu_model:
|
882 |
task_gui = gr.Dropdown(label="Task", choices=sdxl_task, value=task_model_list[0])
|
883 |
model_name_gui = gr.Dropdown(label="Model", info="You can enter a huggingface model repo_id to want to use.", choices=get_tupled_model_list(model_list), value="votepurchase/animagine-xl-3.1", allow_custom_value=True)
|
884 |
model_info_gui = gr.Markdown()
|
|
|
886 |
quick_model_type_gui = gr.Radio(label="Model Type", choices=["None", "Animagine", "Pony"], value="None", interactive=True)
|
887 |
quick_genre_gui = gr.Radio(label="Genre", choices=["Anime", "Photo"], value="Anime", interactive=True)
|
888 |
quick_speed_gui = gr.Radio(label="Speed", choices=["Fast", "Standard", "Heavy"], value="Standard", interactive=True)
|
889 |
+
quick_aspect_gui = gr.Radio(label="Aspect Ratio", choices=["1:1", "3:4"], value="1:1", interactive=True)
|
890 |
+
with gr.Accordion(label="Advanced options", open=False):
|
891 |
+
quality_selector_gui = gr.Dropdown(label="Quality Tags Presets", interactive=True, choices=list(preset_quality.keys()), value="None")
|
892 |
+
style_selector_gui = gr.Dropdown(label="Style Preset", interactive=True, choices=list(preset_styles.keys()), value="None")
|
893 |
+
sampler_selector_gui = gr.Dropdown(label="Sampler Quick Settings", interactive=True, choices=list(preset_sampler_setting.keys()), value="None")
|
894 |
+
optimization_gui = gr.Dropdown(label="Optimization for SDXL", choices=list(optimization_list.keys()), value="None", interactive=True)
|
895 |
+
with gr.Accordion("Generate prompt from Image", open=False) as menu_from_image:
|
896 |
input_image_gui = gr.Image(label="Input image", type="pil", sources=["upload", "clipboard"], height=256)
|
897 |
with gr.Accordion(label="Advanced options", open=False):
|
898 |
general_threshold_gui = gr.Slider(label="Threshold", minimum=0.0, maximum=1.0, value=0.3, step=0.01, interactive=True)
|
|
|
904 |
generate_from_image_btn_gui = gr.Button(value="GENERATE TAGS FROM IMAGE", size="lg", variant="primary")
|
905 |
with gr.Group():
|
906 |
prompt_gui = gr.Textbox(lines=6, placeholder="1girl, solo, ...", label="Prompt", show_copy_button=True)
|
907 |
+
with gr.Accordion("Negative prompt, etc.", open=False) as menu_negative:
|
908 |
neg_prompt_gui = gr.Textbox(lines=3, placeholder="lowres, (bad), ...", label="Negative prompt", show_copy_button=True)
|
909 |
translate_prompt_button = gr.Button(value="Translate prompt to English", size="sm", variant="secondary")
|
910 |
+
with gr.Accordion(label="Advanced options", open=False):
|
911 |
+
insert_prompt_gui = gr.Radio(label="Insert reccomended positive / negative prompt", choices=["None", "Animagine", "Pony"], value="None", interactive=True, scale=2)
|
912 |
+
prompt_type_gui = gr.Radio(label="Convert tags to", choices=["danbooru", "e621"], value="e621", visible=False)
|
913 |
+
prompt_type_button = gr.Button(value="Convert prompt to Pony e621 style", size="sm", variant="secondary")
|
914 |
with gr.Row():
|
915 |
character_dbt = gr.Textbox(lines=1, placeholder="kafuu chino, ...", label="Character names")
|
916 |
series_dbt = gr.Textbox(lines=1, placeholder="Is the order a rabbit?, ...", label="Series names")
|
917 |
+
random_character_gui = gr.Button(value="Pick a random character 🎲", size="sm")
|
918 |
model_name_dbt = gr.Dropdown(label="Model", choices=list(V2_ALL_MODELS.keys()), value=list(V2_ALL_MODELS.keys())[0], visible=False)
|
919 |
aspect_ratio_dbt = gr.Radio(label="Aspect ratio", choices=list(V2_ASPECT_RATIO_OPTIONS), value="square", visible=False)
|
920 |
length_dbt = gr.Radio(label="Length", choices=list(V2_LENGTH_OPTIONS), value="very_long", visible=False)
|
|
|
922 |
ban_tags_dbt = gr.Textbox(label="Ban tags", placeholder="alternate costumen, ...", value="futanari, censored, furry, furrification", visible=False)
|
923 |
elapsed_time_dbt = gr.Markdown(label="Elapsed time", value="", visible=False)
|
924 |
copy_button_dbt = gr.Button(value="Copy to clipboard", visible=False)
|
925 |
+
generate_db_random_button = gr.Button(value="Generate random prompt 🎲", size="sm", variant="secondary")
|
926 |
+
rating_dbt = gr.Radio(label="Rating", choices=list(V2_RATING_OPTIONS), value="sfw")
|
927 |
with gr.Row():
|
928 |
set_params_gui = gr.Button(value="↙️")
|
929 |
clear_prompt_gui = gr.Button(value="🗑️")
|
|
|
959 |
|
960 |
actual_task_info = gr.HTML()
|
961 |
|
962 |
+
with gr.Accordion("Generation settings", open=False, visible=True) as menu_gen:
|
963 |
steps_gui = gr.Slider(minimum=1, maximum=100, step=1, value=28, label="Steps")
|
964 |
cfg_gui = gr.Slider(minimum=0, maximum=30, step=0.5, value=7.0, label="CFG")
|
965 |
sampler_gui = gr.Dropdown(label="Sampler", choices=scheduler_names, value="Euler a")
|
|
|
1051 |
prompt_syntax_gui = gr.Dropdown(label="Prompt Syntax", choices=prompt_s_options, value=prompt_s_options[1][1])
|
1052 |
vae_model_gui = gr.Dropdown(label="VAE Model", choices=vae_model_list)
|
1053 |
|
1054 |
+
with gr.Accordion("Hires fix", open=False, visible=True) as menu_hires:
|
1055 |
|
1056 |
upscaler_keys = list(upscaler_dict_gui.keys())
|
1057 |
|
|
|
1065 |
hires_prompt_gui = gr.Textbox(label="Hires Prompt", placeholder="Main prompt will be use", lines=3)
|
1066 |
hires_negative_prompt_gui = gr.Textbox(label="Hires Negative Prompt", placeholder="Main negative prompt will be use", lines=3)
|
1067 |
|
1068 |
+
with gr.Accordion("LoRA", open=False, visible=True) as menu_lora:
|
1069 |
lora1_gui = gr.Dropdown(label="Lora1", choices=get_lora_tupled_list(lora_model_list), allow_custom_value=True)
|
1070 |
lora_scale_1_gui = gr.Slider(minimum=-2, maximum=2, step=0.01, value=1.00, label="Lora Scale 1")
|
1071 |
with gr.Row():
|
|
|
1110 |
[text_lora],
|
1111 |
[lora1_gui, lora2_gui, lora3_gui, lora4_gui, lora5_gui]
|
1112 |
)
|
1113 |
+
with gr.Row():
|
1114 |
+
search_civitai_query_lora = gr.Textbox(label="Query", placeholder="oomuro sakurako...", lines=1)
|
1115 |
+
search_civitai_basemodel_lora = gr.CheckboxGroup(label="Search LoRA for", choices=["Pony", "SD 1.5", "SDXL 1.0"], value=["Pony", "SDXL 1.0"])
|
1116 |
+
search_civitai_button_lora = gr.Button("Search on Civitai")
|
1117 |
+
search_civitai_result_lora = gr.Dropdown(label="Search Results", choices=[("", "")], value="", allow_custom_value=True, visible=False)
|
1118 |
+
search_civitai_desc_lora = gr.Markdown(value="", visible=False)
|
1119 |
|
1120 |
with gr.Accordion("From Local", open=True, visible=True):
|
1121 |
file_output_lora = gr.File(label="Uploaded LoRA", file_types=['.ckpt', '.pt', '.pth', '.safetensors', '.bin'], file_count="multiple", interactive=False, visible=False)
|
|
|
1125 |
[file_output_lora],
|
1126 |
[lora1_gui, lora2_gui, lora3_gui, lora4_gui, lora5_gui]
|
1127 |
)
|
1128 |
+
|
1129 |
+
with gr.Accordion("IP-Adapter", open=False, visible=True) as menu_ipa:##############
|
1130 |
|
1131 |
IP_MODELS = sorted(list(set(IP_ADAPTERS_SD + IP_ADAPTERS_SDXL)))
|
1132 |
MODE_IP_OPTIONS = ["original", "style", "layout", "style+layout"]
|
|
|
1144 |
mode_ip2 = gr.Dropdown(value="style", label="Mode", choices=MODE_IP_OPTIONS)
|
1145 |
scale_ip2 = gr.Slider(minimum=0., maximum=2., step=0.01, value=0.7, label="Scale")
|
1146 |
|
1147 |
+
with gr.Accordion("ControlNet / Img2img / Inpaint", open=False, visible=True) as menu_i2i:
|
1148 |
image_control = gr.Image(label="Image ControlNet/Inpaint/Img2img", type="filepath")
|
1149 |
image_mask_gui = gr.Image(label="Image Mask", type="filepath")
|
1150 |
strength_gui = gr.Slider(
|
|
|
1176 |
control_net_start_threshold_gui = gr.Slider(minimum=0, maximum=1, step=0.01, value=0, label="ControlNet Start Threshold (%)")
|
1177 |
control_net_stop_threshold_gui = gr.Slider(minimum=0, maximum=1, step=0.01, value=1, label="ControlNet Stop Threshold (%)")
|
1178 |
|
1179 |
+
with gr.Accordion("T2I adapter", open=False, visible=True) as menu_t2i:
|
1180 |
t2i_adapter_preprocessor_gui = gr.Checkbox(value=True, label="T2i Adapter Preprocessor")
|
1181 |
adapter_conditioning_scale_gui = gr.Slider(minimum=0, maximum=5., step=0.1, value=1, label="Adapter Conditioning Scale")
|
1182 |
adapter_conditioning_factor_gui = gr.Slider(minimum=0, maximum=1., step=0.01, value=0.55, label="Adapter Conditioning Factor (%)")
|
1183 |
|
1184 |
+
with gr.Accordion("Styles", open=False, visible=True) as menu_styles:
|
1185 |
|
1186 |
try:
|
1187 |
style_names_found = sd_gen.model.STYLE_NAMES
|
|
|
1209 |
|
1210 |
style_button.click(load_json_style_file, [style_json_gui], [style_prompt_gui])
|
1211 |
|
1212 |
+
with gr.Accordion("Textual inversion", open=False, visible=True) as menu_ti:
|
|
|
1213 |
active_textual_inversion_gui = gr.Checkbox(value=False, label="Active Textual Inversion in prompt")
|
1214 |
use_textual_inversion_gui = gr.CheckboxGroup(choices=get_embed_list(get_model_pipeline(model_name_gui.value)) if active_textual_inversion_gui.value else [], value=None, label="Use Textual Invertion in prompt")
|
1215 |
def update_textual_inversion_gui(active_textual_inversion_gui, model_name_gui):
|
1216 |
return gr.update(choices=get_embed_list(get_model_pipeline(model_name_gui)) if active_textual_inversion_gui else [])
|
1217 |
active_textual_inversion_gui.change(update_textual_inversion_gui, [active_textual_inversion_gui, model_name_gui], [use_textual_inversion_gui])
|
1218 |
model_name_gui.change(update_textual_inversion_gui, [active_textual_inversion_gui, model_name_gui], [use_textual_inversion_gui])
|
|
|
1219 |
|
1220 |
+
with gr.Accordion("Detailfix", open=False, visible=True) as menu_detail:
|
1221 |
|
1222 |
# Adetailer Inpaint Only
|
1223 |
adetailer_inpaint_only_gui = gr.Checkbox(label="Inpaint only", value=True)
|
|
|
1255 |
mask_blur_b_gui = gr.Number(label="Mask blur:", value=4, minimum=1)
|
1256 |
mask_padding_b_gui = gr.Number(label="Mask padding:", value=32, minimum=1)
|
1257 |
|
1258 |
+
with gr.Accordion("Other settings", open=False, visible=True) as menu_other:
|
1259 |
image_previews_gui = gr.Checkbox(value=True, label="Image Previews")
|
1260 |
hires_before_adetailer_gui = gr.Checkbox(value=False, label="Hires Before Adetailer")
|
1261 |
hires_after_adetailer_gui = gr.Checkbox(value=True, label="Hires After Adetailer")
|
|
|
1274 |
retain_hires_model_previous_load_gui = gr.Checkbox(value=False, label="Retain Hires Model Previous Load")
|
1275 |
xformers_memory_efficient_attention_gui = gr.Checkbox(value=False, label="Xformers Memory Efficient Attention")
|
1276 |
|
|
|
1277 |
with gr.Accordion("Examples and help", open=True, visible=True):
|
1278 |
gr.Examples(
|
1279 |
examples=[
|
|
|
1607 |
btn_send.click(send_img, [img_source, img_result], [image_control, image_mask_gui])
|
1608 |
|
1609 |
## BEGIN MOD
|
1610 |
+
interface_mode_gui.change(
|
1611 |
+
change_interface_mode,
|
1612 |
+
[interface_mode_gui],
|
1613 |
+
[menu_model, menu_from_image, menu_negative, menu_gen, menu_hires, menu_lora, menu_ipa,\
|
1614 |
+
menu_i2i, menu_t2i, menu_styles, menu_ti, menu_detail, menu_other, task_gui, quick_speed_gui]
|
1615 |
+
)
|
1616 |
model_name_gui.change(get_t2i_model_info, [model_name_gui], [model_info_gui])
|
1617 |
|
1618 |
quick_model_type_gui.change(
|
|
|
1670 |
lora3_copy_button.click(apply_lora_prompt, [prompt_gui, lora3_trigger_gui], [prompt_gui])
|
1671 |
lora4_copy_button.click(apply_lora_prompt, [prompt_gui, lora4_trigger_gui], [prompt_gui])
|
1672 |
lora5_copy_button.click(apply_lora_prompt, [prompt_gui, lora5_trigger_gui], [prompt_gui])
|
1673 |
+
|
1674 |
+
search_civitai_button_lora.click(
|
1675 |
+
search_civitai_lora,
|
1676 |
+
[search_civitai_query_lora, search_civitai_basemodel_lora],
|
1677 |
+
[search_civitai_result_lora, search_civitai_desc_lora],
|
1678 |
+
queue=True,
|
1679 |
+
show_progress="minimal",
|
1680 |
+
)
|
1681 |
+
search_civitai_query_lora.submit(
|
1682 |
+
search_civitai_lora,
|
1683 |
+
[search_civitai_query_lora, search_civitai_basemodel_lora],
|
1684 |
+
[search_civitai_result_lora, search_civitai_desc_lora],
|
1685 |
+
queue=True,
|
1686 |
+
show_progress="minimal",
|
1687 |
+
)
|
1688 |
+
search_civitai_result_lora.change(
|
1689 |
+
select_civitai_lora,
|
1690 |
+
[search_civitai_result_lora],
|
1691 |
+
[text_lora, search_civitai_desc_lora],
|
1692 |
+
)
|
1693 |
|
1694 |
use_textual_inversion_gui.change(set_textual_inversion_prompt, [use_textual_inversion_gui, prompt_gui, neg_prompt_gui, prompt_syntax_gui], [prompt_gui, neg_prompt_gui])
|
1695 |
|
|
|
1736 |
outputs=[prompt_gui],
|
1737 |
)
|
1738 |
|
1739 |
+
random_character_gui.click(select_random_character, [series_dbt, character_dbt], [series_dbt, character_dbt])
|
1740 |
+
|
1741 |
generate_db_random_button.click(
|
1742 |
parse_upsampling_output(v2b.on_generate),
|
1743 |
inputs=[
|
|
|
1887 |
with gr.Group():
|
1888 |
input_character = gr.Textbox(label="Character tags", placeholder="hatsune miku")
|
1889 |
input_copyright = gr.Textbox(label="Copyright tags", placeholder="vocaloid")
|
1890 |
+
pick_random_character = gr.Button(value="Pick a random character 🎲", size="sm")
|
1891 |
input_general = gr.TextArea(label="General tags", lines=4, placeholder="1girl, ...", value="")
|
1892 |
input_tags_to_copy = gr.Textbox(value="", visible=False)
|
1893 |
copy_input_btn = gr.Button(value="Copy to clipboard", size="sm", interactive=False)
|
|
|
1953 |
gradio_copy_text, inputs=[input_tags_to_copy], js=COPY_ACTION_JS,
|
1954 |
)
|
1955 |
|
1956 |
+
pick_random_character.click(select_random_character, [input_copyright, input_character], [input_copyright, input_character])
|
1957 |
+
|
1958 |
generate_btn.click(
|
1959 |
parse_upsampling_output(v2.on_generate),
|
1960 |
inputs=[
|
modutils.py
CHANGED
@@ -7,6 +7,34 @@ from PIL import Image
|
|
7 |
HF_LORA_PRIVATE_REPOS = ['John6666/loratest1', 'John6666/loratest3', 'John6666/loratest4', 'John6666/loratest6', 'John6666/loratest10', 'John6666/loratest']
|
8 |
HF_LORA_ESSENTIAL_PRIVATE_REPO = 'John6666/loratest1'
|
9 |
directory_loras = 'loras'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
|
11 |
|
12 |
def get_model_list(directory_path):
|
@@ -294,9 +322,7 @@ def get_civitai_info(path):
|
|
294 |
if path in set(civitai_not_exists_list): return ["", "", "", "", ""]
|
295 |
from pathlib import Path
|
296 |
if not Path(path).exists(): return None
|
297 |
-
|
298 |
-
ua = UserAgent()
|
299 |
-
user_agent = ua.random
|
300 |
headers = {'User-Agent': user_agent, 'content-type': 'application/json'}
|
301 |
base_url = 'https://civitai.com/api/v1/model-versions/by-hash/'
|
302 |
params = {}
|
@@ -442,6 +468,60 @@ def move_file_lora(filepaths):
|
|
442 |
),
|
443 |
|
444 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
445 |
quality_prompt_list = [
|
446 |
{
|
447 |
"name": "None",
|
|
|
7 |
HF_LORA_PRIVATE_REPOS = ['John6666/loratest1', 'John6666/loratest3', 'John6666/loratest4', 'John6666/loratest6', 'John6666/loratest10', 'John6666/loratest']
|
8 |
HF_LORA_ESSENTIAL_PRIVATE_REPO = 'John6666/loratest1'
|
9 |
directory_loras = 'loras'
|
10 |
+
CIVITAI_API_KEY = os.environ.get("CIVITAI_API_KEY")
|
11 |
+
|
12 |
+
|
13 |
+
def get_user_agent():
|
14 |
+
return 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:127.0) Gecko/20100101 Firefox/127.0'
|
15 |
+
|
16 |
+
|
17 |
+
def change_interface_mode(mode: str):
|
18 |
+
if mode == "Fast":
|
19 |
+
return gr.update(open=False), gr.update(visible=True), gr.update(open=False), gr.update(open=False),\
|
20 |
+
gr.update(visible=True), gr.update(open=False), gr.update(visible=True), gr.update(visible=True),\
|
21 |
+
gr.update(visible=True), gr.update(visible=True), gr.update(visible=True), gr.update(visible=True),\
|
22 |
+
gr.update(visible=True), gr.update(visible=True), gr.update(value="Fast")
|
23 |
+
elif mode == "Simple": # t2i mode
|
24 |
+
return gr.update(open=True), gr.update(visible=True), gr.update(open=True), gr.update(open=True),\
|
25 |
+
gr.update(visible=True), gr.update(open=False), gr.update(visible=False), gr.update(visible=False),\
|
26 |
+
gr.update(visible=False), gr.update(visible=False), gr.update(visible=False), gr.update(visible=False),\
|
27 |
+
gr.update(visible=False), gr.update(visible=False), gr.update(value="Standard")
|
28 |
+
elif mode == "LoRA": # t2i LoRA mode
|
29 |
+
return gr.update(open=True), gr.update(visible=True), gr.update(open=True), gr.update(open=False),\
|
30 |
+
gr.update(visible=True), gr.update(open=True), gr.update(visible=True), gr.update(visible=True),\
|
31 |
+
gr.update(visible=True), gr.update(visible=True), gr.update(visible=True), gr.update(visible=True),\
|
32 |
+
gr.update(visible=True), gr.update(visible=False), gr.update(value="Standard")
|
33 |
+
else: # Standard
|
34 |
+
return gr.update(open=False), gr.update(visible=True), gr.update(open=False), gr.update(open=False),\
|
35 |
+
gr.update(visible=True), gr.update(open=False), gr.update(visible=True), gr.update(visible=True),\
|
36 |
+
gr.update(visible=True), gr.update(visible=True), gr.update(visible=True), gr.update(visible=True),\
|
37 |
+
gr.update(visible=True), gr.update(visible=True), gr.update(value="Standard")
|
38 |
|
39 |
|
40 |
def get_model_list(directory_path):
|
|
|
322 |
if path in set(civitai_not_exists_list): return ["", "", "", "", ""]
|
323 |
from pathlib import Path
|
324 |
if not Path(path).exists(): return None
|
325 |
+
user_agent = get_user_agent()
|
|
|
|
|
326 |
headers = {'User-Agent': user_agent, 'content-type': 'application/json'}
|
327 |
base_url = 'https://civitai.com/api/v1/model-versions/by-hash/'
|
328 |
params = {}
|
|
|
468 |
),
|
469 |
|
470 |
|
471 |
+
def search_lora_on_civitai(query: str, allow_model: list[str]):
|
472 |
+
import requests
|
473 |
+
if not query: return None
|
474 |
+
user_agent = get_user_agent()
|
475 |
+
headers = {'User-Agent': user_agent, 'content-type': 'application/json'}
|
476 |
+
base_url = 'https://civitai.com/api/v1/models'
|
477 |
+
params = {'query': query, 'types': ['LORA'], 'sort': 'Highest Rated', 'period': 'AllTime',
|
478 |
+
'nsfw': 'true'}
|
479 |
+
r = requests.get(base_url, params=params, headers=headers, timeout=(3.0, 30))
|
480 |
+
if not r.ok: return None
|
481 |
+
json = r.json()
|
482 |
+
if not 'items' in json: return None
|
483 |
+
items = []
|
484 |
+
for j in json['items']:
|
485 |
+
for model in j['modelVersions']:
|
486 |
+
item = {}
|
487 |
+
if not model['baseModel'] in set(allow_model): continue
|
488 |
+
item['name'] = j['name']
|
489 |
+
item['creator'] = j['creator']['username']
|
490 |
+
item['tags'] = j['tags']
|
491 |
+
item['model_name'] = model['name']
|
492 |
+
item['base_model'] = model['baseModel']
|
493 |
+
item['dl_url'] = model['downloadUrl']
|
494 |
+
item['md'] = f'<img src="{model["images"][0]["url"]}" alt="thumbnail" width="150" height="240"><br>[LoRA Model URL](https://civitai.com/models/{j["id"]})'
|
495 |
+
items.append(item)
|
496 |
+
return items
|
497 |
+
|
498 |
+
|
499 |
+
civitai_lora_last_results = {}
|
500 |
+
|
501 |
+
|
502 |
+
def search_civitai_lora(query, base_model):
|
503 |
+
global civitai_lora_last_results
|
504 |
+
items = search_lora_on_civitai(query, base_model)
|
505 |
+
if not items: return gr.update(choices=[("", "")], value="", visible=False), gr.update(value="", visible=False)
|
506 |
+
civitai_lora_last_results = {}
|
507 |
+
choices = []
|
508 |
+
for item in items:
|
509 |
+
base_model_name = "Pony🐴" if item['base_model'] == "Pony" else item['base_model']
|
510 |
+
name = f"{item['name']} (for {base_model_name} / By {item['creator']} / Tags={', '.join(item['tags'])})"
|
511 |
+
value = item['dl_url']
|
512 |
+
choices.append((name, value))
|
513 |
+
civitai_lora_last_results[value] = item['md']
|
514 |
+
if not choices: return gr.update(choices=[("", "")], value="", visible=False), gr.update(value="", visible=False)
|
515 |
+
md = civitai_lora_last_results.get(choices[0][1], "None")
|
516 |
+
return gr.update(choices=choices, value=choices[0][1], visible=True), gr.update(value=md, visible=True)
|
517 |
+
|
518 |
+
|
519 |
+
def select_civitai_lora(search_result):
|
520 |
+
if not "http" in search_result: return gr.update(value=""), gr.update(value="None", visible=True)
|
521 |
+
md = civitai_lora_last_results.get(search_result, "None")
|
522 |
+
return gr.update(value=search_result), gr.update(value=md, visible=True)
|
523 |
+
|
524 |
+
|
525 |
quality_prompt_list = [
|
526 |
{
|
527 |
"name": "None",
|
tagger.py
CHANGED
@@ -81,6 +81,14 @@ def character_list_to_series_list(character_list):
|
|
81 |
return output_series_tag
|
82 |
|
83 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
84 |
def danbooru_to_e621(dtag, e621_dict):
|
85 |
def d_to_e(match, e621_dict):
|
86 |
dtag = match.group(0)
|
|
|
81 |
return output_series_tag
|
82 |
|
83 |
|
84 |
+
def select_random_character(series: str, character: str):
|
85 |
+
from random import randrange
|
86 |
+
character_list = list(anime_series_dict.keys())
|
87 |
+
character = character_list[randrange(len(character_list) - 1)]
|
88 |
+
series = anime_series_dict.get(character.split(",")[0].strip(), "")
|
89 |
+
return series, character
|
90 |
+
|
91 |
+
|
92 |
def danbooru_to_e621(dtag, e621_dict):
|
93 |
def d_to_e(match, e621_dict):
|
94 |
dtag = match.group(0)
|