psurmreqmer commited on
Commit
1723bed
·
1 Parent(s): 17f82c7
Files changed (1) hide show
  1. app6.py +18 -24
app6.py CHANGED
@@ -3,39 +3,40 @@ import torch
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:
@@ -45,7 +46,6 @@ def procesar_con_difusion(imagen_entrada, estilo_radial):
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",
@@ -54,10 +54,10 @@ def procesar_con_difusion(imagen_entrada, estilo_radial):
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:
@@ -65,13 +65,14 @@ def procesar_con_difusion(imagen_entrada, estilo_radial):
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
 
@@ -81,30 +82,24 @@ with gr.Blocks(title="SD v1.5 Estilos Fijos") as demo:
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():
88
- # Lado izquierdo: Inputs y Controles
89
  with gr.Column(scale=1):
90
  image_input = gr.Image(
91
  type="pil",
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",
@@ -112,7 +107,6 @@ with gr.Blocks(title="SD v1.5 Estilos Fijos") as demo:
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],
 
3
  from diffusers import DiffusionPipeline
4
  from PIL import Image
5
 
6
+ # --- Configuración del Modelo (Forzado a CPU) ---
7
 
8
+ # Establecemos el dispositivo a CPU ya que CUDA no está disponible en tu entorno.
9
+ device = "cpu"
10
+ dtype_config = torch.float32 # Los modelos en CPU usan float32
11
 
12
+ # Usamos Stable Diffusion v1.5, el modelo más ligero que funciona bien.
13
  model_id = "runwayml/stable-diffusion-v1-5"
14
 
15
  pipe = None
16
  try:
17
+ # Carga sin accelerate (sin device_map) y forzando a CPU.
18
+ # Esto elimina las dependencias problemáticas de tu error.
19
  pipe = DiffusionPipeline.from_pretrained(
20
  model_id,
21
  torch_dtype=dtype_config,
22
+ use_safetensors=True
23
+ ).to(device) # <--- Forzamos la carga a la CPU
24
+
25
+ print("Modelo Stable Diffusion v1.5 cargado con éxito en la CPU.")
26
 
27
  except Exception as e:
28
+ print(f"Error CRÍTICO al cargar el modelo: {e}")
29
+ print("El modelo NO ha podido cargarse. Comprueba tu conexión o memoria RAM.")
30
 
31
 
32
  # --- Función de Procesamiento con Difusión (i2i) ---
 
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
+ # Devuelve el error si el modelo no se cargó correctamente
40
  return Image.new('RGB', (512, 512), color = 'red')
41
 
42
  if imagen_entrada is None:
 
46
  prompt_base = "fotografía de alta calidad, retrato detallado, foto con textura"
47
 
48
  estilo_prompts = {
 
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",
 
54
  full_prompt = prompt_base + estilo_prompts.get(estilo_radial, "")
55
 
56
  # 2. Fuerza de Difusión FIJA (strength):
 
57
  STRENGTH_FIJA = 0.9
58
 
59
  # 3. Preprocesar la imagen (SD v1.5 nativo es 512x512)
60
+ # Convertimos a RGB y redimensionamos
61
  init_image = imagen_entrada.convert("RGB").resize((512, 512))
62
 
63
  try:
 
65
  image = pipe(
66
  prompt=full_prompt,
67
  image=init_image,
68
+ strength=STRENGTH_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
+ # Devuelve un cuadro de error si el proceso falla
76
  return Image.new('RGB', (512, 512), color = 'red')
77
 
78
 
 
82
  """
83
  # ✅ Tarea de Difusión (Image-to-Image) con SD v1.5
84
  Carga una imagen y selecciona un **Estilo Radial** para que el modelo de difusión la transforme.
85
+ **NOTA:** La generación será lenta (varios minutos) ya que se ejecuta en CPU.
86
  """
87
  )
88
  with gr.Row():
 
89
  with gr.Column(scale=1):
90
  image_input = gr.Image(
91
  type="pil",
92
  label="1. Cargar Imagen Inicial",
93
  )
94
 
 
95
  estilo_radial = gr.Radio(
96
  ["Original (Poco Ruido)", "Blanco y Negro (Monocromático)", "Alto Contraste y Saturación"],
97
  label="2. Selecciona el Estilo de Transformación",
98
  value="Blanco y Negro (Monocromático)"
99
  )
 
 
 
100
 
101
  process_button = gr.Button("✨ Aplicar Difusión", variant="primary")
102
 
 
103
  with gr.Column(scale=1):
104
  image_output = gr.Image(
105
  type="pil",
 
107
  height=512
108
  )
109
 
 
110
  process_button.click(
111
  fn=procesar_con_difusion,
112
  inputs=[image_input, estilo_radial],