mirror of
https://github.com/lllyasviel/Fooocus.git
synced 2026-08-16 13:13:16 +02:00
Merge branch 'jpg_config_image_extension'
# Conflicts: # modules/async_worker.py # modules/config.py # modules/flags.py # webui.py
This commit is contained in:
@@ -1,5 +1,7 @@
|
|||||||
import ldm_patched.modules.args_parser as args_parser
|
import ldm_patched.modules.args_parser as args_parser
|
||||||
|
import os
|
||||||
|
|
||||||
|
from tempfile import gettempdir
|
||||||
|
|
||||||
args_parser.parser.add_argument("--share", action='store_true', help="Set whether to share on Gradio.")
|
args_parser.parser.add_argument("--share", action='store_true', help="Set whether to share on Gradio.")
|
||||||
|
|
||||||
@@ -37,7 +39,11 @@ args_parser.args.always_offload_from_vram = not args_parser.args.disable_offload
|
|||||||
if args_parser.args.disable_analytics:
|
if args_parser.args.disable_analytics:
|
||||||
import os
|
import os
|
||||||
os.environ["GRADIO_ANALYTICS_ENABLED"] = "False"
|
os.environ["GRADIO_ANALYTICS_ENABLED"] = "False"
|
||||||
|
|
||||||
if args_parser.args.disable_in_browser:
|
if args_parser.args.disable_in_browser:
|
||||||
args_parser.args.in_browser = False
|
args_parser.args.in_browser = False
|
||||||
|
|
||||||
|
if args_parser.args.temp_path is None:
|
||||||
|
args_parser.args.temp_path = os.path.join(gettempdir(), 'Fooocus')
|
||||||
|
|
||||||
args = args_parser.args
|
args = args_parser.args
|
||||||
|
|||||||
@@ -112,10 +112,7 @@ parser.add_argument("--is-windows-embedded-python", action="store_true")
|
|||||||
|
|
||||||
parser.add_argument("--disable-server-info", action="store_true")
|
parser.add_argument("--disable-server-info", action="store_true")
|
||||||
|
|
||||||
if ldm_patched.modules.options.args_parsing:
|
args = parser.parse_args([])
|
||||||
args = parser.parse_args([])
|
|
||||||
else:
|
|
||||||
args = parser.parse_args([])
|
|
||||||
|
|
||||||
if args.is_windows_embedded_python:
|
if args.is_windows_embedded_python:
|
||||||
args.in_browser = True
|
args.in_browser = True
|
||||||
|
|||||||
@@ -134,6 +134,7 @@ def worker():
|
|||||||
performance_selection = args.pop()
|
performance_selection = args.pop()
|
||||||
aspect_ratios_selection = args.pop()
|
aspect_ratios_selection = args.pop()
|
||||||
image_number = args.pop()
|
image_number = args.pop()
|
||||||
|
image_extension = args.pop()
|
||||||
image_seed = args.pop()
|
image_seed = args.pop()
|
||||||
sharpness = args.pop()
|
sharpness = args.pop()
|
||||||
guidance_scale = args.pop()
|
guidance_scale = args.pop()
|
||||||
@@ -390,6 +391,7 @@ def worker():
|
|||||||
|
|
||||||
progressbar(async_task, 3, 'Processing prompts ...')
|
progressbar(async_task, 3, 'Processing prompts ...')
|
||||||
tasks = []
|
tasks = []
|
||||||
|
|
||||||
for i in range(image_number):
|
for i in range(image_number):
|
||||||
task_seed = (seed + i) % (constants.MAX_SEED + 1) # randint is inclusive, % is not
|
task_seed = (seed + i) % (constants.MAX_SEED + 1) # randint is inclusive, % is not
|
||||||
task_rng = random.Random(task_seed) # may bind to inpaint noise in the future
|
task_rng = random.Random(task_seed) # may bind to inpaint noise in the future
|
||||||
@@ -525,8 +527,8 @@ def worker():
|
|||||||
|
|
||||||
if direct_return:
|
if direct_return:
|
||||||
d = [('Upscale (Fast)', '2x')]
|
d = [('Upscale (Fast)', '2x')]
|
||||||
log(uov_input_image, d)
|
uov_input_image_path = log(uov_input_image, d, image_extension)
|
||||||
yield_result(async_task, uov_input_image, do_not_show_finished_images=True)
|
yield_result(async_task, uov_input_image_path, do_not_show_finished_images=True)
|
||||||
return
|
return
|
||||||
|
|
||||||
tiled = True
|
tiled = True
|
||||||
@@ -790,6 +792,7 @@ def worker():
|
|||||||
if inpaint_worker.current_task is not None:
|
if inpaint_worker.current_task is not None:
|
||||||
imgs = [inpaint_worker.current_task.post_process(x) for x in imgs]
|
imgs = [inpaint_worker.current_task.post_process(x) for x in imgs]
|
||||||
|
|
||||||
|
img_paths = []
|
||||||
for x in imgs:
|
for x in imgs:
|
||||||
d = [
|
d = [
|
||||||
('Prompt', task['log_positive_prompt']),
|
('Prompt', task['log_positive_prompt']),
|
||||||
@@ -816,9 +819,9 @@ def worker():
|
|||||||
if n != 'None':
|
if n != 'None':
|
||||||
d.append((f'LoRA {li + 1}', f'{n} : {w}'))
|
d.append((f'LoRA {li + 1}', f'{n} : {w}'))
|
||||||
d.append(('Version', 'v' + fooocus_version.version))
|
d.append(('Version', 'v' + fooocus_version.version))
|
||||||
log(x, d)
|
img_paths.append(log(x, d, image_extension))
|
||||||
|
|
||||||
yield_result(async_task, imgs, do_not_show_finished_images=len(tasks) == 1, progressbar_index=int(15.0 + 85.0 * float((current_task_id + 1) * steps) / float(all_steps)))
|
yield_result(async_task, img_paths, do_not_show_finished_images=len(tasks) == 1, progressbar_index=int(15.0 + 85.0 * float((current_task_id + 1) * steps) / float(all_steps)))
|
||||||
except ldm_patched.modules.model_management.InterruptProcessingException as e:
|
except ldm_patched.modules.model_management.InterruptProcessingException as e:
|
||||||
if async_task.last_stop == 'skip':
|
if async_task.last_stop == 'skip':
|
||||||
print('User skipped')
|
print('User skipped')
|
||||||
|
|||||||
+5
-1
@@ -289,6 +289,11 @@ default_max_image_number = get_config_item_or_set_default(
|
|||||||
default_value=32,
|
default_value=32,
|
||||||
validator=lambda x: isinstance(x, int) and x >= 1
|
validator=lambda x: isinstance(x, int) and x >= 1
|
||||||
)
|
)
|
||||||
|
default_image_extension = get_config_item_or_set_default(
|
||||||
|
key='default_image_extension',
|
||||||
|
default_value='png',
|
||||||
|
validator=lambda x: x in modules.flags.image_extensions
|
||||||
|
)
|
||||||
default_image_number = get_config_item_or_set_default(
|
default_image_number = get_config_item_or_set_default(
|
||||||
key='default_image_number',
|
key='default_image_number',
|
||||||
default_value=2,
|
default_value=2,
|
||||||
@@ -388,7 +393,6 @@ possible_preset_keys = {
|
|||||||
"lora_downloads": "lora_downloads"
|
"lora_downloads": "lora_downloads"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
REWRITE_PRESET = False
|
REWRITE_PRESET = False
|
||||||
|
|
||||||
if REWRITE_PRESET and isinstance(args_manager.args.preset, str):
|
if REWRITE_PRESET and isinstance(args_manager.args.preset, str):
|
||||||
|
|||||||
@@ -40,6 +40,8 @@ performance_selections = [
|
|||||||
('Extreme Speed (LCM) <span style="color: grey;"> \U00002223 8 steps, intermediate results disabled</span>', 'Extreme Speed')
|
('Extreme Speed (LCM) <span style="color: grey;"> \U00002223 8 steps, intermediate results disabled</span>', 'Extreme Speed')
|
||||||
]
|
]
|
||||||
|
|
||||||
|
image_extensions = ['png', 'jpg', 'webp']
|
||||||
|
|
||||||
inpaint_option_default = 'Inpaint or Outpaint (default)'
|
inpaint_option_default = 'Inpaint or Outpaint (default)'
|
||||||
inpaint_option_detail = 'Improve Detail (face, hand, eyes, etc.)'
|
inpaint_option_detail = 'Improve Detail (face, hand, eyes, etc.)'
|
||||||
inpaint_option_modify = 'Modify Content (add objects, change background, etc.)'
|
inpaint_option_modify = 'Modify Content (add objects, change background, etc.)'
|
||||||
|
|||||||
@@ -6,25 +6,29 @@ import urllib.parse
|
|||||||
|
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
from modules.util import generate_temp_filename
|
from modules.util import generate_temp_filename
|
||||||
|
from tempfile import gettempdir
|
||||||
|
|
||||||
log_cache = {}
|
log_cache = {}
|
||||||
|
|
||||||
|
|
||||||
def get_current_html_path():
|
def get_current_html_path(image_extension=None):
|
||||||
|
_image_extension = image_extension if image_extension else modules.config.default_image_extension
|
||||||
date_string, local_temp_filename, only_name = generate_temp_filename(folder=modules.config.path_outputs,
|
date_string, local_temp_filename, only_name = generate_temp_filename(folder=modules.config.path_outputs,
|
||||||
extension='png')
|
extension=_image_extension)
|
||||||
html_name = os.path.join(os.path.dirname(local_temp_filename), 'log.html')
|
html_name = os.path.join(os.path.dirname(local_temp_filename), 'log.html')
|
||||||
return html_name
|
return html_name
|
||||||
|
|
||||||
|
|
||||||
def log(img, dic):
|
def log(img, dic, image_extension=None) -> str:
|
||||||
if args_manager.args.disable_image_log:
|
path_outputs = args_manager.args.temp_path if args_manager.args.disable_image_log else modules.config.path_outputs
|
||||||
return
|
_image_extension = image_extension if image_extension else modules.config.default_image_extension
|
||||||
|
date_string, local_temp_filename, only_name = generate_temp_filename(folder=path_outputs, extension=_image_extension)
|
||||||
date_string, local_temp_filename, only_name = generate_temp_filename(folder=modules.config.path_outputs, extension='png')
|
|
||||||
os.makedirs(os.path.dirname(local_temp_filename), exist_ok=True)
|
os.makedirs(os.path.dirname(local_temp_filename), exist_ok=True)
|
||||||
Image.fromarray(img).save(local_temp_filename)
|
Image.fromarray(img).save(local_temp_filename)
|
||||||
|
|
||||||
|
if args_manager.args.disable_image_log:
|
||||||
|
return local_temp_filename
|
||||||
|
|
||||||
html_name = os.path.join(os.path.dirname(local_temp_filename), 'log.html')
|
html_name = os.path.join(os.path.dirname(local_temp_filename), 'log.html')
|
||||||
|
|
||||||
css_styles = (
|
css_styles = (
|
||||||
@@ -105,4 +109,4 @@ def log(img, dic):
|
|||||||
|
|
||||||
log_cache[html_name] = middle_part
|
log_cache[html_name] = middle_part
|
||||||
|
|
||||||
return
|
return local_temp_filename
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ Included adjustments:
|
|||||||
* 🐛 https://github.com/lllyasviel/Fooocus/pull/1784 - correctly sort files, display deepest directory level first
|
* 🐛 https://github.com/lllyasviel/Fooocus/pull/1784 - correctly sort files, display deepest directory level first
|
||||||
* ✨ https://github.com/lllyasviel/Fooocus/pull/1785 - update model Juggernaut XL v6 to v8
|
* ✨ https://github.com/lllyasviel/Fooocus/pull/1785 - update model Juggernaut XL v6 to v8
|
||||||
* ✨ https://github.com/lllyasviel/Fooocus/pull/1809 - reduce file size of preview images
|
* ✨ https://github.com/lllyasviel/Fooocus/pull/1809 - reduce file size of preview images
|
||||||
|
* ✨ https://github.com/lllyasviel/Fooocus/pull/1932 - use consistent file name in gradio
|
||||||
|
* ✨ https://github.com/lllyasviel/Fooocus/pull/1863 - image extension support (png, jpg, webp)
|
||||||
|
|
||||||
✨ = new feature<br>
|
✨ = new feature<br>
|
||||||
🐛 = bugfix<br>
|
🐛 = bugfix<br>
|
||||||
|
|||||||
@@ -74,6 +74,11 @@ def generate_clicked(task):
|
|||||||
gr.update(visible=True, value=product)
|
gr.update(visible=True, value=product)
|
||||||
finished = True
|
finished = True
|
||||||
|
|
||||||
|
# delete Fooocus temp images, only keep gradio temp images
|
||||||
|
if args_manager.args.disable_image_log:
|
||||||
|
for filepath in product:
|
||||||
|
os.remove(filepath)
|
||||||
|
|
||||||
execution_time = time.perf_counter() - execution_start_time
|
execution_time = time.perf_counter() - execution_start_time
|
||||||
print(f'Total time: {execution_time:.2f} seconds')
|
print(f'Total time: {execution_time:.2f} seconds')
|
||||||
return
|
return
|
||||||
@@ -243,6 +248,11 @@ with shared.gradio_root:
|
|||||||
value=modules.config.default_aspect_ratio, info='width × height',
|
value=modules.config.default_aspect_ratio, info='width × height',
|
||||||
elem_classes='aspect_ratios')
|
elem_classes='aspect_ratios')
|
||||||
image_number = gr.Slider(label='Image Number', minimum=1, maximum=modules.config.default_max_image_number, step=1, value=modules.config.default_image_number)
|
image_number = gr.Slider(label='Image Number', minimum=1, maximum=modules.config.default_max_image_number, step=1, value=modules.config.default_image_number)
|
||||||
|
|
||||||
|
image_extension = gr.Radio(label='Image Outputs Extension',
|
||||||
|
choices=modules.flags.image_extensions,
|
||||||
|
value=modules.config.default_image_extension)
|
||||||
|
|
||||||
negative_prompt = gr.Textbox(label='Negative Prompt', show_label=True, placeholder="Type prompt here.",
|
negative_prompt = gr.Textbox(label='Negative Prompt', show_label=True, placeholder="Type prompt here.",
|
||||||
info='Describing what you do not want to see.', lines=2,
|
info='Describing what you do not want to see.', lines=2,
|
||||||
elem_id='negative_prompt',
|
elem_id='negative_prompt',
|
||||||
@@ -272,7 +282,7 @@ with shared.gradio_root:
|
|||||||
queue=False, show_progress=False)
|
queue=False, show_progress=False)
|
||||||
|
|
||||||
if not args_manager.args.disable_image_log:
|
if not args_manager.args.disable_image_log:
|
||||||
gr.HTML(f'<a href="/file={get_current_html_path()}" target="_blank">\U0001F4DA History Log</a>')
|
gr.HTML(f'<a href="/file={get_current_html_path(image_extension)}" target="_blank">\U0001F4DA History Log</a>')
|
||||||
|
|
||||||
with gr.Tab(label='Styles'):
|
with gr.Tab(label='Styles'):
|
||||||
style_sorter.try_load_sorted_styles(
|
style_sorter.try_load_sorted_styles(
|
||||||
@@ -582,7 +592,9 @@ with shared.gradio_root:
|
|||||||
adm_scaler_negative, refiner_switch, refiner_model, sampler_name,
|
adm_scaler_negative, refiner_switch, refiner_model, sampler_name,
|
||||||
scheduler_name, adaptive_cfg, refiner_swap_method, negative_prompt, disable_intermediate_results
|
scheduler_name, adaptive_cfg, refiner_swap_method, negative_prompt, disable_intermediate_results
|
||||||
], queue=False, show_progress=False)
|
], queue=False, show_progress=False)
|
||||||
|
|
||||||
|
image_extension.input(lambda x: gr.update(image_extension=x), inputs=image_extension)
|
||||||
|
|
||||||
advanced_checkbox.change(lambda x: gr.update(visible=x), advanced_checkbox, advanced_column,
|
advanced_checkbox.change(lambda x: gr.update(visible=x), advanced_checkbox, advanced_column,
|
||||||
queue=False, show_progress=False) \
|
queue=False, show_progress=False) \
|
||||||
.then(fn=lambda: None, _js='refresh_grid_delayed', queue=False, show_progress=False)
|
.then(fn=lambda: None, _js='refresh_grid_delayed', queue=False, show_progress=False)
|
||||||
@@ -622,7 +634,7 @@ with shared.gradio_root:
|
|||||||
|
|
||||||
ctrls = [
|
ctrls = [
|
||||||
currentTask, prompt, negative_prompt, translate_prompts, style_selections,
|
currentTask, prompt, negative_prompt, translate_prompts, style_selections,
|
||||||
performance_selection, aspect_ratios_selection, image_number, image_seed, sharpness, guidance_scale
|
performance_selection, aspect_ratios_selection, image_number, image_extension, image_seed, sharpness, guidance_scale
|
||||||
]
|
]
|
||||||
|
|
||||||
ctrls += [base_model, refiner_model, refiner_switch] + lora_ctrls
|
ctrls += [base_model, refiner_model, refiner_switch] + lora_ctrls
|
||||||
|
|||||||
Reference in New Issue
Block a user