File size: 3,939 Bytes
86def46
 
 
 
 
b5cab04
17f82c7
b5cab04
1723bed
b5cab04
86def46
b5cab04
 
86def46
af1df58
86def46
b5cab04
17f82c7
 
 
1723bed
b5cab04
1723bed
b5cab04
af1df58
86def46
1723bed
 
86def46
 
 
17f82c7
86def46
17f82c7
86def46
17f82c7
af1df58
1723bed
17f82c7
86def46
af1df58
 
 
b5cab04
 
af1df58
86def46
b5cab04
 
 
 
86def46
 
 
 
b5cab04
 
 
17f82c7
b5cab04
17f82c7
86def46
 
17f82c7
86def46
 
 
1723bed
af1df58
86def46
 
 
 
af1df58
1723bed
17f82c7
86def46
 
 
b5cab04
86def46
 
b5cab04
 
86def46
 
 
 
 
 
 
 
 
 
 
af1df58
17f82c7
86def46
 
17f82c7
86def46
 
 
 
17f82c7
af1df58
86def46
 
 
17f82c7
 
86def46
 
 
 
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import gradio as gr
import torch
from diffusers import DiffusionPipeline
from PIL import Image

# --- Configuración del Modelo (Sencilla) ---

# Forzamos el dispositivo a CPU (para evitar errores de CUDA/VRAM)
device = "cpu"
dtype_config = torch.float32 

# Modelo Image-to-Image LucyEdit
model_id = "kpsss34/LucyEdit_hybrid" 

pipe = None
try:
    # Carga sencilla, sin device_map, sin aceleración avanzada
    pipe = DiffusionPipeline.from_pretrained(
        model_id, 
        torch_dtype=dtype_config, 
        use_safetensors=True
    ).to(device) 
    
    print("✅ Modelo LucyEdit cargado con éxito en la CPU.")

except Exception as e:
    print(f"❌ Error CRÍTICO al cargar el modelo: {e}")
    print("El modelo NO ha podido cargarse. Comprueba tu conexión o memoria RAM.")


# --- Función de Procesamiento con Difusión (i2i) ---
def procesar_con_difusion(imagen_entrada, estilo_radial):
    """
    Modifica la imagen usando el pipeline de difusión con el estilo radial seleccionado.
    """
    # Manejo de error de carga
    if pipe is None:
        # Devuelve el error si el modelo no se cargó correctamente
        return Image.new('RGB', (512, 512), color = 'red') 

    if imagen_entrada is None:
        return None 
    
    # 1. Prompt Base Fijo (Lo que debe hacer el modelo)
    prompt_base = "fotografía de alta calidad, retrato detallado, con estilo" 
    
    estilo_prompts = {
        # El prompt fijo + el modificador del estilo
        "Blanco y Negro (Monocromático)": ", monocromático, alto contraste, dramático, blanco y negro",
        "Alto Contraste y Saturación": ", colores vívidos, alto contraste, HDR, saturación extrema",
        "Original (Poco Ruido)": ", fotografía de alta calidad, realista, colores naturales, sutil",
    }
    
    full_prompt = prompt_base + estilo_prompts.get(estilo_radial, "")

    # 2. Fuerza de Difusión FIJA
    # Un valor alto (0.85) para asegurar que el efecto (B/N o contraste) se aplique bien.
    STRENGTH_FIJA = 0.85 
    
    # 3. Preprocesar la imagen (LucyEdit trabaja en 512x512)
    init_image = imagen_entrada.convert("RGB").resize((512, 512))
    
    try:
        # 4. Ejecutar el pipeline de difusión i2i
        image = pipe(
            prompt=full_prompt, 
            image=init_image, 
            strength=STRENGTH_FIJA, 
            guidance_scale=7.5    
        ).images[0] 
        
        return image
    except Exception as e:
        print(f"Error durante la ejecución del pipeline: {e}")
        # Devuelve un cuadro de error si el proceso falla
        return Image.new('RGB', (512, 512), color = 'red')


# --- Interfaz Gradio con gr.Blocks() ---
with gr.Blocks(title="LucyEdit Estilos Fijos") as demo:
    gr.Markdown(
        """
        # 🖼️ Tarea de Difusión (Image-to-Image) con LucyEdit
        Carga una imagen y selecciona un **Estilo Radial** (Blanco y Negro o Contraste) para que el modelo de difusión la transforme. 
        """
    )
    with gr.Row():
        with gr.Column(scale=1):
            image_input = gr.Image(
                type="pil", 
                label="1. Cargar Imagen Inicial",
            )
            
            estilo_radial = gr.Radio(
                ["Original (Poco Ruido)", "Blanco y Negro (Monocromático)", "Alto Contraste y Saturación"],
                label="2. Selecciona el Estilo de Transformación",
                value="Blanco y Negro (Monocromático)"
            )
            
            process_button = gr.Button("✨ Aplicar Difusión", variant="primary")
            
        with gr.Column(scale=1):
            image_output = gr.Image(
                type="pil",
                label="Imagen Transformada por Difusión",
                height=512 
            )
    
    process_button.click(
        fn=procesar_con_difusion, 
        inputs=[image_input, estilo_radial],
        outputs=image_output
    )

demo.launch(inbrowser=True)