TheEeeeLin's picture
update retinaface
402b504
raw
history blame
20.8 kB
import gradio as gr
import os
import pathlib
from demo.locals import LOCALES
from hivision.creator.choose_handler import FACE_DETECT_MODELS
def load_description(fp):
with open(fp, "r", encoding="utf-8") as f:
content = f.read()
return content
def create_ui(
processor, root_dir, human_matting_models: list, face_detect_models: list
):
DEFAULT_LANG = "zh"
DEFAULT_HUMAN_MATTING_MODEL = "modnet_photographic_portrait_matting"
DEFAULT_FACE_DETECT_MODEL = "mtcnn"
if DEFAULT_HUMAN_MATTING_MODEL in human_matting_models:
human_matting_models.remove(DEFAULT_HUMAN_MATTING_MODEL)
human_matting_models.insert(0, DEFAULT_HUMAN_MATTING_MODEL)
css = """
#col-left {
margin: 0 auto;
max-width: 430px;
}
#col-mid {
margin: 0 auto;
max-width: 430px;
}
#col-right {
margin: 0 auto;
max-width: 430px;
}
#col-showcase {
margin: 0 auto;
max-width: 1100px;
}
#button {
color: blue;
}
"""
demo = gr.Blocks(title="HivisionIDPhotos", css=css)
with demo:
gr.HTML(load_description(os.path.join(root_dir, "assets/title.md")))
with gr.Row():
# ------------ 左半边 UI ----------------
with gr.Column():
img_input = gr.Image(height=400)
with gr.Row():
# 语言选择器
language = ["zh", "en"]
language_options = gr.Dropdown(
choices=language,
label="Language",
value=DEFAULT_LANG,
)
face_detect_model_options = gr.Dropdown(
choices=face_detect_models,
label=LOCALES["face_model"][DEFAULT_LANG]["label"],
value=DEFAULT_FACE_DETECT_MODEL,
)
matting_model_options = gr.Dropdown(
choices=human_matting_models,
label=LOCALES["matting_model"][DEFAULT_LANG]["label"],
value=human_matting_models[0],
)
with gr.Tab(
LOCALES["key_param"][DEFAULT_LANG]["label"]
) as key_parameter_tab:
mode_options = gr.Radio(
choices=LOCALES["size_mode"][DEFAULT_LANG]["choices"],
label=LOCALES["size_mode"][DEFAULT_LANG]["label"],
value=LOCALES["size_mode"][DEFAULT_LANG]["choices"][0],
)
with gr.Row(visible=True) as size_list_row:
size_list_options = gr.Dropdown(
choices=LOCALES["size_list"][DEFAULT_LANG]["choices"],
label="预设尺寸",
value=LOCALES["size_list"][DEFAULT_LANG]["choices"][0],
elem_id="size_list",
)
with gr.Row(visible=False) as custom_size:
custom_size_height = gr.Number(
value=413, label="height", interactive=True
)
custom_size_width = gr.Number(
value=295, label="width", interactive=True
)
color_options = gr.Radio(
choices=LOCALES["bg_color"][DEFAULT_LANG]["choices"],
label=LOCALES["bg_color"][DEFAULT_LANG]["label"],
value=LOCALES["bg_color"][DEFAULT_LANG]["choices"][0],
)
with gr.Row(visible=False) as custom_color:
custom_color_R = gr.Number(value=0, label="R", interactive=True)
custom_color_G = gr.Number(value=0, label="G", interactive=True)
custom_color_B = gr.Number(value=0, label="B", interactive=True)
render_options = gr.Radio(
choices=LOCALES["render_mode"][DEFAULT_LANG]["choices"],
label=LOCALES["render_mode"][DEFAULT_LANG]["label"],
value=LOCALES["render_mode"][DEFAULT_LANG]["choices"][0],
)
with gr.Tab(
LOCALES["advance_param"][DEFAULT_LANG]["label"]
) as advance_parameter_tab:
head_measure_ratio_option = gr.Slider(
minimum=0.1,
maximum=0.5,
value=0.2,
step=0.01,
label=LOCALES["head_measure_ratio"][DEFAULT_LANG]["label"],
interactive=True,
)
top_distance_option = gr.Slider(
minimum=0.02,
maximum=0.5,
value=0.12,
step=0.01,
label=LOCALES["top_distance"][DEFAULT_LANG]["label"],
interactive=True,
)
image_kb_options = gr.Radio(
choices=LOCALES["image_kb"][DEFAULT_LANG]["choices"],
label=LOCALES["image_kb"][DEFAULT_LANG]["label"],
value=LOCALES["image_kb"][DEFAULT_LANG]["choices"][0],
)
with gr.Row(visible=False) as custom_image_kb:
custom_image_kb_size = gr.Slider(
minimum=10,
maximum=1000,
value=50,
label=LOCALES["image_kb_size"][DEFAULT_LANG]["label"],
interactive=True,
)
with gr.Tab(
LOCALES["watermark_tab"][DEFAULT_LANG]["label"]
) as watermark_parameter_tab:
watermark_options = gr.Radio(
choices=LOCALES["watermark_switch"][DEFAULT_LANG]["choices"],
label=LOCALES["watermark_switch"][DEFAULT_LANG]["label"],
value=LOCALES["watermark_switch"][DEFAULT_LANG]["choices"][0],
)
with gr.Row():
watermark_text_options = gr.Text(
max_length=20,
label=LOCALES["watermark_text"][DEFAULT_LANG]["label"],
value=LOCALES["watermark_text"][DEFAULT_LANG]["value"],
placeholder=LOCALES["watermark_text"][DEFAULT_LANG][
"placeholder"
],
interactive=False,
)
watermark_text_color = gr.ColorPicker(
label=LOCALES["watermark_color"][DEFAULT_LANG]["label"],
interactive=False,
value="#FFFFFF",
)
watermark_text_size = gr.Slider(
minimum=10,
maximum=100,
value=20,
label=LOCALES["watermark_size"][DEFAULT_LANG]["label"],
interactive=False,
step=1,
)
watermark_text_opacity = gr.Slider(
minimum=0,
maximum=1,
value=0.15,
label=LOCALES["watermark_opacity"][DEFAULT_LANG]["label"],
interactive=False,
step=0.01,
)
watermark_text_angle = gr.Slider(
minimum=0,
maximum=360,
value=30,
label=LOCALES["watermark_angle"][DEFAULT_LANG]["label"],
interactive=False,
step=1,
)
watermark_text_space = gr.Slider(
minimum=10,
maximum=200,
value=25,
label=LOCALES["watermark_space"][DEFAULT_LANG]["label"],
interactive=False,
step=1,
)
def update_watermark_text_visibility(choice, language):
return [
gr.update(
interactive=(
choice
== LOCALES["watermark_switch"][language]["choices"][
1
]
)
)
] * 6
watermark_options.change(
fn=update_watermark_text_visibility,
inputs=[watermark_options, language_options],
outputs=[
watermark_text_options,
watermark_text_color,
watermark_text_size,
watermark_text_opacity,
watermark_text_angle,
watermark_text_space,
],
)
img_but = gr.Button(LOCALES["button"][DEFAULT_LANG]["label"])
example_images = gr.Examples(
inputs=[img_input],
examples=[
[path.as_posix()]
for path in sorted(
pathlib.Path(os.path.join(root_dir, "demo/images")).rglob(
"*.jpg"
)
)
],
)
# ---------------- 右半边 UI ----------------
with gr.Column():
notification = gr.Text(
label=LOCALES["notification"][DEFAULT_LANG]["label"], visible=False
)
with gr.Row():
img_output_standard = gr.Image(
label=LOCALES["standard_photo"][DEFAULT_LANG]["label"],
height=350,
format="jpeg",
)
img_output_standard_hd = gr.Image(
label=LOCALES["hd_photo"][DEFAULT_LANG]["label"],
height=350,
format="jpeg",
)
img_output_layout = gr.Image(
label=LOCALES["layout_photo"][DEFAULT_LANG]["label"],
height=350,
format="jpeg",
)
file_download = gr.File(
label=LOCALES["download"][DEFAULT_LANG]["label"], visible=False
)
# ---------------- 设置隐藏/显示组件 ----------------
def change_language(language):
return {
face_detect_model_options: gr.update(
label=LOCALES["face_model"][language]["label"]
),
matting_model_options: gr.update(
label=LOCALES["matting_model"][language]["label"]
),
size_list_options: gr.update(
label=LOCALES["size_list"][language]["label"],
choices=LOCALES["size_list"][language]["choices"],
value=LOCALES["size_list"][language]["choices"][0],
),
mode_options: gr.update(
label=LOCALES["size_mode"][language]["label"],
choices=LOCALES["size_mode"][language]["choices"],
value=LOCALES["size_mode"][language]["choices"][0],
),
color_options: gr.update(
label=LOCALES["bg_color"][language]["label"],
choices=LOCALES["bg_color"][language]["choices"],
value=LOCALES["bg_color"][language]["choices"][0],
),
img_but: gr.update(value=LOCALES["button"][language]["label"]),
render_options: gr.update(
label=LOCALES["render_mode"][language]["label"],
choices=LOCALES["render_mode"][language]["choices"],
value=LOCALES["render_mode"][language]["choices"][0],
),
image_kb_options: gr.update(
label=LOCALES["image_kb_size"][language]["label"],
choices=LOCALES["image_kb"][language]["choices"],
value=LOCALES["image_kb"][language]["choices"][0],
),
custom_image_kb_size: gr.update(
label=LOCALES["image_kb"][language]["label"]
),
notification: gr.update(
label=LOCALES["notification"][language]["label"]
),
img_output_standard: gr.update(
label=LOCALES["standard_photo"][language]["label"]
),
img_output_standard_hd: gr.update(
label=LOCALES["hd_photo"][language]["label"]
),
img_output_layout: gr.update(
label=LOCALES["layout_photo"][language]["label"]
),
file_download: gr.update(
label=LOCALES["download"][language]["label"]
),
head_measure_ratio_option: gr.update(
label=LOCALES["head_measure_ratio"][language]["label"]
),
top_distance_option: gr.update(
label=LOCALES["top_distance"][language]["label"]
),
key_parameter_tab: gr.update(
label=LOCALES["key_param"][language]["label"]
),
advance_parameter_tab: gr.update(
label=LOCALES["advance_param"][language]["label"]
),
watermark_parameter_tab: gr.update(
label=LOCALES["watermark_tab"][language]["label"]
),
watermark_text_options: gr.update(
label=LOCALES["watermark_text"][language]["label"],
placeholder=LOCALES["watermark_text"][language]["placeholder"],
),
watermark_text_color: gr.update(
label=LOCALES["watermark_color"][language]["label"]
),
watermark_text_size: gr.update(
label=LOCALES["watermark_size"][language]["label"]
),
watermark_text_opacity: gr.update(
label=LOCALES["watermark_opacity"][language]["label"]
),
watermark_text_angle: gr.update(
label=LOCALES["watermark_angle"][language]["label"]
),
watermark_text_space: gr.update(
label=LOCALES["watermark_space"][language]["label"]
),
watermark_options: gr.update(
label=LOCALES["watermark_switch"][language]["label"],
choices=LOCALES["watermark_switch"][language]["choices"],
value=LOCALES["watermark_switch"][language]["choices"][0],
),
}
def change_color(colors):
if colors == "自定义底色" or colors == "Custom Color":
return {custom_color: gr.update(visible=True)}
else:
return {custom_color: gr.update(visible=False)}
def change_size_mode(size_option_item):
if (
size_option_item == "自定义尺寸"
or size_option_item == "Custom Size"
):
return {
custom_size: gr.update(visible=True),
size_list_row: gr.update(visible=False),
}
elif (
size_option_item == "只换底"
or size_option_item == "Only Change Background"
):
return {
custom_size: gr.update(visible=False),
size_list_row: gr.update(visible=False),
}
else:
return {
custom_size: gr.update(visible=False),
size_list_row: gr.update(visible=True),
}
def change_image_kb(image_kb_option):
if image_kb_option == "自定义" or image_kb_option == "Custom":
return {custom_image_kb: gr.update(visible=True)}
else:
return {custom_image_kb: gr.update(visible=False)}
# ---------------- 绑定事件 ----------------
language_options.input(
change_language,
inputs=[language_options],
outputs=[
size_list_options,
mode_options,
color_options,
img_but,
render_options,
image_kb_options,
matting_model_options,
face_detect_model_options,
custom_image_kb_size,
notification,
img_output_standard,
img_output_standard_hd,
img_output_layout,
file_download,
head_measure_ratio_option,
top_distance_option,
key_parameter_tab,
advance_parameter_tab,
watermark_parameter_tab,
watermark_text_options,
watermark_text_color,
watermark_text_size,
watermark_text_opacity,
watermark_text_angle,
watermark_text_space,
watermark_options,
],
)
color_options.input(
change_color, inputs=[color_options], outputs=[custom_color]
)
mode_options.input(
change_size_mode,
inputs=[mode_options],
outputs=[custom_size, size_list_row],
)
image_kb_options.input(
change_image_kb, inputs=[image_kb_options], outputs=[custom_image_kb]
)
img_but.click(
processor.process,
inputs=[
img_input,
mode_options,
size_list_options,
color_options,
render_options,
image_kb_options,
custom_color_R,
custom_color_G,
custom_color_B,
custom_size_height,
custom_size_width,
custom_image_kb_size,
language_options,
matting_model_options,
watermark_options,
watermark_text_options,
watermark_text_color,
watermark_text_size,
watermark_text_opacity,
watermark_text_angle,
watermark_text_space,
face_detect_model_options,
head_measure_ratio_option,
top_distance_option,
],
outputs=[
img_output_standard,
img_output_standard_hd,
img_output_layout,
notification,
file_download,
],
)
return demo