Spaces:
Running
on
Zero
Running
on
Zero
| import os | |
| # Ensure DeepFashion2 model is downloaded early | |
| MODEL_URL = "https://huggingface.co/Bingsu/adetailer/resolve/main/deepfashion2_yolov8s-seg.pt" | |
| MODEL_PATH = "deepfashion2_yolov8s-seg.pt" | |
| if not os.path.exists(MODEL_PATH): | |
| import urllib.request | |
| print("[INFO] Downloading DeepFashion2 YOLOv8 model...") | |
| urllib.request.urlretrieve(MODEL_URL, MODEL_PATH) | |
| print("[INFO] Model downloaded.") | |
| import traceback | |
| from datetime import datetime | |
| import torch, gc | |
| from PIL import Image | |
| import gradio as gr | |
| from inference import generate_with_lora | |
| from background_edit import run_background_removal_and_inpaint, run_clothing_inpaint | |
| # βββββββββββββββ Helpers βββββββββββββββ | |
| def _print_trace(): | |
| traceback.print_exc() | |
| def unload_models(): | |
| torch.cuda.empty_cache() | |
| gc.collect() | |
| def safe_generate_all_steps( | |
| image, | |
| prompt_1, neg_1, strength_1, guidance_1, | |
| prompt_2, neg_2, guidance_2, | |
| prompt_3, neg_3, guidance_3 | |
| ): | |
| try: | |
| if image is None: | |
| raise gr.Error("Please upload an image first.") | |
| # Step 1: Headshot Refinement | |
| print("[INFO] Step 1: Refining headshot...", flush=True) | |
| refined = generate_with_lora( | |
| image=image, | |
| prompt=prompt_1, | |
| negative_prompt=neg_1, | |
| strength=strength_1, | |
| guidance_scale=guidance_1, | |
| ) | |
| # Save intermediate result to disk | |
| os.makedirs("./outputs", exist_ok=True) | |
| ts = datetime.now().strftime("%Y%m%d_%H%M%S") | |
| path = f"./outputs/step1_result_{ts}.png" | |
| refined.save(path) | |
| # Step 2: Background Inpainting | |
| print("[INFO] Step 2: Inpainting background...", flush=True) | |
| unload_models() | |
| with_bg = run_background_removal_and_inpaint( | |
| image_path=path, | |
| prompt=prompt_2, | |
| negative_prompt=neg_2, | |
| guidance_scale=guidance_2 | |
| ) | |
| # Step 3: Clothing Inpainting | |
| print("[INFO] Step 3: Inpainting clothing...", flush=True) | |
| final, err = run_clothing_inpaint( | |
| with_bg, | |
| prompt_3, | |
| neg_3, | |
| guidance_3 | |
| ) | |
| if err: | |
| return refined, with_bg, None, err | |
| return refined, with_bg, final, "" | |
| except gr.Error as e: | |
| return None, None, None, f"π {str(e)}" | |
| except Exception as e: | |
| import traceback | |
| trace = traceback.format_exc() | |
| print("[ERROR]", trace) | |
| return None, None, None, f"β Unexpected Error: {type(e).__name__}: {str(e)}\n{trace}" | |
| # βββββββββββββββ Gradio UI βββββββββββββββ | |
| with gr.Blocks() as demo: | |
| gr.Markdown("## π§ Full Headshot + Background + Clothing Generator (One Click)") | |
| with gr.Row(): | |
| input_image = gr.Image(type="pil", label="Upload Headshot") | |
| gr.Markdown("### Step 1: Headshot Refinement (LoRA)") | |
| with gr.Row(): | |
| prompt_1 = gr.Textbox(label="Headshot Prompt", value="a professional corporate headshot of a confident woman in her 30s with blow dried hair, natural smile, soft lighting, clean studio background, realistic photo, high detail, shallow depth of field") | |
| neg_1 = gr.Textbox(label="Headshot Negative Prompt", value="cartoon, anime, painting, illustration, low quality, overexposed, distorted face, exaggerated features, blurry background") | |
| with gr.Row(): | |
| strength_1 = gr.Slider(0.1, 1.0, value=0.2, step=0.05, label="Refinement Strength") | |
| guidance_1 = gr.Slider(1, 20, value=17, step=0.5, label="Guidance Scale (Headshot)") | |
| gr.Markdown("### Step 2: Background Inpainting (SDXL)") | |
| with gr.Row(): | |
| prompt_2 = gr.Textbox(label="Background Prompt", value="modern startup office, open-plan layout, natural daylight, glass walls, minimalistic decor, desks with computers, warm soft lighting, realistic environment") | |
| neg_2 = gr.Textbox(label="Background Negative Prompt", value="cluttered space, fantasy architecture, cartoon, low-res textures, empty background, distorted shapes, harsh shadowsh") | |
| with gr.Row(): | |
| guidance_2 = gr.Slider(1, 20, value=10, step=0.5, label="Guidance Scale (Background)") | |
| gr.Markdown("### Step 3: Clothing Replacement") | |
| with gr.Row(): | |
| prompt_3 = gr.Textbox(label="Clothing Prompt", value="tailored women's business suit, white blouse, blazer and pencil skirt, elegant corporate style, modern, professional lighting") | |
| neg_3 = gr.Textbox(label="Clothing Negative Prompt", value="casual clothes, hoodie, jeans, fantasy outfit, cartoon, distorted textures, glitch, unrealistic proportions") | |
| with gr.Row(): | |
| guidance_3 = gr.Slider(1, 20, value=17.0, step=0.5, label="Clothing Guidance Scale") | |
| go_btn = gr.Button("β¨ Run Full Pipeline (All 3 Steps)") | |
| with gr.Row(): | |
| output_refined = gr.Image(type="pil", label="Step 1: Refined Headshot") | |
| output_bg = gr.Image(type="pil", label="Step 2: With New Background") | |
| output_final = gr.Image(type="pil", label="Step 3: Final with New Clothing") | |
| error_box = gr.Markdown(label="Error", value="", visible=True) | |
| go_btn.click( | |
| fn=safe_generate_all_steps, | |
| inputs=[ | |
| input_image, | |
| prompt_1, neg_1, strength_1, guidance_1, | |
| prompt_2, neg_2, guidance_2, | |
| prompt_3, neg_3, guidance_3 | |
| ], | |
| outputs=[output_refined, output_bg, output_final, error_box] | |
| ) | |
| demo.launch(debug=True) | |