File size: 4,144 Bytes
86def46
 
 
 
 
1723bed
17f82c7
1723bed
 
 
86def46
1723bed
17f82c7
86def46
af1df58
86def46
1723bed
 
17f82c7
 
 
1723bed
 
 
 
af1df58
86def46
1723bed
 
86def46
 
 
17f82c7
86def46
17f82c7
86def46
17f82c7
af1df58
1723bed
17f82c7
86def46
af1df58
 
 
17f82c7
 
af1df58
86def46
17f82c7
 
 
86def46
 
 
 
17f82c7
 
 
 
1723bed
17f82c7
86def46
 
17f82c7
86def46
 
 
1723bed
af1df58
86def46
 
 
 
af1df58
1723bed
17f82c7
86def46
 
 
17f82c7
86def46
 
17f82c7
af1df58
1723bed
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
116
import gradio as gr
import torch
from diffusers import DiffusionPipeline
from PIL import Image

# --- Configuración del Modelo (Forzado a CPU) ---

# Establecemos el dispositivo a CPU ya que CUDA no está disponible en tu entorno.
device = "cpu"
dtype_config = torch.float32 # Los modelos en CPU usan float32

# Usamos Stable Diffusion v1.5, el modelo más ligero que funciona bien.
model_id = "runwayml/stable-diffusion-v1-5" 

pipe = None
try:
    # Carga sin accelerate (sin device_map) y forzando a CPU.
    # Esto elimina las dependencias problemáticas de tu error.
    pipe = DiffusionPipeline.from_pretrained(
        model_id, 
        torch_dtype=dtype_config, 
        use_safetensors=True
    ).to(device) # <--- Forzamos la carga a la CPU
    
    print("✅ Modelo Stable Diffusion v1.5 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
    prompt_base = "fotografía de alta calidad, retrato detallado, foto con textura" 
    
    estilo_prompts = {
        "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): 
    STRENGTH_FIJA = 0.9 
    
    # 3. Preprocesar la imagen (SD v1.5 nativo es 512x512)
    # Convertimos a RGB y redimensionamos
    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="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. 
        **NOTA:** La generación será lenta (varios minutos) ya que se ejecuta en CPU.
        """
    )
    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)