DHEIVER commited on
Commit
a900d50
1 Parent(s): 0602cd9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +115 -116
app.py CHANGED
@@ -1,13 +1,78 @@
1
  import os
 
 
2
  import gradio as gr
3
  import torch
4
  import cv2
5
  import numpy as np
6
  from preprocess import unsharp_masking
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
 
8
  # Caminho absoluto para a pasta de salvamento
9
  caminho_salvar_resultado = "/Segmento_de_Angio_Coronariana_v5/Salvar Resultado"
10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  # Carregar modelos pré-treinados
12
  models = {
13
  'SE-RegUNet 4GF': torch.jit.load('./model/SERegUNet4GF.pt'),
@@ -18,120 +83,54 @@ models = {
18
  'UNet3+': torch.jit.load('./model/UNet3plus.pt'),
19
  }
20
 
21
- def ordenar_e_preprocessar_imagem(img, modelo):
22
- ori = img.copy()
23
- img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
24
- h, w = img.shape
25
- img_out = preprocessar_imagem(img, modelo)
26
- return img_out, h, w, img, ori
27
 
28
- def preprocessar_imagem(img, modelo='SE-RegUNet 4GF'):
29
- # Redimensionar a imagem para 512x512
30
- img = cv2.resize(img, (512, 512))
31
-
32
- # Aplicar a máscara de nitidez à imagem
33
- img = unsharp_masking(img).astype(np.uint8)
34
-
35
- # Função auxiliar para normalizar a imagem
36
- def normalizar_imagem(img):
37
- return np.float32((img - img.min()) / (img.max() - img.min() + 1e-6))
38
-
39
- if modelo == 'AngioNet' or modelo == 'UNet3+':
40
- img = normalizar_imagem(img)
41
- img_out = np.expand_dims(img, axis=0)
42
- elif modelo == 'SE-RegUNet 4GF':
43
- clahe1 = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
44
- clahe2 = cv2.createCLAHE(clipLimit=8.0, tileGridSize=(8, 8))
45
- image1 = clahe1.apply(img)
46
- image2 = clahe2.apply(img)
47
- img = normalizar_imagem(img)
48
- image1 = normalizar_imagem(image1)
49
- image2 = normalizar_imagem(image2)
50
- img_out = np.stack((img, image1, image2), axis=0)
51
- else:
52
- clahe1 = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
53
- image1 = clahe1.apply(img)
54
-
55
- def processar_imagem_de_entrada(img, modelo, pipe, salvar_resultado=False):
56
- try:
57
- # Faça uma cópia da imagem original
58
- img = img.copy()
59
-
60
- # Coloque o modelo na GPU (se disponível) e configure-o para modo de avaliação
61
- pipe = pipe.to(device).eval()
62
-
63
- # Registre o tempo de início
64
- start = time.time()
65
-
66
- # Pré-processe a imagem e obtenha informações de dimensão
67
- img, h, w, ori_gray, ori = ordenar_e_preprocessar_imagem(img, modelo)
68
-
69
- # Converta a imagem para o formato esperado pelo modelo e coloque-a na GPU
70
- img = torch.FloatTensor(img).unsqueeze(0).to(device)
71
-
72
- # Realize a inferência do modelo sem gradientes
73
- with torch.no_grad():
74
- if modelo == 'AngioNet':
75
- img = torch.cat([img, img], dim=0)
76
- logit = np.round(torch.softmax(pipe.forward(img), dim=1).detach().cpu().numpy()[0, 0]).astype(np.uint8)
77
-
78
- # Calcule o tempo decorrido
79
- spent = time.time() - start
80
- spent = f"{spent:.3f} segundos"
81
-
82
- # Redimensione o resultado, se necessário
83
- if h != 512 or w != 512:
84
- logit = cv2.resize(logit, (h, w))
85
-
86
- # Converta o resultado para um formato booleano
87
- logit = logit.astype(bool)
88
-
89
- # Crie uma cópia da imagem original para saída e aplique a máscara
90
- img_out = ori.copy()
91
- img_out[logit, 0] = 255
92
-
93
- # Salve o resultado em um arquivo se a opção estiver ativada
94
- if salvar_resultado:
95
- nome_arquivo = os.path.join(caminho_salvar_resultado, f'resultado_{int(time.time())}.png')
96
- cv2.imwrite(nome_arquivo, img_out)
97
-
98
- return spent, img_out
99
-
100
- except Exception as e:
101
- # Em caso de erro, retorne uma mensagem de erro
102
- return str(e), None
103
-
104
- def main():
105
- num_analises = 0
106
-
107
- # Criar interface Gradio
108
- my_app = gr.Interface(
109
- fn=processar_imagem_de_entrada_wrapper,
110
- inputs=[
111
- gr.inputs.Image(label="Angiograma:", shape=(512, 512)),
112
- gr.inputs.Dropdown(['SE-RegUNet 4GF','SE-RegUNet 16GF', 'AngioNet', 'EffUNet++ B5', 'Reg-SA-UNet++', 'UNet3+'], label='Modelo', default='SE-RegUNet 4GF'),
113
- gr.inputs.Checkbox(label="Salvar Resultado"),
114
- ],
115
- outputs=[
116
- gr.outputs.Label(label="Tempo decorrido"),
117
- gr.outputs.Image(type="numpy", label="Imagem de Saída"),
118
- gr.outputs.Label(label="Possui Doença?"),
119
- gr.outputs.Label(label="Explicação"),
120
- gr.outputs.Label(label="Análises Realizadas"),
121
- ],
122
- title="Segmentação de Angiograma Coronariano",
123
- description="Esta aplicação segmenta angiogramas coronarianos usando modelos de segmentação pré-treinados.",
124
- theme="default",
125
- layout="vertical",
126
- allow_flagging=False,
127
- )
128
-
129
- # Iniciar interface Gradio
130
- my_app.launch()
131
-
132
- # Criar uma pasta para salvar os resultados
133
- if not os.path.exists(caminho_salvar_resultado):
134
- os.makedirs(caminho_salvar_resultado)
135
-
136
- if __name__ == "__main__":
137
- main()
 
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
+ from sklearn.cluster import KMeans
11
+ import os
12
+
13
+ device = "cuda" if torch.cuda.is_available() else "cpu"
14
+
15
+ # Função para ordenar e pré-processar a imagem de entrada
16
+ def ordenar_e_preprocessar_imagem(img, modelo):
17
+ ori = img.copy()
18
+ img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
19
+ h, w = img.shape
20
+ img_out = preprocessar_imagem(img, modelo)
21
+ return img_out, h, w, img, ori
22
+
23
+ # Função para pré-processar a imagem com base no modelo selecionado
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
40
 
41
  # Caminho absoluto para a pasta de salvamento
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
77
  models = {
78
  'SE-RegUNet 4GF': torch.jit.load('./model/SERegUNet4GF.pt'),
 
83
  'UNet3+': torch.jit.load('./model/UNet3plus.pt'),
84
  }
85
 
86
+ from scipy.spatial import distance
87
+ from scipy.ndimage import label
88
+ import numpy as np
89
+ import numpy as np
90
+ import cv2
91
+ from sklearn.cluster import KMeans
92
 
93
+ def processar_imagem_de_entrada_wrapper(img, modelo, salvar_resultado=False):
94
+ model = models[modelo]
95
+ resultado, img_out = processar_imagem_de_entrada(img, model)
96
+
97
+ # Extração de características dos clusters
98
+ kmeans = KMeans(n_clusters=2, random_state=0)
99
+ kmeans.fit(img_out[:, :, 0].reshape((-1, 1)))
100
+ labels = kmeans.labels_
101
+ cluster_centers = kmeans.cluster_centers_
102
+
103
+ # Detecção de doença
104
+ has_disease = any(cluster_centers[i][0] < 0.3 for i in range(2))
105
+
106
+ # Resultado
107
+ status_doenca = "Sim" if has_disease else "Não"
108
+ explanation = "A máquina detectou uma possível doença nos vasos sanguíneos." if has_disease else "A máquina não detectou nenhuma doença nos vasos sanguíneos."
109
+
110
+ return resultado, img_out, status_doenca, explanation
111
+
112
+ # Inicializar a contagem de análises
113
+ num_analises = 0
114
+
115
+ # Criar a interface Gradio
116
+ # Criar a interface Gradio
117
+ my_app = gr.Interface(
118
+ fn=processar_imagem_de_entrada_wrapper,
119
+ inputs=[
120
+ gr.inputs.Image(label="Angiograma:", shape=(512, 512)),
121
+ gr.inputs.Dropdown(['SE-RegUNet 4GF','SE-RegUNet 16GF', 'AngioNet', 'EffUNet++ B5', 'Reg-SA-UNet++', 'UNet3+'], label='Modelo', default='SE-RegUNet 4GF'),
122
+ ],
123
+ outputs=[
124
+ gr.outputs.Label(label="Tempo decorrido"),
125
+ gr.outputs.Image(type="numpy", label="Imagem de Saída"),
126
+ gr.outputs.Label(label="Possui Doença ou não"),
127
+ ],
128
+ title="Segmentação de Angiograma Coronariano",
129
+ description="Esta aplicação segmenta angiogramas coronarianos usando modelos de segmentação pré-treinados.",
130
+ theme="default",
131
+ layout="vertical",
132
+ allow_flagging=False,
133
+ )
134
+
135
+ # Iniciar a interface Gradio
136
+ my_app.launch()