psurmreqmer commited on
Commit
af1df58
·
1 Parent(s): 86def46
Files changed (1) hide show
  1. app6.py +62 -38
app6.py CHANGED
@@ -4,46 +4,71 @@ from diffusers import DiffusionPipeline
4
  from PIL import Image
5
 
6
  # --- Configuración del Modelo ---
7
- # Usa la GPU si está disponible, sino la CPU (SDXL será muy lento en CPU)
 
 
8
  device = "cuda" if torch.cuda.is_available() else "cpu"
9
- dtype_config = torch.bfloat16 if device == "cuda" else torch.float32 # bfloat16 solo para GPU modernas
 
10
 
11
- # Modelo Stable Diffusion XL Refiner para transformaciones de alta calidad
12
  model_id = "stabilityai/stable-diffusion-xl-refiner-1.0"
13
 
 
14
  try:
15
- # Usamos DiffusionPipeline para Image-to-Image (i2i)
16
- pipe = DiffusionPipeline.from_pretrained(
17
- model_id,
18
- torch_dtype=dtype_config,
19
- use_safetensors=True
20
- ).to(device)
21
- print(f"Modelo SDXL Refiner cargado en: {device.upper()}")
 
 
 
 
 
 
 
 
 
 
22
  except Exception as e:
23
- print(f"Error al cargar el modelo SDXL: {e}")
24
- pipe = None
 
25
 
26
 
27
  # --- Función de Procesamiento con Difusión (i2i) ---
28
- def procesar_con_sdxl(imagen_entrada, prompt_base, estilo_radial, strength_slider):
 
29
  """
30
- Aplica transformación i2i guiada por el prompt y el estilo radial seleccionado.
31
  """
32
- if pipe is None or imagen_entrada is None:
33
- return Image.new('RGB', (512, 512), color = 'red')
 
 
 
 
 
34
 
35
- # 1. Definir el prompt según el estilo radial seleccionado
 
 
 
 
 
36
  estilo_prompts = {
37
- "Blanco y Negro (Monocromático)": ", en alto contraste, blanco y negro, monocromático, dramático",
38
- "Alto Contraste y Saturación": ", colores vívidos, alto contraste, HDR, saturación extrema",
39
- "Original (Poco Ruido)": ", fotografía de alta calidad, realista, colores naturales",
40
  }
41
 
42
- # Combinar el prompt base del usuario con el estilo
43
  full_prompt = prompt_base + estilo_prompts.get(estilo_radial, "")
44
 
45
- # 2. Preprocesar la imagen (SDXL funciona bien con resoluciones más grandes)
46
- # Redimensionamos a 1024x1024, que es la resolución nativa de SDXL, para mejores resultados
47
  init_image = imagen_entrada.convert("RGB").resize((1024, 1024))
48
 
49
  try:
@@ -51,22 +76,24 @@ def procesar_con_sdxl(imagen_entrada, prompt_base, estilo_radial, strength_slide
51
  image = pipe(
52
  prompt=full_prompt,
53
  image=init_image,
54
- strength=strength_slider, # Fuerza de la modificación
55
- guidance_scale=7.5 # Qué tan estricto debe ser el modelo con el prompt
56
  ).images[0]
57
 
58
  return image
59
  except Exception as e:
60
- print(f"Error durante la difusión: {e}")
 
61
  return Image.new('RGB', (1024, 1024), color = 'red')
62
 
63
 
64
  # --- Interfaz Gradio con gr.Blocks() ---
65
- with gr.Blocks(title="SDXL Refiner con Controles Radiales") as demo:
66
  gr.Markdown(
67
  """
68
  # 🌟 Tarea con SDXL Refiner (Image-to-Image)
69
- Carga una imagen, define un **Prompt** y selecciona un **Estilo Radial** para que el modelo de difusión la transforme.
 
70
  """
71
  )
72
  with gr.Row():
@@ -77,15 +104,12 @@ with gr.Blocks(title="SDXL Refiner con Controles Radiales") as demo:
77
  label="1. Cargar Imagen Inicial",
78
  )
79
 
80
- prompt_input = gr.Textbox(
81
- label="2. Prompt Base (ej. Un gato mirando por la ventana)",
82
- value="Una foto de un gato mirando por la ventana"
83
- )
84
-
85
  # --- Control Radial (Radio Buttons) ---
86
  estilo_radial = gr.Radio(
87
  ["Original (Poco Ruido)", "Blanco y Negro (Monocromático)", "Alto Contraste y Saturación"],
88
- label="3. Selecciona el Estilo de Transformación",
89
  value="Original (Poco Ruido)"
90
  )
91
  # -----------------------------------
@@ -95,7 +119,7 @@ with gr.Blocks(title="SDXL Refiner con Controles Radiales") as demo:
95
  maximum=1.0,
96
  value=0.6,
97
  step=0.05,
98
- label="4. Fuerza de Difusión (Strength): 0.1=sutil, 1.0=cambio total"
99
  )
100
 
101
  process_button = gr.Button("✨ Aplicar Difusión SDXL", variant="primary")
@@ -105,13 +129,13 @@ with gr.Blocks(title="SDXL Refiner con Controles Radiales") as demo:
105
  image_output = gr.Image(
106
  type="pil",
107
  label="Imagen Transformada por SDXL",
108
- height=512 # Mostramos a 512, aunque la generación sea a 1024
109
  )
110
 
111
- # Conexión de la acción
112
  process_button.click(
113
  fn=procesar_con_sdxl,
114
- inputs=[image_input, prompt_input, estilo_radial, strength_slider],
115
  outputs=image_output
116
  )
117
 
 
4
  from PIL import Image
5
 
6
  # --- Configuración del Modelo ---
7
+ # NOTA IMPORTANTE: SDXL Refiner (stabilityai/stable-diffusion-xl-refiner-1.0)
8
+ # REQUIERE mucha VRAM (aprox. 12 GB). Si tu GPU no es potente o estás usando CPU,
9
+ # la carga fallará, el pipe será None, y por eso verás la imagen roja de error.
10
  device = "cuda" if torch.cuda.is_available() else "cpu"
11
+ # Usar float16/bfloat16 es solo para acelerar en GPU; si falla, volvemos a float32
12
+ dtype_config = torch.bfloat16 if device == "cuda" and torch.cuda.is_available() else torch.float32
13
 
14
+ # Modelo Stable Diffusion XL Refiner
15
  model_id = "stabilityai/stable-diffusion-xl-refiner-1.0"
16
 
17
+ pipe = None
18
  try:
19
+ if device == "cuda":
20
+ # Intentar cargar con aceleración
21
+ pipe = DiffusionPipeline.from_pretrained(
22
+ model_id,
23
+ torch_dtype=dtype_config,
24
+ use_safetensors=True
25
+ ).to(device)
26
+ else:
27
+ # Si es CPU, cargar solo en float32 (será LENTO, pero intentará funcionar)
28
+ pipe = DiffusionPipeline.from_pretrained(
29
+ model_id,
30
+ torch_dtype=torch.float32,
31
+ use_safetensors=True
32
+ ).to("cpu")
33
+
34
+ print(f"Modelo SDXL Refiner cargado con éxito en: {device.upper()}")
35
+
36
  except Exception as e:
37
+ print(f"Error CRÍTICO al cargar el modelo SDXL: {e}")
38
+ print("El modelo NO ha podido cargarse. Esto es la causa de la imagen roja.")
39
+ print("Solución: Usar un modelo mucho más pequeño o una GPU con más VRAM (min 8-12 GB).")
40
 
41
 
42
  # --- Función de Procesamiento con Difusión (i2i) ---
43
+ # Se eliminó 'prompt_base' de los argumentos, y lo definimos internamente
44
+ def procesar_con_sdxl(imagen_entrada, estilo_radial, strength_slider):
45
  """
46
+ Aplica transformación i2i guiada por el estilo radial seleccionado (sin prompt de usuario).
47
  """
48
+ # -----------------------------------------------------------------
49
+ # SOLUCIÓN DE IMAGEN ROJA: Verificar si el modelo se cargó primero.
50
+ if pipe is None:
51
+ error_text = "ERROR: El modelo SDXL no se pudo cargar (Falta VRAM o GPU potente)."
52
+ print(error_text)
53
+ return Image.new('RGB', (1024, 1024), color = 'red')
54
+ # -----------------------------------------------------------------
55
 
56
+ if imagen_entrada is None:
57
+ return None
58
+
59
+ # 1. Prompt Base Fijo (ya no lo escribe el usuario)
60
+ prompt_base = "fotografía de alta calidad, retrato detallado"
61
+
62
  estilo_prompts = {
63
+ "Blanco y Negro (Monocromático)": ", monocromático, alto contraste, película de 35mm, dramático",
64
+ "Alto Contraste y Saturación": ", colores vívidos, alto contraste, HDR, saturación extrema, cinematográfico",
65
+ "Original (Poco Ruido)": ", fotografía de alta calidad, realista, colores naturales, sutil",
66
  }
67
 
68
+ # Combinar el prompt base fijo con el estilo del radial
69
  full_prompt = prompt_base + estilo_prompts.get(estilo_radial, "")
70
 
71
+ # 2. Preprocesar la imagen
 
72
  init_image = imagen_entrada.convert("RGB").resize((1024, 1024))
73
 
74
  try:
 
76
  image = pipe(
77
  prompt=full_prompt,
78
  image=init_image,
79
+ strength=strength_slider,
80
+ guidance_scale=7.5
81
  ).images[0]
82
 
83
  return image
84
  except Exception as e:
85
+ print(f"Error durante la ejecución del pipeline: {e}")
86
+ # Devuelve un cuadro de error si el proceso falla
87
  return Image.new('RGB', (1024, 1024), color = 'red')
88
 
89
 
90
  # --- Interfaz Gradio con gr.Blocks() ---
91
+ with gr.Blocks(title="SDXL Refiner con Estilos Fijos") as demo:
92
  gr.Markdown(
93
  """
94
  # 🌟 Tarea con SDXL Refiner (Image-to-Image)
95
+ Carga una imagen y selecciona un **Estilo Radial** para que el modelo de difusión la transforme.
96
+ El Prompt ahora es **fijo** en el código.
97
  """
98
  )
99
  with gr.Row():
 
104
  label="1. Cargar Imagen Inicial",
105
  )
106
 
107
+ # ELIMINAMOS EL TEXTBOX DE PROMPT AQUÍ
108
+
 
 
 
109
  # --- Control Radial (Radio Buttons) ---
110
  estilo_radial = gr.Radio(
111
  ["Original (Poco Ruido)", "Blanco y Negro (Monocromático)", "Alto Contraste y Saturación"],
112
+ label="2. Selecciona el Estilo de Transformación",
113
  value="Original (Poco Ruido)"
114
  )
115
  # -----------------------------------
 
119
  maximum=1.0,
120
  value=0.6,
121
  step=0.05,
122
+ label="3. Fuerza de Difusión (Strength): 0.1=sutil, 1.0=cambio total"
123
  )
124
 
125
  process_button = gr.Button("✨ Aplicar Difusión SDXL", variant="primary")
 
129
  image_output = gr.Image(
130
  type="pil",
131
  label="Imagen Transformada por SDXL",
132
+ height=512
133
  )
134
 
135
+ # Conexión de la acción: ¡Cambiamos los inputs!
136
  process_button.click(
137
  fn=procesar_con_sdxl,
138
+ inputs=[image_input, estilo_radial, strength_slider], # Eliminamos el prompt_input
139
  outputs=image_output
140
  )
141