jeysshon commited on
Commit
984e3b6
1 Parent(s): 98be0a9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +58 -24
app.py CHANGED
@@ -24,11 +24,6 @@ except Exception as e:
24
  print(f"Error al cargar el modelo: {e}")
25
  raise
26
 
27
- # Imprimir nombres de las capas del modelo
28
- print("Nombres de las capas en el modelo:")
29
- for layer in model.layers:
30
- print(layer.name)
31
-
32
  # Definir las etiquetas
33
  labels = [
34
  'Acné / Rosácea', 'Queratosis Actínica / Carcinoma Basocelular',
@@ -46,10 +41,8 @@ labels = [
46
  ]
47
 
48
  # Función Grad-CAM para generar el mapa de calor de activación
49
- def grad_cam(model, img_array, last_conv_layer_name, pred_index=None):
50
- grad_model = Model(
51
- [model.inputs], [model.get_layer(last_conv_layer_name).output, model.output]
52
- )
53
 
54
  with tf.GradientTape() as tape:
55
  last_conv_layer_output, preds = grad_model(img_array)
@@ -57,59 +50,100 @@ def grad_cam(model, img_array, last_conv_layer_name, pred_index=None):
57
  pred_index = tf.argmax(preds[0])
58
  class_channel = preds[:, pred_index]
59
 
60
- # Calcula los gradientes de la salida de la clase respecto a la salida de la última capa convolucional
61
  grads = tape.gradient(class_channel, last_conv_layer_output)
62
-
63
- # Promediar sobre cada filtro
64
  pooled_grads = tf.reduce_mean(grads, axis=(0, 1, 2))
65
 
66
- # Ponderar cada filtro en el mapa de características de la última capa convolucional
67
  last_conv_layer_output = last_conv_layer_output[0]
68
  heatmap = last_conv_layer_output @ pooled_grads[..., tf.newaxis]
69
  heatmap = tf.squeeze(heatmap)
70
-
71
- # Normalizar entre 0 y 1 para el mapa de calor
72
  heatmap = tf.maximum(heatmap, 0) / tf.math.reduce_max(heatmap)
73
  return heatmap.numpy()
74
 
75
  # Generar el mapa de calor de activación usando Grad-CAM
76
- def generate_heatmap(image, prediction, last_conv_layer_name="top_conv"): # Reemplaza "top_conv" según el nombre que encuentres
77
  img_array = tf.image.resize(image, (224, 224))
78
  img_array = tf.expand_dims(img_array, axis=0)
79
-
80
  heatmap = grad_cam(model, img_array, last_conv_layer_name)
81
  heatmap = cv2.resize(heatmap, (image.shape[1], image.shape[0]))
82
  heatmap = np.uint8(255 * heatmap)
83
  heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET)
84
  superimposed_image = cv2.addWeighted(np.array(image), 0.6, heatmap, 0.4, 0)
85
- img_pil = Image.fromarray(superimposed_image)
86
- return img_pil
87
 
 
88
  def classify_image(image):
 
89
  image_resized = tf.image.resize(image, (224, 224))
90
  image_resized = tf.expand_dims(image_resized, axis=0)
91
  prediction = model.predict(image_resized).flatten()
92
  confidences = {labels[i]: float(prediction[i]) for i in range(len(labels))}
93
 
94
- # Generar mapa de calor utilizando Grad-CAM
95
- heatmap_image = generate_heatmap(np.array(image), prediction)
96
  return confidences, heatmap_image
97
 
98
  # Configuración de la interfaz de Gradio
99
- title = "AI-DERM DETECTION"
100
- description = "Interfaz para diagnóstico automatizado de enfermedades de la piel"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
 
102
  examples = [
103
  ['./123.jpg'],
104
  ['./acne-closed-comedo-2.jpg'],
105
  ['./distal-subungual-onychomycosis-86.jpeg'],
106
  ['./cherry-angioma-16.jpg'],
107
- ['./malignant-melanoma-16.jpg']
 
 
 
 
 
108
  ]
109
 
 
110
  gr.Interface(
111
  fn=classify_image,
112
  title=title,
 
113
  description=description,
114
  inputs=gr.Image(),
115
  outputs=[gr.Label(num_top_classes=4), gr.Image(label="Mapa de Calor")],
 
24
  print(f"Error al cargar el modelo: {e}")
25
  raise
26
 
 
 
 
 
 
27
  # Definir las etiquetas
28
  labels = [
29
  'Acné / Rosácea', 'Queratosis Actínica / Carcinoma Basocelular',
 
41
  ]
42
 
43
  # Función Grad-CAM para generar el mapa de calor de activación
44
+ def grad_cam(model, img_array, last_conv_layer_name="top_conv", pred_index=None):
45
+ grad_model = Model([model.inputs], [model.get_layer(last_conv_layer_name).output, model.output])
 
 
46
 
47
  with tf.GradientTape() as tape:
48
  last_conv_layer_output, preds = grad_model(img_array)
 
50
  pred_index = tf.argmax(preds[0])
51
  class_channel = preds[:, pred_index]
52
 
 
53
  grads = tape.gradient(class_channel, last_conv_layer_output)
 
 
54
  pooled_grads = tf.reduce_mean(grads, axis=(0, 1, 2))
55
 
 
56
  last_conv_layer_output = last_conv_layer_output[0]
57
  heatmap = last_conv_layer_output @ pooled_grads[..., tf.newaxis]
58
  heatmap = tf.squeeze(heatmap)
 
 
59
  heatmap = tf.maximum(heatmap, 0) / tf.math.reduce_max(heatmap)
60
  return heatmap.numpy()
61
 
62
  # Generar el mapa de calor de activación usando Grad-CAM
63
+ def generate_heatmap(image, last_conv_layer_name="top_conv"):
64
  img_array = tf.image.resize(image, (224, 224))
65
  img_array = tf.expand_dims(img_array, axis=0)
 
66
  heatmap = grad_cam(model, img_array, last_conv_layer_name)
67
  heatmap = cv2.resize(heatmap, (image.shape[1], image.shape[0]))
68
  heatmap = np.uint8(255 * heatmap)
69
  heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET)
70
  superimposed_image = cv2.addWeighted(np.array(image), 0.6, heatmap, 0.4, 0)
71
+ return Image.fromarray(superimposed_image)
 
72
 
73
+ # Función principal para clasificar la imagen y generar el mapa de calor
74
  def classify_image(image):
75
+ # Redimensionar y preparar la imagen para predicción
76
  image_resized = tf.image.resize(image, (224, 224))
77
  image_resized = tf.expand_dims(image_resized, axis=0)
78
  prediction = model.predict(image_resized).flatten()
79
  confidences = {labels[i]: float(prediction[i]) for i in range(len(labels))}
80
 
81
+ # Generar mapa de calor
82
+ heatmap_image = generate_heatmap(np.array(image))
83
  return confidences, heatmap_image
84
 
85
  # Configuración de la interfaz de Gradio
86
+ title = "AI-DERM DETECTION: Diagnóstico Automatizado de Enfermedades Cutáneas con Mapa de Calor"
87
+
88
+ article = (
89
+ "Se propone un sistema automatizado para el diagnóstico de las 23 enfermedades comunes de la piel:\n\n"
90
+ "1. Acné / Rosácea\n"
91
+ "2. Queratosis Actínica / Carcinoma Basocelular\n"
92
+ "3. Dermatitis Atópica\n"
93
+ "4. Enfermedades Bullosas\n"
94
+ "5. Celulitis / Impétigo (Infecciones Bacterianas)\n"
95
+ "6. Eccema\n"
96
+ "7. Exantemas (Erupciones Cutáneas por Medicamentos)\n"
97
+ "8. Pérdida de Cabello (Alopecia)\n"
98
+ "9. Herpes / VPH\n"
99
+ "10. Trastornos de la Pigmentación\n"
100
+ "11. Lupus\n"
101
+ "12. Melanoma (Cáncer de Piel)\n"
102
+ "13. Hongos en las Uñas\n"
103
+ "14. Hiedra Venenosa\n"
104
+ "15. Psoriasis (liquen plano)\n"
105
+ "16. Sarna / Enfermedad de Lyme\n"
106
+ "17. Queratosis Seborreica\n"
107
+ "18. Enfermedad Sistémica\n"
108
+ "19. Tiña / Tiña (Infecciones Fúngicas)\n"
109
+ "20. Urticaria / Ronchas\n"
110
+ "21. Tumores Vasculares\n"
111
+ "22. Vasculitis\n"
112
+ "23. Verrugas / Molusco\n\n"
113
+ "Este sistema automatizado se basa en un modelo preentrenado EfficientNetB7, capaz de diagnosticar 23 enfermedades cutáneas comunes. La interfaz te permite cargar una imagen y obtener las probabilidades de cada enfermedad detectada.\n\n"
114
+ "Además, el sistema incorpora Grad-CAM, una técnica de visualización que genera un mapa de calor superpuesto a la imagen de entrada, "
115
+ "destacando las áreas clave que el modelo considera relevantes para el diagnóstico. Esto permite a los profesionales de la salud y usuarios "
116
+ "comprender mejor el razonamiento del modelo al realizar una predicción, facilitando la interpretación y confianza en el diagnóstico automatizado.\n\n"
117
+ "<p style='text-align: center'>"
118
+ "<span style='font-size: 15pt;'>AI-DERM . Jeysshon Bustos . 2023.</span>"
119
+ "</p>"
120
+ )
121
+
122
+ description = (
123
+ "AI-DERM DETECTION es una herramienta avanzada que permite cargar imágenes de afecciones cutáneas para su diagnóstico automático. "
124
+ "El modelo clasifica la imagen en una de las 23 categorías de enfermedades cutáneas más comunes. Además, gracias a la implementación de Grad-CAM, "
125
+ "se muestra un mapa de calor superpuesto sobre la imagen, resaltando las zonas donde el modelo ha encontrado patrones que contribuyen a la clasificación. "
126
+ "Esta visualización permite entender mejor el diagnóstico y proporciona información adicional sobre las áreas afectadas en la piel."
127
+ )
128
 
129
  examples = [
130
  ['./123.jpg'],
131
  ['./acne-closed-comedo-2.jpg'],
132
  ['./distal-subungual-onychomycosis-86.jpeg'],
133
  ['./cherry-angioma-16.jpg'],
134
+ ['./malignant-melanoma-16.jpg'],
135
+ ['./tinea-primary-lesion-15.jpeg'],
136
+ ['./congenital-nevus-35.jpg'],
137
+ ['./tinea-body-137.jpg'],
138
+ ['./atopic-13.jpg'],
139
+ ['./atopic-7.jpg']
140
  ]
141
 
142
+ # Lanzar la interfaz de Gradio
143
  gr.Interface(
144
  fn=classify_image,
145
  title=title,
146
+ article=article,
147
  description=description,
148
  inputs=gr.Image(),
149
  outputs=[gr.Label(num_top_classes=4), gr.Image(label="Mapa de Calor")],