IADERM-UTOPIC / app.py
jeysshon's picture
Update app.py
984e3b6 verified
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()