From 820f1dc96b1979d7e92170c161db281ee8bd988b Mon Sep 17 00:00:00 2001 From: AUTOMATIC <16777216c@gmail.com> Date: Sun, 2 Oct 2022 15:03:39 +0300 Subject: initial support for training textual inversion --- style.css | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'style.css') diff --git a/style.css b/style.css index 79d6bb0d..39586bf1 100644 --- a/style.css +++ b/style.css @@ -157,7 +157,7 @@ button{ max-width: 10em; } -#txt2img_preview, #img2img_preview{ +#txt2img_preview, #img2img_preview, #ti_preview{ position: absolute; width: 320px; left: 0; @@ -172,18 +172,18 @@ button{ } @media screen and (min-width: 768px) { - #txt2img_preview, #img2img_preview { + #txt2img_preview, #img2img_preview, #ti_preview { position: absolute; } } @media screen and (max-width: 767px) { - #txt2img_preview, #img2img_preview { + #txt2img_preview, #img2img_preview, #ti_preview { position: relative; } } -#txt2img_preview div.left-0.top-0, #img2img_preview div.left-0.top-0{ +#txt2img_preview div.left-0.top-0, #img2img_preview div.left-0.top-0, #ti_preview div.left-0.top-0{ display: none; } @@ -247,7 +247,7 @@ input[type="range"]{ #txt2img_negative_prompt, #img2img_negative_prompt{ } -#txt2img_progressbar, #img2img_progressbar{ +#txt2img_progressbar, #img2img_progressbar, #ti_progressbar{ position: absolute; z-index: 1000; right: 0; -- cgit v1.2.3 From 2a7f48cdb8dcf9acb02610cccae0d1ee5d260bc2 Mon Sep 17 00:00:00 2001 From: fuzzytent Date: Fri, 30 Sep 2022 16:02:16 +0200 Subject: Improve styling of gallery items, particularly in dark mode --- style.css | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'style.css') diff --git a/style.css b/style.css index 9709c4ee..e11316b9 100644 --- a/style.css +++ b/style.css @@ -403,3 +403,7 @@ input[type="range"]{ .red { color: red; } + +.gallery-item { + --tw-bg-opacity: 0 !important; +} -- cgit v1.2.3 From b32852ef037251eb3d846af76e2965594e1ac7a5 Mon Sep 17 00:00:00 2001 From: AUTOMATIC <16777216c@gmail.com> Date: Tue, 4 Oct 2022 20:49:54 +0300 Subject: add editor to img2img --- modules/shared.py | 1 + modules/ui.py | 2 +- style.css | 4 ++++ 3 files changed, 6 insertions(+), 1 deletion(-) (limited to 'style.css') diff --git a/modules/shared.py b/modules/shared.py index ff4e5fa3..e52c9b1d 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -55,6 +55,7 @@ parser.add_argument("--hide-ui-dir-config", action='store_true', help="hide dire parser.add_argument("--ui-settings-file", type=str, help="filename to use for ui settings", default=os.path.join(script_path, 'config.json')) parser.add_argument("--gradio-debug", action='store_true', help="launch gradio with --debug option") parser.add_argument("--gradio-auth", type=str, help='set gradio authentication like "username:password"; or comma-delimit multiple like "u1:p1,u2:p2,u3:p3"', default=None) +parser.add_argument("--gradio-img2img-tool", type=str, help='gradio image uploader tool: can be either editor for ctopping, or color-sketch for drawing', choices=["color-sketch", "editor"], default="color-sketch") parser.add_argument("--opt-channelslast", action='store_true', help="change memory type for stable diffusion to channels last") parser.add_argument("--styles-file", type=str, help="filename to use for styles", default=os.path.join(script_path, 'styles.csv')) parser.add_argument("--autolaunch", action='store_true', help="open the webui URL in the system's default browser upon launch", default=False) diff --git a/modules/ui.py b/modules/ui.py index 20dc8c37..6cd6761b 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -644,7 +644,7 @@ def create_ui(wrap_gradio_gpu_call): with gr.Tabs(elem_id="mode_img2img") as tabs_img2img_mode: with gr.TabItem('img2img', id='img2img'): - init_img = gr.Image(label="Image for img2img", show_label=False, source="upload", interactive=True, type="pil") + 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) with gr.TabItem('Inpaint', id='inpaint'): 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="sketch", image_mode="RGBA") diff --git a/style.css b/style.css index 39586bf1..e8f4cb75 100644 --- a/style.css +++ b/style.css @@ -403,3 +403,7 @@ input[type="range"]{ .red { color: red; } + +#img2img_image div.h-60{ + height: 480px; +} \ No newline at end of file -- cgit v1.2.3 From 59a2b9e5afc27d2fda72069ca0635070535d18fe Mon Sep 17 00:00:00 2001 From: Greendayle Date: Wed, 5 Oct 2022 20:50:10 +0200 Subject: deepdanbooru interrogator --- ... your deepbooru release project folder here.txt | 0 modules/deepbooru.py | 60 ++++++++++++++++++++++ modules/ui.py | 24 +++++++-- requirements.txt | 3 ++ requirements_versions.txt | 3 ++ style.css | 7 ++- 6 files changed, 91 insertions(+), 6 deletions(-) create mode 100644 models/deepbooru/Put your deepbooru release project folder here.txt create mode 100644 modules/deepbooru.py (limited to 'style.css') diff --git a/models/deepbooru/Put your deepbooru release project folder here.txt b/models/deepbooru/Put your deepbooru release project folder here.txt new file mode 100644 index 00000000..e69de29b diff --git a/modules/deepbooru.py b/modules/deepbooru.py new file mode 100644 index 00000000..958b1c3d --- /dev/null +++ b/modules/deepbooru.py @@ -0,0 +1,60 @@ +import os.path +from concurrent.futures import ProcessPoolExecutor + +import numpy as np +import deepdanbooru as dd +import tensorflow as tf + + +def _load_tf_and_return_tags(pil_image, threshold): + this_folder = os.path.dirname(__file__) + model_path = os.path.join(this_folder, '..', 'models', 'deepbooru', 'deepdanbooru-v3-20211112-sgd-e28') + if not os.path.exists(model_path): + return "Download https://github.com/KichangKim/DeepDanbooru/releases/download/v3-20211112-sgd-e28/deepdanbooru-v3-20211112-sgd-e28.zip unpack and put into models/deepbooru" + + tags = dd.project.load_tags_from_project(model_path) + model = dd.project.load_model_from_project( + model_path, compile_model=True + ) + + width = model.input_shape[2] + height = model.input_shape[1] + image = np.array(pil_image) + image = tf.image.resize( + image, + size=(height, width), + method=tf.image.ResizeMethod.AREA, + preserve_aspect_ratio=True, + ) + image = image.numpy() # EagerTensor to np.array + image = dd.image.transform_and_pad_image(image, width, height) + image = image / 255.0 + image_shape = image.shape + image = image.reshape((1, image_shape[0], image_shape[1], image_shape[2])) + + y = model.predict(image)[0] + + result_dict = {} + + for i, tag in enumerate(tags): + result_dict[tag] = y[i] + + + + result_tags_out = [] + result_tags_print = [] + for tag in tags: + if result_dict[tag] >= threshold: + result_tags_out.append(tag) + result_tags_print.append(f'{result_dict[tag]} {tag}') + + print('\n'.join(sorted(result_tags_print, reverse=True))) + + return ', '.join(result_tags_out) + + +def get_deepbooru_tags(pil_image, threshold=0.5): + with ProcessPoolExecutor() as executor: + f = executor.submit(_load_tf_and_return_tags, pil_image, threshold) + ret = f.result() # will rethrow any exceptions + return ret \ No newline at end of file diff --git a/modules/ui.py b/modules/ui.py index 20dc8c37..ae98219a 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -23,6 +23,7 @@ import gradio.utils import gradio.routes from modules import sd_hijack +from modules.deepbooru import get_deepbooru_tags from modules.paths import script_path from modules.shared import opts, cmd_opts import modules.shared as shared @@ -312,6 +313,11 @@ def interrogate(image): return gr_show(True) if prompt is None else prompt +def interrogate_deepbooru(image): + prompt = get_deepbooru_tags(image) + return gr_show(True) if prompt is None else prompt + + def create_seed_inputs(): with gr.Row(): with gr.Box(): @@ -439,15 +445,17 @@ def create_toprow(is_img2img): outputs=[], ) - with gr.Row(): + with gr.Row(scale=1): if is_img2img: - interrogate = gr.Button('Interrogate', elem_id="interrogate") + interrogate = gr.Button('Interrogate\nCLIP', elem_id="interrogate") + deepbooru = gr.Button('Interrogate\nDeepBooru', elem_id="deepbooru") else: interrogate = None + deepbooru = None prompt_style_apply = gr.Button('Apply style', elem_id="style_apply") save_style = gr.Button('Create style', elem_id="style_create") - return prompt, roll, prompt_style, negative_prompt, prompt_style2, submit, interrogate, prompt_style_apply, save_style, paste, token_counter, token_button + return prompt, roll, prompt_style, negative_prompt, prompt_style2, submit, interrogate, deepbooru, prompt_style_apply, save_style, paste, token_counter, token_button def setup_progressbar(progressbar, preview, id_part, textinfo=None): @@ -476,7 +484,7 @@ def create_ui(wrap_gradio_gpu_call): import modules.txt2img 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, paste, token_counter, token_button = create_toprow(is_img2img=False) + txt2img_prompt, roll, txt2img_prompt_style, txt2img_negative_prompt, txt2img_prompt_style2, submit, _, _, txt2img_prompt_style_apply, txt2img_save_style, paste, token_counter, token_button = create_toprow(is_img2img=False) dummy_component = gr.Label(visible=False) with gr.Row(elem_id='txt2img_progress_row'): @@ -628,7 +636,7 @@ def create_ui(wrap_gradio_gpu_call): token_button.click(fn=update_token_counter, inputs=[txt2img_prompt, steps], outputs=[token_counter]) 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_prompt_style_apply, img2img_save_style, paste, token_counter, token_button = create_toprow(is_img2img=True) + img2img_prompt, roll, img2img_prompt_style, img2img_negative_prompt, img2img_prompt_style2, submit, img2img_interrogate, img2img_deepbooru, img2img_prompt_style_apply, img2img_save_style, paste, token_counter, token_button = create_toprow(is_img2img=True) with gr.Row(elem_id='img2img_progress_row'): with gr.Column(scale=1): @@ -785,6 +793,12 @@ def create_ui(wrap_gradio_gpu_call): outputs=[img2img_prompt], ) + img2img_deepbooru.click( + fn=interrogate_deepbooru, + inputs=[init_img], + outputs=[img2img_prompt], + ) + save.click( fn=wrap_gradio_call(save_files), _js="(x, y, z) => [x, y, selected_gallery_index()]", diff --git a/requirements.txt b/requirements.txt index 631fe616..cab101f8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -23,3 +23,6 @@ resize-right torchdiffeq kornia lark +deepdanbooru +tensorflow +tensorflow-io diff --git a/requirements_versions.txt b/requirements_versions.txt index fdff2687..811953c6 100644 --- a/requirements_versions.txt +++ b/requirements_versions.txt @@ -22,3 +22,6 @@ resize-right==0.0.2 torchdiffeq==0.2.3 kornia==0.6.7 lark==1.1.2 +git+https://github.com/KichangKim/DeepDanbooru.git@edf73df4cdaeea2cf00e9ac08bd8a9026b7a7b26#egg=deepdanbooru[tensorflow] +tensorflow==2.10.0 +tensorflow-io==0.27.0 diff --git a/style.css b/style.css index 39586bf1..2fd351f9 100644 --- a/style.css +++ b/style.css @@ -103,7 +103,12 @@ #style_apply, #style_create, #interrogate{ margin: 0.75em 0.25em 0.25em 0.25em; - min-width: 3em; + min-width: 5em; +} + +#style_apply, #style_create, #deepbooru{ + margin: 0.75em 0.25em 0.25em 0.25em; + min-width: 5em; } #style_pos_col, #style_neg_col{ -- cgit v1.2.3 From 83749bfc72923b946abb825ebf4fdcc8b6035c8e Mon Sep 17 00:00:00 2001 From: DepFA <35278260+dfaker@users.noreply.github.com> Date: Sat, 8 Oct 2022 05:35:03 +0100 Subject: context menu styling --- style.css | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) (limited to 'style.css') diff --git a/style.css b/style.css index da0729a2..50c5e557 100644 --- a/style.css +++ b/style.css @@ -410,4 +410,31 @@ input[type="range"]{ #img2img_image div.h-60{ height: 480px; -} \ No newline at end of file +} + +#context-menu{ + z-index:9999; + position:absolute; + display:block; + padding:0px 0; + border:2px solid #a55000; + border-radius:8px; + box-shadow:1px 1px 2px #CE6400; + width: 200px; +} + +.context-menu-items{ + list-style: none; + margin: 0; + padding: 0; +} + +.context-menu-items a{ + display:block; + padding:5px; + cursor:pointer; +} + +.context-menu-items a:hover{ + background: #a55000; +} -- cgit v1.2.3 From 786d9f63aaa4515df82eb2cf357ea92f3dae1e29 Mon Sep 17 00:00:00 2001 From: Trung Ngo Date: Tue, 4 Oct 2022 22:56:30 -0500 Subject: Add button to skip the current iteration --- javascript/hints.js | 1 + javascript/progressbar.js | 20 ++++++++++++++------ modules/img2img.py | 4 ++++ modules/processing.py | 4 ++++ modules/shared.py | 5 +++++ modules/ui.py | 8 ++++++++ style.css | 14 ++++++++++++-- webui.py | 1 + 8 files changed, 49 insertions(+), 8 deletions(-) (limited to 'style.css') diff --git a/javascript/hints.js b/javascript/hints.js index 8adcd983..8e352e94 100644 --- a/javascript/hints.js +++ b/javascript/hints.js @@ -35,6 +35,7 @@ titles = { "Denoising strength": "Determines how little respect the algorithm should have for image's content. At 0, nothing will change, and at 1 you'll get an unrelated image. With values below 1.0, processing will take less steps than the Sampling Steps slider specifies.", "Denoising strength change factor": "In loopback mode, on each loop the denoising strength is multiplied by this value. <1 means decreasing variety so your sequence will converge on a fixed picture. >1 means increasing variety so your sequence will become more and more chaotic.", + "Skip": "Stop processing current image and continue processing.", "Interrupt": "Stop processing images and return any results accumulated so far.", "Save": "Write image to a directory (default - log/images) and generation parameters into csv file.", diff --git a/javascript/progressbar.js b/javascript/progressbar.js index f9e9290e..4395a215 100644 --- a/javascript/progressbar.js +++ b/javascript/progressbar.js @@ -1,8 +1,9 @@ // code related to showing and updating progressbar shown as the image is being made global_progressbars = {} -function check_progressbar(id_part, id_progressbar, id_progressbar_span, id_interrupt, id_preview, id_gallery){ +function check_progressbar(id_part, id_progressbar, id_progressbar_span, id_skip, id_interrupt, id_preview, id_gallery){ var progressbar = gradioApp().getElementById(id_progressbar) + var skip = id_skip ? gradioApp().getElementById(id_skip) : null var interrupt = gradioApp().getElementById(id_interrupt) if(opts.show_progress_in_title && progressbar && progressbar.offsetParent){ @@ -32,30 +33,37 @@ function check_progressbar(id_part, id_progressbar, id_progressbar_span, id_inte var progressDiv = gradioApp().querySelectorAll('#' + id_progressbar_span).length > 0; if(!progressDiv){ + if (skip) { + skip.style.display = "none" + } interrupt.style.display = "none" } } - window.setTimeout(function(){ requestMoreProgress(id_part, id_progressbar_span, id_interrupt) }, 500) + window.setTimeout(function() { requestMoreProgress(id_part, id_progressbar_span, id_skip, id_interrupt) }, 500) }); mutationObserver.observe( progressbar, { childList:true, subtree:true }) } } onUiUpdate(function(){ - check_progressbar('txt2img', 'txt2img_progressbar', 'txt2img_progress_span', 'txt2img_interrupt', 'txt2img_preview', 'txt2img_gallery') - check_progressbar('img2img', 'img2img_progressbar', 'img2img_progress_span', 'img2img_interrupt', 'img2img_preview', 'img2img_gallery') - check_progressbar('ti', 'ti_progressbar', 'ti_progress_span', 'ti_interrupt', 'ti_preview', 'ti_gallery') + check_progressbar('txt2img', 'txt2img_progressbar', 'txt2img_progress_span', 'txt2img_skip', 'txt2img_interrupt', 'txt2img_preview', 'txt2img_gallery') + check_progressbar('img2img', 'img2img_progressbar', 'img2img_progress_span', 'img2img_skip', 'img2img_interrupt', 'img2img_preview', 'img2img_gallery') + check_progressbar('ti', 'ti_progressbar', 'ti_progress_span', '', 'ti_interrupt', 'ti_preview', 'ti_gallery') }) -function requestMoreProgress(id_part, id_progressbar_span, id_interrupt){ +function requestMoreProgress(id_part, id_progressbar_span, id_skip, id_interrupt){ btn = gradioApp().getElementById(id_part+"_check_progress"); if(btn==null) return; btn.click(); var progressDiv = gradioApp().querySelectorAll('#' + id_progressbar_span).length > 0; + var skip = id_skip ? gradioApp().getElementById(id_skip) : null var interrupt = gradioApp().getElementById(id_interrupt) if(progressDiv && interrupt){ + if (skip) { + skip.style.display = "block" + } interrupt.style.display = "block" } } diff --git a/modules/img2img.py b/modules/img2img.py index da212d72..e60b7e0f 100644 --- a/modules/img2img.py +++ b/modules/img2img.py @@ -32,6 +32,10 @@ def process_batch(p, input_dir, output_dir, args): for i, image in enumerate(images): state.job = f"{i+1} out of {len(images)}" + if state.skipped: + state.skipped = False + state.interrupted = False + continue if state.interrupted: break diff --git a/modules/processing.py b/modules/processing.py index d814d5ac..6805039c 100644 --- a/modules/processing.py +++ b/modules/processing.py @@ -355,6 +355,10 @@ def process_images(p: StableDiffusionProcessing) -> Processed: state.job_count = p.n_iter for n in range(p.n_iter): + if state.skipped: + state.skipped = False + state.interrupted = False + if state.interrupted: break diff --git a/modules/shared.py b/modules/shared.py index 864e772c..7f802bd9 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -84,6 +84,7 @@ def selected_hypernetwork(): class State: + skipped = False interrupted = False job = "" job_no = 0 @@ -96,6 +97,10 @@ class State: current_image_sampling_step = 0 textinfo = None + def skip(self): + self.skipped = True + self.interrupted = True + def interrupt(self): self.interrupted = True diff --git a/modules/ui.py b/modules/ui.py index 4f18126f..e3e62fdd 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -191,6 +191,7 @@ def wrap_gradio_call(func, extra_outputs=None): # last item is always HTML res[-1] += f"

Time taken: {elapsed_text}

{vram_html}
" + shared.state.skipped = False shared.state.interrupted = False shared.state.job_count = 0 @@ -411,9 +412,16 @@ def create_toprow(is_img2img): with gr.Column(scale=1): with gr.Row(): + skip = gr.Button('Skip', elem_id=f"{id_part}_skip") interrupt = gr.Button('Interrupt', elem_id=f"{id_part}_interrupt") submit = gr.Button('Generate', elem_id=f"{id_part}_generate", variant='primary') + skip.click( + fn=lambda: shared.state.skip(), + inputs=[], + outputs=[], + ) + interrupt.click( fn=lambda: shared.state.interrupt(), inputs=[], diff --git a/style.css b/style.css index 50c5e557..6904fc50 100644 --- a/style.css +++ b/style.css @@ -393,10 +393,20 @@ input[type="range"]{ #txt2img_interrupt, #img2img_interrupt{ position: absolute; - width: 100%; + width: 50%; height: 72px; background: #b4c0cc; - border-radius: 8px; + border-radius: 0px; + display: none; +} + +#txt2img_skip, #img2img_skip{ + position: absolute; + width: 50%; + right: 0px; + height: 72px; + background: #b4c0cc; + border-radius: 0px; display: none; } diff --git a/webui.py b/webui.py index 480360fe..3b4cf5e9 100644 --- a/webui.py +++ b/webui.py @@ -58,6 +58,7 @@ def wrap_gradio_gpu_call(func, extra_outputs=None): shared.state.current_latent = None shared.state.current_image = None shared.state.current_image_sampling_step = 0 + shared.state.skipped = False shared.state.interrupted = False shared.state.textinfo = None -- cgit v1.2.3 From 6c383d2e82045fc4475d665f83bdeeac8fd844d9 Mon Sep 17 00:00:00 2001 From: AUTOMATIC <16777216c@gmail.com> Date: Sun, 9 Oct 2022 22:24:07 +0300 Subject: show model selection setting on top of page --- modules/shared.py | 5 +++-- modules/ui.py | 54 +++++++++++++++++++++++++++++++++++++++++++++--------- style.css | 9 +++++++++ 3 files changed, 57 insertions(+), 11 deletions(-) (limited to 'style.css') diff --git a/modules/shared.py b/modules/shared.py index 3d7f08e1..270fa402 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -131,13 +131,14 @@ def realesrgan_models_names(): class OptionInfo: - def __init__(self, default=None, label="", component=None, component_args=None, onchange=None): + def __init__(self, default=None, label="", component=None, component_args=None, onchange=None, show_on_main_page=False): self.default = default self.label = label self.component = component self.component_args = component_args self.onchange = onchange self.section = None + self.show_on_main_page = show_on_main_page def options_section(section_identifier, options_dict): @@ -214,7 +215,7 @@ options_templates.update(options_section(('system', "System"), { })) options_templates.update(options_section(('sd', "Stable Diffusion"), { - "sd_model_checkpoint": OptionInfo(None, "Stable Diffusion checkpoint", gr.Dropdown, lambda: {"choices": modules.sd_models.checkpoint_tiles()}), + "sd_model_checkpoint": OptionInfo(None, "Stable Diffusion checkpoint", gr.Dropdown, lambda: {"choices": modules.sd_models.checkpoint_tiles()}, show_on_main_page=True), "sd_hypernetwork": OptionInfo("None", "Stable Diffusion finetune hypernetwork", gr.Dropdown, lambda: {"choices": ["None"] + [x for x in hypernetworks.keys()]}), "img2img_color_correction": OptionInfo(False, "Apply color correction to img2img results to match original colors."), "save_images_before_color_correction": OptionInfo(False, "Save a copy of image before applying color correction to img2img results"), diff --git a/modules/ui.py b/modules/ui.py index dad509f3..2231a8ed 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -1175,10 +1175,13 @@ Requested path was: {f} changed = 0 for key, value, comp in zip(opts.data_labels.keys(), args, components): - if not opts.same_type(value, opts.data_labels[key].default): - return f"Bad value for setting {key}: {value}; expecting {type(opts.data_labels[key].default).__name__}" + if comp != dummy_component and not opts.same_type(value, opts.data_labels[key].default): + return f"Bad value for setting {key}: {value}; expecting {type(opts.data_labels[key].default).__name__}", opts.dumpjson() for key, value, comp in zip(opts.data_labels.keys(), args, components): + if comp == dummy_component: + continue + comp_args = opts.data_labels[key].component_args if comp_args and isinstance(comp_args, dict) and comp_args.get('visible') is False: continue @@ -1196,6 +1199,21 @@ Requested path was: {f} return f'{changed} settings changed.', opts.dumpjson() + def run_settings_single(value, key): + if not opts.same_type(value, opts.data_labels[key].default): + return gr.update(visible=True), opts.dumpjson() + + oldval = opts.data.get(key, None) + opts.data[key] = value + + if oldval != value: + if opts.data_labels[key].onchange is not None: + opts.data_labels[key].onchange() + + opts.save(shared.config_filename) + + 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() @@ -1203,6 +1221,8 @@ Requested path was: {f} settings_cols = 3 items_per_col = int(len(opts.data_labels) * 0.9 / settings_cols) + quicksettings_list = [] + cols_displayed = 0 items_displayed = 0 previous_section = None @@ -1225,10 +1245,14 @@ Requested path was: {f} gr.HTML(elem_id="settings_header_text_{}".format(item.section[0]), value='

{}

'.format(item.section[1])) - component = create_setting_component(k) - component_dict[k] = component - components.append(component) - items_displayed += 1 + if item.show_on_main_page: + quicksettings_list.append((i, k, item)) + components.append(dummy_component) + else: + component = create_setting_component(k) + component_dict[k] = component + components.append(component) + items_displayed += 1 request_notifications = gr.Button(value='Request browser notifications', elem_id="request_notifications") request_notifications.click( @@ -1242,7 +1266,6 @@ Requested path was: {f} 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') - def reload_scripts(): modules.scripts.reload_script_body_only() @@ -1289,7 +1312,11 @@ Requested path was: {f} css += css_hide_progressbar 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: + component = create_setting_component(k) + component_dict[k] = component + settings_interface.gradio_ref = demo with gr.Tabs() as tabs: @@ -1306,7 +1333,16 @@ Requested path was: {f} inputs=components, outputs=[result, text_settings], ) - + + for i, k, item in quicksettings_list: + component = component_dict[k] + + component.change( + fn=lambda value, k=k: run_settings_single(value, key=k), + inputs=[component], + outputs=[component, text_settings], + ) + def modelmerger(*args): try: results = modules.extras.run_modelmerger(*args) diff --git a/style.css b/style.css index 101d2052..28160bdf 100644 --- a/style.css +++ b/style.css @@ -453,3 +453,12 @@ input[type="range"]{ .context-menu-items a:hover{ background: #a55000; } + +#quicksettings > div{ + border: none; +} + +#quicksettings > div > div{ + max-width: 32em; + padding: 0; +} -- cgit v1.2.3 From 45fbd1c5fec887988ab555aac75a999d4f3aff40 Mon Sep 17 00:00:00 2001 From: AUTOMATIC <16777216c@gmail.com> Date: Mon, 10 Oct 2022 00:42:18 +0300 Subject: remove background for quicksettings row (for dark theme) --- style.css | 1 + 1 file changed, 1 insertion(+) (limited to 'style.css') diff --git a/style.css b/style.css index 28160bdf..c0c3f2bb 100644 --- a/style.css +++ b/style.css @@ -456,6 +456,7 @@ input[type="range"]{ #quicksettings > div{ border: none; + background: none; } #quicksettings > div > div{ -- cgit v1.2.3 From ce37fdd30e9fc0fe0bc5805a068ce8b11b42b5a3 Mon Sep 17 00:00:00 2001 From: Ben <110583491+TheLastBen@users.noreply.github.com> Date: Sat, 8 Oct 2022 22:03:00 +0100 Subject: maximize the view --- style.css | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'style.css') diff --git a/style.css b/style.css index c0c3f2bb..04bb9576 100644 --- a/style.css +++ b/style.css @@ -1,3 +1,7 @@ +.container { + max-width: 100%; +} + .output-html p {margin: 0 0.5em;} .row > *, -- cgit v1.2.3 From 9d33baba587637815d818e5e641d8f8b74c4900d Mon Sep 17 00:00:00 2001 From: Vladimir Repin <32306715+mezotaken@users.noreply.github.com> Date: Mon, 10 Oct 2022 18:46:48 +0300 Subject: Always show previous mask and fix extras_send dest --- modules/ui.py | 2 +- style.css | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) (limited to 'style.css') diff --git a/modules/ui.py b/modules/ui.py index 8ba84911..e8039d76 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -961,7 +961,7 @@ def create_ui(wrap_gradio_gpu_call): extras_send_to_inpaint.click( fn=lambda x: image_from_url_text(x), - _js="extract_image_from_gallery_img2img", + _js="extract_image_from_gallery_inpaint", inputs=[result_images], outputs=[init_img_with_mask], ) diff --git a/style.css b/style.css index 04bb9576..00a3d07f 100644 --- a/style.css +++ b/style.css @@ -467,3 +467,10 @@ input[type="range"]{ max-width: 32em; padding: 0; } + +canvas[key="mask"] { + z-index: 12 !important; + filter: invert(); + mix-blend-mode: multiply; + pointer-events: none; +} -- cgit v1.2.3 From b372f5538bee4feba87080af4f3acf1e437accc6 Mon Sep 17 00:00:00 2001 From: Ben <110583491+TheLastBen@users.noreply.github.com> Date: Mon, 10 Oct 2022 19:34:07 +0100 Subject: Save some space --- style.css | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'style.css') diff --git a/style.css b/style.css index 00a3d07f..38410ca4 100644 --- a/style.css +++ b/style.css @@ -2,6 +2,18 @@ max-width: 100%; } +#txt2img_token_counter { + height: 0px; +} + +#img2img_token_counter { + height: 0px; +} + +#negative_prompt { + width: 97.9%; +} + .output-html p {margin: 0 0.5em;} .row > *, -- cgit v1.2.3 From 031dc8cd7fa6bc74b44114715b28e0737342de37 Mon Sep 17 00:00:00 2001 From: Ben <110583491+TheLastBen@users.noreply.github.com> Date: Tue, 11 Oct 2022 08:08:47 +0100 Subject: space holder --- style.css | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'style.css') diff --git a/style.css b/style.css index 38410ca4..d1c866fc 100644 --- a/style.css +++ b/style.css @@ -10,8 +10,16 @@ height: 0px; } -#negative_prompt { - width: 97.9%; +#sh{ + min-width: 2em; + min-height: 2em; + max-width: 2em; + max-height: 2em; + flex-grow: 0; + padding-left: 0.25em; + padding-right: 0.25em; + margin: 0.1em 0; + opacity: 0%; } .output-html p {margin: 0 0.5em;} -- cgit v1.2.3 From 54c519943a24881ea61af5a73dedbab92f9431ce Mon Sep 17 00:00:00 2001 From: Ben <110583491+TheLastBen@users.noreply.github.com> Date: Tue, 11 Oct 2022 10:16:53 +0100 Subject: Update style.css --- style.css | 1 + 1 file changed, 1 insertion(+) (limited to 'style.css') diff --git a/style.css b/style.css index d1c866fc..ecb51bb0 100644 --- a/style.css +++ b/style.css @@ -20,6 +20,7 @@ padding-right: 0.25em; margin: 0.1em 0; opacity: 0%; + cursor: default; } .output-html p {margin: 0 0.5em;} -- cgit v1.2.3 From d7474a5185df2af84a93a12bc7e140d24e0fc516 Mon Sep 17 00:00:00 2001 From: AUTOMATIC <16777216c@gmail.com> Date: Tue, 11 Oct 2022 21:10:55 +0300 Subject: bump gradio to 3.4.1 --- requirements.txt | 2 +- requirements_versions.txt | 2 +- style.css | 11 +++++++++++ 3 files changed, 13 insertions(+), 2 deletions(-) (limited to 'style.css') diff --git a/requirements.txt b/requirements.txt index 631fe616..a0d985ce 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,7 @@ fairscale==0.4.4 fonts font-roboto gfpgan -gradio==3.4b3 +gradio==3.4.1 invisible-watermark numpy omegaconf diff --git a/requirements_versions.txt b/requirements_versions.txt index fdff2687..2bbea40b 100644 --- a/requirements_versions.txt +++ b/requirements_versions.txt @@ -2,7 +2,7 @@ transformers==4.19.2 diffusers==0.3.0 basicsr==1.4.2 gfpgan==1.3.8 -gradio==3.4b3 +gradio==3.4.1 numpy==1.23.3 Pillow==9.2.0 realesrgan==0.3.0 diff --git a/style.css b/style.css index ecb51bb0..e6fa10b4 100644 --- a/style.css +++ b/style.css @@ -240,6 +240,7 @@ fieldset span.text-gray-500, .gr-block.gr-box span.text-gray-500, label.block s #settings fieldset span.text-gray-500, #settings .gr-block.gr-box span.text-gray-500, #settings label.block span{ position: relative; border: none; + margin-right: 8em; } .gr-panel div.flex-col div.justify-between label span{ @@ -495,3 +496,13 @@ canvas[key="mask"] { mix-blend-mode: multiply; pointer-events: none; } + + +/* gradio 3.4.1 stuff for editable scrollbar values */ +.gr-box > div > div > input.gr-text-input{ + position: absolute; + right: 0.5em; + top: -0.6em; + z-index: 200; + width: 8em; +} -- cgit v1.2.3 From bb7baf6b9cb6b4b9fa09b6f07ef997db32fe6e58 Mon Sep 17 00:00:00 2001 From: AUTOMATIC <16777216c@gmail.com> Date: Thu, 13 Oct 2022 16:07:18 +0300 Subject: add option to change what's shown in quicksettings bar --- javascript/hints.js | 2 ++ modules/shared.py | 4 ++-- modules/ui.py | 16 +++++++++------- style.css | 1 + 4 files changed, 14 insertions(+), 9 deletions(-) (limited to 'style.css') diff --git a/javascript/hints.js b/javascript/hints.js index 32f10fde..06bbd9e2 100644 --- a/javascript/hints.js +++ b/javascript/hints.js @@ -84,6 +84,8 @@ titles = { "Filename word regex": "This regular expression will be used extract words from filename, and they will be joined using the option below into label text used for training. Leave empty to keep filename text as it is.", "Filename join string": "This string will be used to hoin split words into a single line if the option above is enabled.", + + "Quicksettings list": "List of setting names, separated by commas, for settings that should go to the quick access bar at the top, rather than the usual stetting tab. See modules/shared.py for setting names. Requires restart to apply." } diff --git a/modules/shared.py b/modules/shared.py index 5f6101a4..4d3ed625 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -152,7 +152,6 @@ class OptionInfo: self.component_args = component_args self.onchange = onchange self.section = None - self.show_on_main_page = show_on_main_page def options_section(section_identifier, options_dict): @@ -237,7 +236,7 @@ options_templates.update(options_section(('training', "Training"), { })) options_templates.update(options_section(('sd', "Stable Diffusion"), { - "sd_model_checkpoint": OptionInfo(None, "Stable Diffusion checkpoint", gr.Dropdown, lambda: {"choices": modules.sd_models.checkpoint_tiles()}, show_on_main_page=True), + "sd_model_checkpoint": OptionInfo(None, "Stable Diffusion checkpoint", gr.Dropdown, lambda: {"choices": modules.sd_models.checkpoint_tiles()}), "sd_hypernetwork": OptionInfo("None", "Stable Diffusion finetune hypernetwork", gr.Dropdown, lambda: {"choices": ["None"] + [x for x in hypernetworks.keys()]}), "img2img_color_correction": OptionInfo(False, "Apply color correction to img2img results to match original colors."), "save_images_before_color_correction": OptionInfo(False, "Save a copy of image before applying color correction to img2img results"), @@ -250,6 +249,7 @@ options_templates.update(options_section(('sd', "Stable Diffusion"), { "filter_nsfw": OptionInfo(False, "Filter NSFW content"), 'CLIP_stop_at_last_layers': OptionInfo(1, "Stop At last layers of CLIP model", gr.Slider, {"minimum": 1, "maximum": 12, "step": 1}), "random_artist_categories": OptionInfo([], "Allowed categories for random artists selection when using the Roll button", gr.CheckboxGroup, {"choices": artist_db.categories()}), + 'quicksettings': OptionInfo("sd_model_checkpoint", "Quicksettings list"), })) options_templates.update(options_section(('interrogate', "Interrogate Options"), { diff --git a/modules/ui.py b/modules/ui.py index e07ee0e1..a0529860 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -1305,6 +1305,9 @@ Requested path was: {f} settings_cols = 3 items_per_col = int(len(opts.data_labels) * 0.9 / settings_cols) + quicksettings_names = [x.strip() for x in opts.quicksettings.split(",")] + quicksettings_names = set(x for x in quicksettings_names if x != 'quicksettings') + quicksettings_list = [] cols_displayed = 0 @@ -1329,7 +1332,7 @@ Requested path was: {f} gr.HTML(elem_id="settings_header_text_{}".format(item.section[0]), value='

{}

'.format(item.section[1])) - if item.show_on_main_page: + if k in quicksettings_names: quicksettings_list.append((i, k, item)) components.append(dummy_component) else: @@ -1338,7 +1341,11 @@ Requested path was: {f} components.append(component) items_displayed += 1 - request_notifications = gr.Button(value='Request browser notifications', elem_id="request_notifications") + with gr.Row(): + request_notifications = gr.Button(value='Request browser notifications', elem_id="request_notifications") + 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') + request_notifications.click( fn=lambda: None, inputs=[], @@ -1346,10 +1353,6 @@ Requested path was: {f} _js='function(){}' ) - 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') - def reload_scripts(): modules.scripts.reload_script_body_only() @@ -1364,7 +1367,6 @@ Requested path was: {f} shared.state.interrupt() settings_interface.gradio_ref.do_restart = True - restart_gradio.click( fn=request_restart, inputs=[], diff --git a/style.css b/style.css index e6fa10b4..55c41971 100644 --- a/style.css +++ b/style.css @@ -488,6 +488,7 @@ input[type="range"]{ #quicksettings > div > div{ max-width: 32em; padding: 0; + margin-right: 0.75em; } canvas[key="mask"] { -- cgit v1.2.3 From a10b0e11fc22cc67b6a3664f2ddd17425d8433a8 Mon Sep 17 00:00:00 2001 From: AUTOMATIC <16777216c@gmail.com> Date: Thu, 13 Oct 2022 19:22:41 +0300 Subject: options to refresh list of models and hypernetworks --- modules/shared.py | 9 +++++---- modules/ui.py | 33 +++++++++++++++++++++++++++++---- style.css | 21 ++++++++++++++++++++- 3 files changed, 54 insertions(+), 9 deletions(-) (limited to 'style.css') diff --git a/modules/shared.py b/modules/shared.py index 4d3ed625..d8e3a286 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -13,7 +13,7 @@ import modules.memmon import modules.sd_models import modules.styles import modules.devices as devices -from modules import sd_samplers +from modules import sd_samplers, sd_models from modules.hypernetworks import hypernetwork from modules.paths import models_path, script_path, sd_path @@ -145,13 +145,14 @@ def realesrgan_models_names(): class OptionInfo: - def __init__(self, default=None, label="", component=None, component_args=None, onchange=None, show_on_main_page=False): + def __init__(self, default=None, label="", component=None, component_args=None, onchange=None, show_on_main_page=False, refresh=None): self.default = default self.label = label self.component = component self.component_args = component_args self.onchange = onchange self.section = None + self.refresh = refresh def options_section(section_identifier, options_dict): @@ -236,8 +237,8 @@ options_templates.update(options_section(('training', "Training"), { })) options_templates.update(options_section(('sd', "Stable Diffusion"), { - "sd_model_checkpoint": OptionInfo(None, "Stable Diffusion checkpoint", gr.Dropdown, lambda: {"choices": modules.sd_models.checkpoint_tiles()}), - "sd_hypernetwork": OptionInfo("None", "Stable Diffusion finetune hypernetwork", gr.Dropdown, lambda: {"choices": ["None"] + [x for x in hypernetworks.keys()]}), + "sd_model_checkpoint": OptionInfo(None, "Stable Diffusion checkpoint", gr.Dropdown, lambda: {"choices": modules.sd_models.checkpoint_tiles()}, refresh=sd_models.list_models), + "sd_hypernetwork": OptionInfo("None", "Stable Diffusion finetune hypernetwork", gr.Dropdown, lambda: {"choices": ["None"] + [x for x in hypernetworks.keys()]}, refresh=reload_hypernetworks), "img2img_color_correction": OptionInfo(False, "Apply color correction to img2img results to match original colors."), "save_images_before_color_correction": OptionInfo(False, "Save a copy of image before applying color correction to img2img results"), "img2img_fix_steps": OptionInfo(False, "With img2img, do exactly the amount of steps the slider specifies (normally you'd do less with less denoising)."), diff --git a/modules/ui.py b/modules/ui.py index a0529860..0a58f6be 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -78,6 +78,8 @@ reuse_symbol = '\u267b\ufe0f' # ♻️ art_symbol = '\U0001f3a8' # 🎨 paste_symbol = '\u2199\ufe0f' # ↙ folder_symbol = '\U0001f4c2' # 📂 +refresh_symbol = '\U0001f504' # 🔄 + def plaintext_to_html(text): text = "

" + "
\n".join([f"{html.escape(x)}" for x in text.split('\n')]) + "

" @@ -1210,8 +1212,7 @@ def create_ui(wrap_gradio_gpu_call): outputs=[], ) - - def create_setting_component(key): + def create_setting_component(key, is_quicksettings=False): def fun(): return opts.data[key] if key in opts.data else opts.data_labels[key].default @@ -1231,7 +1232,31 @@ def create_ui(wrap_gradio_gpu_call): else: raise Exception(f'bad options item type: {str(t)} for key {key}') - return comp(label=info.label, value=fun, **(args or {})) + if info.refresh is not None: + if is_quicksettings: + res = comp(label=info.label, value=fun, **(args or {})) + refresh_button = gr.Button(value=refresh_symbol, elem_id="refresh_"+key) + else: + with gr.Row(variant="compact"): + res = comp(label=info.label, value=fun, **(args or {})) + refresh_button = gr.Button(value=refresh_symbol, elem_id="refresh_" + key) + + def refresh(): + info.refresh() + refreshed_args = info.component_args() if callable(info.component_args) else info.component_args + res.choices = refreshed_args["choices"] + return gr.update(**(refreshed_args or {})) + + refresh_button.click( + fn=refresh, + inputs=[], + outputs=[res], + ) + else: + res = comp(label=info.label, value=fun, **(args or {})) + + + return res components = [] component_dict = {} @@ -1401,7 +1426,7 @@ Requested path was: {f} 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: - component = create_setting_component(k) + component = create_setting_component(k, is_quicksettings=True) component_dict[k] = component settings_interface.gradio_ref = demo diff --git a/style.css b/style.css index 55c41971..ad2a52cc 100644 --- a/style.css +++ b/style.css @@ -228,6 +228,8 @@ fieldset span.text-gray-500, .gr-block.gr-box span.text-gray-500, label.block s border-top: 1px solid #eee; border-left: 1px solid #eee; border-right: 1px solid #eee; + + z-index: 300; } .dark fieldset span.text-gray-500, .dark .gr-block.gr-box span.text-gray-500, .dark label.block span{ @@ -480,17 +482,30 @@ input[type="range"]{ background: #a55000; } +#quicksettings { + gap: 0.4em; +} + #quicksettings > div{ border: none; background: none; + flex: unset; + gap: 0.5em; } #quicksettings > div > div{ max-width: 32em; + min-width: 24em; padding: 0; - margin-right: 0.75em; } +#refresh_sd_model_checkpoint, #refresh_sd_hypernetwork{ + max-width: 2.5em; + min-width: 2.5em; + height: 2.4em; +} + + canvas[key="mask"] { z-index: 12 !important; filter: invert(); @@ -507,3 +522,7 @@ canvas[key="mask"] { z-index: 200; width: 8em; } + +.row.gr-compact{ + overflow: visible; +} -- cgit v1.2.3 From 354ef0da3b1f0fa5c113d04b6c79e3908c848d23 Mon Sep 17 00:00:00 2001 From: AUTOMATIC <16777216c@gmail.com> Date: Thu, 13 Oct 2022 20:12:37 +0300 Subject: add hypernetwork multipliers --- modules/hypernetworks/hypernetwork.py | 8 +++++++- modules/shared.py | 5 ++++- modules/ui.py | 5 ++++- scripts/xy_grid.py | 9 ++++++++- style.css | 3 +++ webui.py | 2 +- 6 files changed, 27 insertions(+), 5 deletions(-) (limited to 'style.css') diff --git a/modules/hypernetworks/hypernetwork.py b/modules/hypernetworks/hypernetwork.py index b6c06d49..f1248bb7 100644 --- a/modules/hypernetworks/hypernetwork.py +++ b/modules/hypernetworks/hypernetwork.py @@ -18,6 +18,8 @@ from modules.textual_inversion.learn_schedule import LearnRateScheduler class HypernetworkModule(torch.nn.Module): + multiplier = 1.0 + def __init__(self, dim, state_dict=None): super().__init__() @@ -36,7 +38,11 @@ class HypernetworkModule(torch.nn.Module): self.to(devices.device) def forward(self, x): - return x + (self.linear2(self.linear1(x))) + return x + (self.linear2(self.linear1(x))) * self.multiplier + + +def apply_strength(value=None): + HypernetworkModule.multiplier = value if value is not None else shared.opts.sd_hypernetwork_strength class Hypernetwork: diff --git a/modules/shared.py b/modules/shared.py index d8e3a286..5901e605 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -238,7 +238,8 @@ options_templates.update(options_section(('training', "Training"), { options_templates.update(options_section(('sd', "Stable Diffusion"), { "sd_model_checkpoint": OptionInfo(None, "Stable Diffusion checkpoint", gr.Dropdown, lambda: {"choices": modules.sd_models.checkpoint_tiles()}, refresh=sd_models.list_models), - "sd_hypernetwork": OptionInfo("None", "Stable Diffusion finetune hypernetwork", gr.Dropdown, lambda: {"choices": ["None"] + [x for x in hypernetworks.keys()]}, refresh=reload_hypernetworks), + "sd_hypernetwork": OptionInfo("None", "Hypernetwork", gr.Dropdown, lambda: {"choices": ["None"] + [x for x in hypernetworks.keys()]}, refresh=reload_hypernetworks), + "sd_hypernetwork_strength": OptionInfo(1.0, "Hypernetwork strength", gr.Slider, {"minimum": 0.0, "maximum": 1.0, "step": 0.001}), "img2img_color_correction": OptionInfo(False, "Apply color correction to img2img results to match original colors."), "save_images_before_color_correction": OptionInfo(False, "Save a copy of image before applying color correction to img2img results"), "img2img_fix_steps": OptionInfo(False, "With img2img, do exactly the amount of steps the slider specifies (normally you'd do less with less denoising)."), @@ -348,6 +349,8 @@ class Options: item = self.data_labels.get(key) item.onchange = func + func() + def dumpjson(self): d = {k: self.data.get(k, self.data_labels.get(k).default) for k in self.data_labels.keys()} return json.dumps(d) diff --git a/modules/ui.py b/modules/ui.py index 0a58f6be..673014f2 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -1244,7 +1244,10 @@ def create_ui(wrap_gradio_gpu_call): def refresh(): info.refresh() refreshed_args = info.component_args() if callable(info.component_args) else info.component_args - res.choices = refreshed_args["choices"] + + for k, v in refreshed_args.items(): + setattr(res, k, v) + return gr.update(**(refreshed_args or {})) refresh_button.click( diff --git a/scripts/xy_grid.py b/scripts/xy_grid.py index 02931ae6..efb63af5 100644 --- a/scripts/xy_grid.py +++ b/scripts/xy_grid.py @@ -107,6 +107,10 @@ def apply_hypernetwork(p, x, xs): hypernetwork.load_hypernetwork(name) +def apply_hypernetwork_strength(p, x, xs): + hypernetwork.apply_strength(x) + + def confirm_hypernetworks(p, xs): for x in xs: if x.lower() in ["", "none"]: @@ -165,6 +169,7 @@ axis_options = [ AxisOption("Sampler", str, apply_sampler, format_value, confirm_samplers), AxisOption("Checkpoint name", str, apply_checkpoint, format_value, confirm_checkpoints), AxisOption("Hypernetwork", str, apply_hypernetwork, format_value, confirm_hypernetworks), + AxisOption("Hypernet str.", float, apply_hypernetwork_strength, format_value_add_label, None), AxisOption("Sigma Churn", float, apply_field("s_churn"), format_value_add_label, None), AxisOption("Sigma min", float, apply_field("s_tmin"), format_value_add_label, None), AxisOption("Sigma max", float, apply_field("s_tmax"), format_value_add_label, None), @@ -250,7 +255,7 @@ class Script(scripts.Script): y_values = gr.Textbox(label="Y values", visible=False, lines=1) draw_legend = gr.Checkbox(label='Draw legend', value=True) - include_lone_images = gr.Checkbox(label='Include Separate Images', value=True) + include_lone_images = gr.Checkbox(label='Include Separate Images', value=False) no_fixed_seeds = gr.Checkbox(label='Keep -1 for seeds', value=False) return [x_type, x_values, y_type, y_values, draw_legend, include_lone_images, no_fixed_seeds] @@ -377,6 +382,8 @@ class Script(scripts.Script): modules.sd_models.reload_model_weights(shared.sd_model) hypernetwork.load_hypernetwork(opts.sd_hypernetwork) + hypernetwork.apply_strength() + opts.data["CLIP_stop_at_last_layers"] = CLIP_stop_at_last_layers diff --git a/style.css b/style.css index ad2a52cc..aa3d379c 100644 --- a/style.css +++ b/style.css @@ -522,6 +522,9 @@ canvas[key="mask"] { z-index: 200; width: 8em; } +#quicksettings .gr-box > div > div > input.gr-text-input { + top: -1.12em; +} .row.gr-compact{ overflow: visible; diff --git a/webui.py b/webui.py index 33ba7905..fe0ce321 100644 --- a/webui.py +++ b/webui.py @@ -72,7 +72,6 @@ def wrap_gradio_gpu_call(func, extra_outputs=None): return modules.ui.wrap_gradio_call(f, extra_outputs=extra_outputs) - def initialize(): modelloader.cleanup_models() modules.sd_models.setup_model() @@ -86,6 +85,7 @@ def initialize(): shared.sd_model = modules.sd_models.load_model() shared.opts.onchange("sd_model_checkpoint", wrap_queued_call(lambda: modules.sd_models.reload_model_weights(shared.sd_model))) shared.opts.onchange("sd_hypernetwork", wrap_queued_call(lambda: modules.hypernetworks.hypernetwork.load_hypernetwork(shared.opts.sd_hypernetwork))) + shared.opts.onchange("sd_hypernetwork_strength", modules.hypernetworks.hypernetwork.apply_strength) def webui(): -- cgit v1.2.3 From 6cdf55627cb4eb156fb7d8c010d396f93011c04e Mon Sep 17 00:00:00 2001 From: AUTOMATIC <16777216c@gmail.com> Date: Fri, 14 Oct 2022 21:12:52 +0300 Subject: restore borders for prompts --- style.css | 8 -------- 1 file changed, 8 deletions(-) (limited to 'style.css') diff --git a/style.css b/style.css index aa3d379c..2306c002 100644 --- a/style.css +++ b/style.css @@ -167,14 +167,6 @@ button{ align-self: stretch !important; } -#prompt, #negative_prompt{ - border: none !important; -} -#prompt textarea, #negative_prompt textarea{ - border: none !important; -} - - #img2maskimg .h-60{ height: 30rem; } -- cgit v1.2.3 From e8729dd0511f8410db967d9ef192645cfef1be8a Mon Sep 17 00:00:00 2001 From: AUTOMATIC <16777216c@gmail.com> Date: Sat, 15 Oct 2022 12:54:23 +0300 Subject: re-apply height hacks to work with new gradio --- modules/ui.py | 4 ++-- style.css | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) (limited to 'style.css') diff --git a/modules/ui.py b/modules/ui.py index baf4c397..9c7a67dd 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -750,10 +750,10 @@ def create_ui(wrap_gradio_gpu_call): with gr.Tabs(elem_id="mode_img2img") as tabs_img2img_mode: with gr.TabItem('img2img', id='img2img'): - 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) + 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).style(height=480) with gr.TabItem('Inpaint', id='inpaint'): - 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="sketch", image_mode="RGBA") + 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="sketch", image_mode="RGBA").style(height=480) 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") diff --git a/style.css b/style.css index 2306c002..c27e53f8 100644 --- a/style.css +++ b/style.css @@ -167,10 +167,6 @@ button{ align-self: stretch !important; } -#img2maskimg .h-60{ - height: 30rem; -} - .overflow-hidden, .gr-panel{ overflow: visible !important; } @@ -443,10 +439,6 @@ input[type="range"]{ --tw-bg-opacity: 0 !important; } -#img2img_image div.h-60{ - height: 480px; -} - #context-menu{ z-index:9999; position:absolute; @@ -521,3 +513,11 @@ canvas[key="mask"] { .row.gr-compact{ overflow: visible; } + +#img2img_image, #img2img_image > .h-60, #img2img_image > .h-60 > div, #img2img_image > .h-60 > div > img, +img2maskimg, #img2maskimg > .h-60, #img2maskimg > .h-60 > div, #img2maskimg > .h-60 > div > img +{ + height: 480px !important; + max-height: 480px !important; + min-height: 480px !important; +} \ No newline at end of file -- cgit v1.2.3 From d3463bc59a44d62c2de8b357184c49876d84f654 Mon Sep 17 00:00:00 2001 From: AUTOMATIC <16777216c@gmail.com> Date: Sat, 15 Oct 2022 14:22:30 +0300 Subject: change styling for top right corner UI made save style button not die when you cancel --- javascript/hints.js | 2 ++ javascript/ui.js | 2 +- modules/ui.py | 57 ++++++++++++++++++++++++++--------------------------- style.css | 16 +++++++-------- 4 files changed, 39 insertions(+), 38 deletions(-) (limited to 'style.css') diff --git a/javascript/hints.js b/javascript/hints.js index 8fec907d..b98012f5 100644 --- a/javascript/hints.js +++ b/javascript/hints.js @@ -16,6 +16,8 @@ titles = { "\u{1f3a8}": "Add a random artist to the prompt.", "\u2199\ufe0f": "Read generation parameters from prompt or last generation if prompt is empty into user interface.", "\u{1f4c2}": "Open images output directory", + "\u{1f4be}": "Save style", + "\u{1f4cb}": "Apply selected styles to current prompt", "Inpaint a part of image": "Draw a mask over an image, and the script will regenerate the masked area with content according to prompt", "SD upscale": "Upscale image normally, split result into tiles, improve each tile using img2img, merge whole image back", diff --git a/javascript/ui.js b/javascript/ui.js index 56f4216f..9e1bed4c 100644 --- a/javascript/ui.js +++ b/javascript/ui.js @@ -141,7 +141,7 @@ function submit_img2img(){ function ask_for_style_name(_, prompt_text, negative_prompt_text) { name_ = prompt('Style name:') - return name_ === null ? [null, null, null]: [name_, prompt_text, negative_prompt_text] + return [name_, prompt_text, negative_prompt_text] } diff --git a/modules/ui.py b/modules/ui.py index de5ab929..cab8ab11 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -81,6 +81,8 @@ art_symbol = '\U0001f3a8' # 🎨 paste_symbol = '\u2199\ufe0f' # ↙ folder_symbol = '\U0001f4c2' # 📂 refresh_symbol = '\U0001f504' # 🔄 +save_style_symbol = '\U0001f4be' # 💾 +apply_style_symbol = '\U0001f4cb' # 📋 def plaintext_to_html(text): @@ -322,7 +324,7 @@ def visit(x, func, path=""): def add_style(name: str, prompt: str, negative_prompt: str): if name is None: - return [gr_show(), gr_show()] + return [gr_show() for x in range(4)] style = modules.styles.PromptStyle(name, prompt, negative_prompt) shared.prompt_styles.styles[style.name] = style @@ -447,7 +449,7 @@ def create_toprow(is_img2img): id_part = "img2img" if is_img2img else "txt2img" with gr.Row(elem_id="toprow"): - with gr.Column(scale=4): + with gr.Column(scale=6): with gr.Row(): with gr.Column(scale=80): with gr.Row(): @@ -455,27 +457,30 @@ def create_toprow(is_img2img): placeholder="Prompt (press Ctrl+Enter or Alt+Enter to generate)" ) - 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") - token_counter = gr.HTML(value="", elem_id=f"{id_part}_token_counter") - token_button = gr.Button(visible=False, elem_id=f"{id_part}_token_button") - - with gr.Column(scale=10, elem_id="style_pos_col"): - prompt_style = gr.Dropdown(label="Style 1", elem_id=f"{id_part}_style_index", choices=[k for k, v in shared.prompt_styles.styles.items()], value=next(iter(shared.prompt_styles.styles.keys())), visible=len(shared.prompt_styles.styles) > 1) - with gr.Row(): - with gr.Column(scale=8): + with gr.Column(scale=80): with gr.Row(): negative_prompt = gr.Textbox(label="Negative prompt", elem_id=f"{id_part}_neg_prompt", show_label=False, lines=2, placeholder="Negative prompt (press Ctrl+Enter or Alt+Enter to generate)" ) - with gr.Column(scale=1, elem_id="roll_col"): - sh = gr.Button(elem_id="sh", visible=True) + 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") - with gr.Column(scale=1, elem_id="style_neg_col"): - 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())), visible=len(shared.prompt_styles.styles) > 1) + token_counter = gr.HTML(value="", elem_id=f"{id_part}_token_counter") + token_button = gr.Button(visible=False, elem_id=f"{id_part}_token_button") + + button_interrogate = None + button_deepbooru = None + if is_img2img: + with gr.Column(scale=1, elem_id="interrogate_col"): + button_interrogate = gr.Button('Interrogate\nCLIP', elem_id="interrogate") + + if cmd_opts.deepdanbooru: + button_deepbooru = gr.Button('Interrogate\nDeepBooru', elem_id="deepbooru") with gr.Column(scale=1): with gr.Row(): @@ -495,20 +500,14 @@ def create_toprow(is_img2img): outputs=[], ) - with gr.Row(scale=1): - if is_img2img: - interrogate = gr.Button('Interrogate\nCLIP', elem_id="interrogate") - if cmd_opts.deepdanbooru: - deepbooru = gr.Button('Interrogate\nDeepBooru', elem_id="deepbooru") - else: - deepbooru = None - else: - interrogate = None - deepbooru = None - prompt_style_apply = gr.Button('Apply style', elem_id="style_apply") - save_style = gr.Button('Create style', elem_id="style_create") + with gr.Row(): + with gr.Column(scale=1, elem_id="style_pos_col"): + prompt_style = gr.Dropdown(label="Style 1", elem_id=f"{id_part}_style_index", choices=[k for k, v in shared.prompt_styles.styles.items()], value=next(iter(shared.prompt_styles.styles.keys()))) + + with gr.Column(scale=1, elem_id="style_neg_col"): + 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()))) - return prompt, roll, prompt_style, negative_prompt, prompt_style2, submit, interrogate, deepbooru, prompt_style_apply, save_style, paste, token_counter, token_button + return prompt, roll, 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): diff --git a/style.css b/style.css index c27e53f8..b534f950 100644 --- a/style.css +++ b/style.css @@ -115,7 +115,7 @@ padding: 0.4em 0; } -#roll, #paste{ +#roll, #paste, #style_create, #style_apply{ min-width: 2em; min-height: 2em; max-width: 2em; @@ -126,14 +126,14 @@ margin: 0.1em 0; } -#style_apply, #style_create, #interrogate{ - margin: 0.75em 0.25em 0.25em 0.25em; - min-width: 5em; +#interrogate_col{ + min-width: 0 !important; + max-width: 8em !important; } - -#style_apply, #style_create, #deepbooru{ - margin: 0.75em 0.25em 0.25em 0.25em; - min-width: 5em; +#interrogate, #deepbooru{ + margin: 0em 0.25em 0.9em 0.25em; + min-width: 8em; + max-width: 8em; } #style_pos_col, #style_neg_col{ -- cgit v1.2.3 From 5fd638f14d75a71a37157ded5d33c716ab9eb8ca Mon Sep 17 00:00:00 2001 From: ruocaled Date: Sat, 15 Oct 2022 02:00:46 -0700 Subject: fix download section layout --- modules/ui.py | 4 ++-- style.css | 7 ------- 2 files changed, 2 insertions(+), 9 deletions(-) (limited to 'style.css') diff --git a/modules/ui.py b/modules/ui.py index c9b53247..3206113e 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -619,7 +619,7 @@ def create_ui(wrap_gradio_gpu_call): txt2img_preview = gr.Image(elem_id='txt2img_preview', visible=False) txt2img_gallery = gr.Gallery(label='Output', show_label=False, elem_id='txt2img_gallery').style(grid=4) - with gr.Group(): + with gr.Column(): with gr.Row(): save = gr.Button('Save') send_to_img2img = gr.Button('Send to img2img') @@ -834,7 +834,7 @@ def create_ui(wrap_gradio_gpu_call): img2img_preview = gr.Image(elem_id='img2img_preview', visible=False) img2img_gallery = gr.Gallery(label='Output', show_label=False, elem_id='img2img_gallery').style(grid=4) - with gr.Group(): + with gr.Column(): with gr.Row(): save = gr.Button('Save') img2img_send_to_img2img = gr.Button('Send to img2img') diff --git a/style.css b/style.css index b534f950..920c32ab 100644 --- a/style.css +++ b/style.css @@ -237,13 +237,6 @@ fieldset span.text-gray-500, .gr-block.gr-box span.text-gray-500, label.block s margin: 0; } -.gr-panel div.flex-col div.justify-between div{ - position: absolute; - top: -0.1em; - right: 1em; - padding: 0 0.5em; -} - #settings .gr-panel div.flex-col div.justify-between div{ position: relative; z-index: 200; -- cgit v1.2.3 From 606519813dd998140a741096f9029c732ee52d2a Mon Sep 17 00:00:00 2001 From: guaneec Date: Sat, 15 Oct 2022 22:10:39 +0800 Subject: Prevent modal content from being selected --- style.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'style.css') diff --git a/style.css b/style.css index 920c32ab..33832ebf 100644 --- a/style.css +++ b/style.css @@ -309,6 +309,8 @@ input[type="range"]{ height: 100%; overflow: auto; background-color: rgba(20, 20, 20, 0.95); + user-select: none; + -webkit-user-select: none; } .modalControls { @@ -513,4 +515,4 @@ img2maskimg, #img2maskimg > .h-60, #img2maskimg > .h-60 > div, #img2maskimg > .h height: 480px !important; max-height: 480px !important; min-height: 480px !important; -} \ No newline at end of file +} -- cgit v1.2.3 From 36a0ba357ab0742c3c4a28437b68fb29a235afbe Mon Sep 17 00:00:00 2001 From: Junpeng Qiu Date: Sat, 15 Oct 2022 21:42:52 -0700 Subject: Added Refresh Button to embedding and hypernetwork names in Train Tab Problem everytime I modified pt files in embedding_dir or hypernetwork_dir, I need to restart webui to have the new files shown in the dropdown of Train Tab Solution refactored create_refresh_button out of create_setting_component so we can use this method to create button next to gr.Dropdowns of embedding name and hypernetworks Extra Modification hypernetwork pt are now sorted in alphabetic order --- modules/ui.py | 45 ++++++++++++++++++++++++++------------------- style.css | 2 +- 2 files changed, 27 insertions(+), 20 deletions(-) (limited to 'style.css') diff --git a/modules/ui.py b/modules/ui.py index 10bdf121..ee3d0248 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -568,6 +568,24 @@ def create_ui(wrap_gradio_gpu_call): import modules.img2img import modules.txt2img + def create_refresh_button(refresh_component, refresh_method, refreshed_args, elem_id): + def refresh(): + refresh_method() + args = refreshed_args() if callable(refreshed_args) else refreshed_args + + for k, v in args.items(): + setattr(refresh_component, k, v) + + return gr.update(**(args or {})) + + refresh_button = gr.Button(value=refresh_symbol, elem_id=elem_id) + refresh_button.click( + fn = refresh, + inputs = [], + outputs = [refresh_component] + ) + return refresh_button + 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) dummy_component = gr.Label(visible=False) @@ -1205,8 +1223,12 @@ def create_ui(wrap_gradio_gpu_call): with gr.Tab(label="Train"): gr.HTML(value="

Train an embedding; must specify a directory with a set of 1:1 ratio images

") - train_embedding_name = gr.Dropdown(label='Embedding', choices=sorted(sd_hijack.model_hijack.embedding_db.word_embeddings.keys())) - train_hypernetwork_name = gr.Dropdown(label='Hypernetwork', choices=[x for x in shared.hypernetworks.keys()]) + with gr.Row(): + train_embedding_name = gr.Dropdown(label='Embedding', choices=sorted(sd_hijack.model_hijack.embedding_db.word_embeddings.keys())) + create_refresh_button(train_embedding_name, sd_hijack.model_hijack.embedding_db.load_textual_inversion_embeddings, lambda: {"choices": sorted(sd_hijack.model_hijack.embedding_db.word_embeddings.keys())}, "refresh_train_embedding_name") + with gr.Row(): + train_hypernetwork_name = gr.Dropdown(label='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") learn_rate = gr.Textbox(label='Learning rate', placeholder="Learning rate", value="0.005") batch_size = gr.Number(label='Batch size', value=1, precision=0) dataset_directory = gr.Textbox(label='Dataset directory', placeholder="Path to directory with input images") @@ -1357,26 +1379,11 @@ def create_ui(wrap_gradio_gpu_call): if info.refresh is not None: if is_quicksettings: res = comp(label=info.label, value=fun, **(args or {})) - refresh_button = gr.Button(value=refresh_symbol, elem_id="refresh_"+key) + refresh_button = create_refresh_button(res, info.refresh, info.component_args, "refresh_" + key) else: with gr.Row(variant="compact"): res = comp(label=info.label, value=fun, **(args or {})) - refresh_button = gr.Button(value=refresh_symbol, elem_id="refresh_" + key) - - def refresh(): - info.refresh() - refreshed_args = info.component_args() if callable(info.component_args) else info.component_args - - for k, v in refreshed_args.items(): - setattr(res, k, v) - - return gr.update(**(refreshed_args or {})) - - refresh_button.click( - fn=refresh, - inputs=[], - outputs=[res], - ) + refresh_button = create_refresh_button(res, info.refresh, info.component_args, "refresh_" + key) else: res = comp(label=info.label, value=fun, **(args or {})) diff --git a/style.css b/style.css index 33832ebf..71eb4d20 100644 --- a/style.css +++ b/style.css @@ -478,7 +478,7 @@ input[type="range"]{ padding: 0; } -#refresh_sd_model_checkpoint, #refresh_sd_hypernetwork{ +#refresh_sd_model_checkpoint, #refresh_sd_hypernetwork, #refresh_train_hypernetwork_name, #refresh_train_embedding_name{ max-width: 2.5em; min-width: 2.5em; height: 2.4em; -- cgit v1.2.3 From cf47d13c1e11fcb7169bac7488d2c39e579ee491 Mon Sep 17 00:00:00 2001 From: AUTOMATIC <16777216c@gmail.com> Date: Mon, 17 Oct 2022 21:15:32 +0300 Subject: localization support --- javascript/localization.js | 146 ++++++++++++++++++++++++++ localizations/Put localization files here.txt | 0 modules/localization.py | 31 ++++++ modules/shared.py | 7 +- modules/ui.py | 33 ++++-- script.js | 10 +- style.css | 2 +- 7 files changed, 211 insertions(+), 18 deletions(-) create mode 100644 javascript/localization.js create mode 100644 localizations/Put localization files here.txt create mode 100644 modules/localization.py (limited to 'style.css') diff --git a/javascript/localization.js b/javascript/localization.js new file mode 100644 index 00000000..e6644635 --- /dev/null +++ b/javascript/localization.js @@ -0,0 +1,146 @@ + +// localization = {} -- the dict with translations is created by the backend + +ignore_ids_for_localization={ + setting_sd_hypernetwork: 'OPTION', + setting_sd_model_checkpoint: 'OPTION', + setting_realesrgan_enabled_models: 'OPTION', + modelmerger_primary_model_name: 'OPTION', + modelmerger_secondary_model_name: 'OPTION', + modelmerger_tertiary_model_name: 'OPTION', + train_embedding: 'OPTION', + train_hypernetwork: 'OPTION', + txt2img_style_index: 'OPTION', + txt2img_style2_index: 'OPTION', + img2img_style_index: 'OPTION', + img2img_style2_index: 'OPTION', + setting_random_artist_categories: 'SPAN', + setting_face_restoration_model: 'SPAN', + setting_realesrgan_enabled_models: 'SPAN', + extras_upscaler_1: 'SPAN', + extras_upscaler_2: 'SPAN', +} + +re_num = /^[\.\d]+$/ +re_emoji = /[\p{Extended_Pictographic}\u{1F3FB}-\u{1F3FF}\u{1F9B0}-\u{1F9B3}]/u + +original_lines = {} +translated_lines = {} + +function textNodesUnder(el){ + var n, a=[], walk=document.createTreeWalker(el,NodeFilter.SHOW_TEXT,null,false); + while(n=walk.nextNode()) a.push(n); + return a; +} + +function canBeTranslated(node, text){ + if(! text) return false; + if(! node.parentElement) return false; + + parentType = node.parentElement.nodeName + if(parentType=='SCRIPT' || parentType=='STYLE' || parentType=='TEXTAREA') return false; + + if (parentType=='OPTION' || parentType=='SPAN'){ + pnode = node + for(var level=0; level<4; level++){ + pnode = pnode.parentElement + if(! pnode) break; + + if(ignore_ids_for_localization[pnode.id] == parentType) return false; + } + } + + if(re_num.test(text)) return false; + if(re_emoji.test(text)) return false; + return true +} + +function getTranslation(text){ + if(! text) return undefined + + if(translated_lines[text] === undefined){ + original_lines[text] = 1 + } + + tl = localization[text] + if(tl !== undefined){ + translated_lines[tl] = 1 + } + + return tl +} + +function processTextNode(node){ + text = node.textContent.trim() + + if(! canBeTranslated(node, text)) return + + tl = getTranslation(text) + if(tl !== undefined){ + node.textContent = tl + } +} + +function processNode(node){ + if(node.nodeType == 3){ + processTextNode(node) + return + } + + if(node.title){ + tl = getTranslation(node.title) + if(tl !== undefined){ + node.title = tl + } + } + + if(node.placeholder){ + tl = getTranslation(node.placeholder) + if(tl !== undefined){ + node.placeholder = tl + } + } + + textNodesUnder(node).forEach(function(node){ + processTextNode(node) + }) +} + +function dumpTranslations(){ + dumped = {} + + Object.keys(original_lines).forEach(function(text){ + if(dumped[text] !== undefined) return + + dumped[text] = localization[text] || text + }) + + return dumped +} + +onUiUpdate(function(m){ + m.forEach(function(mutation){ + mutation.addedNodes.forEach(function(node){ + processNode(node) + }) + }); +}) + + +document.addEventListener("DOMContentLoaded", function() { + processNode(gradioApp()) +}) + +function download_localization() { + text = JSON.stringify(dumpTranslations(), null, 4) + + var element = document.createElement('a'); + element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); + element.setAttribute('download', "localization.json"); + element.style.display = 'none'; + document.body.appendChild(element); + + element.click(); + + document.body.removeChild(element); +} diff --git a/localizations/Put localization files here.txt b/localizations/Put localization files here.txt new file mode 100644 index 00000000..e69de29b diff --git a/modules/localization.py b/modules/localization.py new file mode 100644 index 00000000..b1810cda --- /dev/null +++ b/modules/localization.py @@ -0,0 +1,31 @@ +import json +import os +import sys +import traceback + +localizations = {} + + +def list_localizations(dirname): + localizations.clear() + + for file in os.listdir(dirname): + fn, ext = os.path.splitext(file) + if ext.lower() != ".json": + continue + + localizations[fn] = os.path.join(dirname, file) + + +def localization_js(current_localization_name): + fn = localizations.get(current_localization_name, None) + data = {} + if fn is not None: + try: + with open(fn, "r", encoding="utf8") as file: + data = json.load(file) + except Exception: + print(f"Error loading localization from {fn}:", file=sys.stderr) + print(traceback.format_exc(), file=sys.stderr) + + return f"var localization = {json.dumps(data)}\n" diff --git a/modules/shared.py b/modules/shared.py index c2775603..2a2b0427 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -13,7 +13,7 @@ import modules.memmon import modules.sd_models import modules.styles import modules.devices as devices -from modules import sd_samplers, sd_models +from modules import sd_samplers, sd_models, localization from modules.hypernetworks import hypernetwork from modules.paths import models_path, script_path, sd_path @@ -31,6 +31,7 @@ parser.add_argument("--no-progressbar-hiding", action='store_true', help="do not parser.add_argument("--max-batch-count", type=int, default=16, help="maximum batch count value for the UI") parser.add_argument("--embeddings-dir", type=str, default=os.path.join(script_path, 'embeddings'), help="embeddings directory for textual inversion (default: embeddings)") parser.add_argument("--hypernetwork-dir", type=str, default=os.path.join(models_path, 'hypernetworks'), help="hypernetwork directory") +parser.add_argument("--localizations-dir", type=str, default=os.path.join(script_path, 'localizations'), help="localizations directory") parser.add_argument("--allow-code", action='store_true', help="allow custom script execution from webui") parser.add_argument("--medvram", action='store_true', help="enable stable diffusion model optimizations for sacrificing a little speed for low VRM usage") parser.add_argument("--lowvram", action='store_true', help="enable stable diffusion model optimizations for sacrificing a lot of speed for very low VRM usage") @@ -103,7 +104,6 @@ os.makedirs(cmd_opts.hypernetwork_dir, exist_ok=True) hypernetworks = hypernetwork.list_hypernetworks(cmd_opts.hypernetwork_dir) loaded_hypernetwork = None - def reload_hypernetworks(): global hypernetworks @@ -151,6 +151,8 @@ interrogator = modules.interrogate.InterrogateModels("interrogate") face_restorers = [] +localization.list_localizations(cmd_opts.localizations_dir) + def realesrgan_models_names(): import modules.realesrgan_model @@ -296,6 +298,7 @@ options_templates.update(options_section(('ui', "User interface"), { "js_modal_lightbox_initially_zoomed": OptionInfo(True, "Show images zoomed in by default in full page image viewer"), "show_progress_in_title": OptionInfo(True, "Show generation progress in window title."), 'quicksettings': OptionInfo("sd_model_checkpoint", "Quicksettings list"), + 'localization': OptionInfo("None", "Localization (requires restart)", gr.Dropdown, lambda: {"choices": ["None"] + list(localization.localizations.keys())}, refresh=lambda: localization.list_localizations(cmd_opts.localizations_dir)), })) options_templates.update(options_section(('sampler-params', "Sampler parameters"), { diff --git a/modules/ui.py b/modules/ui.py index 533b1db3..656bab7a 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -23,7 +23,7 @@ import gradio as gr import gradio.utils import gradio.routes -from modules import sd_hijack, sd_models +from modules import sd_hijack, sd_models, localization from modules.paths import script_path from modules.shared import opts, cmd_opts, restricted_opts if cmd_opts.deepdanbooru: @@ -1056,10 +1056,10 @@ def create_ui(wrap_gradio_gpu_call): upscaling_crop = gr.Checkbox(label='Crop to fit', value=True) with gr.Group(): - extras_upscaler_1 = gr.Radio(label='Upscaler 1', choices=[x.name for x in shared.sd_upscalers], value=shared.sd_upscalers[0].name, type="index") + 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', choices=[x.name for x in shared.sd_upscalers], value=shared.sd_upscalers[0].name, type="index") + extras_upscaler_2 = gr.Radio(label='Upscaler 2', celem_id="extras_upscaler_2", hoices=[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) with gr.Group(): @@ -1224,10 +1224,10 @@ def create_ui(wrap_gradio_gpu_call): with gr.Tab(label="Train"): gr.HTML(value="

Train an embedding; must specify a directory with a set of 1:1 ratio images

") with gr.Row(): - train_embedding_name = gr.Dropdown(label='Embedding', choices=sorted(sd_hijack.model_hijack.embedding_db.word_embeddings.keys())) + train_embedding_name = gr.Dropdown(label='Embedding', elem_id="train_embedding", choices=sorted(sd_hijack.model_hijack.embedding_db.word_embeddings.keys())) create_refresh_button(train_embedding_name, sd_hijack.model_hijack.embedding_db.load_textual_inversion_embeddings, lambda: {"choices": sorted(sd_hijack.model_hijack.embedding_db.word_embeddings.keys())}, "refresh_train_embedding_name") with gr.Row(): - train_hypernetwork_name = gr.Dropdown(label='Hypernetwork', choices=[x for x in shared.hypernetworks.keys()]) + 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") learn_rate = gr.Textbox(label='Learning rate', placeholder="Learning rate", value="0.005") batch_size = gr.Number(label='Batch size', value=1, precision=0) @@ -1376,16 +1376,18 @@ def create_ui(wrap_gradio_gpu_call): else: raise Exception(f'bad options item type: {str(t)} for key {key}') + elem_id = "setting_"+key + if info.refresh is not None: if is_quicksettings: - res = comp(label=info.label, value=fun, **(args or {})) - refresh_button = create_refresh_button(res, info.refresh, info.component_args, "refresh_" + key) + 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"): - res = comp(label=info.label, value=fun, **(args or {})) - refresh_button = create_refresh_button(res, info.refresh, info.component_args, "refresh_" + key) + 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: - res = comp(label=info.label, value=fun, **(args or {})) + res = comp(label=info.label, value=fun, elem_id=elem_id, **(args or {})) return res @@ -1509,6 +1511,9 @@ Requested path was: {f} 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") + + 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') @@ -1519,6 +1524,13 @@ Requested path was: {f} _js='function(){}' ) + download_localization.click( + fn=lambda: None, + inputs=[], + outputs=[], + _js='download_localization' + ) + def reload_scripts(): modules.scripts.reload_script_body_only() @@ -1784,6 +1796,7 @@ for filename in sorted(os.listdir(jsdir)): with open(os.path.join(jsdir, filename), "r", encoding="utf8") as jsfile: javascript += f"\n" +javascript += f"\n" if 'gradio_routes_templates_response' not in globals(): def template_response(*args, **kwargs): diff --git a/script.js b/script.js index 88f2c839..8b3b67e3 100644 --- a/script.js +++ b/script.js @@ -21,20 +21,20 @@ function onUiTabChange(callback){ uiTabChangeCallbacks.push(callback) } -function runCallback(x){ +function runCallback(x, m){ try { - x() + x(m) } catch (e) { (console.error || console.log).call(console, e.message, e); } } -function executeCallbacks(queue) { - queue.forEach(runCallback) +function executeCallbacks(queue, m) { + queue.forEach(function(x){runCallback(x, m)}) } document.addEventListener("DOMContentLoaded", function() { var mutationObserver = new MutationObserver(function(m){ - executeCallbacks(uiUpdateCallbacks); + executeCallbacks(uiUpdateCallbacks, m); const newTab = get_uiCurrentTab(); if ( newTab && ( newTab !== uiCurrentTab ) ) { uiCurrentTab = newTab; diff --git a/style.css b/style.css index 71eb4d20..9dc4b696 100644 --- a/style.css +++ b/style.css @@ -478,7 +478,7 @@ input[type="range"]{ padding: 0; } -#refresh_sd_model_checkpoint, #refresh_sd_hypernetwork, #refresh_train_hypernetwork_name, #refresh_train_embedding_name{ +#refresh_sd_model_checkpoint, #refresh_sd_hypernetwork, #refresh_train_hypernetwork_name, #refresh_train_embedding_name, #refresh_localization{ max-width: 2.5em; min-width: 2.5em; height: 2.4em; -- cgit v1.2.3 From 83a517eb96cc36cf1dc0915a9ebde43a7e05c7da Mon Sep 17 00:00:00 2001 From: realryo1 <60560430+realryo1@users.noreply.github.com> Date: Wed, 19 Oct 2022 04:48:00 +0900 Subject: Fixed performance, vram style disorder --- style.css | 5 ----- 1 file changed, 5 deletions(-) (limited to 'style.css') diff --git a/style.css b/style.css index 9dc4b696..9bd408cd 100644 --- a/style.css +++ b/style.css @@ -34,9 +34,6 @@ .performance { font-size: 0.85em; color: #444; - display: flex; - justify-content: space-between; - white-space: nowrap; } .performance .time { @@ -44,8 +41,6 @@ } .performance .vram { - margin-left: 0; - text-align: right; } #txt2img_generate, #img2img_generate { -- cgit v1.2.3 From 9931c0bd48346dc5af23864117becfac33347a7c Mon Sep 17 00:00:00 2001 From: AUTOMATIC <16777216c@gmail.com> Date: Wed, 19 Oct 2022 12:01:31 +0300 Subject: remove the unneeded line break introduced by #3092 --- style.css | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'style.css') diff --git a/style.css b/style.css index 9bd408cd..26ae36a5 100644 --- a/style.css +++ b/style.css @@ -36,6 +36,10 @@ color: #444; } +.performance p{ + display: inline-block; +} + .performance .time { margin-right: 0; } -- cgit v1.2.3 From 8b74b9aa9a20e4c5c1f72641f8b9617479eb276b Mon Sep 17 00:00:00 2001 From: papuSpartan Date: Wed, 19 Oct 2022 19:06:14 -0500 Subject: add symbol for clear button and simplify roll_col css selector --- modules/ui.py | 2 ++ style.css | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) (limited to 'style.css') diff --git a/modules/ui.py b/modules/ui.py index a2dbd41e..9f6edc5f 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -83,6 +83,7 @@ folder_symbol = '\U0001f4c2' # 📂 refresh_symbol = '\U0001f504' # 🔄 save_style_symbol = '\U0001f4be' # 💾 apply_style_symbol = '\U0001f4cb' # 📋 +trash_prompt_symbol = '\U0001F5D1' # 🗑🗑🗑 def plaintext_to_html(text): @@ -498,6 +499,7 @@ def create_toprow(is_img2img): 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") + trash_prompt = gr.Button(value=trash_prompt_symbol, elem_id="trash_prompt") token_counter = gr.HTML(value="", elem_id=f"{id_part}_token_counter") token_button = gr.Button(visible=False, elem_id=f"{id_part}_token_button") diff --git a/style.css b/style.css index 26ae36a5..21a8911f 100644 --- a/style.css +++ b/style.css @@ -114,7 +114,7 @@ padding: 0.4em 0; } -#roll, #paste, #style_create, #style_apply{ +#roll_col > button { min-width: 2em; min-height: 2em; max-width: 2em; -- cgit v1.2.3 From df5706409386cc2e88718bd9101045587c39f8bb Mon Sep 17 00:00:00 2001 From: AUTOMATIC <16777216c@gmail.com> Date: Fri, 21 Oct 2022 16:10:51 +0300 Subject: do not load aesthetic clip model until it's needed add refresh button for aesthetic embeddings add aesthetic params to images' infotext --- modules/aesthetic_clip.py | 40 +++++++++++++++++++---- modules/generation_parameters_copypaste.py | 18 +++++++++-- modules/img2img.py | 5 +-- modules/processing.py | 4 +-- modules/sd_models.py | 3 -- modules/txt2img.py | 4 +-- modules/ui.py | 52 ++++++++++++++++++++---------- style.css | 2 +- 8 files changed, 89 insertions(+), 39 deletions(-) (limited to 'style.css') diff --git a/modules/aesthetic_clip.py b/modules/aesthetic_clip.py index 34efa931..8c828541 100644 --- a/modules/aesthetic_clip.py +++ b/modules/aesthetic_clip.py @@ -40,6 +40,8 @@ def iter_to_batched(iterable, n=1): def create_ui(): + import modules.ui + with gr.Group(): with gr.Accordion("Open for Clip Aesthetic!", open=False): with gr.Row(): @@ -55,6 +57,8 @@ def create_ui(): label="Aesthetic imgs embedding", value="None") + modules.ui.create_refresh_button(aesthetic_imgs, shared.update_aesthetic_embeddings, lambda: {"choices": sorted(shared.aesthetic_embeddings.keys())}, "refresh_aesthetic_embeddings") + with gr.Row(): aesthetic_imgs_text = gr.Textbox(label='Aesthetic text for imgs', placeholder="This text is used to rotate the feature space of the imgs embs", @@ -66,11 +70,21 @@ def create_ui(): return aesthetic_weight, aesthetic_steps, aesthetic_lr, aesthetic_slerp, aesthetic_imgs, aesthetic_imgs_text, aesthetic_slerp_angle, aesthetic_text_negative +aesthetic_clip_model = None + + +def aesthetic_clip(): + global aesthetic_clip_model + + if aesthetic_clip_model is None or aesthetic_clip_model.name_or_path != shared.sd_model.cond_stage_model.wrapped.transformer.name_or_path: + aesthetic_clip_model = CLIPModel.from_pretrained(shared.sd_model.cond_stage_model.wrapped.transformer.name_or_path) + aesthetic_clip_model.cpu() + + return aesthetic_clip_model + + def generate_imgs_embd(name, folder, batch_size): - # clipModel = CLIPModel.from_pretrained( - # shared.sd_model.cond_stage_model.clipModel.name_or_path - # ) - model = shared.clip_model.to(device) + model = aesthetic_clip().to(device) processor = CLIPProcessor.from_pretrained(model.name_or_path) with torch.no_grad(): @@ -91,7 +105,7 @@ def generate_imgs_embd(name, folder, batch_size): path = str(Path(shared.cmd_opts.aesthetic_embeddings_dir) / f"{name}.pt") torch.save(embs, path) - model = model.cpu() + model.cpu() del processor del embs gc.collect() @@ -132,7 +146,7 @@ class AestheticCLIP: self.image_embs = None self.load_image_embs(None) - def set_aesthetic_params(self, aesthetic_lr=0, aesthetic_weight=0, aesthetic_steps=0, image_embs_name=None, + def set_aesthetic_params(self, p, aesthetic_lr=0, aesthetic_weight=0, aesthetic_steps=0, image_embs_name=None, aesthetic_slerp=True, aesthetic_imgs_text="", aesthetic_slerp_angle=0.15, aesthetic_text_negative=False): @@ -145,6 +159,18 @@ class AestheticCLIP: self.aesthetic_steps = aesthetic_steps self.load_image_embs(image_embs_name) + if self.image_embs_name is not None: + p.extra_generation_params.update({ + "Aesthetic LR": aesthetic_lr, + "Aesthetic weight": aesthetic_weight, + "Aesthetic steps": aesthetic_steps, + "Aesthetic embedding": self.image_embs_name, + "Aesthetic slerp": aesthetic_slerp, + "Aesthetic text": aesthetic_imgs_text, + "Aesthetic text negative": aesthetic_text_negative, + "Aesthetic slerp angle": aesthetic_slerp_angle, + }) + def set_skip(self, skip): self.skip = skip @@ -168,7 +194,7 @@ class AestheticCLIP: tokens = torch.asarray(remade_batch_tokens).to(device) - model = copy.deepcopy(shared.clip_model).to(device) + model = copy.deepcopy(aesthetic_clip()).to(device) model.requires_grad_(True) if self.aesthetic_imgs_text is not None and len(self.aesthetic_imgs_text) > 0: text_embs_2 = model.get_text_features( diff --git a/modules/generation_parameters_copypaste.py b/modules/generation_parameters_copypaste.py index 0f041449..f73647da 100644 --- a/modules/generation_parameters_copypaste.py +++ b/modules/generation_parameters_copypaste.py @@ -4,13 +4,22 @@ import gradio as gr from modules.shared import script_path from modules import shared -re_param_code = r"\s*([\w ]+):\s*([^,]+)(?:,|$)" +re_param_code = r'\s*([\w ]+):\s*("(?:\\|\"|[^\"])+"|[^,]*)(?:,|$)' re_param = re.compile(re_param_code) re_params = re.compile(r"^(?:" + re_param_code + "){3,}$") re_imagesize = re.compile(r"^(\d+)x(\d+)$") type_of_gr_update = type(gr.update()) +def quote(text): + if ',' not in str(text): + return text + + text = str(text) + text = text.replace('\\', '\\\\') + text = text.replace('"', '\\"') + return f'"{text}"' + def parse_generation_parameters(x: str): """parses generation parameters string, the one you see in text field under the picture in UI: ``` @@ -83,7 +92,12 @@ def connect_paste(button, paste_fields, input_comp, js=None): else: try: valtype = type(output.value) - val = valtype(v) + + if valtype == bool and v == "False": + val = False + else: + val = valtype(v) + res.append(gr.update(value=val)) except Exception: res.append(gr.update()) diff --git a/modules/img2img.py b/modules/img2img.py index bc7c66bc..eea5199b 100644 --- a/modules/img2img.py +++ b/modules/img2img.py @@ -109,10 +109,7 @@ def img2img(mode: int, prompt: str, negative_prompt: str, prompt_style: str, pro inpainting_mask_invert=inpainting_mask_invert, ) - shared.aesthetic_clip.set_aesthetic_params(float(aesthetic_lr), float(aesthetic_weight), int(aesthetic_steps), - aesthetic_imgs, aesthetic_slerp, aesthetic_imgs_text, - aesthetic_slerp_angle, - aesthetic_text_negative) + shared.aesthetic_clip.set_aesthetic_params(p, float(aesthetic_lr), float(aesthetic_weight), int(aesthetic_steps), aesthetic_imgs, aesthetic_slerp, aesthetic_imgs_text, aesthetic_slerp_angle, aesthetic_text_negative) if shared.cmd_opts.enable_console_prompts: print(f"\nimg2img: {prompt}", file=shared.progress_print_out) diff --git a/modules/processing.py b/modules/processing.py index d1deffa9..f0852cd5 100644 --- a/modules/processing.py +++ b/modules/processing.py @@ -12,7 +12,7 @@ from skimage import exposure from typing import Any, Dict, List, Optional import modules.sd_hijack -from modules import devices, prompt_parser, masking, sd_samplers, lowvram +from modules import devices, prompt_parser, masking, sd_samplers, lowvram, generation_parameters_copypaste from modules.sd_hijack import model_hijack from modules.shared import opts, cmd_opts, state import modules.shared as shared @@ -318,7 +318,7 @@ def create_infotext(p, all_prompts, all_seeds, all_subseeds, comments, iteration generation_params.update(p.extra_generation_params) - generation_params_text = ", ".join([k if k == v else f'{k}: {v}' for k, v in generation_params.items() if v is not None]) + generation_params_text = ", ".join([k if k == v else f'{k}: {generation_parameters_copypaste.quote(v)}' for k, v in generation_params.items() if v is not None]) negative_prompt_text = "\nNegative prompt: " + p.negative_prompt if p.negative_prompt else "" diff --git a/modules/sd_models.py b/modules/sd_models.py index 05a1df28..b1c91b0d 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -234,9 +234,6 @@ def load_model(checkpoint_info=None): sd_hijack.model_hijack.hijack(sd_model) - if shared.clip_model is None or shared.clip_model.transformer.name_or_path != sd_model.cond_stage_model.wrapped.transformer.name_or_path: - shared.clip_model = CLIPModel.from_pretrained(sd_model.cond_stage_model.wrapped.transformer.name_or_path) - sd_model.eval() print(f"Model loaded.") diff --git a/modules/txt2img.py b/modules/txt2img.py index 32ed1d8d..1761cfa2 100644 --- a/modules/txt2img.py +++ b/modules/txt2img.py @@ -36,9 +36,7 @@ def txt2img(prompt: str, negative_prompt: str, prompt_style: str, prompt_style2: firstphase_height=firstphase_height if enable_hr else None, ) - shared.aesthetic_clip.set_aesthetic_params(float(aesthetic_lr), float(aesthetic_weight), int(aesthetic_steps), - aesthetic_imgs, aesthetic_slerp, aesthetic_imgs_text, aesthetic_slerp_angle, - aesthetic_text_negative) + shared.aesthetic_clip.set_aesthetic_params(p, float(aesthetic_lr), float(aesthetic_weight), int(aesthetic_steps), aesthetic_imgs, aesthetic_slerp, aesthetic_imgs_text, aesthetic_slerp_angle, aesthetic_text_negative) if cmd_opts.enable_console_prompts: print(f"\ntxt2img: {prompt}", file=shared.progress_print_out) diff --git a/modules/ui.py b/modules/ui.py index 381ca925..0d020de6 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -597,27 +597,29 @@ def apply_setting(key, value): return value -def create_ui(wrap_gradio_gpu_call): - import modules.img2img - import modules.txt2img +def create_refresh_button(refresh_component, refresh_method, refreshed_args, elem_id): + def refresh(): + refresh_method() + args = refreshed_args() if callable(refreshed_args) else refreshed_args - def create_refresh_button(refresh_component, refresh_method, refreshed_args, elem_id): - def refresh(): - refresh_method() - args = refreshed_args() if callable(refreshed_args) else refreshed_args + for k, v in args.items(): + setattr(refresh_component, k, v) - for k, v in args.items(): - setattr(refresh_component, k, v) + return gr.update(**(args or {})) - return gr.update(**(args or {})) + refresh_button = gr.Button(value=refresh_symbol, elem_id=elem_id) + refresh_button.click( + fn=refresh, + inputs=[], + outputs=[refresh_component] + ) + return refresh_button + + +def create_ui(wrap_gradio_gpu_call): + import modules.img2img + import modules.txt2img - refresh_button = gr.Button(value=refresh_symbol, elem_id=elem_id) - refresh_button.click( - fn = refresh, - inputs = [], - outputs = [refresh_component] - ) - return refresh_button 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) @@ -802,6 +804,14 @@ def create_ui(wrap_gradio_gpu_call): (hr_options, lambda d: gr.Row.update(visible="Denoising strength" in d)), (firstphase_width, "First pass size-1"), (firstphase_height, "First pass size-2"), + (aesthetic_lr, "Aesthetic LR"), + (aesthetic_weight, "Aesthetic weight"), + (aesthetic_steps, "Aesthetic steps"), + (aesthetic_imgs, "Aesthetic embedding"), + (aesthetic_slerp, "Aesthetic slerp"), + (aesthetic_imgs_text, "Aesthetic text"), + (aesthetic_text_negative, "Aesthetic text negative"), + (aesthetic_slerp_angle, "Aesthetic slerp angle"), ] txt2img_preview_params = [ @@ -1077,6 +1087,14 @@ def create_ui(wrap_gradio_gpu_call): (seed_resize_from_w, "Seed resize from-1"), (seed_resize_from_h, "Seed resize from-2"), (denoising_strength, "Denoising strength"), + (aesthetic_lr_im, "Aesthetic LR"), + (aesthetic_weight_im, "Aesthetic weight"), + (aesthetic_steps_im, "Aesthetic steps"), + (aesthetic_imgs_im, "Aesthetic embedding"), + (aesthetic_slerp_im, "Aesthetic slerp"), + (aesthetic_imgs_text_im, "Aesthetic text"), + (aesthetic_text_negative_im, "Aesthetic text negative"), + (aesthetic_slerp_angle_im, "Aesthetic slerp angle"), ] token_button.click(fn=update_token_counter, inputs=[img2img_prompt, steps], outputs=[token_counter]) diff --git a/style.css b/style.css index 26ae36a5..5d2bacc9 100644 --- a/style.css +++ b/style.css @@ -477,7 +477,7 @@ input[type="range"]{ padding: 0; } -#refresh_sd_model_checkpoint, #refresh_sd_hypernetwork, #refresh_train_hypernetwork_name, #refresh_train_embedding_name, #refresh_localization{ +#refresh_sd_model_checkpoint, #refresh_sd_hypernetwork, #refresh_train_hypernetwork_name, #refresh_train_embedding_name, #refresh_localization, #refresh_aesthetic_embeddings{ max-width: 2.5em; min-width: 2.5em; height: 2.4em; -- cgit v1.2.3 From 6398dc9b1049f242576ca309f95a3fb1e654951c Mon Sep 17 00:00:00 2001 From: AUTOMATIC <16777216c@gmail.com> Date: Sat, 22 Oct 2022 13:34:49 +0300 Subject: further support for extensions --- .gitignore | 1 + README.md | 3 +-- modules/scripts.py | 44 +++++++++++++++++++++++++++++++++++--------- modules/ui.py | 19 ++++++++++--------- style.css | 2 +- 5 files changed, 48 insertions(+), 21 deletions(-) (limited to 'style.css') diff --git a/.gitignore b/.gitignore index 2f1e08ed..8fa05852 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,4 @@ notification.mp3 /SwinIR /textual_inversion .vscode +/extensions diff --git a/README.md b/README.md index 5b5dc8ba..6853aea0 100644 --- a/README.md +++ b/README.md @@ -83,8 +83,7 @@ Check the [custom scripts](https://github.com/AUTOMATIC1111/stable-diffusion-web - Estimated completion time in progress bar - API - Support for dedicated [inpainting model](https://github.com/runwayml/stable-diffusion#inpainting-with-stable-diffusion) by RunwayML. -- Aesthetic Gradients, a way to generate images with a specific aesthetic by using clip images embds (implementation of [https://github.com/vicgalle/stable-diffusion-aesthetic-gradients](https://github.com/vicgalle/stable-diffusion-aesthetic-gradients)) - +- via extension: [Aesthetic Gradients](https://github.com/AUTOMATIC1111/stable-diffusion-webui-aesthetic-gradients), a way to generate images with a specific aesthetic by using clip images embds (implementation of [https://github.com/vicgalle/stable-diffusion-aesthetic-gradients](https://github.com/vicgalle/stable-diffusion-aesthetic-gradients)) ## Installation and Running Make sure the required [dependencies](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Dependencies) are met and follow the instructions available for both [NVidia](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Install-and-Run-on-NVidia-GPUs) (recommended) and [AMD](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Install-and-Run-on-AMD-GPUs) GPUs. diff --git a/modules/scripts.py b/modules/scripts.py index 65f25f49..9323af3e 100644 --- a/modules/scripts.py +++ b/modules/scripts.py @@ -102,17 +102,39 @@ def list_scripts(scriptdirname, extension): if os.path.exists(extdir): for dirname in sorted(os.listdir(extdir)): dirpath = os.path.join(extdir, dirname) - if not os.path.isdir(dirpath): + scriptdirpath = os.path.join(dirpath, scriptdirname) + + if not os.path.isdir(scriptdirpath): continue - for filename in sorted(os.listdir(os.path.join(dirpath, scriptdirname))): - scripts_list.append(ScriptFile(dirpath, filename, os.path.join(dirpath, scriptdirname, filename))) + for filename in sorted(os.listdir(scriptdirpath)): + scripts_list.append(ScriptFile(dirpath, filename, os.path.join(scriptdirpath, filename))) scripts_list = [x for x in scripts_list if os.path.splitext(x.path)[1].lower() == extension and os.path.isfile(x.path)] return scripts_list +def list_files_with_name(filename): + res = [] + + dirs = [paths.script_path] + + extdir = os.path.join(paths.script_path, "extensions") + if os.path.exists(extdir): + dirs += [os.path.join(extdir, d) for d in sorted(os.listdir(extdir))] + + for dirpath in dirs: + if not os.path.isdir(dirpath): + continue + + path = os.path.join(dirpath, filename) + if os.path.isfile(filename): + res.append(path) + + return res + + def load_scripts(): global current_basedir scripts_data.clear() @@ -276,7 +298,7 @@ class ScriptRunner: print(f"Error running alwayson script: {script.filename}", file=sys.stderr) print(traceback.format_exc(), file=sys.stderr) - def reload_sources(self): + def reload_sources(self, cache): for si, script in list(enumerate(self.scripts)): with open(script.filename, "r", encoding="utf8") as file: args_from = script.args_from @@ -286,9 +308,12 @@ class ScriptRunner: from types import ModuleType - compiled = compile(text, filename, 'exec') - module = ModuleType(script.filename) - exec(compiled, module.__dict__) + module = cache.get(filename, None) + if module is None: + compiled = compile(text, filename, 'exec') + module = ModuleType(script.filename) + exec(compiled, module.__dict__) + cache[filename] = module for key, script_class in module.__dict__.items(): if type(script_class) == type and issubclass(script_class, Script): @@ -303,8 +328,9 @@ scripts_img2img = ScriptRunner() def reload_script_body_only(): - scripts_txt2img.reload_sources() - scripts_img2img.reload_sources() + cache = {} + scripts_txt2img.reload_sources(cache) + scripts_img2img.reload_sources(cache) def reload_scripts(): diff --git a/modules/ui.py b/modules/ui.py index c977482c..29986124 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -1636,13 +1636,15 @@ Requested path was: {f} interfaces += [(settings_interface, "Settings", "settings")] - with open(os.path.join(script_path, "style.css"), "r", encoding="utf8") as file: - css = file.read() + css = "" + + for cssfile in modules.scripts.list_files_with_name("style.css"): + with open(cssfile, "r", encoding="utf8") as file: + css += file.read() + "\n" if os.path.exists(os.path.join(script_path, "user.css")): with open(os.path.join(script_path, "user.css"), "r", encoding="utf8") as file: - usercss = file.read() - css += usercss + css += file.read() + "\n" if not cmd_opts.no_progressbar_hiding: css += css_hide_progressbar @@ -1865,9 +1867,9 @@ def load_javascript(raw_response): with open(os.path.join(script_path, "script.js"), "r", encoding="utf8") as jsfile: javascript = f'' - jsdir = os.path.join(script_path, "javascript") - for filename in sorted(os.listdir(jsdir)): - with open(os.path.join(jsdir, filename), "r", encoding="utf8") as jsfile: + scripts_list = modules.scripts.list_scripts("javascript", ".js") + for basedir, filename, path in scripts_list: + with open(path, "r", encoding="utf8") as jsfile: javascript += f"\n" if cmd_opts.theme is not None: @@ -1885,6 +1887,5 @@ def load_javascript(raw_response): gradio.routes.templates.TemplateResponse = template_response -reload_javascript = partial(load_javascript, - gradio.routes.templates.TemplateResponse) +reload_javascript = partial(load_javascript, gradio.routes.templates.TemplateResponse) reload_javascript() diff --git a/style.css b/style.css index 5d2bacc9..26ae36a5 100644 --- a/style.css +++ b/style.css @@ -477,7 +477,7 @@ input[type="range"]{ padding: 0; } -#refresh_sd_model_checkpoint, #refresh_sd_hypernetwork, #refresh_train_hypernetwork_name, #refresh_train_embedding_name, #refresh_localization, #refresh_aesthetic_embeddings{ +#refresh_sd_model_checkpoint, #refresh_sd_hypernetwork, #refresh_train_hypernetwork_name, #refresh_train_embedding_name, #refresh_localization{ max-width: 2.5em; min-width: 2.5em; height: 2.4em; -- cgit v1.2.3 From ca2ebc89c2d18c02d9e337b660fdabe7178a6ccc Mon Sep 17 00:00:00 2001 From: xmodar Date: Mon, 24 Oct 2022 19:03:01 +0300 Subject: Add RTL languages support and improved Arabic localization --- javascript/localization.js | 20 +- localizations/ar_AR.json | 1145 ++++++++++++++++++-------------------------- localizations/ja_JP.json | 1 + localizations/ko_KR.json | 1 + localizations/ru_RU.json | 1 + style.css | 74 +++ 6 files changed, 551 insertions(+), 691 deletions(-) (limited to 'style.css') diff --git a/javascript/localization.js b/javascript/localization.js index e6644635..6fb2fccd 100644 --- a/javascript/localization.js +++ b/javascript/localization.js @@ -107,7 +107,7 @@ function processNode(node){ } function dumpTranslations(){ - dumped = {} + dumped = { rtl: localization.rtl || false } Object.keys(original_lines).forEach(function(text){ if(dumped[text] !== undefined) return @@ -129,6 +129,24 @@ onUiUpdate(function(m){ document.addEventListener("DOMContentLoaded", function() { processNode(gradioApp()) + + if (localization.rtl) { // if the language is from right to left, + (new MutationObserver((mutations, observer) => { // wait for the style to load + mutations.forEach(mutation => { + mutation.addedNodes.forEach(node => { + if (node.tagName === 'STYLE') { + observer.disconnect(); + + for (const x of node.sheet.rules) { // find all rtl media rules + if (Array.from(x.media || []).includes('rtl')) { + x.media.appendMedium('all'); // enable them + } + } + } + }) + }); + })).observe(gradioApp(), { childList: true }); + } }) function download_localization() { diff --git a/localizations/ar_AR.json b/localizations/ar_AR.json index 6d03e013..1195a8e9 100644 --- a/localizations/ar_AR.json +++ b/localizations/ar_AR.json @@ -1,691 +1,456 @@ -{ "⤡": "⤡", - "⊞": "⊞", - "×": "×", - "❮": "❮", - "❯": "❯", - "Loading...": "جار التحميل...", - "view": "معاينة", - "api": "api", - "•": "•", - "built with gradio": "مبني باستخدام Gradio", - "Stable Diffusion checkpoint": "نماذج الانتشار المستقر", - "txt2img": "نص لصورة", - "img2img": "صورة لصورة", - "Extras": "الإضافات", - "PNG Info": "معلومات PNG", - "Image Browser": "مستعرض الصور", - "Checkpoint Merger": "دمج النماذج", - "Train": "التدريب", - "Settings": "الإعدادات", - "Prompt": "الموجه", - "Negative prompt": "الموجه السلبي", - "Run": "تشغيل", - "Skip": "تخطي", - "Interrupt": "إيقاف", - "Generate": "إنشاء", - "Style 1": "نمط 1", - "Style 2": "نمط 2", - "Label": "الوسم", - "File": "ملف", - "Drop File Here": "اسحب الملف هنا", - "-": "-", - "or": "أو", - "Click to Upload": "انقر للتحميل", - "Image": "صورة", - "Check progress": "تحقق من التقدم", - "Check progress (first)": "تحقق من التقدم (الأول)", - "Sampling Steps": "خطوات أخذ العينة", - "Sampling method": "نظام أخذ العينات", - "Euler a": "Euler a", - "Euler": "Euler", - "LMS": "LMS", - "Heun": "Heun", - "DPM2": "DPM2", - "DPM2 a": "DPM2 a", - "DPM fast": "DPM fast", - "DPM adaptive": "DPM adaptive", - "LMS Karras": "LMS Karras", - "DPM2 Karras": "DPM2 Karras", - "DPM2 a Karras": "DPM2 a Karras", - "DDIM": "DDIM", - "PLMS": "PLMS", - "Width": "العرض", - "Height": "الارتفاع", - "Restore faces": "ترميم الوجوه", - "Tiling": "تبليط", - "Highres. fix": "إصلاح الصور عالية الدقة", - "Firstpass width": "عرض المرور الأول", - "Firstpass height": "ارتفاع المرور الأول", - "Denoising strength": "قوة تقليل الضوضاء", - "Batch count": "عدد الدُفعات", - "Batch size": "حجم الدفعة", - "CFG Scale": "مقياس التقارب من الموجه (CFG)", - "Seed": "البذرة", - "Extra": "إضافي", - "Variation seed": "تباين البذرة", - "Variation strength": "قوة التباين", - "Resize seed from width": "تغيير حجم البذرة من العرض", - "Resize seed from height": "تغيير حجم البذرة من الارتفاع", - "Script": "سكريبت", - "None": "لايوجد", - "Prompt matrix": "مصفوفة الموجهات", - "Prompts from file or textbox": "موجهات من ملف أو مربع النص", - "X/Y plot": "الرسم البياني X/Y", - "Put variable parts at start of prompt": "ضع الأجزاء المتغيرة في بداية الموجه", - "Show Textbox": "إظهار مربع النص", - "File with inputs": "ملف يحتوي المدخلات", - "Prompts": "الموجهات", - "X type": "نوع X", - "Nothing": "لا شئ", - "Var. seed": "تغير البذرة", - "Var. strength": "قوة التغيير", - "Steps": "الخطوات", - "Prompt S/R": "موجه S / R", - "Prompt order": "ترتيب الموجهات", - "Sampler": "نظام أخذ العينات", - "Checkpoint name": "اسم النموذج", - "Hypernetwork": "الشبكة الفائقة", - "Hypernet str.": "قوة الشبكة الفائقة", - "Sigma Churn": "دفع سيجما", - "Sigma min": "أصغر سيجما", - "Sigma max": "أكبر سيجما", - "Sigma noise": "ضجة سيجما", - "Eta": "الوقت المتوقع", - "Clip skip": "تخطي Clip", - "Denoising": "تقليل الضوضاء", - "X values": "قيم X", - "Y type": "نوع Y", - "Y values": "قيم Y", - "Draw legend": "ارسم مفتاح التوضيح", - "Include Separate Images": "قم بتضمين الصور منفصلة", - "Keep -1 for seeds": "احتفظ بـقيمة -1 للبذور", - "Drop Image Here": "إسقاط الصورة هنا", - "Save": "حفظ", - "Send to img2img": "أرسل إلى صورة لصورة", - "Send to inpaint": "أرسل إلى إعادة الرسم الجزئي", - "Send to extras": "أرسل إلى الإضافات", - "Make Zip when Save?": "إنشاء ملف مضغوط عند الحفظ؟", - "Textbox": "مربع النص", - "Interrogate\nCLIP": "استجواب\n CLIP", - "Inpaint": "إعادة الرسم الجزئي", - "Batch img2img": "دفعات صورة لصورة", - "Image for img2img": "صورة (صورة لصورة)", - "Image for inpainting with mask": "صورة (إعادة الرسم الجزئي)", - "Mask": "القناع", - "Mask blur": "ضبابية القناع", - "Mask mode": "أسلوب القناع", - "Draw mask": "رسم القناع", - "Upload mask": "تحميل القناع", - "Masking mode": "أسلوب التقنيع", - "Inpaint masked": "إعادة الرسم الجزئي (المنطقة المقنعة)", - "Inpaint not masked": "إعادة الرسم الجزئي (المنطقة الغير مقنعة)", - "Masked content": "المحتوى المقنع", - "fill": "الملأ", - "original": "الأصلي", - "latent noise": "الضوضاء الكامنة", - "latent nothing": "لا شيء كامن", - "Inpaint at full resolution": "إعادة الرسم الجزئي بدقة كاملة", - "Inpaint at full resolution padding, pixels": "إعادة الرسم الجزئي بدقة كاملة, الحشو, بيكسل", - "Process images in a directory on the same machine where the server is running.": "معالجة الصور في المجلد على نفس الجهاز حيث يتم تشغيل الخادم.", - "Use an empty output directory to save pictures normally instead of writing to the output directory.": "استخدم مجلد إخراج فارغ لحفظ الصور بشكل طبيعي بدلاً من الكتابة إلى مجلد المخرجات.", - "Input directory": "مجلد المدخلات", - "Output directory": "مجلد المخرجات", - "Resize mode": "وضعية تغيير الحجم", - "Just resize": "تغييير الحجم فقط", - "Crop and resize": "اقتصاص وتغيير الحجم", - "Resize and fill": "تغيير الحجم والتعبئة", - "Animator": "محرك الرسوم", - "Animator v2": "محرك الرسوم نسخة 2", - "Deforum v0.5-webui-beta": "ديفوروم 0.5", - "External Image Masking": "تقنيع الصور الخارجي", - "img2img alternative test": "صورة لصورة البديلة", - "Loopback": "الحلقة الراجعة", - "Outpainting mk2": "الرسم الخارجي نسخة 2", - "Poor man's outpainting": "الرسم الخارجي للفقراء", - "SD upscale": "ترقية الانتشار المستقر", - "txt2mask v0.1.1": "نص لقناع 0.1.1", - "[C] Video to video": "فيديو لفيديو", - "Videos": "فيديوهات", - "Render these video formats:": "رسم تنسيقات الفيديو:", - "GIF": "GIF", - "MP4": "MP4", - "WEBM": "WEBM", - "Animation Parameters": "متغيرات تحريك الرسوم", - "Total Animation Length (s)": "المدة الكلية للرسوم المتحركة", - "Framerate": "Framerate", - "Add_Noise": "Add_Noise", - "Noise Strength": "Noise Strength", - "Denoising_Decay": "Denoising_Decay", - "Denoising Decay Rate": "Denoising Decay Rate", - "Initial Parameters": "Initial Parameters", - "Denoising Strength (overrides img2img slider)": "Denoising Strength (overrides img2img slider)", - "Zoom Factor (scale/s)": "Zoom Factor (scale/s)", - "X Pixel Shift (pixels/s)": "X Pixel Shift (pixels/s)", - "Y Pixel Shift (pixels/s)": "Y Pixel Shift (pixels/s)", - "Prompt Template, applied to each keyframe below": "Prompt Template, applied to each keyframe below", - "Positive Prompts": "Positive Prompts", - "Negative Prompts": "Negative Prompts", - "Keyframe Format:": "Keyframe Format:", - "Time (s) | Desnoise | Zoom (/s) | X Shift (pix/s) | Y shift (pix/s) | Positive Prompts | Negative Prompts | Seed": "Time (s) | Desnoise | Zoom (/s) | X Shift (pix/s) | Y shift (pix/s) | Positive Prompts | Negative Prompts | Seed", - "Keyframes:": "Keyframes:", - "Rotation (deg/s)": "Rotation (deg/s)", - "Props": "Props", - "Folder:": "Folder:", - "Supported Keyframes:": "Supported Keyframes:", - "time_s | prompt | positive_prompts | negative_prompts": "time_s | prompt | positive_prompts | negative_prompts", - "time_s | transform | zoom | x_shift | y_shift | rotation": "time_s | transform | zoom | x_shift | y_shift | rotation", - "time_s | seed | new_seed_int": "time_s | seed | new_seed_int", - "time_s | denoise | denoise_value": "time_s | denoise | denoise_value", - "time_s | prop | prop_filename | x_pos | y_pos | scale | rotation": "time_s | prop | prop_filename | x_pos | y_pos | scale | rotation", - "time_s | set_text | textblock_name | text_prompt | x | y | fore_R | fore_G | fore_B | back_R | back_G | back_B | font_name | font_size": "time_s | set_text | textblock_name | text_prompt | x | y | fore_R | fore_G | fore_B | back_R | back_G | back_B | font_name | font_size", - "time_s | clear_text | textblock_name": "time_s | clear_text | textblock_name", - "time_s | prop | prop_name | prop_filename | x pos | y pos | scale | rotation": "time_s | prop | prop_name | prop_filename | x pos | y pos | scale | rotation", - "time_s | set_stamp | stamp_name | stamp_filename | x pos | y pos | scale | rotation": "time_s | set_stamp | stamp_name | stamp_filename | x pos | y pos | scale | rotation", - "time_s | clear_stamp | stamp_name": "time_s | clear_stamp | stamp_name", - "time_s | col_set": "time_s | col_set", - "time_s | col_clear": "time_s | col_clear", - "time_s | model | 2022-10-19T08-10-53_VV_6_training_images_1212_max_training_steps_VV_V_token_woman_class_word, 2022-10-19T09-06-28_VV_6_training_images_1212_max_training_steps_VV_V_token_woman_class_word, 2022-10-20T10-07-46_Zori_New_20_training_images_2020_max_training_steps_ZZ_W_token_woman_class_word, 2022-10-20T10-39-38_Zori_New_20_training_images_1010_max_training_steps_ZZ_W_token_woman_class_word, HD-16, L, L2_1, L2_2, LM, MT_V, Main+Trinart, Z1, Z2, model, modelZ, nai, robo-diffusion-v1, sd-v1-5-inpainting, trinart2_step115000, v1-5-pruned, v1-5-pruned-emaonly, wd-v1-2-full-ema, wd-v1-3-float16": "time_s | model | 2022-10-19T08-10-53_VV_6_training_images_1212_max_training_steps_VV_V_token_woman_class_word, 2022-10-19T09-06-28_VV_6_training_images_1212_max_training_steps_VV_V_token_woman_class_word, 2022-10-20T10-07-46_Zori_New_20_training_images_2020_max_training_steps_ZZ_W_token_woman_class_word, 2022-10-20T10-39-38_Zori_New_20_training_images_1010_max_training_steps_ZZ_W_token_woman_class_word, HD-16, L, L2_1, L2_2, LM, MT_V, Main+Trinart, Z1, Z2, model, modelZ, nai, robo-diffusion-v1, sd-v1-5-inpainting, trinart2_step115000, v1-5-pruned, v1-5-pruned-emaonly, wd-v1-2-full-ema, wd-v1-3-float16", - "Click here after the generation to show the video": "Click here after the generation to show the video", - "Made by deforum.github.io, port for AUTOMATIC1111's webui maintained by kabachuha": "Made by deforum.github.io, port for AUTOMATIC1111's webui maintained by kabachuha", - "Original Deforum Github repo github.com/deforum/stable-diffusion": "Original Deforum Github repo github.com/deforum/stable-diffusion", - "This fork for auto1111's webui github.com/deforum-art/deforum-for-automatic1111-webui": "This fork for auto1111's webui github.com/deforum-art/deforum-for-automatic1111-webui", - "Join the official Deforum Discord discord.gg/deforum to share your creations and suggestions": "Join the official Deforum Discord discord.gg/deforum to share your creations and suggestions", - "User guide for v0.5 docs.google.com/document/d/1pEobUknMFMkn8F5TMsv8qRzamXX_75BShMMXV8IFslI/edit": "User guide for v0.5 docs.google.com/document/d/1pEobUknMFMkn8F5TMsv8qRzamXX_75BShMMXV8IFslI/edit", - "Math keyframing explanation docs.google.com/document/d/1pfW1PwbDIuW0cv-dnuyYj1UzPqe23BlSLTJsqazffXM/edit?usp=sharing": "Math keyframing explanation docs.google.com/document/d/1pfW1PwbDIuW0cv-dnuyYj1UzPqe23BlSLTJsqazffXM/edit?usp=sharing", - "Keyframes": "Keyframes", - "Init": "Init", - "Video output": "Video output", - "Run settings": "Run settings", - "Import settings from file": "Import settings from file", - "Override settings": "Override settings", - "Custom settings file": "Custom settings file", - "Sampling settings": "Sampling settings", - "The following settings have already been set up in the webui": "The following settings have already been set up in the webui", - "Do you want to override them with the values above?": "Do you want to override them with the values above?", - "FIXME! Need to make deforum <-> webui samplers map. Before that, the sampler gets used from webui anyway. If your images are changing too adruptly, lower steps or increase strength schedule!": "FIXME! Need to make deforum <-> webui samplers map. Before that, the sampler gets used from webui anyway. If your images are changing too adruptly, lower steps or increase strength schedule!", - "override_these_with_webui": "override_these_with_webui", - "W, H, seed, sampler, steps, scale, ddim_eta, n_batch, make_grid, grid_rows": "W, H, seed, sampler, steps, scale, ddim_eta, n_batch, make_grid, grid_rows", - "W": "W", - "H": "H", - "seed": "seed", - "sampler": "sampler", - "klms": "klms", - "dpm2": "dpm2", - "dpm2_ancestral": "dpm2_ancestral", - "heun": "heun", - "euler": "euler", - "euler_ancestral": "euler_ancestral", - "plms": "plms", - "ddim": "ddim", - "steps": "steps", - "scale": "scale", - "ddim_eta": "ddim_eta", - "n_batch": "n_batch", - "make_grid": "make_grid", - "grid_rows": "grid_rows", - "save_settings": "save_settings", - "save_samples": "save_samples", - "display_samples": "display_samples", - "save_sample_per_step": "save_sample_per_step", - "show_sample_per_step": "show_sample_per_step", - "Batch settings": "Batch settings", - "batch_name": "batch_name", - "filename_format": "filename_format", - "seed_behavior": "seed_behavior", - "iter": "iter", - "fixed": "fixed", - "random": "random", - "schedule": "schedule", - "Animation settings": "Animation settings", - "animation_mode": "animation_mode", - "2D": "2D", - "3D": "3D", - "Video Input": "Video Input", - "max_frames": "max_frames", - "border": "border", - "replicate": "replicate", - "wrap": "wrap", - "Motion parameters:": "Motion parameters:", - "2D and 3D settings": "2D and 3D settings", - "angle": "angle", - "zoom": "zoom", - "translation_x": "translation_x", - "translation_y": "translation_y", - "3D settings": "3D settings", - "translation_z": "translation_z", - "rotation_3d_x": "rotation_3d_x", - "rotation_3d_y": "rotation_3d_y", - "rotation_3d_z": "rotation_3d_z", - "Prespective flip — Low VRAM pseudo-3D mode:": "Prespective flip — Low VRAM pseudo-3D mode:", - "flip_2d_perspective": "flip_2d_perspective", - "perspective_flip_theta": "perspective_flip_theta", - "perspective_flip_phi": "perspective_flip_phi", - "perspective_flip_gamma": "perspective_flip_gamma", - "perspective_flip_fv": "perspective_flip_fv", - "Generation settings:": "Generation settings:", - "noise_schedule": "noise_schedule", - "strength_schedule": "strength_schedule", - "contrast_schedule": "contrast_schedule", - "cfg_scale_schedule": "cfg_scale_schedule", - "To enable seed schedule select seed behavior — 'schedule'": "To enable seed schedule select seed behavior — 'schedule'", - "seed_schedule": "seed_schedule", - "Coherence:": "Coherence:", - "color_coherence": "color_coherence", - "Match Frame 0 HSV": "Match Frame 0 HSV", - "Match Frame 0 LAB": "Match Frame 0 LAB", - "Match Frame 0 RGB": "Match Frame 0 RGB", - "diffusion_cadence": "diffusion_cadence", - "3D Depth Warping:": "3D Depth Warping:", - "use_depth_warping": "use_depth_warping", - "midas_weight": "midas_weight", - "near_plane": "near_plane", - "far_plane": "far_plane", - "fov": "fov", - "padding_mode": "padding_mode", - "reflection": "reflection", - "zeros": "zeros", - "sampling_mode": "sampling_mode", - "bicubic": "bicubic", - "bilinear": "bilinear", - "nearest": "nearest", - "save_depth_maps": "save_depth_maps", - "`animation_mode: None` batches on list of *prompts*. (Batch mode disabled atm, only animation_prompts are working)": "`animation_mode: None` batches on list of *prompts*. (Batch mode disabled atm, only animation_prompts are working)", - "*Important change from vanilla Deforum!*": "*Important change from vanilla Deforum!*", - "This script uses the built-in webui weighting settings.": "This script uses the built-in webui weighting settings.", - "So if you want to use math functions as prompt weights,": "So if you want to use math functions as prompt weights,", - "keep the values above zero in both parts": "keep the values above zero in both parts", - "Negative prompt part can be specified with --neg": "Negative prompt part can be specified with --neg", - "batch_prompts (disabled atm)": "batch_prompts (disabled atm)", - "animation_prompts": "animation_prompts", - "Init settings": "Init settings", - "use_init": "use_init", - "from_img2img_instead_of_link": "from_img2img_instead_of_link", - "strength_0_no_init": "strength_0_no_init", - "strength": "strength", - "init_image": "init_image", - "use_mask": "use_mask", - "use_alpha_as_mask": "use_alpha_as_mask", - "invert_mask": "invert_mask", - "overlay_mask": "overlay_mask", - "mask_file": "mask_file", - "mask_brightness_adjust": "mask_brightness_adjust", - "mask_overlay_blur": "mask_overlay_blur", - "Video Input:": "Video Input:", - "video_init_path": "video_init_path", - "extract_nth_frame": "extract_nth_frame", - "overwrite_extracted_frames": "overwrite_extracted_frames", - "use_mask_video": "use_mask_video", - "video_mask_path": "video_mask_path", - "Interpolation (turned off atm)": "Interpolation (turned off atm)", - "interpolate_key_frames": "interpolate_key_frames", - "interpolate_x_frames": "interpolate_x_frames", - "Resume animation:": "Resume animation:", - "resume_from_timestring": "resume_from_timestring", - "resume_timestring": "resume_timestring", - "Video output settings": "Video output settings", - "skip_video_for_run_all": "skip_video_for_run_all", - "fps": "fps", - "output_format": "output_format", - "PIL gif": "PIL gif", - "FFMPEG mp4": "FFMPEG mp4", - "ffmpeg_location": "ffmpeg_location", - "add_soundtrack": "add_soundtrack", - "soundtrack_path": "soundtrack_path", - "use_manual_settings": "use_manual_settings", - "render_steps": "render_steps", - "max_video_frames": "max_video_frames", - "path_name_modifier": "path_name_modifier", - "x0_pred": "x0_pred", - "x": "x", - "image_path": "image_path", - "mp4_path": "mp4_path", - "Masking preview size": "Masking preview size", - "Draw new mask on every run": "Draw new mask on every run", - "Process non-contigious masks separately": "Process non-contigious masks separately", - "should be 2 or lower.": "should be 2 or lower.", - "Override `Sampling method` to Euler?(this method is built for it)": "Override `Sampling method` to Euler?(this method is built for it)", - "Override `prompt` to the same value as `original prompt`?(and `negative prompt`)": "Override `prompt` to the same value as `original prompt`?(and `negative prompt`)", - "Original prompt": "Original prompt", - "Original negative prompt": "Original negative prompt", - "Override `Sampling Steps` to the same value as `Decode steps`?": "Override `Sampling Steps` to the same value as `Decode steps`?", - "Decode steps": "Decode steps", - "Override `Denoising strength` to 1?": "Override `Denoising strength` to 1?", - "Decode CFG scale": "Decode CFG scale", - "Randomness": "Randomness", - "Sigma adjustment for finding noise for image": "Sigma adjustment for finding noise for image", - "Loops": "Loops", - "Denoising strength change factor": "معامل قوة تقليل الضوضاء", - "Recommended settings: Sampling Steps: 80-100, Sampler: Euler a, Denoising strength: 0.8": "الإعدادات الموصى بها: خطوات أخذ العينات: 80-100 ، طريقة أخذ العينات: Euler a ، تقليل الضوضاء: 0.8", - "Pixels to expand": "عدد البكسل للتوسيع", - "Outpainting direction": "إتجاه الرسم الخارجي", - "left": "يسار", - "right": "يمين", - "up": "فوق", - "down": "تحت", - "Fall-off exponent (lower=higher detail)": "أس التناقص (الأدنى = تفاصيل أعلى)", - "Color variation": "اختلاف اللون", - "Will upscale the image to twice the dimensions; use width and height sliders to set tile size": "سيقوم بترقية الصورة إلى ضعف الأبعاد ؛ استخدم شريط تمرير العرض والارتفاع لضبط حجم التبليط", - "Tile overlap": "تداخل التبليط", - "Upscaler": "المرقي", - "Lanczos": "Lanczos", - "LDSR": "LDSR", - "ESRGAN 4x": "ESRGAN 4x", - "R-ESRGAN General 4xV3": "R-ESRGAN General 4xV3", - "R-ESRGAN General WDN 4xV3": "R-ESRGAN General WDN 4xV3", - "R-ESRGAN AnimeVideo": "R-ESRGAN AnimeVideo", - "R-ESRGAN 4x+": "R-ESRGAN 4x+", - "R-ESRGAN 4x+ Anime6B": "R-ESRGAN 4x+ Anime6B", - "R-ESRGAN 2x+": "R-ESRGAN 2x+", - "ScuNET GAN": "ScuNET GAN", - "ScuNET PSNR": "ScuNET PSNR", - "SwinIR_4x": "SwinIR_4x", - "Mask prompt": "Mask prompt", - "Negative mask prompt": "Negative mask prompt", - "Mask precision": "Mask precision", - "Mask padding": "Mask padding", - "Brush mask mode": "Brush mask mode", - "discard": "discard", - "add": "add", - "subtract": "subtract", - "Show mask in output?": "Show mask in output?", - "If you like my work, please consider showing your support on": "If you like my work, please consider showing your support on", - "Patreon": "Patreon", - "Input file path": "Input file path", - "CRF (quality, less is better, x264 param)": "CRF (quality, less is better, x264 param)", - "FPS": "FPS", - "Seed step size": "Seed step size", - "Seed max distance": "Seed max distance", - "Start time": "Start time", - "End time": "End time", - "End Prompt Blend Trigger Percent": "End Prompt Blend Trigger Percent", - "Prompt end": "Prompt end", - "Smooth video": "Smooth video", - "Seconds": "Seconds", - "Zoom": "Zoom", - "Zoom level": "Zoom level", - "Direction X": "Direction X", - "Direction Y": "Direction Y", - "Rotate": "Rotate", - "Degrees": "Degrees", - "Is the Image Tiled?": "Is the Image Tiled?", - "TranslateX": "TranslateX", - "Left": "Left", - "PercentX": "PercentX", - "TranslateY": "TranslateY", - "Up": "Up", - "PercentY": "PercentY", - "Show generated pictures in ui": "عرض الصور المنشئة في واجهة الاستخدام", - "Single Image": "صورة واحدة", - "Batch Process": "معالجة الدفعات", - "Batch from Directory": "دفعة من المجلد", - "Source": "مصدر", - "Show result images": "إظهار نتائج الصور ", - "Scale by": "رفع الحجم بمقدار", - "Scale to": "رفع الحجم إلى", - "Resize": "تغيير الحجم", - "Crop to fit": "اقتصاص للتوافق", - "Upscaler 2 visibility": "إظهار المرقي 2", - "GFPGAN visibility": "إظهار GFPGAN", - "CodeFormer visibility": "إظهار CodeFormer", - "CodeFormer weight (0 = maximum effect, 1 = minimum effect)": "وزن CodeFormer (0 = أقصى تأثير ، 1 = تأثير أدنى)", - "Open output directory": "افتح مجلد المخرجات", - "Send to txt2img": "أرسل إلى كتابة لصورة", - "extras": "إضافات", - "favorites": "المفضلة", - "Load": "تحميل", - "Images directory": "مجلد الصور", - "Prev batch": "الدفعة السابقة", - "Next batch": "الدفعة التالية", - "First Page": "الصفحة الأولى", - "Prev Page": "الصفحة السابقة", - "Page Index": "فهرس الصفحات", - "Next Page": "الصفحة التالية", - "End Page": "صفحة النهاية", - "number of images to delete consecutively next": "عدد الصور المطلوب حذفها على التوالي بعد ذلك", - "Delete": "حذف", - "Generate Info": "معلومات الإنشاء", - "File Name": "اسم الملف", - "Collect": "جمع", - "Refresh page": "إعادة تحميل الصفحة", - "Date to": "التاريخ إلى", - "Number": "الرقم", - "set_index": "وضع الفهرس", - "Checkbox": "صندوق اختيار", - "A merger of the two checkpoints will be generated in your": "سيتم إنشاء نموذجمدمج من النموذجين في", - "checkpoint": "النموذج", - "directory.": "المجلد.", - "Primary model (A)": "النموذج الأساسي (أ)", - "Secondary model (B)": "النموذج الثانوي (ب)", - "Tertiary model (C)": "النموذج الثالث (ج)", - "Custom Name (Optional)": "اسم مخصص (اختياري)", - "Multiplier (M) - set to 0 to get model A": "المضاعف (M) - اضبط على 0 للحصول على النموذج أ", - "Interpolation Method": "طريقة الاستنباط", - "Weighted sum": "المجموع الموزون", - "Add difference": "أضافة الاختلاف", - "Save as float16": "حفظ float16", - "See": "شاهد", - "wiki": "ويكي", - "for detailed explanation.": "للحصول على شرح مفصل.", - "Create embedding": "إنشاء التضمين", - "Create hypernetwork": "إنشاء شبكة فائقة", - "Preprocess images": "تجهيز الصور", - "Name": "الاسم", - "Initialization text": "نص التهيئة", - "Number of vectors per token": "عدد المتجهات لكل رمز", - "Overwrite Old Embedding": "الكتابة فوق التضمين القديم", - "Modules": "الوحدات", - "Enter hypernetwork layer structure": "أدخل بنية طبقة الشبكة الفائقة", - "Select activation function of hypernetwork": "حدد وظيفة تنشيط الشبكة الفائقة", - "linear": "خطي (Linear)", - "relu": "الوحدة الخطية المعدلة (Relu)", - "leakyrelu": "الوحدة الخطية المعدلة المسربة (Leakyrelu)", - "elu": "الوحدة الأسية الخطية (Elu)", - "swish": "Swish", - "Add layer normalization": "أضف طبقة التسوية", - "Use dropout": "استخدم الهبوط", - "Overwrite Old Hypernetwork": "الكتابة فوق الشبكة الفائقة القديمة", - "Source directory": "مجلد المصدر", - "Destination directory": "مجلد النتائج", - "Existing Caption txt Action": "الإجراء النصي للتعليق المتوفر", - "ignore": "تجاهل", - "copy": "نسخ", - "prepend": "أضف قبل", - "append": "ألحق", - "Create flipped copies": "قم بإنشاء نسخ مقلوبة", - "Split oversized images": "تقسيم الصور كبيرة الحجم", - "Use BLIP for caption": "استخدم BLIP للتعليق", - "Use deepbooru for caption": "استخدم deepbooru للتعليق", - "Split image threshold": "حد تقسيم الصورة", - "Split image overlap ratio": "نسبة تداخل الصورة المنقسمة", - "Preprocess": "تجهيز الصور", - "Train an embedding or Hypernetwork; you must specify a directory with a set of 1:1 ratio images": "تدريب التضمين أو الشبكة الفائقة ؛ يجب تحديد مجلد بمجموعة من الصور بنسبة أبعاد 1: 1", - "[wiki]": "[ويكي]", - "Embedding": "التضمين", - "Embedding Learning rate": "معدل تعلم التضمين", - "Hypernetwork Learning rate": "معدل تعلم الشبكة الفائقة", - "Dataset directory": "مجلد مجموعة البيانات", - "Log directory": "مجلد السجل", - "Prompt template file": "ملف قالب الموجهات", - "Max steps": "الخطوات القصوى", - "Save an image to log directory every N steps, 0 to disable": "حفظ صورة في مجلد السجل كل N خطوات ، 0 للتعطيل", - "Save a copy of embedding to log directory every N steps, 0 to disable": "حفظ نسخة من التضمين في مجلد السجل كل N خطوات ، 0 للتعطيل", - "Save images with embedding in PNG chunks": "حفظ التضمين مع الصور في أجزاء PNG", - "Read parameters (prompt, etc...) from txt2img tab when making previews": "قراءة المتغيرات (الموجه ، إلخ ...) من علامة تبويب نص لصورة عند إجراء المعاينات", - "Train Hypernetwork": "تدريب الشبكة الفائقة", - "Train Embedding": "تدريب التضمين", - "Apply settings": "تطبيق الإعدادات", - "Saving images/grids": "حفظ الصور / الإطار الشبكي", - "Always save all generated images": "احفظ دائمًا جميع الصور التي تم إنشائها", - "File format for images": "تنسيق ملفات الصور", - "Images filename pattern": "نمط اسم ملفات الصور", - "Always save all generated image grids": "احفظ دائمًا جميع الإطارات الشبكية للصور التي تم إنشاؤها", - "File format for grids": "تنسيق ملفات الإطارات الشبكية", - "Add extended info (seed, prompt) to filename when saving grid": "أضف معلومات إضافية (البذرة ، الموجه) إلى اسم الملف عند حفظ الإطار الشبكي", - "Do not save grids consisting of one picture": "لا تحفظ الإطارات الشبكية التي تتكون من صورة واحدة", - "Prevent empty spots in grid (when set to autodetect)": "منع المناطق الفارغة في الإطار الشبكي (عند الضبط على الاكتشاف التلقائي)", - "Grid row count; use -1 for autodetect and 0 for it to be same as batch size": "عدد صفوف الإطار الشبكي استخدم -1 للاكتشاف التلقائي و 0 ليكون نفس حجم الدُفعة", - "Save text information about generation parameters as chunks to png files": "احفظ معلومات نصية حول متغيرات الإنشاء كمقاطع في ملفات png", - "Create a text file next to every image with generation parameters.": "قم بإنشاء ملف نصي بجوار كل صورة باستخدام متغيرات الإنشاء.", - "Save a copy of image before doing face restoration.": "احفظ نسخة من الصورة قبل القيام بترميم الوجوه.", - "Quality for saved jpeg images": "جودة الصور المحفوظة بتنسيق jpeg", - "If PNG image is larger than 4MB or any dimension is larger than 4000, downscale and save copy as JPG": "إذا كانت صورة PNG أكبر من 4 ميجابايت أو كان أي بُعد أكبر من 4000 ، قم بتقليل حجم الصورة وحفظها بتنسيق JPG", - "Use original name for output filename during batch process in extras tab": "استخدم الاسم الأصلي لاسم ملف الإخراج أثناء عملية الدُفعات في علامة تبويب الإضافات", - "When using 'Save' button, only save a single selected image": "عند استخدام زر 'حفظ' ، احفظ فقط صورة واحدة محددة", - "Do not add watermark to images": "لا تقم بإضافة العلامة المائية للصور", - "Paths for saving": "مسارات الحفظ", - "Output directory for images; if empty, defaults to three directories below": "مجلد المخرجات للصور ؛ إذا كان فارغا ، يتم تعيينه افتراضيًا إلى المجلدات الثلاثة أدناه", - "Output directory for txt2img images": "مجلد المخرجات لصور نص لصورة", - "Output directory for img2img images": "مجلد المخرجات لصور صورة لصورة", - "Output directory for images from extras tab": "مجلد المخرجات لصور علامة تبويب الإضافات", - "Output directory for grids; if empty, defaults to two directories below": "مجلد المخرجات للإطارات الشبكية ؛ إذا كان فارغا ، يتم تعيينه افتراضيًا إلى المجلدين أدناه", - "Output directory for txt2img grids": "مجلد المخرجات للإطارات الشبكية نص لصورة", - "Output directory for img2img grids": "مجلد المخرجات للإطارات الشبكية صورة لصورة", - "Directory for saving images using the Save button": "مجلد لحفظ الصور باستخدام زر حفظ", - "Saving to a directory": "يتم الحفظ إلى المجلد..", - "Save images to a subdirectory": "حفظ الصور في مجلد فرعي", - "Save grids to a subdirectory": "حفظ الإطارات الشبكية في مجلد فرعي", - "When using 'Save' button, save images to a subdirectory": "عند استخدام زر 'حفظ' ، احفظ الصور في مجلد فرعي", - "Directory name pattern": "نمط اسم المجلد", - "Max prompt words for [prompt_words] pattern": "أقصى عدد لكلمات التوجيه لنمط [كلمات_التوجيه]", - "Upscaling": "الارتقاء", - "Tile size for ESRGAN upscalers. 0 = no tiling.": "حجم التبليط لترقيات ESRGAN, القيمة 0= لا يوجد تبليط.", - "Tile overlap, in pixels for ESRGAN upscalers. Low values = visible seam.": "تداخل المربعات ، بالبكسل لمرقي ESRGAN. القيم المنخفضة = تداخل مرئي.", - "Tile size for all SwinIR.": "حجم التليط لجميع عمليات SwinIR.", - "Tile overlap, in pixels for SwinIR. Low values = visible seam.": "تداخل المربعات بالبكسل لـ SwinIR. القيم المنخفضة = تداخل مرئي.", - "LDSR processing steps. Lower = faster": "خطوات معالجة LDSR. أقل = أسرع", - "Upscaler for img2img": "المرقي لصورة لصورة", - "Upscale latent space image when doing hires. fix": "ترقية صورة الفضاء الكامن عند التعيينات. تصليح", - "Face restoration": "ترميم الوجوه", - "CodeFormer weight parameter; 0 = maximum effect; 1 = minimum effect": "متغيرات وزن CodeFormer ؛ 0 = أقصى تأثير ؛ 1 = الحد الأدنى من التأثير", - "Move face restoration model from VRAM into RAM after processing": "انقل نموذج استعادة الوجوه من VRAM إلى RAM بعد المعالجة", - "System": "نظام", - "VRAM usage polls per second during generation. Set to 0 to disable.": "استطلاعات استخدام VRAM في الثانية أثناء الإنشاء. اضبط على 0 للتعطيل.", - "Always print all generation info to standard output": "قم دائمًا بطباعة جميع معلومات الإنشاء إلى المخرج القياسي", - "Add a second progress bar to the console that shows progress for an entire job.": "أضف شريط تقدم آخر إلى وحدة التحكم يُظهر التدقم الكلي للمهمة.", - "Training": "التدريب", - "Move VAE and CLIP to RAM when training hypernetwork. Saves VRAM.": "تفريغ VAE و CLIP من VRAM عند التدريب", - "Filename word regex": "اسم ملف كلمات regex", - "Filename join string": "سلسلة أحرف دمج أسماء الملفات", - "Number of repeats for a single input image per epoch; used only for displaying epoch number": "عدد التكرارات لصورة إدخال واحدة لكل حقبة ؛ تستخدم فقط لعرض رقم الحقبة", - "Save an csv containing the loss to log directory every N steps, 0 to disable": "حفظ ملف csv يحتوي على الخسارة إلى مجلد السجل كل N خطوات ، 0 للتعطيل", - "Stable Diffusion": "انتشار مستقر", - "Checkpoints to cache in RAM": "التخزين المؤقت للنماذج في RAM", - "Hypernetwork strength": "قوة الشبكة الفائقة", - "Apply color correction to img2img results to match original colors.": "قم بتطبيق تصحيح الألوان على نتائج صورة لصورة لمطابقة الألوان الأصلية.", - "Save a copy of image before applying color correction to img2img results": "احفظ نسخة من الصورة قبل تطبيق تصحيح الألوان على نتائج صورة لصورة", - "With img2img, do exactly the amount of steps the slider specifies (normally you'd do less with less denoising).": "باستخدام صورة لصورة ، قم بالضبط بعدد الخطوات التي يحددها شريط التمرير (عادةً ما سيكون أقل مع تقليل التشويش).", - "Enable quantization in K samplers for sharper and cleaner results. This may change existing seeds. Requires restart to apply.": "تمكين تكميم عينات K للحصول على نتائج أوضح وأنظف. هذا قد يغير البذرة المستخدمة. يتطلب إعادة التشغيل للتطبيق.", - "Emphasis: use (text) to make model pay more attention to text and [text] to make it pay less attention": "التأكيد: استخدم (النص) لجعل النموذج يولي مزيدًا من الاهتمام للنص و استخدم [النص] لجعل النموذج يولي اهتمامًا أقل للنص", - "Use old emphasis implementation. Can be useful to reproduce old seeds.": "استخدم طريقة التأكيد القديمة. يمكن أن يكون مفيدًا لإعادة إنتاج البذور القديمة.", - "Make K-diffusion samplers produce same images in a batch as when making a single image": "اجعل انظمة أخذ عينات الانتشار K تنتج نفس الصور في الدفعات كما هو الحال عند إنشاء صورة واحدة", - "Increase coherency by padding from the last comma within n tokens when using more than 75 tokens": "زيادة التناسق عن طريق المساحة المتروكة من الفاصلة الأخيرة ضمن عدد n من الرموز المميزة عند استخدام أكثر من 75 رمزًا مميزًا", - "Filter NSFW content": "تصفية المحتوى الإباحي", - "Stop At last layers of CLIP model": "توقف عند آخر طبقات نموذج CLIP", - "Interrogate Options": "خيارات الاستجواب", - "Interrogate: keep models in VRAM": "الاستجواب: احتفظ بالنماذج في VRAM", - "Interrogate: use artists from artists.csv": "الاستجواب: استخدم قائمة الفنانين من ملف artists.csv", - "Interrogate: include ranks of model tags matches in results (Has no effect on caption-based interrogators).": "الاستجواب: قم بتضمين رتب علامات النموذج في النتائج (ليس له تأثير على الاستجواب المستند إلى التعليقات).", - "Interrogate: num_beams for BLIP": "الاستجواب: عدد الحزم لـ BLIP", - "Interrogate: minimum description length (excluding artists, etc..)": "الاستجواب: الحد الأدنى لطول الوصف (باستثناء الفنانين ،إلخ..)", - "Interrogate: maximum description length": "الاستجواب: الحد الأقصى لطول الوصف", - "CLIP: maximum number of lines in text file (0 = No limit)": "CLIP: أقصى عدد من الأسطر في الملف النصي (0 = بلا حدود)", - "Interrogate: deepbooru score threshold": "الاستجواب: عتبة درجات deepbooru", - "Interrogate: deepbooru sort alphabetically": "الاستجواب: الترتيب الأبجدي لـ deepbooru", - "use spaces for tags in deepbooru": "استخدام مسافات للعلامات في deepbooru", - "User interface": "واجهة المستخدم", - "Show progressbar": "إظهار شريط التقدم", - "Show image creation progress every N sampling steps. Set 0 to disable.": "إظهار تقدم إنشاء الصورة لكل N خطوة من خطوات أخذ العينات. قم بتعيين 0 للتعطيل.", - "Show previews of all images generated in a batch as a grid": "إظهار معاينة لجميع الصور التي يتم إنشائها في الدفعة كإطار شبكي", - "Show grid in results for web": "إظهار الإطار الشبكي في نتائج الويب", - "Do not show any images in results for web": "لا تظهر أي صور في نتائج الويب", - "Add model hash to generation information": "أضف معلومات الهاش للنموذج إلى معلومات الإنشاء", - "Add model name to generation information": "أضف اسم النموذج إلى معلومات الإنشاء", - "When reading generation parameters from text into UI (from PNG info or pasted text), do not change the selected model/checkpoint.": "عند قراءة متغيرات الإنشاء من النص إلى واجهة المستخدم (من معلومات PNG أو النص الملصق) ، لا تقم بتغيير النموذج", - "Font for image grids that have text": "الخط المستخدم للإطارات الشبكية للصور التي تحتوي على نص", - "Enable full page image viewer": "تفعيل عارض الصور ذو الصفحة الكاملة", - "Show images zoomed in by default in full page image viewer": "إظهار الصور التي تم تكبيرها بشكل افتراضي في عارض الصور ذو الصفحة الكاملة", - "Show generation progress in window title.": "إظهار تقدم الإنشاء في عنوان الشاشة.", - "Quicksettings list": "قائمة الإعدادات السريعة", - "Localization (requires restart)": "الترجمة (يتطلب إعادة التشغيل)", - "ar_AR": "العربية", - "ja_JP": "اليابانية", - "ru_RU": "الروسية", - "Sampler parameters": "متغيرات أنظمة اخذ العينات", - "Hide samplers in user interface (requires restart)": "إخفاء أنظمة أخذ العينات في واجهة المستخدم (يتطلب إعادة التشغيل)", - "eta (noise multiplier) for DDIM": "الوقت المتبقي (مضاعف الضوضاء) لـ DDIM", - "eta (noise multiplier) for ancestral samplers": "الوقت المتبقي (مضاعف الضوضاء) لأنظمة أخذ العينات التي تعتمد على الأجداد", - "img2img DDIM discretize": "تفصل DDIM لصورة لصورة", - "uniform": "التوحيد", - "quad": "رباعية", - "sigma churn": "دفع سيجما", - "sigma tmin": "سيجما tmin", - "sigma noise": "ضجيج سيجما", - "Eta noise seed delta": "الوقت المتوقع لديلتا بذرة الضجيج ", - "Images Browser": "مستعرض الصور", - "Preload images at startup": "تحميل الصور مسبقًا عند بدء التشغيل", - "Number of pictures displayed on each page": "عدد الصور المعروضة في كل صفحة", - "Minimum number of pages per load": "الحد الأدنى لعدد الصفحات لكل تحميل", - "Number of grids in each row": "عدد الإطارات الشبكية لكل صف", - "Request browser notifications": "طلب إشعارات المتصفح", - "Download localization template": "تنزيل نموذج الترجمة", - "Reload custom script bodies (No ui updates, No restart)": "إعادة تحميل السكريبتات المخصصة (لا توجد تحديثات لواجهة المستخدم ، لا إعادة تشغيل)", - "Restart Gradio and Refresh components (Custom Scripts, ui.py, js and css only)": "أعادة تشغيل Gradio و تحديث مكونات واجهة الاستخدام (السكريبتات و ui.py و js و css فقط)", - "Prompt (press Ctrl+Enter or Alt+Enter to generate)": "الموجه (اضغط على Ctrl + Enter أو Alt + Enter للإنشاء)", - "Negative prompt (press Ctrl+Enter or Alt+Enter to generate)": "الموجه السلبي (اضغط على Ctrl + Enter أو Alt + Enter للإنشاء)", - "Add a random artist to the prompt.": "أضف فنانًا عشوائيًا إلى الموجه.", - "Read generation parameters from prompt or last generation if prompt is empty into user interface.": "قراءة متغيرات الإنشاء من الموجه أو الإنشاء الأخير إذا كان الموجه فارغا في واجهة المستخدم.", - "Save style": "حفظ النمط", - "Apply selected styles to current prompt": "تطبيق الأنماط المحددة للموجه الحالي", - "Stop processing current image and continue processing.": "توقف عن معالجة الصورة الحالية واستمر في المعالجة.", - "Stop processing images and return any results accumulated so far.": "توقف عن معالجة الصور وقم بإرجاع أي نتائج متراكمة حتى الآن.", - "Style to apply; styles have components for both positive and negative prompts and apply to both": "النمط المطلوب تطبيقه ؛ الأنماط لها مكونات لكل من الموجهات الإيجابية والسلبية وتنطبق على كليهما", - "Do not do anything special": "لا تفعل أي شيء خاص", - "Which algorithm to use to produce the image": "الخوارزمية التي يجب استخدامها لإنتاج الصورة", - "Euler Ancestral - very creative, each can get a completely different picture depending on step count, setting steps to higher than 30-40 does not help": "Euler Ancestral - مبدع جدًا ، يمكن لكل منها الحصول على صورة مختلفة تمامًا اعتمادًا على عدد الخطوات ، تعيين الخطوات على أعلى من 30-40 لا يعطي نتيجة مفيدة", - "Denoising Diffusion Implicit Models - best at inpainting": "نماذج تقليل التشويش الضمني - أفضل اسخدام في الرسم الجزئي", - "Produce an image that can be tiled.": "أنتج صورة يمكن تبليطها.", - "Use a two step process to partially create an image at smaller resolution, upscale, and then improve details in it without changing composition": "استخدم عملية من خطوتين لإنشاء صورة جزئيًا بدقة أقل ثم ترقيتها و تحسين تفاصيلها دون تغيير التكوين", - "Determines how little respect the algorithm should have for image's content. At 0, nothing will change, and at 1 you'll get an unrelated image. With values below 1.0, processing will take less steps than the Sampling Steps slider specifies.": "يحدد مدى ضآلة احترام الخوارزمية لمحتوى الصورة. عند 0 ، لن يتغير شيء ، وعند 1 ستحصل على صورة لا صلة لها بالصورة الأصلية. مع وجود قيم أقل من 1.0 ، المعالجة ستأخذ خطوات أقل مما يحدده شريط تمرير خطوات المعالجة.", - "How many batches of images to create": "كم عدد دفعات الصور التي يتم إنشائها", - "How many image to create in a single batch": "كم صورة يتم إنشائها دفعة واحدة", - "Classifier Free Guidance Scale - how strongly the image should conform to prompt - lower values produce more creative results": "مقياس التوجيه الحر للمصنف - إلى أي مدى يجب أن تتوافق الصورة مع الموجه - القيم المنخفضة تنتج نتائج أكثر إبداعًا", - "A value that determines the output of random number generator - if you create an image with same parameters and seed as another image, you'll get the same result": "القيمة التي تحدد ناتج منشئ الأرقام العشوائية - إذا قمت بإنشاء صورة بنفس المتغيرات و بذرة الصورة ، فستحصل على نفس النتيجة", - "Set seed to -1, which will cause a new random number to be used every time": "عيّن البذرة إلى -1 ، مما سيؤدي إلى استخدام رقم عشوائي جديد في كل مرة", - "Reuse seed from last generation, mostly useful if it was randomed": "إعادة استخدام البذرة من الإنشاء الأخير ، وتكون مفيدة في الغالب إذا كانت عشوائية", - "Seed of a different picture to be mixed into the generation.": "استخدام بذرة من صورة مختلفة ليتم مزجها في الإنشاء.", - "How strong of a variation to produce. At 0, there will be no effect. At 1, you will get the complete picture with variation seed (except for ancestral samplers, where you will just get something).": "ما مدى قوة التباين عند الإنشاء. 0 ، لن يكون هناك أي تأثير. 1 ، ستحصل على الصورة الكاملة ببذور التباين (باستثناء أنظمة عينات الأسلاف ، حيث ستحصل على شيء ما فقط).", - "Make an attempt to produce a picture similar to what would have been produced with same seed at specified resolution": "قم بمحاولة لإنتاج صورة مشابهة لما تم إنتاجه بنفس البذرة بناءا على دقة محددة", - "Separate values for X axis using commas.": "افصل بين قيم المحور X باستخدام الفواصل.", - "Separate values for Y axis using commas.": "افصل بين قيم المحور Y باستخدام الفواصل.", - "Write image to a directory (default - log/images) and generation parameters into csv file.": "اكتب الصورة إلى مجلد (الافتراضي - log/images) وتوليد المتغيرات في ملف csv.", - "Open images output directory": "افتح مجلد مخرجات الصور", - "How much to blur the mask before processing, in pixels.": "كم يتم تضبيب القناع قبل المعالجة ، بالبكسل.", - "What to put inside the masked area before processing it with Stable Diffusion.": "ما يجب وضعه داخل المنطقة المقنعة قبل معالجتها باستخدام الانتشار المستقر.", - "fill it with colors of the image": "املأها بألوان الصورة", - "keep whatever was there originally": "احتفظ بكل ما كان هناك في الأصل", - "fill it with latent space noise": "املأه بضوضاء الفضاء الكامنة", - "fill it with latent space zeroes": "املأه بأصفار الفضاء الكامنة", - "Upscale masked region to target resolution, do inpainting, downscale back and paste into original image": "قم بترقية المنطقة المقنعة إلى الدقة المستهدفة و الرسم الجزئي ثم تقليص الحجم واللصق في الصورة الأصلية", - "Resize image to target resolution. Unless height and width match, you will get incorrect aspect ratio.": "تغيير حجم الصورة إلى الدقة المستهدفة. ما لم يتطابق الطول والعرض ، ستحصل على نسبة عرض إلى ارتفاع غير صحيحة.", - "Resize the image so that entirety of target resolution is filled with the image. Crop parts that stick out.": "قم بتغيير حجم الصورة بحيث يتم ملء الدقة المستهدفة بالكامل بالصورة. يتم قطع المناطق التي تبرز.", - "Resize the image so that entirety of image is inside target resolution. Fill empty space with image's colors.": "قم بتغيير حجم الصورة بحيث تكون الصورة بأكملها داخل الدقة المستهدفة. املأ المساحة الفارغة بألوان الصورة.", - "How many times to repeat processing an image and using it as input for the next iteration": "كم مرة يتم تكرار معالجة صورة واستخدامها كمدخل للتكرار التالي", - "In loopback mode, on each loop the denoising strength is multiplied by this value. <1 means decreasing variety so your sequence will converge on a fixed picture. >1 means increasing variety so your sequence will become more and more chaotic.": "في وضع حلقة الاسترجاع ، يتم ضرب قوة تقليل الضوضاء بهذه القيمة في كل حلقة. يعني <1 تقليل التنوع بحيث يتقارب التسلسل الخاص بك على صورة ثابتة. > 1 يعني زيادة التنوع بحيث يصبح تسلسلك أكثر وأكثر فوضوية.", - "For SD upscale, how much overlap in pixels should there be between tiles. Tiles overlap so that when they are merged back into one picture, there is no clearly visible seam.": "الترقية باستخدام الانتشار المستقر ، كم يجب أن يكون مقدار التداخل بالبكسل بين المربعات. تتداخل المربعات بحيث لا يكون هناك خط واضح للعيان عند دمجها مرة أخرى في صورة واحدة.", - "A directory on the same machine where the server is running.": "مجلد على نفس الجهاز حيث يتم تشغيل الخادم.", - "Leave blank to save images to the default path.": "اتركه فارغًا لحفظ الصور في المسار الافتراضي.", - "Input images directory": "مجلد الصور المدخلة", - "Result = A * (1 - M) + B * M": "النتيجة = A * (1 - M) + B * M", - "Result = A + (B - C) * M": "النتيجة = A + (B - C) * M", - "1st and last digit must be 1. ex:'1, 2, 1'": "يجب أن يكون الرقم الأول والأخير 1. على سبيل المثال: '1 ، 2 ، 1'", - "Path to directory with input images": "المسار إلى مجلد الصور المدخلة", - "Path to directory where to write outputs": "المسار إلى مجلد كتابة النتائج", - "Use following tags to define how filenames for images are chosen: [steps], [cfg], [prompt], [prompt_no_styles], [prompt_spaces], [width], [height], [styles], [sampler], [seed], [model_hash], [prompt_words], [date], [datetime], [job_timestamp]; leave empty for default.": "استخدم العلامات التالية لتعريف كيفية اختيار أسماء الملفات للصور: [steps], [cfg], [prompt], [prompt_no_styles], [prompt_spaces], [width], [height], [styles], [sampler], [seed], [model_hash], [prompt_words], [date], [datetime], [job_timestamp] ؛ اتركه فارغا للوضع الافتراضي.", - "If this option is enabled, watermark will not be added to created images. Warning: if you do not add watermark, you may be behaving in an unethical manner.": "إذا تم تمكين هذا الخيار ، فلن تتم إضافة العلامة المائية إلى الصور التي تم إنشاؤها. تحذير: إذا لم تقم بإضافة علامة مائية ، فقد تكون تتصرف بطريقة غير أخلاقية.", - "Use following tags to define how subdirectories for images and grids are chosen: [steps], [cfg], [prompt], [prompt_no_styles], [prompt_spaces], [width], [height], [styles], [sampler], [seed], [model_hash], [prompt_words], [date], [datetime], [job_timestamp]; leave empty for default.": "استخدم العلامات التالية لتحديد كيفية اختيار المجادت الفرعية للصور و الإطارات الشبكية : [steps], [cfg], [prompt], [prompt_no_styles], [prompt_spaces], [width], [height], [styles], [sampler], [seed], [model_hash], [prompt_words], [date], [datetime], [job_timestamp] ؛ اتركه فارغا للوضع الافتراضي.", - "Restore low quality faces using GFPGAN neural network": "ترميم الوجوه منخفضة الجودة باستخدام الشبكة العصبية GFPGAN ", - "This regular expression will be used extract words from filename, and they will be joined using the option below into label text used for training. Leave empty to keep filename text as it is.": "سيتم استخدام هذا التعبير العادي لاستخراج الكلمات من اسم الملف ، وسيتم ضمها باستخدام الخيار أدناه في نص التسمية المستخدم للتدريب. اتركه فارغًا للاحتفاظ بنص اسم الملف كما هو.", - "This string will be used to join split words into a single line if the option above is enabled.": "سيتم استخدام هذا النص لضم الكلمات المقسمة إلى سطر واحد إذا تم تمكين الخيار أعلاه.", - "List of setting names, separated by commas, for settings that should go to the quick access bar at the top, rather than the usual setting tab. See modules/shared.py for setting names. Requires restarting to apply.": "قائمة أسماء الإعدادات ، مفصولة بفواصل ، للإعدادات التي يجب أن تنتقل إلى شريط الوصول السريع في الأعلى ، بدلاً من علامة تبويب الإعداد المعتادة. انظر modules / shared.py للتعرف على أسماء الإعدادات. يتطلب إعادة التشغيل للتطبيق.", - "If this values is non-zero, it will be added to seed and used to initialize RNG for noises when using samplers with Eta. You can use this to produce even more variation of images, or you can use this to match images of other software if you know what you are doing.": "إذا كانت هذه القيم غير صفرية ، فستتم إضافتها إلى البذرة واستخدامها لتهيئة فوضى الضوضاء عند استخدام أنظمة أخذ العينات باستخدام الوقت المتبقي. يمكنك استخدام ذلك لإنتاج المزيد من التنوعات في الصور ، أو يمكنك استخدامه لمطابقة صور البرامج الأخرى إذا كنت تعرف ما تفعله." +{ + "rtl": true, + "⤡": "⤡", + "⊞": "⊞", + "×": "×", + "❮": "❮", + "❯": "❯", + "Loading...": "جار التحميل...", + "view": "معاينة", + "api": "api", + "•": "•", + "built with gradio": "مبني باستخدام Gradio", + "Stable Diffusion checkpoint": "نماذج الانتشار المستقر", + "txt2img": "نص لصورة", + "img2img": "صورة لصورة", + "Extras": "الإضافات", + "PNG Info": "معلومات PNG", + "Checkpoint Merger": "دمج النماذج", + "Train": "التدريب", + "Create aesthetic embedding": "Create aesthetic embedding", + "Image Browser": "مستعرض الصور", + "Settings": "الإعدادات", + "Prompt": "الموجه", + "Negative prompt": "الموجه السلبي", + "Run": "تشغيل", + "Skip": "تخطي", + "Interrupt": "إيقاف", + "Generate": "إنشاء", + "Style 1": "نمط 1", + "Style 2": "نمط 2", + "Label": "الوسم", + "File": "ملف", + "Drop File Here": "اسحب الملف هنا", + "-": "-", + "or": "أو", + "Click to Upload": "انقر للتحميل", + "Image": "صورة", + "Check progress": "تحقق من التقدم", + "Check progress (first)": "تحقق من التقدم (الأول)", + "Sampling Steps": "خطوات أخذ العينة", + "Sampling method": "نظام أخذ العينات", + "Euler a": "Euler a", + "Euler": "Euler", + "LMS": "LMS", + "Heun": "Heun", + "DPM2": "DPM2", + "DPM2 a": "DPM2 a", + "DPM fast": "DPM fast", + "DPM adaptive": "DPM adaptive", + "LMS Karras": "LMS Karras", + "DPM2 Karras": "DPM2 Karras", + "DPM2 a Karras": "DPM2 a Karras", + "DDIM": "DDIM", + "PLMS": "PLMS", + "Width": "العرض", + "Height": "الارتفاع", + "Restore faces": "ترميم الوجوه", + "Tiling": "تبليط", + "Highres. fix": "إصلاح الصور عالية الدقة", + "Firstpass width": "عرض المرور الأول", + "Firstpass height": "ارتفاع المرور الأول", + "Denoising strength": "قوة تقليل الضوضاء", + "Batch count": "عدد الدُفعات", + "Batch size": "حجم الدفعة", + "CFG Scale": "مقياس التقارب من الموجه (CFG)", + "Seed": "البذرة", + "Extra": "إضافي", + "Variation seed": "تباين البذرة", + "Variation strength": "قوة التباين", + "Resize seed from width": "تغيير حجم البذرة من العرض", + "Resize seed from height": "تغيير حجم البذرة من الارتفاع", + "Open for Clip Aesthetic!": "Open for Clip Aesthetic!", + "▼": "▼", + "Aesthetic weight": "Aesthetic weight", + "Aesthetic steps": "Aesthetic steps", + "Aesthetic learning rate": "Aesthetic learning rate", + "Slerp interpolation": "Slerp interpolation", + "Aesthetic imgs embedding": "Aesthetic imgs embedding", + "None": "لايوجد", + "Aesthetic text for imgs": "Aesthetic text for imgs", + "Slerp angle": "Slerp angle", + "Is negative text": "Is negative text", + "Script": "سكريبت", + "Prompt matrix": "مصفوفة الموجهات", + "Prompts from file or textbox": "موجهات من ملف أو مربع النص", + "X/Y plot": "الرسم البياني X/Y", + "Put variable parts at start of prompt": "ضع الأجزاء المتغيرة في بداية الموجه", + "Show Textbox": "إظهار مربع النص", + "File with inputs": "ملف يحتوي المدخلات", + "Prompts": "الموجهات", + "X type": "نوع X", + "Nothing": "لا شئ", + "Var. seed": "تغير البذرة", + "Var. strength": "قوة التغيير", + "Steps": "الخطوات", + "Prompt S/R": "موجه S / R", + "Prompt order": "ترتيب الموجهات", + "Sampler": "نظام أخذ العينات", + "Checkpoint name": "اسم النموذج", + "Hypernetwork": "الشبكة الفائقة", + "Hypernet str.": "قوة الشبكة الفائقة", + "Sigma Churn": "دفع سيجما", + "Sigma min": "أصغر سيجما", + "Sigma max": "أكبر سيجما", + "Sigma noise": "ضجة سيجما", + "Eta": "الوقت المتوقع", + "Clip skip": "تخطي Clip", + "Denoising": "تقليل الضوضاء", + "X values": "قيم X", + "Y type": "نوع Y", + "Y values": "قيم Y", + "Draw legend": "ارسم مفتاح التوضيح", + "Include Separate Images": "قم بتضمين الصور منفصلة", + "Keep -1 for seeds": "احتفظ بـقيمة -1 للبذور", + "Drop Image Here": "إسقاط الصورة هنا", + "Save": "حفظ", + "Send to img2img": "أرسل إلى صورة لصورة", + "Send to inpaint": "أرسل إلى إعادة الرسم الجزئي", + "Send to extras": "أرسل إلى الإضافات", + "Make Zip when Save?": "إنشاء ملف مضغوط عند الحفظ؟", + "Textbox": "مربع النص", + "Interrogate\nCLIP": "استجواب\n CLIP", + "Inpaint": "إعادة الرسم الجزئي", + "Batch img2img": "دفعات صورة لصورة", + "Image for img2img": "صورة (صورة لصورة)", + "Image for inpainting with mask": "صورة (إعادة الرسم الجزئي)", + "Mask": "القناع", + "Mask blur": "ضبابية القناع", + "Mask mode": "أسلوب القناع", + "Draw mask": "رسم القناع", + "Upload mask": "تحميل القناع", + "Masking mode": "أسلوب التقنيع", + "Inpaint masked": "إعادة الرسم الجزئي (المنطقة المقنعة)", + "Inpaint not masked": "إعادة الرسم الجزئي (المنطقة الغير مقنعة)", + "Masked content": "المحتوى المقنع", + "fill": "الملأ", + "original": "الأصلي", + "latent noise": "الضوضاء الكامنة", + "latent nothing": "لا شيء كامن", + "Inpaint at full resolution": "إعادة الرسم الجزئي بدقة كاملة", + "Inpaint at full resolution padding, pixels": "إعادة الرسم الجزئي بدقة كاملة, الحشو, بيكسل", + "Process images in a directory on the same machine where the server is running.": "معالجة الصور في المجلد على نفس الجهاز حيث يتم تشغيل الخادم.", + "Use an empty output directory to save pictures normally instead of writing to the output directory.": "استخدم مجلد إخراج فارغ لحفظ الصور بشكل طبيعي بدلاً من الكتابة إلى مجلد المخرجات.", + "Input directory": "مجلد المدخلات", + "Output directory": "مجلد المخرجات", + "Resize mode": "وضعية تغيير الحجم", + "Just resize": "تغييير الحجم فقط", + "Crop and resize": "اقتصاص وتغيير الحجم", + "Resize and fill": "تغيير الحجم والتعبئة", + "img2img alternative test": "صورة لصورة البديلة", + "Loopback": "الحلقة الراجعة", + "Outpainting mk2": "الرسم الخارجي نسخة 2", + "Poor man's outpainting": "الرسم الخارجي للفقراء", + "SD upscale": "ترقية الانتشار المستقر", + "should be 2 or lower.": "should be 2 or lower.", + "Override `Sampling method` to Euler?(this method is built for it)": "Override `Sampling method` to Euler?(this method is built for it)", + "Override `prompt` to the same value as `original prompt`?(and `negative prompt`)": "Override `prompt` to the same value as `original prompt`?(and `negative prompt`)", + "Original prompt": "Original prompt", + "Original negative prompt": "Original negative prompt", + "Override `Sampling Steps` to the same value as `Decode steps`?": "Override `Sampling Steps` to the same value as `Decode steps`?", + "Decode steps": "Decode steps", + "Override `Denoising strength` to 1?": "Override `Denoising strength` to 1?", + "Decode CFG scale": "Decode CFG scale", + "Randomness": "Randomness", + "Sigma adjustment for finding noise for image": "Sigma adjustment for finding noise for image", + "Loops": "Loops", + "Denoising strength change factor": "معامل قوة تقليل الضوضاء", + "Recommended settings: Sampling Steps: 80-100, Sampler: Euler a, Denoising strength: 0.8": "الإعدادات الموصى بها: خطوات أخذ العينات: 80-100 ، طريقة أخذ العينات: Euler a ، تقليل الضوضاء: 0.8", + "Pixels to expand": "عدد البكسل للتوسيع", + "Outpainting direction": "إتجاه الرسم الخارجي", + "left": "يسار", + "right": "يمين", + "up": "فوق", + "down": "تحت", + "Fall-off exponent (lower=higher detail)": "أس التناقص (الأدنى = تفاصيل أعلى)", + "Color variation": "اختلاف اللون", + "Will upscale the image to twice the dimensions; use width and height sliders to set tile size": "سيقوم بترقية الصورة إلى ضعف الأبعاد ؛ استخدم شريط تمرير العرض والارتفاع لضبط حجم التبليط", + "Tile overlap": "تداخل التبليط", + "Upscaler": "المرقي", + "Lanczos": "Lanczos", + "Single Image": "صورة واحدة", + "Batch Process": "معالجة الدفعات", + "Batch from Directory": "دفعة من المجلد", + "Source": "مصدر", + "Show result images": "إظهار نتائج الصور ", + "Scale by": "رفع الحجم بمقدار", + "Scale to": "رفع الحجم إلى", + "Resize": "تغيير الحجم", + "Crop to fit": "اقتصاص للتوافق", + "Upscaler 2 visibility": "إظهار المرقي 2", + "GFPGAN visibility": "إظهار GFPGAN", + "CodeFormer visibility": "إظهار CodeFormer", + "CodeFormer weight (0 = maximum effect, 1 = minimum effect)": "وزن CodeFormer (0 = أقصى تأثير ، 1 = تأثير أدنى)", + "Open output directory": "افتح مجلد المخرجات", + "Send to txt2img": "أرسل إلى كتابة لصورة", + "A merger of the two checkpoints will be generated in your": "سيتم إنشاء نموذجمدمج من النموذجين في", + "checkpoint": "النموذج", + "directory.": "المجلد.", + "Primary model (A)": "النموذج الأساسي (أ)", + "Secondary model (B)": "النموذج الثانوي (ب)", + "Tertiary model (C)": "النموذج الثالث (ج)", + "Custom Name (Optional)": "اسم مخصص (اختياري)", + "Multiplier (M) - set to 0 to get model A": "المضاعف (M) - اضبط على 0 للحصول على النموذج أ", + "Interpolation Method": "طريقة الاستنباط", + "Weighted sum": "المجموع الموزون", + "Add difference": "أضافة الاختلاف", + "Save as float16": "حفظ float16", + "See": "شاهد", + "wiki": "ويكي", + "for detailed explanation.": "للحصول على شرح مفصل.", + "Create embedding": "إنشاء التضمين", + "Create hypernetwork": "إنشاء شبكة فائقة", + "Preprocess images": "تجهيز الصور", + "Name": "الاسم", + "Initialization text": "نص التهيئة", + "Number of vectors per token": "عدد المتجهات لكل رمز", + "Overwrite Old Embedding": "الكتابة فوق التضمين القديم", + "Modules": "الوحدات", + "Enter hypernetwork layer structure": "أدخل بنية طبقة الشبكة الفائقة", + "Select activation function of hypernetwork": "حدد وظيفة تنشيط الشبكة الفائقة", + "linear": "خطي (Linear)", + "relu": "الوحدة الخطية المعدلة (Relu)", + "leakyrelu": "الوحدة الخطية المعدلة المسربة (Leakyrelu)", + "elu": "الوحدة الأسية الخطية (Elu)", + "swish": "Swish", + "Add layer normalization": "أضف طبقة التسوية", + "Use dropout": "استخدم الهبوط", + "Overwrite Old Hypernetwork": "الكتابة فوق الشبكة الفائقة القديمة", + "Source directory": "مجلد المصدر", + "Destination directory": "مجلد النتائج", + "Existing Caption txt Action": "الإجراء النصي للتعليق المتوفر", + "ignore": "تجاهل", + "copy": "نسخ", + "prepend": "أضف قبل", + "append": "ألحق", + "Create flipped copies": "قم بإنشاء نسخ مقلوبة", + "Split oversized images": "تقسيم الصور كبيرة الحجم", + "Use BLIP for caption": "استخدم BLIP للتعليق", + "Use deepbooru for caption": "استخدم deepbooru للتعليق", + "Split image threshold": "حد تقسيم الصورة", + "Split image overlap ratio": "نسبة تداخل الصورة المنقسمة", + "Preprocess": "تجهيز الصور", + "Train an embedding or Hypernetwork; you must specify a directory with a set of 1:1 ratio images": "تدريب التضمين أو الشبكة الفائقة ؛ يجب تحديد مجلد بمجموعة من الصور بنسبة أبعاد 1: 1", + "[wiki]": "[ويكي]", + "Embedding": "التضمين", + "Embedding Learning rate": "معدل تعلم التضمين", + "Hypernetwork Learning rate": "معدل تعلم الشبكة الفائقة", + "Dataset directory": "مجلد مجموعة البيانات", + "Log directory": "مجلد السجل", + "Prompt template file": "ملف قالب الموجهات", + "Max steps": "الخطوات القصوى", + "Save an image to log directory every N steps, 0 to disable": "حفظ صورة في مجلد السجل كل N خطوات ، 0 للتعطيل", + "Save a copy of embedding to log directory every N steps, 0 to disable": "حفظ نسخة من التضمين في مجلد السجل كل N خطوات ، 0 للتعطيل", + "Save images with embedding in PNG chunks": "حفظ التضمين مع الصور في أجزاء PNG", + "Read parameters (prompt, etc...) from txt2img tab when making previews": "قراءة المتغيرات (الموجه ، إلخ ...) من علامة تبويب نص لصورة عند إجراء المعاينات", + "Train Hypernetwork": "تدريب الشبكة الفائقة", + "Train Embedding": "تدريب التضمين", + "Create an aesthetic embedding out of any number of images": "Create an aesthetic embedding out of any number of images", + "Create images embedding": "Create images embedding", + "extras": "إضافات", + "favorites": "المفضلة", + "custom fold": "custom fold", + "Load": "تحميل", + "Images directory": "مجلد الصور", + "Prev batch": "الدفعة السابقة", + "Next batch": "الدفعة التالية", + "First Page": "الصفحة الأولى", + "Prev Page": "الصفحة السابقة", + "Page Index": "فهرس الصفحات", + "Next Page": "الصفحة التالية", + "End Page": "صفحة النهاية", + "number of images to delete consecutively next": "عدد الصور المطلوب حذفها على التوالي بعد ذلك", + "Delete": "حذف", + "Generate Info": "معلومات الإنشاء", + "File Name": "اسم الملف", + "Collect": "جمع", + "Refresh page": "إعادة تحميل الصفحة", + "Date to": "التاريخ إلى", + "Number": "الرقم", + "set_index": "وضع الفهرس", + "Checkbox": "صندوق اختيار", + "Apply settings": "تطبيق الإعدادات", + "Saving images/grids": "حفظ الصور / الإطار الشبكي", + "Always save all generated images": "احفظ دائمًا جميع الصور التي تم إنشائها", + "File format for images": "تنسيق ملفات الصور", + "Images filename pattern": "نمط اسم ملفات الصور", + "Add number to filename when saving": "Add number to filename when saving", + "Always save all generated image grids": "احفظ دائمًا جميع الإطارات الشبكية للصور التي تم إنشاؤها", + "File format for grids": "تنسيق ملفات الإطارات الشبكية", + "Add extended info (seed, prompt) to filename when saving grid": "أضف معلومات إضافية (البذرة ، الموجه) إلى اسم الملف عند حفظ الإطار الشبكي", + "Do not save grids consisting of one picture": "لا تحفظ الإطارات الشبكية التي تتكون من صورة واحدة", + "Prevent empty spots in grid (when set to autodetect)": "منع المناطق الفارغة في الإطار الشبكي (عند الضبط على الاكتشاف التلقائي)", + "Grid row count; use -1 for autodetect and 0 for it to be same as batch size": "عدد صفوف الإطار الشبكي استخدم -1 للاكتشاف التلقائي و 0 ليكون نفس حجم الدُفعة", + "Save text information about generation parameters as chunks to png files": "احفظ معلومات نصية حول متغيرات الإنشاء كمقاطع في ملفات png", + "Create a text file next to every image with generation parameters.": "قم بإنشاء ملف نصي بجوار كل صورة باستخدام متغيرات الإنشاء.", + "Save a copy of image before doing face restoration.": "احفظ نسخة من الصورة قبل القيام بترميم الوجوه.", + "Quality for saved jpeg images": "جودة الصور المحفوظة بتنسيق jpeg", + "If PNG image is larger than 4MB or any dimension is larger than 4000, downscale and save copy as JPG": "إذا كانت صورة PNG أكبر من 4 ميجابايت أو كان أي بُعد أكبر من 4000 ، قم بتقليل حجم الصورة وحفظها بتنسيق JPG", + "Use original name for output filename during batch process in extras tab": "استخدم الاسم الأصلي لاسم ملف الإخراج أثناء عملية الدُفعات في علامة تبويب الإضافات", + "When using 'Save' button, only save a single selected image": "عند استخدام زر 'حفظ' ، احفظ فقط صورة واحدة محددة", + "Do not add watermark to images": "لا تقم بإضافة العلامة المائية للصور", + "Paths for saving": "مسارات الحفظ", + "Output directory for images; if empty, defaults to three directories below": "مجلد المخرجات للصور ؛ إذا كان فارغا ، يتم تعيينه افتراضيًا إلى المجلدات الثلاثة أدناه", + "Output directory for txt2img images": "مجلد المخرجات لصور نص لصورة", + "Output directory for img2img images": "مجلد المخرجات لصور صورة لصورة", + "Output directory for images from extras tab": "مجلد المخرجات لصور علامة تبويب الإضافات", + "Output directory for grids; if empty, defaults to two directories below": "مجلد المخرجات للإطارات الشبكية ؛ إذا كان فارغا ، يتم تعيينه افتراضيًا إلى المجلدين أدناه", + "Output directory for txt2img grids": "مجلد المخرجات للإطارات الشبكية نص لصورة", + "Output directory for img2img grids": "مجلد المخرجات للإطارات الشبكية صورة لصورة", + "Directory for saving images using the Save button": "مجلد لحفظ الصور باستخدام زر حفظ", + "Saving to a directory": "يتم الحفظ إلى المجلد..", + "Save images to a subdirectory": "حفظ الصور في مجلد فرعي", + "Save grids to a subdirectory": "حفظ الإطارات الشبكية في مجلد فرعي", + "When using \"Save\" button, save images to a subdirectory": "احفظ الصور في مجلد فرعي عند الضغط على زر الحفظ", + "Directory name pattern": "نمط اسم المجلد", + "Max prompt words for [prompt_words] pattern": "أقصى عدد لكلمات التوجيه لنمط [كلمات_التوجيه]", + "Upscaling": "الارتقاء", + "Tile size for ESRGAN upscalers. 0 = no tiling.": "حجم التبليط لترقيات ESRGAN, القيمة 0= لا يوجد تبليط.", + "Tile overlap, in pixels for ESRGAN upscalers. Low values = visible seam.": "تداخل المربعات ، بالبكسل لمرقي ESRGAN. القيم المنخفضة = تداخل مرئي.", + "Tile size for all SwinIR.": "حجم التليط لجميع عمليات SwinIR.", + "Tile overlap, in pixels for SwinIR. Low values = visible seam.": "تداخل المربعات بالبكسل لـ SwinIR. القيم المنخفضة = تداخل مرئي.", + "LDSR processing steps. Lower = faster": "خطوات معالجة LDSR. أقل = أسرع", + "Upscaler for img2img": "المرقي لصورة لصورة", + "Upscale latent space image when doing hires. fix": "ترقية صورة الفضاء الكامن عند التعيينات. تصليح", + "Face restoration": "ترميم الوجوه", + "CodeFormer weight parameter; 0 = maximum effect; 1 = minimum effect": "متغيرات وزن CodeFormer ؛ 0 = أقصى تأثير ؛ 1 = الحد الأدنى من التأثير", + "Move face restoration model from VRAM into RAM after processing": "انقل نموذج استعادة الوجوه من VRAM إلى RAM بعد المعالجة", + "System": "نظام", + "VRAM usage polls per second during generation. Set to 0 to disable.": "استطلاعات استخدام VRAM في الثانية أثناء الإنشاء. اضبط على 0 للتعطيل.", + "Always print all generation info to standard output": "قم دائمًا بطباعة جميع معلومات الإنشاء إلى المخرج القياسي", + "Add a second progress bar to the console that shows progress for an entire job.": "أضف شريط تقدم آخر إلى وحدة التحكم يُظهر التدقم الكلي للمهمة.", + "Training": "التدريب", + "Move VAE and CLIP to RAM when training hypernetwork. Saves VRAM.": "تفريغ VAE و CLIP من VRAM عند التدريب", + "Filename word regex": "اسم ملف كلمات regex", + "Filename join string": "سلسلة أحرف دمج أسماء الملفات", + "Number of repeats for a single input image per epoch; used only for displaying epoch number": "عدد التكرارات لصورة إدخال واحدة لكل حقبة ؛ تستخدم فقط لعرض رقم الحقبة", + "Save an csv containing the loss to log directory every N steps, 0 to disable": "حفظ ملف csv يحتوي على الخسارة إلى مجلد السجل كل N خطوات ، 0 للتعطيل", + "Stable Diffusion": "انتشار مستقر", + "Checkpoints to cache in RAM": "التخزين المؤقت للنماذج في RAM", + "Hypernetwork strength": "قوة الشبكة الفائقة", + "Apply color correction to img2img results to match original colors.": "قم بتطبيق تصحيح الألوان على نتائج صورة لصورة لمطابقة الألوان الأصلية.", + "Save a copy of image before applying color correction to img2img results": "احفظ نسخة من الصورة قبل تطبيق تصحيح الألوان على نتائج صورة لصورة", + "With img2img, do exactly the amount of steps the slider specifies (normally you'd do less with less denoising).": "باستخدام صورة لصورة ، قم بالضبط بعدد الخطوات التي يحددها شريط التمرير (عادةً ما سيكون أقل مع تقليل التشويش).", + "Enable quantization in K samplers for sharper and cleaner results. This may change existing seeds. Requires restart to apply.": "تمكين تكميم عينات K للحصول على نتائج أوضح وأنظف. هذا قد يغير البذرة المستخدمة. يتطلب إعادة التشغيل للتطبيق.", + "Emphasis: use (text) to make model pay more attention to text and [text] to make it pay less attention": "التأكيد: استخدم (النص) لجعل النموذج يولي مزيدًا من الاهتمام للنص و استخدم [النص] لجعل النموذج يولي اهتمامًا أقل للنص", + "Use old emphasis implementation. Can be useful to reproduce old seeds.": "استخدم طريقة التأكيد القديمة. يمكن أن يكون مفيدًا لإعادة إنتاج البذور القديمة.", + "Make K-diffusion samplers produce same images in a batch as when making a single image": "اجعل انظمة أخذ عينات الانتشار K تنتج نفس الصور في الدفعات كما هو الحال عند إنشاء صورة واحدة", + "Increase coherency by padding from the last comma within n tokens when using more than 75 tokens": "زيادة التناسق عن طريق المساحة المتروكة من الفاصلة الأخيرة ضمن عدد n من الرموز المميزة عند استخدام أكثر من 75 رمزًا مميزًا", + "Filter NSFW content": "تصفية المحتوى الإباحي", + "Stop At last layers of CLIP model": "توقف عند آخر طبقات نموذج CLIP", + "Interrogate Options": "خيارات الاستجواب", + "Interrogate: keep models in VRAM": "الاستجواب: احتفظ بالنماذج في VRAM", + "Interrogate: use artists from artists.csv": "الاستجواب: استخدم قائمة الفنانين من ملف artists.csv", + "Interrogate: include ranks of model tags matches in results (Has no effect on caption-based interrogators).": "الاستجواب: قم بتضمين رتب علامات النموذج في النتائج (ليس له تأثير على الاستجواب المستند إلى التعليقات).", + "Interrogate: num_beams for BLIP": "الاستجواب: عدد الحزم لـ BLIP", + "Interrogate: minimum description length (excluding artists, etc..)": "الاستجواب: الحد الأدنى لطول الوصف (باستثناء الفنانين ،إلخ..)", + "Interrogate: maximum description length": "الاستجواب: الحد الأقصى لطول الوصف", + "CLIP: maximum number of lines in text file (0 = No limit)": "CLIP: أقصى عدد من الأسطر في الملف النصي (0 = بلا حدود)", + "Interrogate: deepbooru score threshold": "الاستجواب: عتبة درجات deepbooru", + "Interrogate: deepbooru sort alphabetically": "الاستجواب: الترتيب الأبجدي لـ deepbooru", + "use spaces for tags in deepbooru": "استخدام مسافات للعلامات في deepbooru", + "escape (\\) brackets in deepbooru (so they are used as literal brackets and not for emphasis)": "تجاهل الأقواس عند استخدام deepbooru (كي لا تعامل كأقواس التشديد)", + "User interface": "واجهة المستخدم", + "Show progressbar": "إظهار شريط التقدم", + "Show image creation progress every N sampling steps. Set 0 to disable.": "إظهار تقدم إنشاء الصورة لكل N خطوة من خطوات أخذ العينات. قم بتعيين 0 للتعطيل.", + "Show previews of all images generated in a batch as a grid": "إظهار معاينة لجميع الصور التي يتم إنشائها في الدفعة كإطار شبكي", + "Show grid in results for web": "إظهار الإطار الشبكي في نتائج الويب", + "Do not show any images in results for web": "لا تظهر أي صور في نتائج الويب", + "Add model hash to generation information": "أضف معلومات الهاش للنموذج إلى معلومات الإنشاء", + "Add model name to generation information": "أضف اسم النموذج إلى معلومات الإنشاء", + "When reading generation parameters from text into UI (from PNG info or pasted text), do not change the selected model/checkpoint.": "عند قراءة متغيرات الإنشاء من النص إلى واجهة المستخدم (من معلومات PNG أو النص الملصق) ، لا تقم بتغيير النموذج", + "Font for image grids that have text": "الخط المستخدم للإطارات الشبكية للصور التي تحتوي على نص", + "Enable full page image viewer": "تفعيل عارض الصور ذو الصفحة الكاملة", + "Show images zoomed in by default in full page image viewer": "إظهار الصور التي تم تكبيرها بشكل افتراضي في عارض الصور ذو الصفحة الكاملة", + "Show generation progress in window title.": "إظهار تقدم الإنشاء في عنوان الشاشة.", + "Quicksettings list": "قائمة الإعدادات السريعة", + "Localization (requires restart)": "الترجمة (يتطلب إعادة التشغيل)", + "Sampler parameters": "متغيرات أنظمة اخذ العينات", + "Hide samplers in user interface (requires restart)": "إخفاء أنظمة أخذ العينات في واجهة المستخدم (يتطلب إعادة التشغيل)", + "eta (noise multiplier) for DDIM": "الوقت المتبقي (مضاعف الضوضاء) لـ DDIM", + "eta (noise multiplier) for ancestral samplers": "الوقت المتبقي (مضاعف الضوضاء) لأنظمة أخذ العينات التي تعتمد على الأجداد", + "img2img DDIM discretize": "تفصل DDIM لصورة لصورة", + "uniform": "التوحيد", + "quad": "رباعية", + "sigma churn": "دفع سيجما", + "sigma tmin": "سيجما tmin", + "sigma noise": "ضجيج سيجما", + "Eta noise seed delta": "الوقت المتوقع لديلتا بذرة الضجيج ", + "Images Browser": "مستعرض الصور", + "Preload images at startup": "تحميل الصور مسبقًا عند بدء التشغيل", + "Number of columns on the page": "Number of columns on the page", + "Number of rows on the page": "Number of rows on the page", + "Minimum number of pages per load": "الحد الأدنى لعدد الصفحات لكل تحميل", + "Request browser notifications": "طلب إشعارات المتصفح", + "Download localization template": "تنزيل نموذج الترجمة", + "Reload custom script bodies (No ui updates, No restart)": "إعادة تحميل السكريبتات المخصصة (لا توجد تحديثات لواجهة المستخدم ، لا إعادة تشغيل)", + "Restart Gradio and Refresh components (Custom Scripts, ui.py, js and css only)": "أعادة تشغيل Gradio و تحديث مكونات واجهة الاستخدام (السكريبتات و ui.py و js و css فقط)", + "Prompt (press Ctrl+Enter or Alt+Enter to generate)": "الموجه (اضغط على Ctrl + Enter أو Alt + Enter للإنشاء)", + "Negative prompt (press Ctrl+Enter or Alt+Enter to generate)": "الموجه السلبي (اضغط على Ctrl + Enter أو Alt + Enter للإنشاء)", + "Add a random artist to the prompt.": "أضف فنانًا عشوائيًا إلى الموجه.", + "Read generation parameters from prompt or last generation if prompt is empty into user interface.": "قراءة متغيرات الإنشاء من الموجه أو الإنشاء الأخير إذا كان الموجه فارغا في واجهة المستخدم.", + "Save style": "حفظ النمط", + "Apply selected styles to current prompt": "تطبيق الأنماط المحددة للموجه الحالي", + "Stop processing current image and continue processing.": "توقف عن معالجة الصورة الحالية واستمر في المعالجة.", + "Stop processing images and return any results accumulated so far.": "توقف عن معالجة الصور وقم بإرجاع أي نتائج متراكمة حتى الآن.", + "Style to apply; styles have components for both positive and negative prompts and apply to both": "النمط المطلوب تطبيقه ؛ الأنماط لها مكونات لكل من الموجهات الإيجابية والسلبية وتنطبق على كليهما", + "Do not do anything special": "لا تفعل أي شيء خاص", + "Which algorithm to use to produce the image": "الخوارزمية التي يجب استخدامها لإنتاج الصورة", + "Euler Ancestral - very creative, each can get a completely different picture depending on step count, setting steps to higher than 30-40 does not help": "Euler Ancestral - مبدع جدًا ، يمكن لكل منها الحصول على صورة مختلفة تمامًا اعتمادًا على عدد الخطوات ، تعيين الخطوات على أعلى من 30-40 لا يعطي نتيجة مفيدة", + "Denoising Diffusion Implicit Models - best at inpainting": "نماذج تقليل التشويش الضمني - أفضل اسخدام في الرسم الجزئي", + "Produce an image that can be tiled.": "أنتج صورة يمكن تبليطها.", + "Use a two step process to partially create an image at smaller resolution, upscale, and then improve details in it without changing composition": "استخدم عملية من خطوتين لإنشاء صورة جزئيًا بدقة أقل ثم ترقيتها و تحسين تفاصيلها دون تغيير التكوين", + "Determines how little respect the algorithm should have for image's content. At 0, nothing will change, and at 1 you'll get an unrelated image. With values below 1.0, processing will take less steps than the Sampling Steps slider specifies.": "يحدد مدى ضآلة احترام الخوارزمية لمحتوى الصورة. عند 0 ، لن يتغير شيء ، وعند 1 ستحصل على صورة لا صلة لها بالصورة الأصلية. مع وجود قيم أقل من 1.0 ، المعالجة ستأخذ خطوات أقل مما يحدده شريط تمرير خطوات المعالجة.", + "How many batches of images to create": "كم عدد دفعات الصور التي يتم إنشائها", + "How many image to create in a single batch": "كم صورة يتم إنشائها دفعة واحدة", + "Classifier Free Guidance Scale - how strongly the image should conform to prompt - lower values produce more creative results": "مقياس التوجيه الحر للمصنف - إلى أي مدى يجب أن تتوافق الصورة مع الموجه - القيم المنخفضة تنتج نتائج أكثر إبداعًا", + "A value that determines the output of random number generator - if you create an image with same parameters and seed as another image, you'll get the same result": "القيمة التي تحدد ناتج منشئ الأرقام العشوائية - إذا قمت بإنشاء صورة بنفس المتغيرات و بذرة الصورة ، فستحصل على نفس النتيجة", + "Set seed to -1, which will cause a new random number to be used every time": "عيّن البذرة إلى -1 ، مما سيؤدي إلى استخدام رقم عشوائي جديد في كل مرة", + "Reuse seed from last generation, mostly useful if it was randomed": "إعادة استخدام البذرة من الإنشاء الأخير ، وتكون مفيدة في الغالب إذا كانت عشوائية", + "Seed of a different picture to be mixed into the generation.": "استخدام بذرة من صورة مختلفة ليتم مزجها في الإنشاء.", + "How strong of a variation to produce. At 0, there will be no effect. At 1, you will get the complete picture with variation seed (except for ancestral samplers, where you will just get something).": "ما مدى قوة التباين عند الإنشاء. 0 ، لن يكون هناك أي تأثير. 1 ، ستحصل على الصورة الكاملة ببذور التباين (باستثناء أنظمة عينات الأسلاف ، حيث ستحصل على شيء ما فقط).", + "Make an attempt to produce a picture similar to what would have been produced with same seed at specified resolution": "قم بمحاولة لإنتاج صورة مشابهة لما تم إنتاجه بنفس البذرة بناءا على دقة محددة", + "This text is used to rotate the feature space of the imgs embs": "This text is used to rotate the feature space of the imgs embs", + "Separate values for X axis using commas.": "افصل بين قيم المحور X باستخدام الفواصل.", + "Separate values for Y axis using commas.": "افصل بين قيم المحور Y باستخدام الفواصل.", + "Write image to a directory (default - log/images) and generation parameters into csv file.": "اكتب الصورة إلى مجلد (الافتراضي - log/images) وتوليد المتغيرات في ملف csv.", + "Open images output directory": "افتح مجلد مخرجات الصور", + "How much to blur the mask before processing, in pixels.": "كم يتم تضبيب القناع قبل المعالجة ، بالبكسل.", + "What to put inside the masked area before processing it with Stable Diffusion.": "ما يجب وضعه داخل المنطقة المقنعة قبل معالجتها باستخدام الانتشار المستقر.", + "fill it with colors of the image": "املأها بألوان الصورة", + "keep whatever was there originally": "احتفظ بكل ما كان هناك في الأصل", + "fill it with latent space noise": "املأه بضوضاء الفضاء الكامنة", + "fill it with latent space zeroes": "املأه بأصفار الفضاء الكامنة", + "Upscale masked region to target resolution, do inpainting, downscale back and paste into original image": "قم بترقية المنطقة المقنعة إلى الدقة المستهدفة و الرسم الجزئي ثم تقليص الحجم واللصق في الصورة الأصلية", + "Resize image to target resolution. Unless height and width match, you will get incorrect aspect ratio.": "تغيير حجم الصورة إلى الدقة المستهدفة. ما لم يتطابق الطول والعرض ، ستحصل على نسبة عرض إلى ارتفاع غير صحيحة.", + "Resize the image so that entirety of target resolution is filled with the image. Crop parts that stick out.": "قم بتغيير حجم الصورة بحيث يتم ملء الدقة المستهدفة بالكامل بالصورة. يتم قطع المناطق التي تبرز.", + "Resize the image so that entirety of image is inside target resolution. Fill empty space with image's colors.": "قم بتغيير حجم الصورة بحيث تكون الصورة بأكملها داخل الدقة المستهدفة. املأ المساحة الفارغة بألوان الصورة.", + "How many times to repeat processing an image and using it as input for the next iteration": "كم مرة يتم تكرار معالجة صورة واستخدامها كمدخل للتكرار التالي", + "In loopback mode, on each loop the denoising strength is multiplied by this value. <1 means decreasing variety so your sequence will converge on a fixed picture. >1 means increasing variety so your sequence will become more and more chaotic.": "في وضع حلقة الاسترجاع ، يتم ضرب قوة تقليل الضوضاء بهذه القيمة في كل حلقة. يعني <1 تقليل التنوع بحيث يتقارب التسلسل الخاص بك على صورة ثابتة. > 1 يعني زيادة التنوع بحيث يصبح تسلسلك أكثر وأكثر فوضوية.", + "For SD upscale, how much overlap in pixels should there be between tiles. Tiles overlap so that when they are merged back into one picture, there is no clearly visible seam.": "الترقية باستخدام الانتشار المستقر ، كم يجب أن يكون مقدار التداخل بالبكسل بين المربعات. تتداخل المربعات بحيث لا يكون هناك خط واضح للعيان عند دمجها مرة أخرى في صورة واحدة.", + "A directory on the same machine where the server is running.": "مجلد على نفس الجهاز حيث يتم تشغيل الخادم.", + "Leave blank to save images to the default path.": "اتركه فارغًا لحفظ الصور في المسار الافتراضي.", + "Result = A * (1 - M) + B * M": "النتيجة = A * (1 - M) + B * M", + "Result = A + (B - C) * M": "النتيجة = A + (B - C) * M", + "1st and last digit must be 1. ex:'1, 2, 1'": "يجب أن يكون الرقم الأول والأخير 1. على سبيل المثال: '1 ، 2 ، 1'", + "Path to directory with input images": "المسار إلى مجلد الصور المدخلة", + "Path to directory where to write outputs": "المسار إلى مجلد كتابة النتائج", + "Input images directory": "مجلد الصور المدخلة", + "Use following tags to define how filenames for images are chosen: [steps], [cfg], [prompt], [prompt_no_styles], [prompt_spaces], [width], [height], [styles], [sampler], [seed], [model_hash], [prompt_words], [date], [datetime], [datetime], [datetime