DHEIVER commited on
Commit
3125630
1 Parent(s): 3eb0308

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +65 -22
app.py CHANGED
@@ -1,20 +1,14 @@
1
  import os
 
 
2
  import gradio as gr
3
  import torch
4
  import cv2
5
  import numpy as np
 
6
  import time
7
- from sklearn.cluster import KMeans
8
 
9
- # Carregar modelos pré-treinados
10
- models = {
11
- 'SE-RegUNet 4GF': torch.jit.load('./model/SERegUNet4GF.pt'),
12
- 'SE-RegUNet 16GF': torch.jit.load('./model/SERegUNet16GF.pt'),
13
- 'AngioNet': torch.jit.load('./model/AngioNet.pt'),
14
- 'EffUNet++ B5': torch.jit.load('./model/EffUNetppb5.pt'),
15
- 'Reg-SA-UNet++': torch.jit.load('./model/RegSAUnetpp.pt'),
16
- 'UNet3+': torch.jit.load('./model/UNet3plus.pt'),
17
- }
18
 
19
  # Função para ordenar e pré-processar a imagem de entrada
20
  def ordenar_e_preprocessar_imagem(img, modelo):
@@ -23,7 +17,43 @@ def ordenar_e_preprocessar_imagem(img, modelo):
23
  h, w = img.shape
24
  img_out = preprocessar_imagem(img, modelo)
25
  return img_out, h, w, img, ori
 
 
 
 
 
 
 
 
26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  def processar_imagem_de_entrada(img, modelo, pipe, salvar_resultado=False):
28
  try:
29
  # Faça uma cópia da imagem original
@@ -32,6 +62,9 @@ def processar_imagem_de_entrada(img, modelo, pipe, salvar_resultado=False):
32
  # Coloque o modelo na GPU (se disponível) e configure-o para modo de avaliação
33
  pipe = pipe.to(device).eval()
34
 
 
 
 
35
  # Pré-processe a imagem e obtenha informações de dimensão
36
  img, h, w, ori_gray, ori = ordenar_e_preprocessar_imagem(img, modelo)
37
 
@@ -44,6 +77,10 @@ def processar_imagem_de_entrada(img, modelo, pipe, salvar_resultado=False):
44
  img = torch.cat([img, img], dim=0)
45
  logit = np.round(torch.softmax(pipe.forward(img), dim=1).detach().cpu().numpy()[0, 0]).astype(np.uint8)
46
 
 
 
 
 
47
  # Redimensione o resultado, se necessário
48
  if h != 512 or w != 512:
49
  logit = cv2.resize(logit, (h, w))
@@ -60,27 +97,32 @@ def processar_imagem_de_entrada(img, modelo, pipe, salvar_resultado=False):
60
  nome_arquivo = os.path.join(caminho_salvar_resultado, f'resultado_{int(time.time())}.png')
61
  cv2.imwrite(nome_arquivo, img_out)
62
 
63
- return img_out
64
 
65
  except Exception as e:
66
  # Em caso de erro, retorne uma mensagem de erro
67
  return str(e)
68
 
 
 
 
 
 
 
 
 
 
69
 
70
- # Resto do código permanece inalterado
71
  def processar_imagem_de_entrada_wrapper(img, modelo, salvar_resultado=False):
72
- resultado, img_out, _, _, _ = processar_imagem_de_entrada(img, modelo, models[modelo], salvar_resultado)
73
-
74
- # Sobrepor a máscara na imagem original
75
- overlaid_img = cv2.addWeighted(img, 0.7, cv2.cvtColor(img_out, cv2.COLOR_GRAY2BGR), 0.3, 0)
76
-
77
- return resultado, overlaid_img
78
-
79
 
80
  # Inicializar a contagem de análises
81
  num_analises = 0
82
 
83
- # Criar a interface Gradio
84
  my_app = gr.Interface(
85
  fn=processar_imagem_de_entrada_wrapper,
86
  inputs=[
@@ -93,8 +135,9 @@ my_app = gr.Interface(
93
  description="Esta aplicação segmenta angiogramas coronarianos usando modelos de segmentação pré-treinados.",
94
  theme="default",
95
  layout="vertical",
96
- allow_flagging=False,
97
  )
98
 
99
  # Iniciar a interface Gradio
100
- my_app.launch()
 
 
1
  import os
2
+ os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
3
+
4
  import gradio as gr
5
  import torch
6
  import cv2
7
  import numpy as np
8
+ from preprocess import unsharp_masking
9
  import time
 
10
 
11
+ device = "cuda" if torch.cuda.is_available() else "cpu"
 
 
 
 
 
 
 
 
12
 
13
  # Função para ordenar e pré-processar a imagem de entrada
14
  def ordenar_e_preprocessar_imagem(img, modelo):
 
17
  h, w = img.shape
18
  img_out = preprocessar_imagem(img, modelo)
19
  return img_out, h, w, img, ori
20
+
21
+ # Função para pré-processar a imagem com base no modelo selecionado
22
+ def preprocessar_imagem(img, modelo='SE-RegUNet 4GF'):
23
+ # Redimensionar a imagem para 512x512
24
+ img = cv2.resize(img, (512, 512))
25
+
26
+ # Aplicar a máscara de nitidez à imagem
27
+ img = unsharp_masking(img).astype(np.uint8)
28
 
29
+ # Função auxiliar para normalizar a imagem
30
+ def normalizar_imagem(img):
31
+ return np.float32((img - img.min()) / (img.max() - img.min() + 1e-6))
32
+
33
+ if modelo == 'AngioNet' or modelo == 'UNet3+':
34
+ img = normalizar_imagem(img)
35
+ img_out = np.expand_dims(img, axis=0)
36
+ elif modelo == 'SE-RegUNet 4GF':
37
+ clahe1 = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
38
+ clahe2 = cv2.createCLAHE(clipLimit=8.0, tileGridSize=(8, 8))
39
+ image1 = clahe1.apply(img)
40
+ image2 = clahe2.apply(img)
41
+ img = normalizar_imagem(img)
42
+ image1 = normalizar_imagem(image1)
43
+ image2 = normalizar_imagem(image2)
44
+ img_out = np.stack((img, image1, image2), axis=0)
45
+ else:
46
+ clahe1 = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
47
+ image1 = clahe1.apply(img)
48
+ image1 = normalizar_imagem(image1)
49
+ img_out = np.stack((image1,) * 3, axis=0)
50
+
51
+ return img_out
52
+
53
+ # Caminho absoluto para a pasta de salvamento
54
+ caminho_salvar_resultado = "/Segmento_de_Angio_Coronariana_v5/Salvar Resultado"
55
+
56
+ # Função para processar a imagem de entrada
57
  def processar_imagem_de_entrada(img, modelo, pipe, salvar_resultado=False):
58
  try:
59
  # Faça uma cópia da imagem original
 
62
  # Coloque o modelo na GPU (se disponível) e configure-o para modo de avaliação
63
  pipe = pipe.to(device).eval()
64
 
65
+ # Registre o tempo de início
66
+ start = time.time()
67
+
68
  # Pré-processe a imagem e obtenha informações de dimensão
69
  img, h, w, ori_gray, ori = ordenar_e_preprocessar_imagem(img, modelo)
70
 
 
77
  img = torch.cat([img, img], dim=0)
78
  logit = np.round(torch.softmax(pipe.forward(img), dim=1).detach().cpu().numpy()[0, 0]).astype(np.uint8)
79
 
80
+ # Calcule o tempo decorrido
81
+ spent = time.time() - start
82
+ spent = f"{spent:.3f} segundos"
83
+
84
  # Redimensione o resultado, se necessário
85
  if h != 512 or w != 512:
86
  logit = cv2.resize(logit, (h, w))
 
97
  nome_arquivo = os.path.join(caminho_salvar_resultado, f'resultado_{int(time.time())}.png')
98
  cv2.imwrite(nome_arquivo, img_out)
99
 
100
+ return spent, img_out
101
 
102
  except Exception as e:
103
  # Em caso de erro, retorne uma mensagem de erro
104
  return str(e)
105
 
106
+ # Carregar modelos pré-treinados
107
+ models = {
108
+ 'SE-RegUNet 4GF': torch.jit.load('./model/SERegUNet4GF.pt'),
109
+ 'SE-RegUNet 16GF': torch.jit.load('./model/SERegUNet16GF.pt'),
110
+ 'AngioNet': torch.jit.load('./model/AngioNet.pt'),
111
+ 'EffUNet++ B5': torch.jit.load('./model/EffUNetppb5.pt'),
112
+ 'Reg-SA-UNet++': torch.jit.load('./model/RegSAUnetpp.pt'),
113
+ 'UNet3+': torch.jit.load('./model/UNet3plus.pt'),
114
+ }
115
 
116
+ # Função para processar a imagem de entrada com os campos extras removidos
117
  def processar_imagem_de_entrada_wrapper(img, modelo, salvar_resultado=False):
118
+ model = models[modelo]
119
+ resultado = processar_imagem_de_entrada(img, modelo, model, salvar_resultado)
120
+ return resultado
 
 
 
 
121
 
122
  # Inicializar a contagem de análises
123
  num_analises = 0
124
 
125
+ # Criar a interface Gradio sem os campos extras
126
  my_app = gr.Interface(
127
  fn=processar_imagem_de_entrada_wrapper,
128
  inputs=[
 
135
  description="Esta aplicação segmenta angiogramas coronarianos usando modelos de segmentação pré-treinados.",
136
  theme="default",
137
  layout="vertical",
138
+ allow_flagging="never", # Altere para uma string "auto", "manual" ou "never"
139
  )
140
 
141
  # Iniciar a interface Gradio
142
+ my_app.launch()
143
+