Spaces:
No application file
No application file
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) |