Spaces:
Running
Running
File size: 6,512 Bytes
19a5591 c1fddf0 d25c5db ab7273d c1fddf0 19a5591 d25c5db 98be0a9 d25c5db 62e38e8 d25c5db 19a5591 bf85b72 7500ba9 6f2b2b6 45bb8a3 6f2b2b6 45bb8a3 6f2b2b6 45bb8a3 6f2b2b6 7500ba9 19a5591 ab7273d 984e3b6 45f19d8 ab7273d bf85b72 984e3b6 ab7273d 98be0a9 ab7273d c1fddf0 ab7273d c1fddf0 ab7273d 984e3b6 c1fddf0 984e3b6 13ed002 984e3b6 c1fddf0 98be0a9 c1fddf0 d25c5db c1fddf0 984e3b6 c1fddf0 19a5591 bf85b72 984e3b6 98be0a9 19a5591 0711c05 7500ba9 f32ddff 7500ba9 984e3b6 7500ba9 19a5591 984e3b6 7500ba9 984e3b6 7500ba9 2772f38 c1fddf0 7500ba9 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
import gradio as gr
import tensorflow as tf
import numpy as np
import cv2
from tensorflow.keras.layers import DepthwiseConv2D
from tensorflow.keras.models import Model
from PIL import Image
# Función personalizada para DepthwiseConv2D
def custom_depthwise_conv2d(**kwargs):
kwargs.pop('groups', None)
return DepthwiseConv2D(**kwargs)
custom_objects = {'DepthwiseConv2D': custom_depthwise_conv2d}
# Ruta del modelo
path_to_model = "modelo_jeysshon_iaderm.h5"
# Cargar el modelo con custom_objects
try:
model = tf.keras.models.load_model(path_to_model, custom_objects=custom_objects)
print("Modelo cargado exitosamente.")
except Exception as e:
print(f"Error al cargar el modelo: {e}")
raise
# Definir las etiquetas
labels = [
'Acné / Rosácea', 'Queratosis Actínica / Carcinoma Basocelular',
'Dermatitis Atópica', 'Enfermedad Bullosa',
'Celulitis Impétigo (Infecciones Bacterianas)',
'Eczema', 'Exanthems (Erupciones Cutáneas por Medicamentos)', 'Pérdida de Cabello (Alopecia)',
'Herpes HPV', 'Trastornos de Pigmentación',
'Lupus',
'Melanoma (Cáncer de Piel)', 'Hongos en las Uñas',
'Hiedra Venenosa',
'Psoriasis (Lichen Planus)', 'Sarna Lyme',
'Queratosis Seborreica', 'Enfermedad Sistémica',
'Tinea Ringworm (Infecciones Fúngicas)',
'Urticaria Ronchas', 'Tumores Vasculares', 'Vasculitis', 'Verrugas Molusco'
]
# Función Grad-CAM para generar el mapa de calor de activación
def grad_cam(model, img_array, last_conv_layer_name="top_conv", pred_index=None):
grad_model = Model([model.inputs], [model.get_layer(last_conv_layer_name).output, model.output])
with tf.GradientTape() as tape:
last_conv_layer_output, preds = grad_model(img_array)
if pred_index is None:
pred_index = tf.argmax(preds[0])
class_channel = preds[:, pred_index]
grads = tape.gradient(class_channel, last_conv_layer_output)
pooled_grads = tf.reduce_mean(grads, axis=(0, 1, 2))
last_conv_layer_output = last_conv_layer_output[0]
heatmap = last_conv_layer_output @ pooled_grads[..., tf.newaxis]
heatmap = tf.squeeze(heatmap)
heatmap = tf.maximum(heatmap, 0) / tf.math.reduce_max(heatmap)
return heatmap.numpy()
# Generar el mapa de calor de activación usando Grad-CAM
def generate_heatmap(image, last_conv_layer_name="top_conv"):
img_array = tf.image.resize(image, (224, 224))
img_array = tf.expand_dims(img_array, axis=0)
heatmap = grad_cam(model, img_array, last_conv_layer_name)
heatmap = cv2.resize(heatmap, (image.shape[1], image.shape[0]))
heatmap = np.uint8(255 * heatmap)
heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET)
superimposed_image = cv2.addWeighted(np.array(image), 0.6, heatmap, 0.4, 0)
return Image.fromarray(superimposed_image)
# Función principal para clasificar la imagen y generar el mapa de calor
def classify_image(image):
# Redimensionar y preparar la imagen para predicción
image_resized = tf.image.resize(image, (224, 224))
image_resized = tf.expand_dims(image_resized, axis=0)
prediction = model.predict(image_resized).flatten()
confidences = {labels[i]: float(prediction[i]) for i in range(len(labels))}
# Generar mapa de calor
heatmap_image = generate_heatmap(np.array(image))
return confidences, heatmap_image
# Configuración de la interfaz de Gradio
title = "AI-DERM DETECTION: Diagnóstico Automatizado de Enfermedades Cutáneas con Mapa de Calor"
article = (
"Se propone un sistema automatizado para el diagnóstico de las 23 enfermedades comunes de la piel:\n\n"
"1. Acné / Rosácea\n"
"2. Queratosis Actínica / Carcinoma Basocelular\n"
"3. Dermatitis Atópica\n"
"4. Enfermedades Bullosas\n"
"5. Celulitis / Impétigo (Infecciones Bacterianas)\n"
"6. Eccema\n"
"7. Exantemas (Erupciones Cutáneas por Medicamentos)\n"
"8. Pérdida de Cabello (Alopecia)\n"
"9. Herpes / VPH\n"
"10. Trastornos de la Pigmentación\n"
"11. Lupus\n"
"12. Melanoma (Cáncer de Piel)\n"
"13. Hongos en las Uñas\n"
"14. Hiedra Venenosa\n"
"15. Psoriasis (liquen plano)\n"
"16. Sarna / Enfermedad de Lyme\n"
"17. Queratosis Seborreica\n"
"18. Enfermedad Sistémica\n"
"19. Tiña / Tiña (Infecciones Fúngicas)\n"
"20. Urticaria / Ronchas\n"
"21. Tumores Vasculares\n"
"22. Vasculitis\n"
"23. Verrugas / Molusco\n\n"
"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"
"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, "
"destacando las áreas clave que el modelo considera relevantes para el diagnóstico. Esto permite a los profesionales de la salud y usuarios "
"comprender mejor el razonamiento del modelo al realizar una predicción, facilitando la interpretación y confianza en el diagnóstico automatizado.\n\n"
"<p style='text-align: center'>"
"<span style='font-size: 15pt;'>AI-DERM . Jeysshon Bustos . 2023.</span>"
"</p>"
)
description = (
"AI-DERM DETECTION es una herramienta avanzada que permite cargar imágenes de afecciones cutáneas para su diagnóstico automático. "
"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, "
"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. "
"Esta visualización permite entender mejor el diagnóstico y proporciona información adicional sobre las áreas afectadas en la piel."
)
examples = [
['./123.jpg'],
['./acne-closed-comedo-2.jpg'],
['./distal-subungual-onychomycosis-86.jpeg'],
['./cherry-angioma-16.jpg'],
['./malignant-melanoma-16.jpg'],
['./tinea-primary-lesion-15.jpeg'],
['./congenital-nevus-35.jpg'],
['./tinea-body-137.jpg'],
['./atopic-13.jpg'],
['./atopic-7.jpg']
]
# Lanzar la interfaz de Gradio
gr.Interface(
fn=classify_image,
title=title,
article=article,
description=description,
inputs=gr.Image(),
outputs=[gr.Label(num_top_classes=4), gr.Image(label="Mapa de Calor")],
examples=examples
).launch()
|