add image quality arg

https://github.com/Sanster/lama-cleaner/issues/229
This commit is contained in:
Qing 2023-03-20 21:23:49 +08:00
parent 5f4c62ac18
commit 1bb25bebe6
5 changed files with 67 additions and 42 deletions

View File

@ -7,7 +7,6 @@ MPS_SUPPORT_MODELS = [
"realisticVision1.4", "realisticVision1.4",
"sd2", "sd2",
"paint_by_example", "paint_by_example",
"controlnet",
] ]
DEFAULT_MODEL = "lama" DEFAULT_MODEL = "lama"
@ -25,7 +24,6 @@ AVAILABLE_MODELS = [
"sd2", "sd2",
"paint_by_example", "paint_by_example",
"instruct_pix2pix", "instruct_pix2pix",
"controlnet",
] ]
SD15_MODELS = ["sd1.5", "anything4", "realisticVision1.4"] SD15_MODELS = ["sd1.5", "anything4", "realisticVision1.4"]
@ -50,7 +48,7 @@ Run Stable Diffusion text encoder model on CPU to save GPU memory.
""" """
SD_CONTROLNET_HELP = """ SD_CONTROLNET_HELP = """
Run Stable Diffusion 1.5 inpainting model with controlNet-canny model. Run Stable Diffusion 1.5 inpainting model with Canny ControlNet control.
""" """
LOCAL_FILES_ONLY_HELP = """ LOCAL_FILES_ONLY_HELP = """
@ -84,3 +82,7 @@ Launch Lama Cleaner as desktop app
NO_GUI_AUTO_CLOSE_HELP = """ NO_GUI_AUTO_CLOSE_HELP = """
Prevent backend auto close after the GUI window closed. Prevent backend auto close after the GUI window closed.
""" """
QUALITY_HELP = """
Quality of image encoding, 0-100. Default is 95, higher quality will generate larger file size.
"""

View File

@ -135,9 +135,9 @@ def numpy_to_bytes(image_numpy: np.ndarray, ext: str) -> bytes:
return image_bytes return image_bytes
def pil_to_bytes(pil_img, ext: str, exif=None) -> bytes: def pil_to_bytes(pil_img, ext: str, quality: int = 95, exif=None) -> bytes:
with io.BytesIO() as output: with io.BytesIO() as output:
pil_img.save(output, format=ext, exif=exif, quality=95) pil_img.save(output, format=ext, exif=exif, quality=quality)
image_bytes = output.getvalue() image_bytes = output.getvalue()
return image_bytes return image_bytes

View File

@ -37,9 +37,7 @@ def parse_args():
parser.add_argument( parser.add_argument(
"--sd-cpu-textencoder", action="store_true", help=SD_CPU_TEXTENCODER_HELP "--sd-cpu-textencoder", action="store_true", help=SD_CPU_TEXTENCODER_HELP
) )
parser.add_argument( parser.add_argument("--sd-controlnet", action="store_true", help=SD_CONTROLNET_HELP)
"--sd-controlnet", action="store_true", help=SD_CONTROLNET_HELP
)
parser.add_argument( parser.add_argument(
"--local-files-only", action="store_true", help=LOCAL_FILES_ONLY_HELP "--local-files-only", action="store_true", help=LOCAL_FILES_ONLY_HELP
) )
@ -70,6 +68,9 @@ def parse_args():
action="store_true", action="store_true",
help="Disable model switch in frontend", help="Disable model switch in frontend",
) )
parser.add_argument(
"--quality", default=95, type=int, help=QUALITY_HELP,
)
# useless args # useless args
parser.add_argument("--debug", action="store_true", help=argparse.SUPPRESS) parser.add_argument("--debug", action="store_true", help=argparse.SUPPRESS)

View File

@ -93,6 +93,7 @@ is_controlnet: bool = False
is_enable_file_manager: bool = False is_enable_file_manager: bool = False
is_enable_auto_saving: bool = False is_enable_auto_saving: bool = False
is_desktop: bool = False is_desktop: bool = False
image_quality: int = 95
def get_image_ext(img_bytes): def get_image_ext(img_bytes):
@ -300,10 +301,12 @@ def process():
ext = get_image_ext(origin_image_bytes) ext = get_image_ext(origin_image_bytes)
# fmt: off
if exif is not None: if exif is not None:
bytes_io = io.BytesIO(pil_to_bytes(Image.fromarray(res_np_img), ext, exif=exif)) bytes_io = io.BytesIO(pil_to_bytes(Image.fromarray(res_np_img), ext, quality=image_quality, exif=exif))
else: else:
bytes_io = io.BytesIO(pil_to_bytes(Image.fromarray(res_np_img), ext)) bytes_io = io.BytesIO(pil_to_bytes(Image.fromarray(res_np_img), ext, quality=image_quality))
# fmt: on
response = make_response( response = make_response(
send_file( send_file(
@ -437,6 +440,10 @@ def main(args):
global output_dir global output_dir
global is_enable_auto_saving global is_enable_auto_saving
global is_controlnet global is_controlnet
global image_quality
image_quality = args.quality
if args.sd_controlnet and args.model in SD15_MODELS: if args.sd_controlnet and args.model in SD15_MODELS:
is_controlnet = True is_controlnet = True

View File

@ -55,6 +55,7 @@ def save_config(
model_dir, model_dir,
input, input,
output_dir, output_dir,
quality,
): ):
config = Config(**locals()) config = Config(**locals())
print(config) print(config)
@ -97,39 +98,52 @@ def main(config_file: str):
with gr.Row(): with gr.Row():
host = gr.Textbox(init_config.host, label="Host") host = gr.Textbox(init_config.host, label="Host")
port = gr.Number(init_config.port, label="Port", precision=0) port = gr.Number(init_config.port, label="Port", precision=0)
with gr.Row():
model = gr.Radio(AVAILABLE_MODELS, label="Model", value=init_config.model) model = gr.Radio(AVAILABLE_MODELS, label="Model", value=init_config.model)
device = gr.Radio( device = gr.Radio(AVAILABLE_DEVICES, label="Device", value=init_config.device)
AVAILABLE_DEVICES, label="Device", value=init_config.device quality = gr.Slider(
value=95,
label=f"Image Quality ({QUALITY_HELP})",
minimum=75,
maximum=100,
step=1,
)
with gr.Column():
gui = gr.Checkbox(init_config.gui, label=f"{GUI_HELP}")
no_gui_auto_close = gr.Checkbox(
init_config.no_gui_auto_close, label=f"{NO_GUI_AUTO_CLOSE_HELP}"
) )
gui = gr.Checkbox(init_config.gui, label=f"{GUI_HELP}")
no_gui_auto_close = gr.Checkbox( model_dir = gr.Textbox(init_config.model_dir, label=f"{MODEL_DIR_HELP}")
init_config.no_gui_auto_close, label=f"{NO_GUI_AUTO_CLOSE_HELP}" input = gr.Textbox(
) init_config.input, label=f"Input file or directory. {INPUT_HELP}"
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}") output_dir = gr.Textbox(
disable_nsfw = gr.Checkbox( init_config.output_dir, label=f"Output directory. {OUTPUT_DIR_HELP}"
init_config.disable_nsfw, label=f"{DISABLE_NSFW_HELP}" )
)
sd_controlnet = gr.Checkbox( with gr.Column():
init_config.sd_controlnet, label=f"{SD_CONTROLNET_HELP}" sd_controlnet = gr.Checkbox(
) init_config.sd_controlnet, label=f"{SD_CONTROLNET_HELP}"
sd_cpu_textencoder = gr.Checkbox( )
init_config.sd_cpu_textencoder, label=f"{SD_CPU_TEXTENCODER_HELP}" no_half = gr.Checkbox(init_config.no_half, label=f"{NO_HALF_HELP}")
) cpu_offload = gr.Checkbox(
enable_xformers = gr.Checkbox( init_config.cpu_offload, label=f"{CPU_OFFLOAD_HELP}"
init_config.enable_xformers, label=f"{ENABLE_XFORMERS_HELP}" )
) disable_nsfw = gr.Checkbox(
local_files_only = gr.Checkbox( init_config.disable_nsfw, label=f"{DISABLE_NSFW_HELP}"
init_config.local_files_only, label=f"{LOCAL_FILES_ONLY_HELP}" )
) sd_cpu_textencoder = gr.Checkbox(
model_dir = gr.Textbox(init_config.model_dir, label=f"{MODEL_DIR_HELP}") init_config.sd_cpu_textencoder, label=f"{SD_CPU_TEXTENCODER_HELP}"
input = gr.Textbox( )
init_config.input, label=f"Input file or directory. {INPUT_HELP}" enable_xformers = gr.Checkbox(
) init_config.enable_xformers, label=f"{ENABLE_XFORMERS_HELP}"
output_dir = gr.Textbox( )
init_config.output_dir, label=f"Output directory. {OUTPUT_DIR_HELP}" local_files_only = gr.Checkbox(
) init_config.local_files_only, label=f"{LOCAL_FILES_ONLY_HELP}"
)
save_btn.click( save_btn.click(
save_config, save_config,
[ [
@ -149,6 +163,7 @@ def main(config_file: str):
model_dir, model_dir,
input, input,
output_dir, output_dir,
quality,
], ],
message, message,
) )