Spaces:
Sleeping
Sleeping
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() | |