File size: 2,157 Bytes
86def46
 
43555c1
 
86def46
43555c1
 
 
86def46
43555c1
86def46
43555c1
 
 
 
 
 
86def46
 
43555c1
 
86def46
43555c1
86def46
af1df58
43555c1
 
af1df58
43555c1
 
 
 
 
 
 
 
 
 
86def46
43555c1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
from PIL import Image
from diffusers import StableDiffusionImg2ImgPipeline
import torch

# 1. Cargar el modelo ligero (Solo se ejecuta una vez al iniciar el Space)
model_id = "runwayml/stable-diffusion-v1-5" 
device = "cuda" if torch.cuda.is_available() else "cpu"

# Usamos StableDiffusionImg2ImgPipeline para Image-to-Image
try:
    pipe = StableDiffusionImg2ImgPipeline.from_pretrained(model_id, torch_dtype=torch.float16)
    pipe = pipe.to(device)
except:
    # Fallback si no hay GPU o si falla la carga con float16
    pipe = StableDiffusionImg2ImgPipeline.from_pretrained(model_id)
    pipe = pipe.to(device)


# 2. Función de procesamiento (Aquí se ejecuta la inferencia)
def convert_to_bn_diffusion(input_image: Image.Image, prompt: str, strength: float) -> Image.Image:
    """
    Ejecuta el pipeline de difusión I2I para estilizar la imagen.
    """
    
    # Aseguramos que la imagen esté en RGB y redimensionamos si es necesario
    input_image = input_image.convert("RGB").resize((512, 512))
    
    # Prompt forzando el estilo monocromático
    bn_prompt = f"{prompt}, high contrast, black and white, monochrome, grayscale"

    # Generación (Inferencia)
    output_image = pipe(
        prompt=bn_prompt,
        image=input_image,
        strength=strength, # Cuanto más alto, más se transforma (más BN)
        guidance_scale=7.5
    ).images[0]
    
    return output_image

# 3. Interfaz de Gradio
iface = gr.Interface(
    fn=convert_to_bn_diffusion,
    inputs=[
        gr.Image(type="pil", label="Sube tu imagen (se redimensionará a 512x512)"),
        gr.Textbox(label="Prompt adicional (ej: 'a moody photo', 'vintage style')", value="A sharp, detailed photograph"),
        gr.Slider(minimum=0.5, maximum=1.0, step=0.05, value=0.9, label="Fuerza de Estilización (Strength - Cuánto se convierte a B/N)")
    ],
    outputs="image",
    title="Conversor a B/N con Modelo de Difusión (Img2Img)",
    description="Sube una imagen y el modelo Stable Diffusion intentará convertirla a blanco y negro basado en el prompt y la fuerza de estilización."
)

if __name__ == "__main__":
    iface.launch()