fecia commited on
Commit
b7b4f99
1 Parent(s): f8a3c3f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +61 -31
app.py CHANGED
@@ -3,7 +3,8 @@ import numpy as np
3
  import matplotlib.pyplot as plt
4
  from ultralytics import YOLO
5
  import gradio as gr
6
- from matplotlib.patches import Patch
 
7
 
8
  # Cargar el modelo YOLO
9
  model = YOLO("model.pt")
@@ -16,25 +17,27 @@ def process_image(image):
16
  # Realizar inferencia en la imagen
17
  results = model.predict(source=img, save=False)
18
 
 
 
 
 
19
  # Inicializar la lista para almacenar la información de las máscaras
20
  mask_info_list = []
21
 
22
  # Crear una imagen en blanco para las máscaras
23
  mask_image = np.zeros_like(img, dtype=np.uint8)
24
 
25
- # Transparencia ajustada para la superposición de máscaras
26
- alpha = 0.4 # Un valor más bajo aumenta la transparencia y reduce la saturación
27
-
28
  # Procesar resultados
29
  for result in results:
 
30
  if result.masks is not None and len(result.masks.data) > 0:
31
- # Obtener máscaras, probabilidades y clases
32
- masks = result.masks.data.cpu().numpy()
33
- confidences = result.boxes.conf.cpu().numpy()
34
  classes = result.boxes.cls.cpu().numpy().astype(int)
35
- names = model.names
36
 
37
- # Normalizar probabilidades al rango [0, 1]
38
  confidences_norm = (confidences - confidences.min()) / (confidences.max() - confidences.min() + 1e-6)
39
 
40
  # Redimensionar las máscaras para que coincidan con el tamaño de la imagen
@@ -42,39 +45,47 @@ def process_image(image):
42
  for mask in masks:
43
  mask_resized = cv2.resize(mask, (img.shape[1], img.shape[0]), interpolation=cv2.INTER_LINEAR)
44
  resized_masks.append(mask_resized)
45
- resized_masks = np.array(resized_masks)
46
 
47
  # Aplicar suavizado a las máscaras
48
  smoothed_masks = []
49
  for mask in resized_masks:
 
50
  mask_uint8 = (mask * 255).astype(np.uint8)
51
- blurred_mask = cv2.GaussianBlur(mask_uint8, (5, 5), 0)
 
 
52
  mask_smoothed = blurred_mask.astype(np.float32) / 255.0
53
  smoothed_masks.append(mask_smoothed)
54
  smoothed_masks = np.array(smoothed_masks)
55
 
56
- # Ordenar máscaras por probabilidad
57
  sorted_indices = np.argsort(-confidences)
58
  sorted_masks = smoothed_masks[sorted_indices]
59
  sorted_confidences = confidences[sorted_indices]
60
  sorted_confidences_norm = confidences_norm[sorted_indices]
61
  sorted_classes = classes[sorted_indices]
62
 
63
- # Definir mapa de colores con un ajuste para colores más suaves
64
  colormap = plt.cm.get_cmap('viridis')
65
 
66
- # Procesar cada máscara
67
- for idx_in_order, (idx, mask, conf_norm, conf, cls) in enumerate(zip(sorted_indices, sorted_masks, sorted_confidences_norm, sorted_confidences, sorted_classes)):
68
- mask_bool = mask > 0.5
69
- update_mask = np.logical_and(mask_bool, mask_image[:, :, 0] == 0) # Solo actualizamos píxeles que no han sido coloreados
70
 
 
 
 
 
 
 
71
  if not np.any(update_mask):
72
- continue
 
73
 
74
- # Obtener color y hacerlo más suave
75
  color_rgb = colormap(conf_norm)[:3]
76
- color_rgb = [int(c * 150) for c in color_rgb] # Reducir la intensidad del color (150 en lugar de 255)
77
- color_bgr = color_rgb[::-1] # Convertir de RGB a BGR para OpenCV
78
 
79
  # Almacenar la información de la máscara
80
  mask_info = {
@@ -88,20 +99,34 @@ def process_image(image):
88
 
89
  # Asignar colores a los píxeles correspondientes en la imagen de máscaras
90
  for i in range(3):
91
- mask_image[:, :, i][update_mask] = color_bgr[i]
92
-
93
- # Superponer la imagen de máscaras sobre la imagen original con transparencia
 
 
 
 
 
 
 
 
 
 
 
94
  img_with_masks = cv2.addWeighted(img.astype(np.float32), 1, mask_image.astype(np.float32), alpha, 0).astype(np.uint8)
95
 
96
  else:
 
97
  img_with_masks = img.copy()
 
98
 
99
- # Convertir la imagen a RGB para matplotlib
100
- img_rgb = cv2.cvtColor(img_with_masks, cv2.COLOR_BGR2RGB)
 
101
 
102
  # Crear una figura para mostrar la imagen y la leyenda
103
  fig, ax = plt.subplots(figsize=(8, 8))
104
- ax.imshow(img_rgb)
105
  ax.axis('off')
106
 
107
  # Crear la leyenda si hay máscaras detectadas
@@ -109,13 +134,18 @@ def process_image(image):
109
  handles = []
110
  labels = []
111
  for mask_info in mask_info_list:
112
- color_rgb = np.array(mask_info['color_rgb']) / 255 # Normalizar el color
113
- patch = Patch(facecolor=color_rgb)
114
- label = f"{mask_info['class']}: {mask_info['confidence']:.2f}"
 
115
  handles.append(patch)
116
  labels.append(label)
117
 
118
- ax.legend(handles, labels, loc='upper right')
 
 
 
 
119
 
120
  # Convertir la figura a una imagen NumPy
121
  fig.canvas.draw()
 
3
  import matplotlib.pyplot as plt
4
  from ultralytics import YOLO
5
  import gradio as gr
6
+ from matplotlib.patches import Rectangle
7
+ from matplotlib.legend import Legend
8
 
9
  # Cargar el modelo YOLO
10
  model = YOLO("model.pt")
 
17
  # Realizar inferencia en la imagen
18
  results = model.predict(source=img, save=False)
19
 
20
+ # Crear una carpeta para guardar las imágenes individuales (opcional)
21
+ # output_folder = "mascaras_individuales"
22
+ # os.makedirs(output_folder, exist_ok=True)
23
+
24
  # Inicializar la lista para almacenar la información de las máscaras
25
  mask_info_list = []
26
 
27
  # Crear una imagen en blanco para las máscaras
28
  mask_image = np.zeros_like(img, dtype=np.uint8)
29
 
 
 
 
30
  # Procesar resultados
31
  for result in results:
32
+ # Verificar si se detectaron máscaras
33
  if result.masks is not None and len(result.masks.data) > 0:
34
+ # Obtener las máscaras, las probabilidades y las clases
35
+ masks = result.masks.data.cpu().numpy() # Forma: (num_masks, altura, ancho)
36
+ confidences = result.boxes.conf.cpu().numpy() # Probabilidades
37
  classes = result.boxes.cls.cpu().numpy().astype(int)
38
+ names = model.names # Nombres de las clases
39
 
40
+ # Normalizar las probabilidades al rango [0, 1]
41
  confidences_norm = (confidences - confidences.min()) / (confidences.max() - confidences.min() + 1e-6)
42
 
43
  # Redimensionar las máscaras para que coincidan con el tamaño de la imagen
 
45
  for mask in masks:
46
  mask_resized = cv2.resize(mask, (img.shape[1], img.shape[0]), interpolation=cv2.INTER_LINEAR)
47
  resized_masks.append(mask_resized)
48
+ resized_masks = np.array(resized_masks) # Forma: (num_masks, altura, ancho)
49
 
50
  # Aplicar suavizado a las máscaras
51
  smoothed_masks = []
52
  for mask in resized_masks:
53
+ # Convertir la máscara a escala de grises (valores entre 0 y 255)
54
  mask_uint8 = (mask * 255).astype(np.uint8)
55
+ # Aplicar desenfoque gaussiano
56
+ blurred_mask = cv2.GaussianBlur(mask_uint8, (7, 7), 0)
57
+ # Normalizar y convertir de nuevo a rango [0, 1]
58
  mask_smoothed = blurred_mask.astype(np.float32) / 255.0
59
  smoothed_masks.append(mask_smoothed)
60
  smoothed_masks = np.array(smoothed_masks)
61
 
62
+ # Ordenar las máscaras por probabilidad descendente
63
  sorted_indices = np.argsort(-confidences)
64
  sorted_masks = smoothed_masks[sorted_indices]
65
  sorted_confidences = confidences[sorted_indices]
66
  sorted_confidences_norm = confidences_norm[sorted_indices]
67
  sorted_classes = classes[sorted_indices]
68
 
69
+ # Definir el mapa de colores
70
  colormap = plt.cm.get_cmap('viridis')
71
 
72
+ # Crear una matriz para rastrear qué máscara se asigna a cada píxel
73
+ mask_indices = np.full((img.shape[0], img.shape[1]), -1, dtype=int)
 
 
74
 
75
+ # Procesar cada máscara y asignar máscaras de mayor probabilidad a los píxeles
76
+ for idx_in_order, (idx, mask, conf_norm, conf, cls) in enumerate(
77
+ zip(sorted_indices, sorted_masks, sorted_confidences_norm, sorted_confidences, sorted_classes)):
78
+ mask_bool = mask > 0.5 # Umbral para convertir a binario
79
+ # Actualizar píxeles donde aún no se ha asignado una máscara
80
+ update_mask = np.logical_and(mask_bool, mask_indices == -1)
81
  if not np.any(update_mask):
82
+ continue # Si no hay píxeles nuevos, continuar
83
+ mask_indices[update_mask] = idx
84
 
85
+ # Obtener el color del mapa de colores basado en la probabilidad normalizada
86
  color_rgb = colormap(conf_norm)[:3]
87
+ color_rgb = [int(c * 255) for c in color_rgb] # Convertir a escala [0, 255]
88
+ color_bgr = color_rgb[::-1] # Convertir de RGB a BGR
89
 
90
  # Almacenar la información de la máscara
91
  mask_info = {
 
99
 
100
  # Asignar colores a los píxeles correspondientes en la imagen de máscaras
101
  for i in range(3):
102
+ mask_image[:, :, i][update_mask] = color_bgr[i] # Usar color BGR para OpenCV
103
+
104
+ # Generar y guardar la imagen individual de la máscara (opcional)
105
+ # mask_rgb = np.zeros_like(img, dtype=np.float32)
106
+ # for i in range(3):
107
+ # mask_rgb[:, :, i] = mask * color_bgr[i] # Usar la máscara suavizada
108
+ # img_individual = cv2.addWeighted(img.astype(np.float32), 1, mask_rgb, 0.2, 0).astype(np.uint8)
109
+ # text_str = f"Stenosis probability: {conf:.2f}"
110
+ # cv2.putText(img_individual, text_str, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, color_bgr, 2)
111
+ # output_path = os.path.join(output_folder, f"imagen_mascara_{idx}.jpg")
112
+ # cv2.imwrite(output_path, img_individual)
113
+
114
+ # Superponer la imagen de máscaras sobre la imagen original
115
+ alpha = 0.2 # Transparencia ajustada
116
  img_with_masks = cv2.addWeighted(img.astype(np.float32), 1, mask_image.astype(np.float32), alpha, 0).astype(np.uint8)
117
 
118
  else:
119
+ # Si no hay máscaras, usar la imagen original
120
  img_with_masks = img.copy()
121
+ print("No se detectaron máscaras en esta imagen.")
122
 
123
+ # Convertir las imágenes de BGR a RGB para matplotlib
124
+ img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
125
+ img_with_masks_rgb = cv2.cvtColor(img_with_masks, cv2.COLOR_BGR2RGB)
126
 
127
  # Crear una figura para mostrar la imagen y la leyenda
128
  fig, ax = plt.subplots(figsize=(8, 8))
129
+ ax.imshow(img_with_masks_rgb)
130
  ax.axis('off')
131
 
132
  # Crear la leyenda si hay máscaras detectadas
 
134
  handles = []
135
  labels = []
136
  for mask_info in mask_info_list:
137
+ color_rgb = mask_info['color_rgb']
138
+ color_normalized = np.array(color_rgb) / 255
139
+ patch = Rectangle((0, 0), 1, 1, facecolor=color_normalized)
140
+ label = f"Stenosis probability: {mask_info['confidence']:.2f}"
141
  handles.append(patch)
142
  labels.append(label)
143
 
144
+ # Añadir la leyenda al gráfico
145
+ legend = Legend(ax, handles, labels, loc='upper right')
146
+ ax.add_artist(legend)
147
+
148
+ plt.tight_layout()
149
 
150
  # Convertir la figura a una imagen NumPy
151
  fig.canvas.draw()