LoloSemper commited on
Commit
fe3b436
·
verified ·
1 Parent(s): 3f8fe80

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +10 -76
app.py CHANGED
@@ -1,63 +1,3 @@
1
- import torch
2
- from transformers import ViTImageProcessor, ViTForImageClassification
3
- from fastai.learner import load_learner
4
- from fastai.vision.core import PILImage
5
- from PIL import Image
6
- import matplotlib.pyplot as plt
7
- import numpy as np
8
- import gradio as gr
9
- import io
10
- import base64
11
- import tensorflow as tf
12
- import keras # <--- nuevo import para TFSMLayer
13
- import zipfile
14
- import os
15
-
16
- # 🔹 Cargar modelo ViT desde Hugging Face
17
- MODEL_NAME = "ahishamm/vit-base-HAM-10000-sharpened-patch-32"
18
- feature_extractor = ViTImageProcessor.from_pretrained(MODEL_NAME)
19
- model_vit = ViTForImageClassification.from_pretrained(MODEL_NAME)
20
- model_vit.eval()
21
-
22
- # 🔹 Cargar modelos Fast.ai desde archivos locales
23
- model_malignancy = load_learner("ada_learn_malben.pkl")
24
- model_norm2000 = load_learner("ada_learn_skin_norm2000.pkl")
25
-
26
- # 🔹 Preparar y cargar modelo TensorFlow ISIC
27
- zip_path = "saved_model.zip"
28
- extract_dir = "saved_model"
29
- if not os.path.exists(extract_dir):
30
- with zipfile.ZipFile(zip_path, 'r') as zip_ref:
31
- zip_ref.extractall(extract_dir)
32
-
33
- # Cargar modelo con TFSMLayer (solo para inferencia)
34
- model_isic = keras.layers.TFSMLayer(extract_dir, call_endpoint='serving_default')
35
-
36
- # 🔹 Clases y niveles de riesgo
37
- CLASSES = [
38
- "Queratosis actínica / Bowen", "Carcinoma células basales",
39
- "Lesión queratósica benigna", "Dermatofibroma",
40
- "Melanoma maligno", "Nevus melanocítico", "Lesión vascular"
41
- ]
42
- RISK_LEVELS = {
43
- 0: {'level': 'Moderado', 'color': '#ffaa00', 'weight': 0.6},
44
- 1: {'level': 'Alto', 'color': '#ff4444', 'weight': 0.8},
45
- 2: {'level': 'Bajo', 'color': '#44ff44', 'weight': 0.1},
46
- 3: {'level': 'Bajo', 'color': '#44ff44', 'weight': 0.1},
47
- 4: {'level': 'Crítico', 'color': '#cc0000', 'weight': 1.0},
48
- 5: {'level': 'Bajo', 'color': '#44ff44', 'weight': 0.1},
49
- 6: {'level': 'Bajo', 'color': '#44ff44', 'weight': 0.1}
50
- }
51
-
52
- def preprocess_image_isic(image: Image.Image):
53
- # Ajustar tamaño y normalización que espera el modelo ISIC
54
- image = image.resize((224, 224))
55
- img_array = np.array(image) / 255.0
56
- if img_array.shape[-1] == 4: # eliminar canal alpha si existe
57
- img_array = img_array[..., :3]
58
- img_array = np.expand_dims(img_array, axis=0) # batch dimension
59
- return img_array.astype(np.float32)
60
-
61
  def analizar_lesion_combined(img):
62
  # Convertir imagen para Fastai
63
  img_fastai = PILImage.create(img)
@@ -78,8 +18,16 @@ def analizar_lesion_combined(img):
78
 
79
  # Modelo TensorFlow ISIC (usando TFSMLayer)
80
  x_isic = preprocess_image_isic(img)
81
- preds_isic_tensor = model_isic(x_isic) # devuelve tensor
82
- preds_isic = preds_isic_tensor.numpy()[0] # convertir a numpy y quitar batch dim
 
 
 
 
 
 
 
 
83
  pred_idx_isic = int(np.argmax(preds_isic))
84
  pred_class_isic = CLASSES[pred_idx_isic]
85
  confidence_isic = preds_isic[pred_idx_isic]
@@ -116,7 +64,6 @@ def analizar_lesion_combined(img):
116
  <b>🩺 Recomendación automática:</b><br>
117
  """
118
 
119
- # Recomendación basada en ViT + malignidad
120
  cancer_risk_score = sum(probs_vit[i] * RISK_LEVELS[i]['weight'] for i in range(7))
121
  if prob_malignant > 0.7 or cancer_risk_score > 0.6:
122
  informe += "🚨 <b>CRÍTICO</b> – Derivación urgente a oncología dermatológica"
@@ -130,16 +77,3 @@ def analizar_lesion_combined(img):
130
  informe += "</div>"
131
 
132
  return informe, html_chart
133
-
134
- # 🔹 Interfaz Gradio
135
- demo = gr.Interface(
136
- fn=analizar_lesion_combined,
137
- inputs=gr.Image(type="pil", label="Sube una imagen de la lesión"),
138
- outputs=[gr.HTML(label="Informe combinado"), gr.HTML(label="Gráfico ViT")],
139
- title="Detector de Lesiones Cutáneas (ViT + Fast.ai + ISIC TensorFlow)",
140
- description="Comparación entre ViT transformer (HAM10000), dos modelos Fast.ai y el modelo ISIC TensorFlow.",
141
- flagging_mode="never"
142
- )
143
-
144
- if __name__ == "__main__":
145
- demo.launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  def analizar_lesion_combined(img):
2
  # Convertir imagen para Fastai
3
  img_fastai = PILImage.create(img)
 
18
 
19
  # Modelo TensorFlow ISIC (usando TFSMLayer)
20
  x_isic = preprocess_image_isic(img)
21
+ preds_isic_dict = model_isic(x_isic) # devuelve dict con tensores
22
+
23
+ # DEBUG: imprime claves para saber cuál usar
24
+ print("Claves de salida de model_isic:", preds_isic_dict.keys())
25
+
26
+ # Por ejemplo, si la clave correcta es 'outputs', cámbiala aquí:
27
+ # Si sólo hay una clave, la usamos directamente:
28
+ key = list(preds_isic_dict.keys())[0]
29
+ preds_isic = preds_isic_dict[key].numpy()[0]
30
+
31
  pred_idx_isic = int(np.argmax(preds_isic))
32
  pred_class_isic = CLASSES[pred_idx_isic]
33
  confidence_isic = preds_isic[pred_idx_isic]
 
64
  <b>🩺 Recomendación automática:</b><br>
65
  """
66
 
 
67
  cancer_risk_score = sum(probs_vit[i] * RISK_LEVELS[i]['weight'] for i in range(7))
68
  if prob_malignant > 0.7 or cancer_risk_score > 0.6:
69
  informe += "🚨 <b>CRÍTICO</b> – Derivación urgente a oncología dermatológica"
 
77
  informe += "</div>"
78
 
79
  return informe, html_chart