Update app.py
Browse files
app.py
CHANGED
@@ -7,8 +7,20 @@ import cv2
|
|
7 |
import numpy as np
|
8 |
from preprocess import unsharp_masking
|
9 |
import time
|
10 |
-
from sklearn.cluster import KMeans
|
11 |
import os
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
12 |
|
13 |
device = "cuda" if torch.cuda.is_available() else "cpu"
|
14 |
|
@@ -52,9 +64,6 @@ def preprocessar_imagem(img, modelo='SE-RegUNet 4GF'):
|
|
52 |
|
53 |
return img_out
|
54 |
|
55 |
-
|
56 |
-
import os
|
57 |
-
|
58 |
# Caminho absoluto para a pasta de salvamento
|
59 |
caminho_salvar_resultado = "/Segmento_de_Angio_Coronariana_v5/Salvar Resultado"
|
60 |
|
@@ -108,58 +117,58 @@ def processar_imagem_de_entrada(img, modelo, pipe, salvar_resultado=False):
|
|
108 |
# Em caso de erro, retorne uma mensagem de erro
|
109 |
return str(e), None
|
110 |
|
111 |
-
|
112 |
-
|
113 |
-
# Carregar modelos pré-treinados
|
114 |
-
models = {
|
115 |
-
'SE-RegUNet 4GF': torch.jit.load('./model/SERegUNet4GF.pt'),
|
116 |
-
'SE-RegUNet 16GF': torch.jit.load('./model/SERegUNet16GF.pt'),
|
117 |
-
'AngioNet': torch.jit.load('./model/AngioNet.pt'),
|
118 |
-
'EffUNet++ B5': torch.jit.load('./model/EffUNetppb5.pt'),
|
119 |
-
'Reg-SA-UNet++': torch.jit.load('./model/RegSAUnetpp.pt'),
|
120 |
-
'UNet3+': torch.jit.load('./model/UNet3plus.pt'),
|
121 |
-
}
|
122 |
-
|
123 |
-
from scipy.spatial import distance
|
124 |
-
from scipy.ndimage import label
|
125 |
-
import numpy as np
|
126 |
-
import numpy as np
|
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 |
-
#
|
135 |
kmeans = KMeans(n_clusters=2, random_state=0)
|
136 |
flattened_img = img_out[:, :, 0].reshape((-1, 1))
|
137 |
kmeans.fit(flattened_img)
|
138 |
labels = kmeans.labels_
|
139 |
cluster_centers = kmeans.cluster_centers_
|
140 |
|
141 |
-
#
|
142 |
num_clusters = len(cluster_centers)
|
143 |
cluster_features = []
|
144 |
for i in range(num_clusters):
|
145 |
-
cluster_mask = labels == i #
|
146 |
|
147 |
# Calcular área do cluster
|
148 |
area = np.sum(cluster_mask)
|
149 |
|
150 |
-
if area == 0: #
|
151 |
continue
|
152 |
|
153 |
-
# Calcular
|
154 |
-
|
155 |
-
|
156 |
-
perimeter = cv2.arcLength(contours[0], True)
|
157 |
-
compactness = 4 * np.pi * area / (perimeter ** 2)
|
158 |
|
159 |
-
|
160 |
|
161 |
# Decidir se há doença com base nas características dos clusters
|
162 |
-
has_disease_flag = any(feature['area'] >= 200 and feature['
|
163 |
|
164 |
# Formatar o indicador de doença como uma string
|
165 |
if has_disease_flag:
|
@@ -169,9 +178,13 @@ def processar_imagem_de_entrada_wrapper(img, modelo, salvar_resultado=False, nom
|
|
169 |
status_doenca = "Não"
|
170 |
explanation = "A máquina não detectou nenhuma doença nos vasos sanguíneos."
|
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 |
|
|
|
7 |
import numpy as np
|
8 |
from preprocess import unsharp_masking
|
9 |
import time
|
|
|
10 |
import os
|
11 |
+
from scipy.spatial import distance
|
12 |
+
from scipy.ndimage import label
|
13 |
+
from sklearn.cluster import KMeans
|
14 |
+
|
15 |
+
# Carregar modelos pré-treinados
|
16 |
+
models = {
|
17 |
+
'SE-RegUNet 4GF': torch.jit.load('./model/SERegUNet4GF.pt'),
|
18 |
+
'SE-RegUNet 16GF': torch.jit.load('./model/SERegUNet16GF.pt'),
|
19 |
+
'AngioNet': torch.jit.load('./model/AngioNet.pt'),
|
20 |
+
'EffUNet++ B5': torch.jit.load('./model/EffUNetppb5.pt'),
|
21 |
+
'Reg-SA-UNet++': torch.jit.load('./model/RegSAUnetpp.pt'),
|
22 |
+
'UNet3+': torch.jit.load('./model/UNet3plus.pt'),
|
23 |
+
}
|
24 |
|
25 |
device = "cuda" if torch.cuda.is_available() else "cpu"
|
26 |
|
|
|
64 |
|
65 |
return img_out
|
66 |
|
|
|
|
|
|
|
67 |
# Caminho absoluto para a pasta de salvamento
|
68 |
caminho_salvar_resultado = "/Segmento_de_Angio_Coronariana_v5/Salvar Resultado"
|
69 |
|
|
|
117 |
# Em caso de erro, retorne uma mensagem de erro
|
118 |
return str(e), None
|
119 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
120 |
def processar_imagem_de_entrada_wrapper(img, modelo, salvar_resultado=False, nome_arquivo=None):
|
121 |
+
"""
|
122 |
+
Processa uma imagem de entrada usando um modelo de segmentação pré-treinado e extrai características dos clusters.
|
123 |
+
|
124 |
+
Args:
|
125 |
+
img (numpy.ndarray): A imagem de entrada.
|
126 |
+
modelo (str): O nome do modelo a ser utilizado.
|
127 |
+
salvar_resultado (bool): Indica se o resultado deve ser salvo em arquivo.
|
128 |
+
nome_arquivo (str): O nome do arquivo para salvar o resultado.
|
129 |
+
|
130 |
+
Returns:
|
131 |
+
tuple: Uma tupla contendo:
|
132 |
+
- resultado (str): Tempo decorrido para o processamento.
|
133 |
+
- img_out (numpy.ndarray): A imagem de saída.
|
134 |
+
- status_doenca (str): Indicador de presença de doença.
|
135 |
+
- explanation (str): Explicação do status de doença.
|
136 |
+
- num_analises (str): Número de análises realizadas.
|
137 |
+
"""
|
138 |
+
|
139 |
+
# Carregar o modelo correspondente
|
140 |
model = models[modelo]
|
141 |
+
|
142 |
+
# Processar a imagem usando o modelo
|
143 |
resultado, img_out = processar_imagem_de_entrada(img, modelo, model)
|
144 |
|
145 |
+
# Aplicar o algoritmo K-Means para segmentação de imagem
|
146 |
kmeans = KMeans(n_clusters=2, random_state=0)
|
147 |
flattened_img = img_out[:, :, 0].reshape((-1, 1))
|
148 |
kmeans.fit(flattened_img)
|
149 |
labels = kmeans.labels_
|
150 |
cluster_centers = kmeans.cluster_centers_
|
151 |
|
152 |
+
# Extrair características dos clusters
|
153 |
num_clusters = len(cluster_centers)
|
154 |
cluster_features = []
|
155 |
for i in range(num_clusters):
|
156 |
+
cluster_mask = labels == i # Criar uma máscara booleana para o cluster
|
157 |
|
158 |
# Calcular área do cluster
|
159 |
area = np.sum(cluster_mask)
|
160 |
|
161 |
+
if area == 0: # Ignorar clusters vazios
|
162 |
continue
|
163 |
|
164 |
+
# Calcular momentos de Hu para descrição de forma
|
165 |
+
moments = cv2.moments(cluster_mask)
|
166 |
+
hu_moments = cv2.HuMoments(moments).flatten()
|
|
|
|
|
167 |
|
168 |
+
cluster_features.append({'area': area, 'hu_moments': hu_moments})
|
169 |
|
170 |
# Decidir se há doença com base nas características dos clusters
|
171 |
+
has_disease_flag = any(feature['area'] >= 200 and np.linalg.norm(feature['hu_moments']) < 0.1 for feature in cluster_features)
|
172 |
|
173 |
# Formatar o indicador de doença como uma string
|
174 |
if has_disease_flag:
|
|
|
178 |
status_doenca = "Não"
|
179 |
explanation = "A máquina não detectou nenhuma doença nos vasos sanguíneos."
|
180 |
|
181 |
+
# Número de análises realizadas (pode ser atualizado conforme necessário)
|
182 |
+
num_analises = "1"
|
183 |
+
|
184 |
return resultado, img_out, status_doenca, explanation, f"{num_analises} análises realizadas"
|
185 |
|
186 |
|
187 |
+
|
188 |
# Inicializar a contagem de análises
|
189 |
num_analises = 0
|
190 |
|