Spaces:
No application file
No application file
File size: 3,939 Bytes
86def46 b5cab04 17f82c7 b5cab04 1723bed b5cab04 86def46 b5cab04 86def46 af1df58 86def46 b5cab04 17f82c7 1723bed b5cab04 1723bed b5cab04 af1df58 86def46 1723bed 86def46 17f82c7 86def46 17f82c7 86def46 17f82c7 af1df58 1723bed 17f82c7 86def46 af1df58 b5cab04 af1df58 86def46 b5cab04 86def46 b5cab04 17f82c7 b5cab04 17f82c7 86def46 17f82c7 86def46 1723bed af1df58 86def46 af1df58 1723bed 17f82c7 86def46 b5cab04 86def46 b5cab04 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 |
import gradio as gr
import torch
from diffusers import DiffusionPipeline
from PIL import Image
# --- Configuración del Modelo (Sencilla) ---
# Forzamos el dispositivo a CPU (para evitar errores de CUDA/VRAM)
device = "cpu"
dtype_config = torch.float32
# Modelo Image-to-Image LucyEdit
model_id = "kpsss34/LucyEdit_hybrid"
pipe = None
try:
# Carga sencilla, sin device_map, sin aceleración avanzada
pipe = DiffusionPipeline.from_pretrained(
model_id,
torch_dtype=dtype_config,
use_safetensors=True
).to(device)
print("✅ Modelo LucyEdit 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 (Lo que debe hacer el modelo)
prompt_base = "fotografía de alta calidad, retrato detallado, con estilo"
estilo_prompts = {
# El prompt fijo + el modificador del estilo
"Blanco y Negro (Monocromático)": ", monocromático, alto contraste, dramático, blanco y negro",
"Alto Contraste y Saturación": ", colores vívidos, alto contraste, HDR, saturación extrema",
"Original (Poco Ruido)": ", fotografía de alta calidad, realista, colores naturales, sutil",
}
full_prompt = prompt_base + estilo_prompts.get(estilo_radial, "")
# 2. Fuerza de Difusión FIJA
# Un valor alto (0.85) para asegurar que el efecto (B/N o contraste) se aplique bien.
STRENGTH_FIJA = 0.85
# 3. Preprocesar la imagen (LucyEdit trabaja en 512x512)
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="LucyEdit Estilos Fijos") as demo:
gr.Markdown(
"""
# 🖼️ Tarea de Difusión (Image-to-Image) con LucyEdit
Carga una imagen y selecciona un **Estilo Radial** (Blanco y Negro o Contraste) para que el modelo de difusión la transforme.
"""
)
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) |