Team Ai
Apppublic

vncgabriel/InstanceSegmentation

sourceHugging Faceapache-2.0updated 1y agoView on Hugging Face
0likes
app.py76 linesDownload Raw Back to root
1# app.py2 3import gradio as gr4import torch5import numpy as np6import torch.nn.functional as F7from PIL import Image8from huggingface_hub import hf_hub_download9from inference import load_model, predict10 11# 1) Descarga automática de los pesos desde el Model Hub12model_path = hf_hub_download(13    repo_id="vncgabriel/instancia-segmentation-model",14    filename="pytorch_model.bin",15    repo_type="model",16)17 18# 2) Carga el modelo (usa GPU si está disponible)19device = torch.device("cuda" if torch.cuda.is_available() else "cpu")20model = load_model(model_path, device)21model.eval()22 23def segmentar_imagen(image: Image.Image):24    """25    Recibe una PIL Image y devuelve:26      1) overlay: imagen original con máscara semitransparente en rojo27      2) pure: máscara pura en amarillo sobre fondo negro28    """29    # Preprocesado: RGB -> numpy [H,W,3] -> tensor [1,3,H,W]30    img = image.convert("RGB")31    arr = np.array(img, dtype=np.float32) / 255.032    tensor = torch.from_numpy(arr).permute(2,0,1).unsqueeze(0).to(device)33 34    # Padding a múltiplos de 32 (5 downsamples)35    _,_,H,W = tensor.shape36    pad_h = (32 - H % 32) % 3237    pad_w = (32 - W % 32) % 3238    tensor_p = F.pad(tensor, (0, pad_w, 0, pad_h), mode="reflect")39 40    # Inferencia41    with torch.no_grad():42        mask_p = model(tensor_p)[0,0]   # [H+pad, W+pad]43 44    # Binariza y recorta al tamaño original45    mask_np = (mask_p.cpu().numpy() > 0.5).astype(np.uint8) * 25546    mask = mask_np[:H, :W]47 48    # --- Overlay en rojo ---49    overlay = img.convert("RGBA")50    mask_img = Image.fromarray(mask).convert("L")51    capa_roja = Image.new("RGBA", overlay.size, (255, 0, 0, 100))52    overlay.paste(capa_roja, mask=mask_img)53 54    # --- Máscara pura en amarillo ---55    pure = Image.new("RGB", (W, H), (0, 0, 0))56    capa_amarilla = Image.new("RGB", (W, H), (255, 255, 0))57    pure.paste(capa_amarilla, mask=mask_img)58 59    return overlay, pure60 61# 3) Interfaz Gradio62iface = gr.Interface(63    fn=segmentar_imagen,64    inputs=gr.Image(type="pil", label="Imagen de entrada"),65    outputs=[66        gr.Image(type="pil", label="Overlay en rojo"),67        gr.Image(type="pil", label="Máscara pura en amarillo"),68    ],69    title="Segmentación de Instancias (Overlay + Máscara)",70    description="Sube una imagen y obtén la segmentación de instancias: overlay rojo y máscara amarilla.",71    live=True,72)73 74if __name__ == "__main__":75    iface.launch()76