Spaces:
Runtime error
Runtime error
import gradio as gr | |
import random | |
import time | |
import shared | |
import argparse | |
import modules.path | |
import fooocus_version | |
import modules.html | |
import modules.async_worker as worker | |
import modules.constants as constants | |
import json | |
from modules.settings import load_settings | |
from modules.resolutions import get_resolution_string, resolutions | |
from modules.sdxl_styles import style_keys | |
from collections.abc import Mapping | |
from PIL import Image | |
def generate_clicked(*args): | |
yield gr.update(interactive=False), \ | |
gr.update(visible=True, value=modules.html.make_progress_html(1, 'Processing text encoding ...')), \ | |
gr.update(visible=True, value=None), \ | |
gr.update(visible=False), \ | |
gr.update(), \ | |
gr.update(value=None), \ | |
gr.update() | |
worker.buffer.append(list(args)) | |
finished = False | |
while not finished: | |
time.sleep(0.01) | |
if len(worker.outputs) > 0: | |
flag, product = worker.outputs.pop(0) | |
if flag == 'preview': | |
percentage, title, image = product | |
yield gr.update(interactive=False), \ | |
gr.update(visible=True, value=modules.html.make_progress_html(percentage, title)), \ | |
gr.update(visible=True, value=image) if image is not None else gr.update(), \ | |
gr.update(visible=False), \ | |
gr.update(), \ | |
gr.update(), \ | |
gr.update() | |
if flag == 'results': | |
yield gr.update(interactive=True), \ | |
gr.update(visible=False), \ | |
gr.update(visible=False), \ | |
gr.update(visible=True), \ | |
gr.update(value=product), \ | |
gr.update(), \ | |
gr.update() | |
if flag == 'metadatas': | |
yield gr.update(), gr.update(), gr.update(), gr.update(), gr.update(), gr.update(value=product), gr.update(selected=1) | |
finished = True | |
return | |
def metadata_to_ctrls(metadata, ctrls): | |
if not isinstance(metadata, Mapping): | |
return ctrls | |
if 'prompt' in metadata: | |
ctrls[0] = metadata['prompt'] | |
if 'negative_prompt' in metadata: | |
ctrls[1] = metadata['negative_prompt'] | |
if 'style' in metadata: | |
ctrls[2] = metadata['style'] | |
if 'performance' in metadata: | |
ctrls[3] = metadata['performance'] | |
if 'width' in metadata and 'height' in metadata: | |
ctrls[4] = get_resolution_string(metadata['width'], metadata['height']) | |
elif 'resolution' in metadata: | |
ctrls[4] = metadata['resolution'] | |
# image_number | |
if 'seed' in metadata: | |
ctrls[6] = metadata['seed'] | |
ctrls[32] = False | |
if 'sharpness' in metadata: | |
ctrls[7] = metadata['sharpness'] | |
if 'sampler_name' in metadata: | |
ctrls[8] = metadata['sampler_name'] | |
elif 'sampler' in metadata: | |
ctrls[8] = metadata['sampler'] | |
if 'scheduler' in metadata: | |
ctrls[9] = metadata['scheduler'] | |
if 'steps' in metadata: | |
ctrls[10] = metadata['steps'] | |
if ctrls[10] == constants.STEPS_SPEED: | |
ctrls[3] = 'Speed' | |
elif ctrls[10] == constants.STEPS_QUALITY: | |
ctrls[3] = 'Quality' | |
else: | |
ctrls[3] = 'Custom' | |
if 'switch' in metadata: | |
ctrls[11] = round(metadata['switch'] / ctrls[10], 2) | |
if ctrls[11] != round(constants.SWITCH_SPEED / constants.STEPS_SPEED, 2): | |
ctrls[3] = 'Custom' | |
if 'cfg' in metadata: | |
ctrls[12] = metadata['cfg'] | |
if 'base_model' in metadata: | |
ctrls[13] = metadata['base_model'] | |
elif 'base_model_name' in metadata: | |
ctrls[13] = metadata['base_model_name'] | |
if 'refiner_model' in metadata: | |
ctrls[14] = metadata['refiner_model'] | |
elif 'refiner_model_name' in metadata: | |
ctrls[14] = metadata['refiner_model_name'] | |
if 'base_clip_skip' in metadata: | |
ctrls[15] = metadata['base_clip_skip'] | |
if 'refiner_clip_skip' in metadata: | |
ctrls[16] = metadata['refiner_clip_skip'] | |
if 'l1' in metadata: | |
ctrls[17] = metadata['l1'] | |
if 'w1' in metadata: | |
ctrls[18] = metadata['w1'] | |
if 'l2' in metadata: | |
ctrls[19] = metadata['l2'] | |
if 'w2' in metadata: | |
ctrls[20] = metadata['w2'] | |
if 'l3' in metadata: | |
ctrls[21] = metadata['l3'] | |
if 'w3' in metadata: | |
ctrls[22] = metadata['w3'] | |
if 'l4' in metadata: | |
ctrls[23] = metadata['l4'] | |
if 'w4' in metadata: | |
ctrls[24] = metadata['w4'] | |
if 'l5' in metadata: | |
ctrls[25] = metadata['l5'] | |
if 'w5' in metadata: | |
ctrls[26] = metadata['w5'] | |
# save_metadata_json | |
# save_metadata_png | |
if 'img2img' in metadata: | |
ctrls[29] = metadata['img2img'] | |
if 'start_step' in metadata: | |
if ctrls[3] == 'Speed': | |
ctrls[30] = round(metadata['start_step'] / constants.STEPS_SPEED, 2) | |
elif ctrls[3] == 'Quality': | |
ctrls[30] = round(metadata['start_step'] / constants.STEPS_QUALITY, 2) | |
else: | |
ctrls[30] = round(metadata['start_step'] / ctrls[10], 2) | |
if 'denoise' in metadata: | |
ctrls[31] = metadata['denoise'] | |
# seed_random | |
return ctrls | |
def load_prompt_handler(_file, *args): | |
ctrls=list(args) | |
path = _file.name | |
if path.endswith('.json'): | |
with open(path, encoding='utf-8') as json_file: | |
try: | |
json_obj = json.load(json_file) | |
metadata_to_ctrls(json_obj, ctrls) | |
except Exception as e: | |
print(e) | |
finally: | |
json_file.close() | |
elif path.endswith('.png'): | |
with open(path, 'rb') as png_file: | |
image = Image.open(png_file) | |
png_file.close() | |
if 'Comment' in image.info: | |
try: | |
metadata = json.loads(image.info['Comment']) | |
metadata_to_ctrls(metadata, ctrls) | |
except Exception as e: | |
print(e) | |
return ctrls | |
def load_images_handler(files): | |
return gr.update(value=True), list(map(lambda x: x.name, files)), gr.update(selected=0) | |
def output_to_input_handler(gallery): | |
if len(gallery) == 0: | |
return gr.update(value=False), [], gr.update() | |
else: | |
return gr.update(value=True), list(map(lambda x: x['name'], gallery)), gr.update(selected=0) | |
settings = load_settings() | |
shared.gradio_root = gr.Blocks(title=fooocus_version.full_version, css=modules.html.css).queue() | |
with shared.gradio_root: | |
with gr.Row(): | |
with gr.Column(): | |
progress_window = gr.Image(label='Preview', show_label=True, height=640, visible=False) | |
progress_html = gr.HTML(value=modules.html.make_progress_html(32, 'Progress 32%'), visible=False, elem_id='progress-bar', elem_classes='progress-bar') | |
with gr.Column() as gallery_holder: | |
with gr.Tabs(selected=1) as gallery_tabs: | |
with gr.Tab(label='Input', id=0): | |
input_gallery = gr.Gallery(label='Input', show_label=False, object_fit='contain', height=720, visible=True) | |
with gr.Tab(label='Output', id=1): | |
output_gallery = gr.Gallery(label='Output', show_label=False, object_fit='contain', height=720, visible=True) | |
with gr.Row(elem_classes='type_row'): | |
with gr.Column(scale=0.85): | |
prompt = gr.Textbox(show_label=False, placeholder='Type prompt here.', container=False, autofocus=True, elem_classes='type_row', lines=1024, value=settings['prompt']) | |
with gr.Column(scale=0.15, min_width=0): | |
with gr.Row(): | |
img2img_mode = gr.Checkbox(label='Image-2-Image', value=settings['img2img_mode'], elem_classes='type_small_row') | |
with gr.Row(): | |
run_button = gr.Button(label='Generate', value='Generate', elem_classes='type_small_row') | |
with gr.Row(): | |
advanced_checkbox = gr.Checkbox(label='Advanced', value=settings['advanced_mode'], container=False) | |
def verify_input(img2img, gallery_in, gallery_out): | |
if img2img and len(gallery_in) == 0: | |
if len(gallery_out) == 0: | |
gr.Warning('Image-2-Image: disabled (no images available)') | |
return gr.update(value=False), gr.update(), gr.update() | |
else: | |
gr.Info('Image-2-Image: imported output as input') | |
return gr.update(), list(map(lambda x: x['name'], gallery_out)), gr.update() | |
else: | |
return gr.update(), gr.update(), gr.update() | |
with gr.Column(scale=0.5, visible=settings['advanced_mode']) as advanced_column: | |
with gr.Tab(label='Settings'): | |
performance = gr.Radio(label='Performance', choices=['Speed', 'Quality', 'Custom'], value=settings['performance']) | |
custom_steps = gr.Slider(label='Custom Steps', minimum=10, maximum=200, step=1, value=settings['custom_steps'], visible=settings['performance'] == 'Custom') | |
custom_switch = gr.Slider(label='Custom Switch', minimum=0.2, maximum=1.0, step=0.01, value=settings['custom_switch'], visible=settings['performance'] == 'Custom') | |
resolution = gr.Dropdown(label='Resolution (width × height)', choices=list(resolutions.keys()), value=settings['resolution']) | |
style_selection = gr.Dropdown(label='Style', choices=style_keys, value=settings['style']) | |
image_number = gr.Slider(label='Image Number', minimum=1, maximum=32, step=1, value=settings['image_number']) | |
negative_prompt = gr.Textbox(label='Negative Prompt', show_label=True, placeholder="Type prompt here.", value=settings['negative_prompt']) | |
seed_random = gr.Checkbox(label='Random', value=settings['seed_random']) | |
image_seed = gr.Number(label='Seed', value=settings['seed'], precision=0, visible=not settings['seed_random']) | |
img2img_denoise = gr.Slider(label='Image-2-Image Denoise', minimum=0.2, maximum=1.0, step=0.01, value=settings['img2img_denoise']) | |
with gr.Row(): | |
load_prompt_button = gr.UploadButton(label='Load Prompt', file_count='single', file_types=['.json', '.png'], elem_classes='type_small_row', min_width=0) | |
load_images_button = gr.UploadButton(label='Load Image(s)', file_count='multiple', file_types=["image"], elem_classes='type_small_row', min_width=0) | |
output_to_input_button = gr.Button(label='Output to Input', value='Output to Input', elem_classes='type_small_row', min_width=0) | |
def random_checked(r): | |
return gr.update(visible=not r) | |
def refresh_seed(r, s): | |
if r or not isinstance(s, int) or s < 0 or s > 2**63 - 1: | |
return random.randint(0, 2**63 - 1) | |
else: | |
return s | |
seed_random.change(random_checked, inputs=[seed_random], outputs=[image_seed]) | |
def performance_changed(value): | |
return gr.update(visible=value == 'Custom'), gr.update(visible=value == 'Custom') | |
performance.change(fn=performance_changed, inputs=[performance], outputs=[custom_steps, custom_switch]) | |
load_images_button.upload(fn=load_images_handler, inputs=[load_images_button], outputs=[img2img_mode, input_gallery, gallery_tabs]) | |
output_to_input_button.click(output_to_input_handler, inputs=output_gallery, outputs=[img2img_mode, input_gallery, gallery_tabs]) | |
with gr.Tab(label='Models'): | |
with gr.Row(): | |
base_model = gr.Dropdown(label='SDXL Base Model', choices=modules.path.model_filenames, value=settings['base_model'], show_label=True) | |
refiner_model = gr.Dropdown(label='SDXL Refiner', choices=['None'] + modules.path.model_filenames, value=settings['refiner_model'], show_label=True) | |
with gr.Accordion(label='LoRAs', open=True): | |
lora_ctrls = [] | |
for i in range(5): | |
with gr.Row(): | |
lora_model = gr.Dropdown(label=f'SDXL LoRA {i+1}', choices=['None'] + modules.path.lora_filenames, value=settings[f'lora_{i+1}_model']) | |
lora_weight = gr.Slider(label='Weight', minimum=-2, maximum=2, step=0.01, value=settings[f'lora_{i+1}_weight']) | |
lora_ctrls += [lora_model, lora_weight] | |
with gr.Row(): | |
model_refresh = gr.Button(label='Refresh', value='\U0001f504 Refresh All Files', variant='secondary', elem_classes='refresh_button') | |
with gr.Tab(label='Advanced'): | |
cfg = gr.Slider(label='CFG', minimum=1.0, maximum=20.0, step=0.1, value=settings['cfg']) | |
base_clip_skip = gr.Slider(label='Base CLIP Skip', minimum=-10, maximum=-1, step=1, value=settings['base_clip_skip']) | |
refiner_clip_skip = gr.Slider(label='Refiner CLIP Skip', minimum=-10, maximum=-1, step=1, value=settings['refiner_clip_skip']) | |
sampler_name = gr.Dropdown(label='Sampler', choices=['dpmpp_2m_sde_gpu', 'dpmpp_2m_sde', 'dpmpp_3m_sde_gpu', 'dpmpp_3m_sde', | |
'dpmpp_sde_gpu', 'dpmpp_sde', 'dpmpp_2s_ancestral', 'euler', 'euler_ancestral', 'heun', 'dpm_2', 'dpm_2_ancestral'], value=settings['sampler']) | |
scheduler = gr.Dropdown(label='Scheduler', choices=['karras', 'exponential', 'simple', 'ddim_uniform'], value=settings['scheduler']) | |
img2img_start_step = gr.Slider(label='Image-2-Image Start Step', minimum=0.0, maximum=0.8, step=0.01, value=settings['img2img_start_step']) | |
sharpness = gr.Slider(label='Sampling Sharpness', minimum=0.0, maximum=40.0, step=0.01, value=settings['sharpness']) | |
gr.HTML('<a href="https://github.com/lllyasviel/Fooocus/discussions/117">\U0001F4D4 Document</a>') | |
def model_refresh_clicked(): | |
modules.path.update_all_model_names() | |
results = [] | |
results += [gr.update(choices=modules.path.model_filenames), gr.update(choices=['None'] + modules.path.model_filenames)] | |
for i in range(5): | |
results += [gr.update(choices=['None'] + modules.path.lora_filenames), gr.update()] | |
return results | |
model_refresh.click(model_refresh_clicked, [], [base_model, refiner_model] + lora_ctrls) | |
with gr.Tab(label='Metadata'): | |
with gr.Row(): | |
save_metadata_json = gr.Checkbox(label='Save Metadata in JSON', value=settings['save_metadata_json']) | |
save_metadata_png = gr.Checkbox(label='Save Metadata in PNG', value=settings['save_metadata_png']) | |
metadata_viewer = gr.JSON(label='Metadata') | |
advanced_checkbox.change(lambda x: gr.update(visible=x), advanced_checkbox, advanced_column) | |
ctrls = [ | |
prompt, negative_prompt, style_selection, | |
performance, resolution, image_number, image_seed, sharpness, sampler_name, scheduler, | |
custom_steps, custom_switch, cfg | |
] | |
ctrls += [base_model, refiner_model, base_clip_skip, refiner_clip_skip] + lora_ctrls + [save_metadata_json, save_metadata_png, img2img_mode, img2img_start_step, img2img_denoise] | |
load_prompt_button.upload(fn=load_prompt_handler, inputs=[load_prompt_button] + ctrls + [seed_random], outputs=ctrls + [seed_random]) | |
run_button.click(fn=refresh_seed, inputs=[seed_random, image_seed], outputs=image_seed) \ | |
.then(fn=verify_input, inputs=[img2img_mode, input_gallery, output_gallery], outputs=[img2img_mode, input_gallery, output_gallery]) \ | |
.then(fn=generate_clicked, inputs=ctrls + [input_gallery], outputs=[run_button, progress_html, progress_window, gallery_holder, output_gallery, metadata_viewer, gallery_tabs]) | |
parser = argparse.ArgumentParser() | |
parser.add_argument("--port", type=int, default=None, help="Set the listen port.") | |
parser.add_argument("--share", action='store_true', help="Set whether to share on Gradio.") | |
parser.add_argument("--listen", type=str, default=None, metavar="IP", nargs="?", const="0.0.0.0", help="Set the listen interface.") | |
args = parser.parse_args() | |
shared.gradio_root.launch(inbrowser=True, server_name=args.listen, server_port=args.port, share=args.share) | |