Update app.py
Browse files
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 |
-
#
|
29 |
-
img = img.astype(np.
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
64 |
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
|
69 |
-
|
70 |
-
|
71 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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)
|
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
|
|
|
|
|
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()
|