from glob import glob
import gradio as gr
from gradio_client import Client
from utils import make_flatten_background
REPO_ID = "leonelhs/faceshine"
clients = {
"GFPGAN": "leonelhs/GFPGAN",
"ZeroScratches": "leonelhs/ZeroScratches",
"Deoldify": "leonelhs/deoldify",
"EnhanceLight": "leonelhs/Zero-DCE",
"ZeroBackground": "leonelhs/rembg",
}
def load_client(space):
try:
return Client(space)
except ValueError as err:
print(err)
logger.value.append(f"Space: {space}, log: {err}")
pass
def gfpgan_face(image, version, scale):
return clients["GFPGAN"].predict(image, version, scale, fn_index=0)[0]
def zero_scratches(image):
return clients["ZeroScratches"].predict(image, api_name="/predict")
def colorize_photo(image):
return clients["Deoldify"].predict(image, api_name="/predict")
def enhance_light(image):
return clients["EnhanceLight"].predict(image, api_name="/predict")
def zero_background(image, new_bgr=None):
# Fixme: cant find predict function by name
# return clients["ZeroBackground"].predict(image, new_bgr, fn_index=0)[1]
# return clients["ZeroBackground"].predict(image, fn_index=0)
img, mask = clients["ZeroBackground"].predict(image, "U2NET Human Seg", False, fn_index=9)
return make_flatten_background(img, mask)
def parse_face(image):
return clients["FaceParser"].predict(image, api_name="/predict")
def mirror(x):
return x
def active_first():
return gr.Tabs.update(selected=0)
def clear():
return None, None
footer = r"""
This App is running on a CPU, help us to upgrade a GPU or just give us a Github ⭐
leonelhs@gmail.com
"""
with gr.Blocks(title="Face Shine") as app:
logger = gr.State(value=[])
for client, endpoint in clients.items():
clients[client] = load_client(endpoint)
with gr.Row():
gr.HTML("Face Shine
")
with gr.Tabs() as tabs:
with gr.TabItem("Photo restorer", id=0):
with gr.Row(equal_height=False):
with gr.Column(scale=1):
btn_eraser = gr.Button(value="Erase scratches")
btn_color = gr.Button(value="Colorize photo")
btn_hires = gr.Button(value="Enhance face")
btn_light = gr.Button(value="Enhance light")
btn_clear = gr.Button(value="Flatten background")
with gr.Column(scale=2):
with gr.Row():
img_input = gr.Image(label="Input", type="filepath")
with gr.Row():
btn_reset = gr.Button(value="Reset", variant="stop")
btn_swap = gr.Button(value="Ok", variant="primary")
with gr.Column(scale=2):
with gr.Row():
img_output = gr.Image(label="Result", type="filepath", interactive=False)
with gr.TabItem("Examples", id=1):
gr.Examples(examples=glob("lowres/*"), inputs=[img_input], label="Low resolution")
gr.Examples(examples=glob("gray/*"), inputs=[img_input], label="Gray scale")
gr.Examples(examples=glob("scratch/*"), inputs=[img_input], label="Scratched")
gr.Button(value="Ok", variant="primary").click(active_first, None, tabs)
with gr.TabItem("Settings", id=2):
with gr.Accordion("Image restoration settings", open=False):
enhancer = gr.Dropdown(['v1.2', 'v1.3', 'v1.4', 'RestoreFormer'],
label='GFPGAN face restoration algorithm',
type="value", value='RestoreFormer',
info="version")
rescale = gr.Dropdown(["1", "2", "3", "4"],
type="value", value="2", label="Rescaling factor")
with gr.Accordion("Logs info", open=False):
text_logger = gr.Textbox(label="login", lines=5, show_label=False)
gr.Button("Save settings")
btn_hires.click(gfpgan_face, inputs=[img_input, enhancer, rescale], outputs=[img_output])
btn_eraser.click(zero_scratches, inputs=[img_input], outputs=[img_output])
btn_color.click(colorize_photo, inputs=[img_input], outputs=[img_output])
btn_light.click(enhance_light, inputs=[img_input], outputs=[img_output])
btn_clear.click(zero_background, inputs=[img_input], outputs=[img_output])
btn_swap.click(mirror, inputs=[img_output], outputs=[img_input])
btn_reset.click(clear, outputs=[img_input, img_output])
with gr.Row():
gr.HTML(footer)
app.queue()
app.launch(share=False, debug=True, show_error=True)