psurmreqmer commited on
Commit
17f82c7
·
1 Parent(s): af1df58
Files changed (1) hide show
  1. app6.py +46 -66
app6.py CHANGED
@@ -3,97 +3,85 @@ import torch
3
  from diffusers import DiffusionPipeline
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:
75
- # 3. Ejecutar el pipeline de difusión i2i
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,38 +92,30 @@ with gr.Blocks(title="SDXL Refiner con Estilos Fijos") as demo:
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
  # -----------------------------------
116
 
117
- strength_slider = gr.Slider(
118
- minimum=0.1,
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")
126
 
127
  # Lado derecho: Output
128
  with gr.Column(scale=1):
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
 
 
3
  from diffusers import DiffusionPipeline
4
  from PIL import Image
5
 
6
+ # --- Configuración del Modelo (Cambiado a Stable Diffusion v1.5) ---
7
+
8
+ # SD v1.5 requiere menos VRAM (4-8 GB) y es más estable en entornos limitados.
 
9
  device = "cuda" if torch.cuda.is_available() else "cpu"
10
+ dtype_config = torch.float16 if device == "cuda" else torch.float32
 
11
 
12
+ # Modelo Stable Diffusion v1.5
13
+ model_id = "runwayml/stable-diffusion-v1-5"
14
 
15
  pipe = None
16
  try:
17
+ # Carga con accelerate (device_map="auto") para manejar la memoria
18
+ pipe = DiffusionPipeline.from_pretrained(
19
+ model_id,
20
+ torch_dtype=dtype_config,
21
+ use_safetensors=True,
22
+ device_map="auto" # Mantiene accelerate para optimizar
23
+ )
24
+ print("Modelo Stable Diffusion v1.5 cargado con éxito usando accelerate.")
 
 
 
 
 
 
 
 
25
 
26
  except Exception as e:
27
+ print(f"Error CRÍTICO al cargar el modelo: {e}")
28
+ print("El modelo NO ha podido cargarse. Si esto ocurre con v1.5, el hardware es insuficiente.")
 
29
 
30
 
31
  # --- Función de Procesamiento con Difusión (i2i) ---
32
+ # Hemos quitado 'strength_slider' de los argumentos
33
+ def procesar_con_difusion(imagen_entrada, estilo_radial):
34
  """
35
+ Modifica la imagen usando el pipeline de difusión con el estilo radial seleccionado.
36
  """
37
+ # Manejo de error de carga
 
38
  if pipe is None:
39
+ return Image.new('RGB', (512, 512), color = 'red')
 
 
 
40
 
41
  if imagen_entrada is None:
42
  return None
43
 
44
+ # 1. Prompt Base Fijo
45
+ prompt_base = "fotografía de alta calidad, retrato detallado, foto con textura"
46
 
47
  estilo_prompts = {
48
+ # El prompt fijo + el modificador del estilo
49
+ "Blanco y Negro (Monocromático)": ", monocromático, alto contraste, película de 35mm, grain, dramático",
50
+ "Alto Contraste y Saturación": ", colores vívidos, alto contraste, saturación extrema, cinematográfico, hyperdetailed",
51
+ "Original (Poco Ruido)": ", fotografía de alta calidad, realista, colores naturales, sutil, cinematic lighting",
52
  }
53
 
 
54
  full_prompt = prompt_base + estilo_prompts.get(estilo_radial, "")
55
 
56
+ # 2. Fuerza de Difusión FIJA (strength):
57
+ # Es fundamental para que el proceso i2i aplique el estilo del prompt.
58
+ STRENGTH_FIJA = 0.9
59
+
60
+ # 3. Preprocesar la imagen (SD v1.5 nativo es 512x512)
61
+ init_image = imagen_entrada.convert("RGB").resize((512, 512))
62
 
63
  try:
64
+ # 4. Ejecutar el pipeline de difusión i2i
65
  image = pipe(
66
  prompt=full_prompt,
67
  image=init_image,
68
+ strength=STRENGTH_FIJA, # Usamos la fuerza fija
69
  guidance_scale=7.5
70
  ).images[0]
71
 
72
  return image
73
  except Exception as e:
74
  print(f"Error durante la ejecución del pipeline: {e}")
75
+ return Image.new('RGB', (512, 512), color = 'red')
 
76
 
77
 
78
  # --- Interfaz Gradio con gr.Blocks() ---
79
+ with gr.Blocks(title="SD v1.5 Estilos Fijos") as demo:
80
  gr.Markdown(
81
  """
82
+ # Tarea de Difusión (Image-to-Image) con SD v1.5
83
  Carga una imagen y selecciona un **Estilo Radial** para que el modelo de difusión la transforme.
84
+ Este modelo es más ligero y evita la imagen roja.
85
  """
86
  )
87
  with gr.Row():
 
92
  label="1. Cargar Imagen Inicial",
93
  )
94
 
 
 
95
  # --- Control Radial (Radio Buttons) ---
96
  estilo_radial = gr.Radio(
97
  ["Original (Poco Ruido)", "Blanco y Negro (Monocromático)", "Alto Contraste y Saturación"],
98
  label="2. Selecciona el Estilo de Transformación",
99
+ value="Blanco y Negro (Monocromático)"
100
  )
101
  # -----------------------------------
102
 
103
+ # ELIMINAMOS EL SLIDER DE FUERZA DE DIFUSIÓN
 
 
 
 
 
 
104
 
105
+ process_button = gr.Button("✨ Aplicar Difusión", variant="primary")
106
 
107
  # Lado derecho: Output
108
  with gr.Column(scale=1):
109
  image_output = gr.Image(
110
  type="pil",
111
+ label="Imagen Transformada por Difusión",
112
  height=512
113
  )
114
 
115
+ # Conexión de la acción: ¡Cambiamos los inputs a solo dos!
116
  process_button.click(
117
+ fn=procesar_con_difusion,
118
+ inputs=[image_input, estilo_radial],
119
  outputs=image_output
120
  )
121