DHEIVER commited on
Commit
b1bab45
1 Parent(s): 3cf72b4

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +79 -48
app.py CHANGED
@@ -24,16 +24,33 @@ def ordenar_e_preprocessar_imagem(img, modelo):
24
  def preprocessar_imagem(img, modelo='SE-RegUNet 4GF'):
25
  # Redimensionar a imagem para 512x512
26
  img = cv2.resize(img, (512, 512))
27
-
28
- # Normalizar a imagem
29
- img = img.astype(np.float32)
30
- img = (img - img.min()) / (img.max() - img.min() + 1e-6)
31
-
32
- # Aplicar o CLAHE
33
- if modelo == 'SE-RegUNet 4GF':
34
- img = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)).apply(img)
35
-
36
- return img
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
 
38
 
39
  import os
@@ -42,35 +59,55 @@ import os
42
  caminho_salvar_resultado = "/Segmento_de_Angio_Coronariana_v5/Salvar Resultado"
43
 
44
  # Função para processar a imagem de entrada
45
- def processar_imagem_de_entrada(img, modelo, pipe):
46
- """
47
- Processa uma imagem de entrada usando um modelo de segmentação pré-treinado.
48
-
49
- Args:
50
- img: Imagem de entrada (numpy array).
51
- modelo: Modelo de segmentação.
52
- pipe: Pipe de inferência do modelo.
53
-
54
- Returns:
55
- Tempo decorrido e imagem de saída.
56
- """
57
-
58
- # Pré-processe a imagem
59
- img, h, w = ordenar_e_preprocessar_imagem(img, modelo)
60
-
61
- # Execute a inferência do modelo
62
- with torch.no_grad():
63
- logit = pipe(img.unsqueeze(0).to(device))[0].argmax(dim=1).cpu().numpy()
 
 
 
 
 
 
 
64
 
65
- # Redimensione o resultado, se necessário
66
- if h != 512 or w != 512:
67
- logit = cv2.resize(logit, (h, w))
68
 
69
- # Crie a imagem de saída
70
- img_out = img.copy()
71
- img_out[logit] = 255
 
 
 
 
 
 
 
 
 
 
 
 
 
 
72
 
73
- return f"{time.time() - start:.3f} segundos", img_out
74
 
75
 
76
  # Carregar modelos pré-treinados
@@ -90,12 +127,9 @@ import numpy as np
90
  import cv2
91
  from sklearn.cluster import KMeans
92
 
93
- # ...
94
-
95
- # Função para processar a imagem de entrada e calcular as características dos clusters
96
  def processar_imagem_de_entrada_wrapper(img, modelo, salvar_resultado=False, nome_arquivo=None):
97
  model = models[modelo]
98
- resultado, img_out = processar_imagem_de_entrada(img, modelo, model) # Passe 'model' como 'pipe' aqui
99
 
100
  # Resto do código permanece inalterado
101
  kmeans = KMeans(n_clusters=2, random_state=0)
@@ -137,27 +171,24 @@ def processar_imagem_de_entrada_wrapper(img, modelo, salvar_resultado=False, nom
137
 
138
  return resultado, img_out, status_doenca, explanation, f"{num_analises} análises realizadas"
139
 
140
- # ...
141
-
142
- # Iniciar a interface Gradio
143
- my_app.launch()
144
-
145
 
146
  # Inicializar a contagem de análises
147
  num_analises = 0
148
 
149
- # Criar a interface Gradio
150
  # Criar a interface Gradio
151
  my_app = gr.Interface(
152
  fn=processar_imagem_de_entrada_wrapper,
153
  inputs=[
154
  gr.inputs.Image(label="Angiograma:", shape=(512, 512)),
155
  gr.inputs.Dropdown(['SE-RegUNet 4GF','SE-RegUNet 16GF', 'AngioNet', 'EffUNet++ B5', 'Reg-SA-UNet++', 'UNet3+'], label='Modelo', default='SE-RegUNet 4GF'),
 
156
  ],
157
  outputs=[
158
  gr.outputs.Label(label="Tempo decorrido"),
159
  gr.outputs.Image(type="numpy", label="Imagem de Saída"),
160
- gr.outputs.Label(label="Possui Doença ou não"),
 
 
161
  ],
162
  title="Segmentação de Angiograma Coronariano",
163
  description="Esta aplicação segmenta angiogramas coronarianos usando modelos de segmentação pré-treinados.",
@@ -167,4 +198,4 @@ my_app = gr.Interface(
167
  )
168
 
169
  # Iniciar a interface Gradio
170
- my_app.launch()
 
24
  def preprocessar_imagem(img, modelo='SE-RegUNet 4GF'):
25
  # Redimensionar a imagem para 512x512
26
  img = cv2.resize(img, (512, 512))
27
+
28
+ # Aplicar a máscara de nitidez à imagem
29
+ img = unsharp_masking(img).astype(np.uint8)
30
+
31
+ # Função auxiliar para normalizar a imagem
32
+ def normalizar_imagem(img):
33
+ return np.float32((img - img.min()) / (img.max() - img.min() + 1e-6))
34
+
35
+ if modelo == 'AngioNet' or modelo == 'UNet3+':
36
+ img = normalizar_imagem(img)
37
+ img_out = np.expand_dims(img, axis=0)
38
+ elif modelo == 'SE-RegUNet 4GF':
39
+ clahe1 = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
40
+ clahe2 = cv2.createCLAHE(clipLimit=8.0, tileGridSize=(8, 8))
41
+ image1 = clahe1.apply(img)
42
+ image2 = clahe2.apply(img)
43
+ img = normalizar_imagem(img)
44
+ image1 = normalizar_imagem(image1)
45
+ image2 = normalizar_imagem(image2)
46
+ img_out = np.stack((img, image1, image2), axis=0)
47
+ else:
48
+ clahe1 = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
49
+ image1 = clahe1.apply(img)
50
+ image1 = normalizar_imagem(image1)
51
+ img_out = np.stack((image1,) * 3, axis=0)
52
+
53
+ return img_out
54
 
55
 
56
  import os
 
59
  caminho_salvar_resultado = "/Segmento_de_Angio_Coronariana_v5/Salvar Resultado"
60
 
61
  # Função para processar a imagem de entrada
62
+ def processar_imagem_de_entrada(img, modelo, pipe, salvar_resultado=False):
63
+ try:
64
+ # Faça uma cópia da imagem original
65
+ img = img.copy()
66
+
67
+ # Coloque o modelo na GPU (se disponível) e configure-o para modo de avaliação
68
+ pipe = pipe.to(device).eval()
69
+
70
+ # Registre o tempo de início
71
+ start = time.time()
72
+
73
+ # Pré-processe a imagem e obtenha informações de dimensão
74
+ img, h, w, ori_gray, ori = ordenar_e_preprocessar_imagem(img, modelo)
75
+
76
+ # Converta a imagem para o formato esperado pelo modelo e coloque-a na GPU
77
+ img = torch.FloatTensor(img).unsqueeze(0).to(device)
78
+
79
+ # Realize a inferência do modelo sem gradientes
80
+ with torch.no_grad():
81
+ if modelo == 'AngioNet':
82
+ img = torch.cat([img, img], dim=0)
83
+ logit = np.round(torch.softmax(pipe.forward(img), dim=1).detach().cpu().numpy()[0, 0]).astype(np.uint8)
84
+
85
+ # Calcule o tempo decorrido
86
+ spent = time.time() - start
87
+ spent = f"{spent:.3f} segundos"
88
 
89
+ # Redimensione o resultado, se necessário
90
+ if h != 512 or w != 512:
91
+ logit = cv2.resize(logit, (h, w))
92
 
93
+ # Converta o resultado para um formato booleano
94
+ logit = logit.astype(bool)
95
+
96
+ # Crie uma cópia da imagem original para saída e aplique a máscara
97
+ img_out = ori.copy()
98
+ img_out[logit, 0] = 255
99
+
100
+ # Salve o resultado em um arquivo se a opção estiver ativada
101
+ if salvar_resultado:
102
+ nome_arquivo = os.path.join(caminho_salvar_resultado, f'resultado_{int(time.time())}.png')
103
+ cv2.imwrite(nome_arquivo, img_out)
104
+
105
+ return spent, img_out
106
+
107
+ except Exception as e:
108
+ # Em caso de erro, retorne uma mensagem de erro
109
+ return str(e), None
110
 
 
111
 
112
 
113
  # Carregar modelos pré-treinados
 
127
  import cv2
128
  from sklearn.cluster import KMeans
129
 
 
 
 
130
  def processar_imagem_de_entrada_wrapper(img, modelo, salvar_resultado=False, nome_arquivo=None):
131
  model = models[modelo]
132
+ resultado, img_out = processar_imagem_de_entrada(img, modelo, model)
133
 
134
  # Resto do código permanece inalterado
135
  kmeans = KMeans(n_clusters=2, random_state=0)
 
171
 
172
  return resultado, img_out, status_doenca, explanation, f"{num_analises} análises realizadas"
173
 
 
 
 
 
 
174
 
175
  # Inicializar a contagem de análises
176
  num_analises = 0
177
 
 
178
  # Criar a interface Gradio
179
  my_app = gr.Interface(
180
  fn=processar_imagem_de_entrada_wrapper,
181
  inputs=[
182
  gr.inputs.Image(label="Angiograma:", shape=(512, 512)),
183
  gr.inputs.Dropdown(['SE-RegUNet 4GF','SE-RegUNet 16GF', 'AngioNet', 'EffUNet++ B5', 'Reg-SA-UNet++', 'UNet3+'], label='Modelo', default='SE-RegUNet 4GF'),
184
+ gr.inputs.Checkbox(label="Salvar Resultado"),
185
  ],
186
  outputs=[
187
  gr.outputs.Label(label="Tempo decorrido"),
188
  gr.outputs.Image(type="numpy", label="Imagem de Saída"),
189
+ gr.outputs.Label(label="Possui Doença?"),
190
+ gr.outputs.Label(label="Explicação"),
191
+ gr.outputs.Label(label="Análises Realizadas"),
192
  ],
193
  title="Segmentação de Angiograma Coronariano",
194
  description="Esta aplicação segmenta angiogramas coronarianos usando modelos de segmentação pré-treinados.",
 
198
  )
199
 
200
  # Iniciar a interface Gradio
201
+ my_app.launch()