Spaces:
Running on Zero
Running on Zero
| import gradio as gr | |
| import config | |
| import face_swapper | |
| def render_cpu_tools(input_img): | |
| with gr.Accordion("🛠️ Standalone Image Face Swapper & GFPGAN Restoration Tool", open=True): | |
| with gr.Row(): | |
| tool_target_img = gr.Image(type="pil", label="Target Image to Swap / Enhance", sources=["upload", "clipboard"], height=180) | |
| tool_ref_img = gr.Image(type="pil", label="Reference Face Image (Optional)", sources=["upload", "clipboard"], height=180) | |
| with gr.Row(): | |
| tool_gender_dropdown = gr.Dropdown( | |
| choices=["Any / All Faces", "Female Faces Only", "Male Faces Only"], | |
| value="Any / All Faces", | |
| label="👥 Target Gender to Swap" | |
| ) | |
| tool_gfpgan_checkbox = gr.Checkbox( | |
| label="✨ Enhance Face Detail (GFPGAN v1.4)", | |
| value=True, | |
| info="Sharpens blurry facial details via GFPGAN restoration" | |
| ) | |
| with gr.Row(): | |
| tool_swap_btn = gr.Button("🚀 Swap Single Image Face (CPU)", variant="primary") | |
| tool_enhance_only_btn = gr.Button("✨ Enhance Face Only (GFPGAN v1.4)", variant="secondary") | |
| tool_result_img = gr.Image(type="pil", label="Result Image (Swapped / Enhanced)", interactive=False, height=200) | |
| tool_send_btn = gr.Button("📸 Send Result Image to Main Video Input", variant="secondary") | |
| def run_standalone_swap(target_img, ref_img, gender, enhance_gfpgan): | |
| if target_img is None: | |
| raise gr.Error("Please upload a target image to swap.") | |
| return face_swapper.swap_face_in_single_image(target_img, ref_img, gender, enhance_with_gfpgan=enhance_gfpgan) | |
| def run_standalone_face_enhance(target_img): | |
| if target_img is None: | |
| raise gr.Error("Please upload an image to enhance.") | |
| res = face_swapper.call_sulphur_enhance_face_api(target_img) | |
| if res is None: | |
| raise gr.Error("Sulphur AI GFPGAN Face Enhance API is offline or not configured.") | |
| return res | |
| tool_swap_btn.click( | |
| fn=run_standalone_swap, | |
| inputs=[tool_target_img, tool_ref_img, tool_gender_dropdown, tool_gfpgan_checkbox], | |
| outputs=[tool_result_img] | |
| ) | |
| tool_enhance_only_btn.click( | |
| fn=run_standalone_face_enhance, | |
| inputs=[tool_target_img], | |
| outputs=[tool_result_img] | |
| ) | |
| tool_send_btn.click( | |
| fn=lambda img: img, | |
| inputs=[tool_result_img], | |
| outputs=[input_img] | |
| ) | |
| return { | |
| "tool_target_img": tool_target_img, | |
| "tool_ref_img": tool_ref_img, | |
| "tool_gender_dropdown": tool_gender_dropdown, | |
| "tool_gfpgan_checkbox": tool_gfpgan_checkbox, | |
| "tool_swap_btn": tool_swap_btn, | |
| "tool_enhance_only_btn": tool_enhance_only_btn, | |
| "tool_result_img": tool_result_img, | |
| "tool_send_btn": tool_send_btn | |
| } | |