Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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,
|
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 |
-
|
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
|
95 |
-
heatmap_image = generate_heatmap(np.array(image)
|
96 |
return confidences, heatmap_image
|
97 |
|
98 |
# Configuración de la interfaz de Gradio
|
99 |
-
title = "AI-DERM DETECTION"
|
100 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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")],
|