DHEIVER commited on
Commit
c5da014
1 Parent(s): b1bab45

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +47 -34
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
- # Resto do código permanece inalterado
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
- # Extração de características dos clusters
142
  num_clusters = len(cluster_centers)
143
  cluster_features = []
144
  for i in range(num_clusters):
145
- cluster_mask = labels == i # Create a boolean mask for the cluster
146
 
147
  # Calcular área do cluster
148
  area = np.sum(cluster_mask)
149
 
150
- if area == 0: # Skip empty clusters
151
  continue
152
 
153
- # Calcular forma do cluster usando a relação entre área e perímetro
154
- contours, _ = cv2.findContours(np.uint8(cluster_mask), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
155
- if len(contours) > 0:
156
- perimeter = cv2.arcLength(contours[0], True)
157
- compactness = 4 * np.pi * area / (perimeter ** 2)
158
 
159
- cluster_features.append({'area': area, 'compactness': compactness})
160
 
161
  # Decidir se há doença com base nas características dos clusters
162
- has_disease_flag = any(feature['area'] >= 200 and feature['compactness'] < 0.3 for feature in cluster_features)
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