fecia commited on
Commit
9d34803
1 Parent(s): b7b4f99

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +24 -40
app.py CHANGED
@@ -10,29 +10,25 @@ from matplotlib.legend import Legend
10
  model = YOLO("model.pt")
11
 
12
  def process_image(image):
13
- # Convertir la imagen de PIL a NumPy array y de RGB a BGR
14
- img = np.array(image)
15
- img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
16
 
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
@@ -43,9 +39,9 @@ def process_image(image):
43
  # Redimensionar las máscaras para que coincidan con el tamaño de la imagen
44
  resized_masks = []
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 = []
@@ -66,11 +62,11 @@ def process_image(image):
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(
@@ -83,45 +79,34 @@ def process_image(image):
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 = {
92
  'mask_index': idx,
93
  'class': names[cls],
94
  'confidence': conf,
95
- 'color_rgb': color_rgb,
96
- 'color_bgr': color_bgr
97
  }
98
  mask_info_list.append(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
@@ -134,9 +119,8 @@ def process_image(image):
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)
 
10
  model = YOLO("model.pt")
11
 
12
  def process_image(image):
13
+ # Convertir la imagen de PIL a NumPy array y de RGB a BGR (PIL usa RGB, OpenCV usa BGR)
14
+ img_rgb = np.array(image)
15
+ img_bgr = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2BGR)
16
 
17
+ # Realizar inferencia en la imagen BGR
18
+ results = model.predict(source=img_bgr, save=False)
 
 
 
 
19
 
20
  # Inicializar la lista para almacenar la información de las máscaras
21
  mask_info_list = []
22
 
23
+ # Crear una imagen en blanco para las máscaras (en formato BGR)
24
+ mask_image = np.zeros_like(img_bgr, dtype=np.uint8)
25
 
26
  # Procesar resultados
27
  for result in results:
28
  # Verificar si se detectaron máscaras
29
  if result.masks is not None and len(result.masks.data) > 0:
30
  # Obtener las máscaras, las probabilidades y las clases
31
+ masks = result.masks.data.cpu().numpy() # Shape: (num_masks, height, width)
32
  confidences = result.boxes.conf.cpu().numpy() # Probabilidades
33
  classes = result.boxes.cls.cpu().numpy().astype(int)
34
  names = model.names # Nombres de las clases
 
39
  # Redimensionar las máscaras para que coincidan con el tamaño de la imagen
40
  resized_masks = []
41
  for mask in masks:
42
+ mask_resized = cv2.resize(mask, (img_bgr.shape[1], img_bgr.shape[0]), interpolation=cv2.INTER_LINEAR)
43
  resized_masks.append(mask_resized)
44
+ resized_masks = np.array(resized_masks) # Shape: (num_masks, height, width)
45
 
46
  # Aplicar suavizado a las máscaras
47
  smoothed_masks = []
 
62
  sorted_confidences_norm = confidences_norm[sorted_indices]
63
  sorted_classes = classes[sorted_indices]
64
 
65
+ # Definir el mapa de colores (puedes cambiar a 'plasma', 'inferno', etc.)
66
+ colormap = plt.cm.get_cmap('viridis') # Cambia 'viridis' por 'plasma' o 'inferno' si lo deseas
67
 
68
  # Crear una matriz para rastrear qué máscara se asigna a cada píxel
69
+ mask_indices = np.full((img_bgr.shape[0], img_bgr.shape[1]), -1, dtype=int)
70
 
71
  # Procesar cada máscara y asignar máscaras de mayor probabilidad a los píxeles
72
  for idx_in_order, (idx, mask, conf_norm, conf, cls) in enumerate(
 
79
  mask_indices[update_mask] = idx
80
 
81
  # Obtener el color del mapa de colores basado en la probabilidad normalizada
82
+ color_rgb = colormap(conf_norm)[:3] # Color en formato RGB [0, 1]
83
+ color_rgb_255 = [int(c * 255) for c in color_rgb] # Escalar a [0, 255]
84
+ color_bgr_255 = color_rgb_255[::-1] # Convertir de RGB a BGR
85
 
86
  # Almacenar la información de la máscara
87
  mask_info = {
88
  'mask_index': idx,
89
  'class': names[cls],
90
  'confidence': conf,
91
+ 'color_rgb': color_rgb_255,
92
+ 'color_bgr': color_bgr_255
93
  }
94
  mask_info_list.append(mask_info)
95
 
96
  # Asignar colores a los píxeles correspondientes en la imagen de máscaras
97
  for i in range(3):
98
+ mask_image[:, :, i][update_mask] = color_bgr_255[i]
 
 
 
 
 
 
 
 
 
 
99
 
100
  # Superponer la imagen de máscaras sobre la imagen original
101
  alpha = 0.2 # Transparencia ajustada
102
+ img_with_masks = cv2.addWeighted(img_bgr.astype(np.float32), 1, mask_image.astype(np.float32), alpha, 0).astype(np.uint8)
103
 
104
  else:
105
  # Si no hay máscaras, usar la imagen original
106
+ img_with_masks = img_bgr.copy()
107
  print("No se detectaron máscaras en esta imagen.")
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
 
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 = Rectangle((0, 0), 1, 1, facecolor=color_rgb_normalized)
 
124
  label = f"Stenosis probability: {mask_info['confidence']:.2f}"
125
  handles.append(patch)
126
  labels.append(label)