File size: 2,811 Bytes
e3f6801
5ded1c9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e3f6801
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# app.py

# --- 🚨 CORREÇÃO DE EMERGÊNCIA: Garantir websockets >= 11.0.3 ANTES de importar qualquer coisa ---
import subprocess
import sys

def install_package(package):
    subprocess.check_call([sys.executable, "-m", "pip", "install", "--no-cache-dir", package])

try:
    import websockets
    # Verifica se o submódulo 'asyncio' existe (presente só a partir da v11+)
    if not hasattr(websockets, 'asyncio'):
        raise ImportError("Versão antiga do websockets detectada. Atualizando...")
except (ImportError, AttributeError):
    print("📦 Instalando websockets>=11.0.3...")
    install_package("websockets>=11.0.3")
    # Recarrega o módulo após instalação
    import importlib
    import websockets
    importlib.reload(websockets)
    print("✅ websockets atualizado com sucesso!")
# --- ✅ FIM DA CORREÇÃO ---

# Agora sim, importe o resto
import os
import gradio as gr
from utils.editor import run_pipeline
from PIL import Image
import io

DESCRIPTION = """
# 👗 Fashion Editor — Stable Diffusion + ControlNet (OpenPose)
Envie a foto da modelo e uma foto da peça (jaqueta, camiseta etc.). A ferramenta
irá alinhar a peça, extrair a pose e usar Stable Diffusion + ControlNet para gerar
a composição fotorrealista.
"""

examples = [
    # Você pode adicionar exemplos aqui (caminhos relativos dentro do repo) após fazer upload
]

def infer(model_image, garment_image, prompt_extra):
    """
    model_image: PIL.Image or numpy
    garment_image: PIL.Image or numpy
    prompt_extra: str - description tweaks
    """
    if model_image is None or garment_image is None:
        return None, "Envie as duas imagens (modelo e peça)."

    # run_pipeline retorna (pil_image_result, debug_info_dict)
    try:
        result, info = run_pipeline(model_image, garment_image, prompt_extra)
        return result, f"OK — steps: {info.get('steps')}, guidance: {info.get('guidance_scale')}"
    except Exception as e:
        return None, f"Erro durante a geração: {str(e)}"

with gr.Blocks(title="Fashion Editor (SD + ControlNet)") as demo:
    gr.Markdown(DESCRIPTION)
    with gr.Row():
        with gr.Column():
            model_input = gr.Image(label="Foto da Modelo", type="pil")
            garment_input = gr.Image(label="Foto da Peça (Roupa)", type="pil")
            prompt_extra = gr.Textbox(label="Prompt extra (opcional) — ex: 'leather biker jacket, black, shiny, realistic'", lines=2)
            run_button = gr.Button("Gerar Edição")
            status = gr.Textbox(label="Status / Informações", interactive=False)
        with gr.Column():
            output = gr.Image(label="Resultado (Final)")

    run_button.click(fn=infer, inputs=[model_input, garment_input, prompt_extra], outputs=[output, status])

if __name__ == "__main__":
    demo.launch()