diff --git a/fooocus_version.py b/fooocus_version.py index f79e964..2e584e3 100644 --- a/fooocus_version.py +++ b/fooocus_version.py @@ -1 +1 @@ -version = '2.1.686' +version = '2.1.687' diff --git a/modules/async_worker.py b/modules/async_worker.py index 0658a97..1e475dd 100644 --- a/modules/async_worker.py +++ b/modules/async_worker.py @@ -26,7 +26,7 @@ def worker(): import modules.advanced_parameters as advanced_parameters import fooocus_extras.ip_adapter as ip_adapter - from modules.sdxl_styles import apply_style, aspect_ratios, fooocus_expansion + from modules.sdxl_styles import apply_style, apply_wildcards, aspect_ratios, fooocus_expansion from modules.private_logger import log from modules.expansion import safe_str from modules.util import join_prompts, remove_empty_str, HWC3, resize_image, image_is_generated_in_current_ui, make_sure_that_image_is_not_too_large @@ -227,44 +227,50 @@ def worker(): pipeline.refresh_everything(refiner_model_name=refiner_model_name, base_model_name=base_model_name, loras=loras) progressbar(3, 'Processing prompts ...') - positive_basic_workloads = [] - negative_basic_workloads = [] + tasks = [] + for i in range(image_number): + task_seed = seed + i + task_prompt = apply_wildcards(prompt, task_seed) - if use_style: - for s in style_selections: - p, n = apply_style(s, positive=prompt) - positive_basic_workloads.append(p) - negative_basic_workloads.append(n) - else: - positive_basic_workloads.append(prompt) + positive_basic_workloads = [] + negative_basic_workloads = [] - negative_basic_workloads.append(negative_prompt) # Always use independent workload for negative. + if use_style: + for s in style_selections: + p, n = apply_style(s, positive=task_prompt) + positive_basic_workloads.append(p) + negative_basic_workloads.append(n) + else: + positive_basic_workloads.append(task_prompt) - positive_basic_workloads = positive_basic_workloads + extra_positive_prompts - negative_basic_workloads = negative_basic_workloads + extra_negative_prompts + negative_basic_workloads.append(negative_prompt) # Always use independent workload for negative. - positive_basic_workloads = remove_empty_str(positive_basic_workloads, default=prompt) - negative_basic_workloads = remove_empty_str(negative_basic_workloads, default=negative_prompt) + positive_basic_workloads = positive_basic_workloads + extra_positive_prompts + negative_basic_workloads = negative_basic_workloads + extra_negative_prompts - positive_top_k = len(positive_basic_workloads) - negative_top_k = len(negative_basic_workloads) + positive_basic_workloads = remove_empty_str(positive_basic_workloads, default=task_prompt) + negative_basic_workloads = remove_empty_str(negative_basic_workloads, default=negative_prompt) - tasks = [dict( - task_seed=seed + i, - positive=positive_basic_workloads, - negative=negative_basic_workloads, - expansion='', - c=None, - uc=None, - ) for i in range(image_number)] + positive_top_k = len(positive_basic_workloads) + negative_top_k = len(negative_basic_workloads) + + tasks.append(dict( + task_seed=task_seed, + task_prompt=task_prompt, + positive=positive_basic_workloads, + negative=negative_basic_workloads, + expansion='', + c=None, + uc=None + )) if use_expansion: for i, t in enumerate(tasks): progressbar(5, f'Preparing Fooocus text #{i + 1} ...') - expansion = pipeline.final_expansion(prompt, t['task_seed']) + expansion = pipeline.final_expansion(t['task_prompt'], t['task_seed']) print(f'[Prompt Expansion] New suffix: {expansion}') t['expansion'] = expansion - t['positive'] = copy.deepcopy(t['positive']) + [join_prompts(prompt, expansion)] # Deep copy. + t['positive'] = copy.deepcopy(t['positive']) + [join_prompts(t['task_prompt'], expansion)] # Deep copy. for i, t in enumerate(tasks): progressbar(7, f'Encoding positive #{i + 1} ...') diff --git a/modules/sdxl_styles.py b/modules/sdxl_styles.py index 61de3c4..97de07a 100644 --- a/modules/sdxl_styles.py +++ b/modules/sdxl_styles.py @@ -1,11 +1,15 @@ import os import json +import re +import random + from modules.util import get_files_from_folder # cannot use modules.path - validators causing circular imports styles_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '../sdxl_styles/')) +wildcards_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '../wildcards/')) default_styles_files = ['sdxl_styles_fooocus.json', 'sdxl_styles_sai.json', 'sdxl_styles_mre.json', 'sdxl_styles_twri.json', 'sdxl_styles_diva.json'] @@ -111,3 +115,18 @@ for k, (w, h) in SD_XL_BASE_RATIOS.items(): def apply_style(style, positive): p, n = styles[style] return p.replace('{prompt}', positive), n + + +def apply_wildcards(wildcard_text, seed=None, directory=wildcards_path): + placeholders = re.findall(r'__(\w+)__', wildcard_text) + for placeholder in placeholders: + try: + with open(os.path.join(directory, f'{placeholder}.txt')) as f: + words = f.read().splitlines() + f.close() + rng = random.Random(seed) + wildcard_text = re.sub(rf'__{placeholder}__', rng.choice(words), wildcard_text) + except IOError: + print(f'Error: could not open wildcard file {placeholder}.txt, using as normal word.') + wildcard_text = wildcard_text.replace(f'__{placeholder}__', placeholder) + return wildcard_text diff --git a/update_log.md b/update_log.md index 9e8ae25..9c4979e 100644 --- a/update_log.md +++ b/update_log.md @@ -1,3 +1,17 @@ +# 2.1.687 + +* Added support for wildcards (using files from wildcards folder - try prompts like `__color__ sports car` with different seeds). + +# 2.1.682 + +* Added support for custom styles (loaded from JSON files placed in sdxl_styles folder). + +# 2.1.681 + +* Added support for generate hotkey (CTRL+ENTER). +* Added support for generate forever (RMB on Generate button). +* Added support for playing sound when generation is finished ('notification.ogg' or 'notification.mp3'). + # 2.1.62 * Preset system. Added anime and realistic support. diff --git a/wildcards/color.txt b/wildcards/color.txt new file mode 100644 index 0000000..4678986 --- /dev/null +++ b/wildcards/color.txt @@ -0,0 +1,17 @@ +aqua +black +blue +fuchsia +gray +green +lime +maroon +navy +olive +orange +purple +red +silver +teal +white +yellow