vncgabriel commited on
Commit
5db65e9
·
verified ·
1 Parent(s): 2618997

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +57 -39
app.py CHANGED
@@ -1,57 +1,75 @@
1
  # app.py
 
2
  import gradio as gr
3
  import torch
4
  import numpy as np
 
5
  from PIL import Image
6
  from huggingface_hub import hf_hub_download
7
  from inference import load_model, predict
8
- import traceback
9
 
10
- # 1) Baixa o peso do modelo do Hugging Face Model Hub
11
  model_path = hf_hub_download(
12
  repo_id="vncgabriel/instancia-segmentation-model",
13
  filename="pytorch_model.bin",
14
- repo_type="model"
15
  )
16
 
17
- # 2) Carrega o modelo (na CPU ou GPU)
18
  device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
19
- model = load_model(model_path, device=device)
20
-
21
- def segment_instance(image: Image.Image):
22
- try:
23
- # 3) Preprocessamento: PIL->numpy->[0,1]->tensor [C,H,W]
24
- img = image.convert("RGB") # garante 3 canais
25
- arr = np.array(img).astype(np.float32) / 255.0
26
- tensor = torch.from_numpy(arr).permute(2, 0, 1).to(device)
27
-
28
- # 4) Inferência
29
- mask = predict(model, tensor).cpu().numpy()
30
- mask = (mask > 0.5).astype(np.uint8) * 255 # binariza e escala
31
-
32
- # 5) Cria overlay vermelho semi-transparente
33
- overlay = img.convert("RGBA")
34
- mask_img = Image.fromarray(mask).convert("L")
35
- red_layer = Image.new("RGBA", overlay.size, (255, 0, 0, 100))
36
- overlay.paste(red_layer, mask=mask_img)
37
-
38
- return overlay
39
-
40
- except Exception as e:
41
- # Log completo para o console do Space
42
- print(traceback.format_exc())
43
- # Mostra mensagem de erro no frontend
44
- return None, str(e)
45
-
46
- # 6) Monta a interface
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  iface = gr.Interface(
48
- fn=segment_instance,
49
- inputs=gr.Image(type="pil", label="Input Image"),
50
- outputs=gr.Image(type="pil", label="Segmented Overlay"),
51
- title="Segmentação de Instâncias",
52
- description="Envie uma imagem e veja os objetos segmentados em vermelho."
 
 
 
 
53
  )
54
 
55
  if __name__ == "__main__":
56
- iface.launch(server_name="0.0.0.0", server_port=7860)
57
-
 
1
  # app.py
2
+
3
  import gradio as gr
4
  import torch
5
  import numpy as np
6
+ import torch.nn.functional as F
7
  from PIL import Image
8
  from huggingface_hub import hf_hub_download
9
  from inference import load_model, predict
 
10
 
11
+ # 1) Descarga automática de los pesos desde el Model Hub
12
  model_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)
19
  device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
20
+ model = load_model(model_path, device)
21
+ model.eval()
22
+
23
+ def segmentar_imagen(image: Image.Image):
24
+ """
25
+ Recibe una PIL Image y devuelve:
26
+ 1) overlay: imagen original con máscara semitransparente en rojo
27
+ 2) pure: máscara pura en amarillo sobre fondo negro
28
+ """
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.0
32
+ 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.shape
36
+ pad_h = (32 - H % 32) % 32
37
+ pad_w = (32 - W % 32) % 32
38
+ tensor_p = F.pad(tensor, (0, pad_w, 0, pad_h), mode="reflect")
39
+
40
+ # Inferencia
41
+ with torch.no_grad():
42
+ mask_p = model(tensor_p)[0,0] # [H+pad, W+pad]
43
+
44
+ # Binariza y recorta al tamaño original
45
+ mask_np = (mask_p.cpu().numpy() > 0.5).astype(np.uint8) * 255
46
+ 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, pure
60
+
61
+ # 3) Interfaz Gradio
62
  iface = 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
 
74
  if __name__ == "__main__":
75
+ iface.launch()