fecia commited on
Commit
6265351
1 Parent(s): b824fc5

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +34 -38
app.py CHANGED
@@ -22,8 +22,11 @@ def process_image(image):
22
  # Crear una imagen en blanco para las máscaras (en formato BGR)
23
  mask_image = np.zeros_like(img_bgr, dtype=np.uint8)
24
 
25
- # Inicializar la máscara acumulativa
26
- cumulative_mask = np.zeros((img_bgr.shape[0], img_bgr.shape[1]), dtype=bool)
 
 
 
27
 
28
  # Procesar resultados
29
  for result in results:
@@ -64,49 +67,39 @@ def process_image(image):
64
  sorted_confidences_norm = confidences_norm[sorted_indices]
65
  sorted_classes = classes[sorted_indices]
66
 
67
- # Definir el mapa de colores (puedes cambiar a 'plasma', 'inferno', etc.)
68
- colormap = plt.cm.get_cmap('plasma') # Cambia 'viridis' por 'plasma' o 'inferno' si lo deseas
 
 
 
 
 
 
69
 
70
- # Procesar cada máscara y asignar máscaras de mayor confianza primero
71
- for idx_in_order, (idx, mask, conf_norm, conf, cls) in enumerate(
72
- zip(sorted_indices, sorted_masks, sorted_confidences_norm, sorted_confidences, sorted_classes)):
73
  # Umbralizar la máscara para obtener valores binarios
74
- mask_bool = mask > 0.5
75
-
76
- # Restar la máscara acumulativa de la máscara actual para obtener la parte única
77
- unique_mask = np.logical_and(mask_bool, np.logical_not(cumulative_mask))
78
 
79
- # Actualizar la máscara acumulativa
80
- cumulative_mask = np.logical_or(cumulative_mask, unique_mask)
81
 
82
- # Si no hay píxeles únicos, continuar
83
- if not np.any(unique_mask):
84
- continue
 
85
 
86
- # Obtener el color del mapa de colores basado en la probabilidad normalizada
87
- color_rgb = colormap(conf_norm)[:3] # Color en formato RGB [0, 1]
88
- color_rgb_255 = [int(c * 255) for c in color_rgb] # Escalar a [0, 255]
89
- color_bgr_255 = color_rgb_255[::-1] # Convertir de RGB a BGR
90
-
91
- # Almacenar la información de la máscara
92
  mask_info = {
93
- 'mask_index': idx,
94
  'class': names[cls],
95
- 'confidence': conf,
96
- 'color_rgb': color_rgb_255,
97
- 'color_bgr': color_bgr_255
98
  }
99
  mask_info_list.append(mask_info)
100
 
101
- # Asignar colores a los píxeles correspondientes en la imagen de máscaras
102
- # Utilizamos broadcasting para asignar el color a los píxeles únicos
103
- mask_image[unique_mask] = color_bgr_255
104
-
105
  # Superponer la imagen de máscaras sobre la imagen original
106
- alpha = 0.3 # Transparencia ajustada (puedes ajustar este valor según tus preferencias)
107
  img_with_masks = cv2.addWeighted(img_bgr.astype(np.float32), 1, mask_image.astype(np.float32), alpha, 0).astype(np.uint8)
108
 
109
- # Convertir la imagen de BGR a RGB para matplotlib
110
  img_with_masks_rgb = cv2.cvtColor(img_with_masks, cv2.COLOR_BGR2RGB)
111
 
112
  # Crear una figura para mostrar la imagen y la leyenda
@@ -118,16 +111,19 @@ def process_image(image):
118
  if mask_info_list:
119
  handles = []
120
  labels = []
 
 
121
  for mask_info in mask_info_list:
122
- color_rgb_normalized = np.array(mask_info['color_rgb']) / 255 # Normalizar al rango [0, 1]
123
- patch = Patch(facecolor=color_rgb_normalized)
124
  label = f"{mask_info['class']} - Confianza: {mask_info['confidence']:.2f}"
125
- handles.append(patch)
126
- labels.append(label)
 
 
 
 
127
 
128
  # Añadir la leyenda al gráfico
129
- legend = ax.legend(handles, labels, loc='upper right', bbox_to_anchor=(1.15, 1))
130
- ax.add_artist(legend)
131
 
132
  plt.tight_layout()
133
 
 
22
  # Crear una imagen en blanco para las máscaras (en formato BGR)
23
  mask_image = np.zeros_like(img_bgr, dtype=np.uint8)
24
 
25
+ # Inicializar una matriz para almacenar la máxima confianza por píxel
26
+ max_confidence_map = np.zeros((img_bgr.shape[0], img_bgr.shape[1]), dtype=np.float32)
27
+
28
+ # Definir el mapa de colores (puedes cambiar a 'plasma', 'inferno', etc.)
29
+ colormap = plt.cm.get_cmap('tab20') # 'tab20' proporciona una variedad de colores distintivos
30
 
31
  # Procesar resultados
32
  for result in results:
 
67
  sorted_confidences_norm = confidences_norm[sorted_indices]
68
  sorted_classes = classes[sorted_indices]
69
 
70
+ # Asignar un color único a cada máscara utilizando el mapa de colores
71
+ for idx_in_order, (mask, conf_norm, conf, cls) in enumerate(
72
+ zip(sorted_masks, sorted_confidences_norm, sorted_confidences, sorted_classes)):
73
+
74
+ # Obtener el color del mapa de colores
75
+ color = colormap(idx_in_order % colormap.N)[:3] # Evitar exceder el número de colores disponibles
76
+ color_rgb = [int(c * 255) for c in color] # Escalar a [0, 255]
77
+ color_bgr = color_rgb[::-1] # Convertir de RGB a BGR
78
 
 
 
 
79
  # Umbralizar la máscara para obtener valores binarios
80
+ mask_binary = mask > 0.5
 
 
 
81
 
82
+ # Obtener los píxeles donde la máscara actual tiene mayor confianza
83
+ update_pixels = mask_binary & (sorted_confidences[idx_in_order] > max_confidence_map)
84
 
85
+ # Actualizar la imagen de máscaras y el mapa de máxima confianza
86
+ for i in range(3):
87
+ mask_image[:, :, i][update_pixels] = color_bgr[i]
88
+ max_confidence_map[update_pixels] = sorted_confidences[idx_in_order]
89
 
90
+ # Almacenar la información de la máscara para la leyenda
 
 
 
 
 
91
  mask_info = {
 
92
  'class': names[cls],
93
+ 'confidence': sorted_confidences[idx_in_order],
94
+ 'color_rgb': color_rgb
 
95
  }
96
  mask_info_list.append(mask_info)
97
 
 
 
 
 
98
  # Superponer la imagen de máscaras sobre la imagen original
99
+ alpha = 0.4 # Transparencia ajustada (puedes ajustar este valor según tus preferencias)
100
  img_with_masks = cv2.addWeighted(img_bgr.astype(np.float32), 1, mask_image.astype(np.float32), alpha, 0).astype(np.uint8)
101
 
102
+ # Convertir la imagen de BGR a RGB para matplotlib y Gradio
103
  img_with_masks_rgb = cv2.cvtColor(img_with_masks, cv2.COLOR_BGR2RGB)
104
 
105
  # Crear una figura para mostrar la imagen y la leyenda
 
111
  if mask_info_list:
112
  handles = []
113
  labels = []
114
+ # Para evitar duplicados en la leyenda (si hay múltiples máscaras de la misma clase)
115
+ seen = set()
116
  for mask_info in mask_info_list:
 
 
117
  label = f"{mask_info['class']} - Confianza: {mask_info['confidence']:.2f}"
118
+ if label not in seen:
119
+ seen.add(label)
120
+ color_rgb_normalized = np.array(mask_info['color_rgb']) / 255 # Normalizar al rango [0, 1]
121
+ patch = Patch(facecolor=color_rgb_normalized)
122
+ handles.append(patch)
123
+ labels.append(label)
124
 
125
  # Añadir la leyenda al gráfico
126
+ ax.legend(handles, labels, loc='upper right', bbox_to_anchor=(1.15, 1))
 
127
 
128
  plt.tight_layout()
129