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()