File size: 4,462 Bytes
86def46
 
 
 
 
17f82c7
 
 
86def46
17f82c7
86def46
17f82c7
 
86def46
af1df58
86def46
17f82c7
 
 
 
 
 
 
 
af1df58
86def46
17f82c7
 
86def46
 
 
17f82c7
 
86def46
17f82c7
86def46
17f82c7
af1df58
17f82c7
86def46
af1df58
 
 
17f82c7
 
af1df58
86def46
17f82c7
 
 
 
86def46
 
 
 
17f82c7
 
 
 
 
 
86def46
 
17f82c7
86def46
 
 
17f82c7
af1df58
86def46
 
 
 
af1df58
17f82c7
86def46
 
 
17f82c7
86def46
 
17f82c7
af1df58
17f82c7
86def46
 
 
 
 
 
 
 
 
 
 
 
 
af1df58
17f82c7
86def46
 
 
17f82c7
86def46
17f82c7
86def46
 
 
 
 
17f82c7
af1df58
86def46
 
17f82c7
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
116
117
118
119
120
121
122
import gradio as gr
import torch
from diffusers import DiffusionPipeline
from PIL import Image

# --- Configuración del Modelo (Cambiado a Stable Diffusion v1.5) ---

# SD v1.5 requiere menos VRAM (4-8 GB) y es más estable en entornos limitados.
device = "cuda" if torch.cuda.is_available() else "cpu"
dtype_config = torch.float16 if device == "cuda" else torch.float32 

# Modelo Stable Diffusion v1.5
model_id = "runwayml/stable-diffusion-v1-5" 

pipe = None
try:
    # Carga con accelerate (device_map="auto") para manejar la memoria
    pipe = DiffusionPipeline.from_pretrained(
        model_id, 
        torch_dtype=dtype_config, 
        use_safetensors=True,
        device_map="auto" # Mantiene accelerate para optimizar
    )
    print("Modelo Stable Diffusion v1.5 cargado con éxito usando accelerate.")

except Exception as e:
    print(f"Error CRÍTICO al cargar el modelo: {e}")
    print("El modelo NO ha podido cargarse. Si esto ocurre con v1.5, el hardware es insuficiente.")


# --- Función de Procesamiento con Difusión (i2i) ---
# Hemos quitado 'strength_slider' de los argumentos
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:
        return Image.new('RGB', (512, 512), color = 'red') 

    if imagen_entrada is None:
        return None 
    
    # 1. Prompt Base Fijo
    prompt_base = "fotografía de alta calidad, retrato detallado, foto con textura" 
    
    estilo_prompts = {
        # El prompt fijo + el modificador del estilo
        "Blanco y Negro (Monocromático)": ", monocromático, alto contraste, película de 35mm, grain, dramático",
        "Alto Contraste y Saturación": ", colores vívidos, alto contraste, saturación extrema, cinematográfico, hyperdetailed",
        "Original (Poco Ruido)": ", fotografía de alta calidad, realista, colores naturales, sutil, cinematic lighting",
    }
    
    full_prompt = prompt_base + estilo_prompts.get(estilo_radial, "")

    # 2. Fuerza de Difusión FIJA (strength): 
    # Es fundamental para que el proceso i2i aplique el estilo del prompt.
    STRENGTH_FIJA = 0.9 
    
    # 3. Preprocesar la imagen (SD v1.5 nativo es 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, # Usamos la fuerza fija
            guidance_scale=7.5    
        ).images[0] 
        
        return image
    except Exception as e:
        print(f"Error durante la ejecución del pipeline: {e}")
        return Image.new('RGB', (512, 512), color = 'red')


# --- Interfaz Gradio con gr.Blocks() ---
with gr.Blocks(title="SD v1.5 Estilos Fijos") as demo:
    gr.Markdown(
        """
        # ✅ Tarea de Difusión (Image-to-Image) con SD v1.5
        Carga una imagen y selecciona un **Estilo Radial** para que el modelo de difusión la transforme. 
        Este modelo es más ligero y evita la imagen roja.
        """
    )
    with gr.Row():
        # Lado izquierdo: Inputs y Controles
        with gr.Column(scale=1):
            image_input = gr.Image(
                type="pil", 
                label="1. Cargar Imagen Inicial",
            )
            
            # --- Control Radial (Radio Buttons) ---
            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)"
            )
            # -----------------------------------
            
            # ELIMINAMOS EL SLIDER DE FUERZA DE DIFUSIÓN
            
            process_button = gr.Button("✨ Aplicar Difusión", variant="primary")
            
        # Lado derecho: Output
        with gr.Column(scale=1):
            image_output = gr.Image(
                type="pil",
                label="Imagen Transformada por Difusión",
                height=512 
            )
    
    # Conexión de la acción: ¡Cambiamos los inputs a solo dos!
    process_button.click(
        fn=procesar_con_difusion, 
        inputs=[image_input, estilo_radial],
        outputs=image_output
    )

demo.launch(inbrowser=True)