2023-01-20 09:52:38 +01:00
|
|
|
import json
|
|
|
|
import os
|
|
|
|
from datetime import datetime
|
|
|
|
|
|
|
|
import gradio as gr
|
|
|
|
from loguru import logger
|
|
|
|
from pydantic import BaseModel
|
|
|
|
|
2023-02-06 15:00:47 +01:00
|
|
|
from lama_cleaner.const import (
|
|
|
|
AVAILABLE_MODELS,
|
|
|
|
AVAILABLE_DEVICES,
|
|
|
|
CPU_OFFLOAD_HELP,
|
|
|
|
NO_HALF_HELP,
|
|
|
|
DISABLE_NSFW_HELP,
|
|
|
|
SD_CPU_TEXTENCODER_HELP,
|
|
|
|
LOCAL_FILES_ONLY_HELP,
|
|
|
|
ENABLE_XFORMERS_HELP,
|
|
|
|
MODEL_DIR_HELP,
|
|
|
|
OUTPUT_DIR_HELP,
|
|
|
|
INPUT_HELP,
|
|
|
|
GUI_HELP,
|
|
|
|
DEFAULT_MODEL,
|
|
|
|
DEFAULT_DEVICE,
|
|
|
|
NO_GUI_AUTO_CLOSE_HELP,
|
|
|
|
DEFAULT_MODEL_DIR, MPS_SUPPORT_MODELS,
|
|
|
|
)
|
2023-01-20 09:52:38 +01:00
|
|
|
|
|
|
|
_config_file = None
|
|
|
|
|
|
|
|
|
|
|
|
class Config(BaseModel):
|
|
|
|
host: str = "127.0.0.1"
|
|
|
|
port: int = 8080
|
|
|
|
model: str = DEFAULT_MODEL
|
|
|
|
device: str = DEFAULT_DEVICE
|
|
|
|
gui: bool = False
|
|
|
|
no_gui_auto_close: bool = False
|
|
|
|
no_half: bool = False
|
|
|
|
cpu_offload: bool = False
|
|
|
|
disable_nsfw: bool = False
|
|
|
|
sd_cpu_textencoder: bool = False
|
|
|
|
enable_xformers: bool = False
|
|
|
|
local_files_only: bool = False
|
|
|
|
model_dir: str = DEFAULT_MODEL_DIR
|
|
|
|
input: str = None
|
|
|
|
output_dir: str = None
|
|
|
|
|
|
|
|
|
|
|
|
def load_config(installer_config: str):
|
|
|
|
if os.path.exists(installer_config):
|
2023-02-06 15:00:47 +01:00
|
|
|
with open(installer_config, "r", encoding="utf-8") as f:
|
2023-01-20 09:52:38 +01:00
|
|
|
return Config(**json.load(f))
|
|
|
|
else:
|
|
|
|
return Config()
|
|
|
|
|
|
|
|
|
|
|
|
def save_config(
|
2023-02-06 15:00:47 +01:00
|
|
|
host,
|
|
|
|
port,
|
|
|
|
model,
|
|
|
|
device,
|
|
|
|
gui,
|
|
|
|
no_gui_auto_close,
|
|
|
|
no_half,
|
|
|
|
cpu_offload,
|
|
|
|
disable_nsfw,
|
|
|
|
sd_cpu_textencoder,
|
|
|
|
enable_xformers,
|
|
|
|
local_files_only,
|
|
|
|
model_dir,
|
|
|
|
input,
|
|
|
|
output_dir,
|
2023-01-20 09:52:38 +01:00
|
|
|
):
|
|
|
|
config = Config(**locals())
|
|
|
|
print(config)
|
|
|
|
if config.input and not os.path.exists(config.input):
|
|
|
|
return "[Error] Input file or directory does not exist"
|
|
|
|
|
|
|
|
current_time = datetime.now().strftime("%H:%M:%S")
|
|
|
|
msg = f"[{current_time}] Successful save config to: {os.path.abspath(_config_file)}"
|
|
|
|
logger.info(msg)
|
|
|
|
try:
|
|
|
|
with open(_config_file, "w", encoding="utf-8") as f:
|
|
|
|
json.dump(config.dict(), f, indent=4, ensure_ascii=False)
|
|
|
|
except Exception as e:
|
|
|
|
return f"Save failed: {str(e)}"
|
|
|
|
return msg
|
|
|
|
|
|
|
|
|
|
|
|
def close_server(*args):
|
|
|
|
# TODO: make close both browser and server works
|
|
|
|
import os, signal
|
2023-02-06 15:00:47 +01:00
|
|
|
|
2023-01-20 09:52:38 +01:00
|
|
|
pid = os.getpid()
|
|
|
|
os.kill(pid, signal.SIGUSR1)
|
|
|
|
|
|
|
|
|
|
|
|
def main(config_file: str):
|
|
|
|
global _config_file
|
|
|
|
_config_file = config_file
|
|
|
|
|
|
|
|
init_config = load_config(config_file)
|
|
|
|
|
|
|
|
with gr.Blocks() as demo:
|
|
|
|
with gr.Row():
|
|
|
|
with gr.Column(scale=1):
|
|
|
|
save_btn = gr.Button(value="Save configurations")
|
|
|
|
message = gr.HTML()
|
|
|
|
# with gr.Column(scale=0, min_width=100):
|
|
|
|
# exit_btn = gr.Button(value="Close")
|
|
|
|
# exit_btn.click(close_server)
|
|
|
|
with gr.Row():
|
|
|
|
host = gr.Textbox(init_config.host, label="Host")
|
|
|
|
port = gr.Number(init_config.port, label="Port", precision=0)
|
|
|
|
with gr.Row():
|
|
|
|
model = gr.Radio(AVAILABLE_MODELS, label="Model", value=init_config.model)
|
2023-02-06 15:00:47 +01:00
|
|
|
device = gr.Radio(
|
|
|
|
AVAILABLE_DEVICES, label=f"Device(mps supports {MPS_SUPPORT_MODELS})", value=init_config.device
|
|
|
|
)
|
2023-01-20 09:52:38 +01:00
|
|
|
gui = gr.Checkbox(init_config.gui, label=f"{GUI_HELP}")
|
2023-02-06 15:00:47 +01:00
|
|
|
no_gui_auto_close = gr.Checkbox(
|
|
|
|
init_config.no_gui_auto_close, label=f"{NO_GUI_AUTO_CLOSE_HELP}"
|
|
|
|
)
|
2023-01-20 09:52:38 +01:00
|
|
|
no_half = gr.Checkbox(init_config.no_half, label=f"{NO_HALF_HELP}")
|
|
|
|
cpu_offload = gr.Checkbox(init_config.cpu_offload, label=f"{CPU_OFFLOAD_HELP}")
|
2023-02-06 15:00:47 +01:00
|
|
|
disable_nsfw = gr.Checkbox(
|
|
|
|
init_config.disable_nsfw, label=f"{DISABLE_NSFW_HELP}"
|
|
|
|
)
|
|
|
|
sd_cpu_textencoder = gr.Checkbox(
|
|
|
|
init_config.sd_cpu_textencoder, label=f"{SD_CPU_TEXTENCODER_HELP}"
|
|
|
|
)
|
|
|
|
enable_xformers = gr.Checkbox(
|
|
|
|
init_config.enable_xformers, label=f"{ENABLE_XFORMERS_HELP}"
|
|
|
|
)
|
|
|
|
local_files_only = gr.Checkbox(
|
|
|
|
init_config.local_files_only, label=f"{LOCAL_FILES_ONLY_HELP}"
|
|
|
|
)
|
2023-01-20 09:52:38 +01:00
|
|
|
model_dir = gr.Textbox(init_config.model_dir, label=f"{MODEL_DIR_HELP}")
|
2023-02-06 15:00:47 +01:00
|
|
|
input = gr.Textbox(
|
|
|
|
init_config.input, label=f"Input file or directory. {INPUT_HELP}"
|
|
|
|
)
|
|
|
|
output_dir = gr.Textbox(
|
|
|
|
init_config.output_dir, label=f"Output directory. {OUTPUT_DIR_HELP}"
|
|
|
|
)
|
|
|
|
save_btn.click(
|
|
|
|
save_config,
|
|
|
|
[
|
|
|
|
host,
|
|
|
|
port,
|
|
|
|
model,
|
|
|
|
device,
|
|
|
|
gui,
|
|
|
|
no_gui_auto_close,
|
|
|
|
no_half,
|
|
|
|
cpu_offload,
|
|
|
|
disable_nsfw,
|
|
|
|
sd_cpu_textencoder,
|
|
|
|
enable_xformers,
|
|
|
|
local_files_only,
|
|
|
|
model_dir,
|
|
|
|
input,
|
|
|
|
output_dir,
|
|
|
|
],
|
|
|
|
message,
|
|
|
|
)
|
2023-01-20 09:52:38 +01:00
|
|
|
demo.launch(inbrowser=True, show_api=False)
|