Jedav commited on
Commit
8d96067
·
verified ·
1 Parent(s): c0c49f9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +28 -36
app.py CHANGED
@@ -2,7 +2,6 @@ import gradio as gr
2
  import numpy as np
3
  from PIL import Image
4
  import tensorflow as tf
5
- import cv2
6
  from transformers import pipeline
7
 
8
  # =========================
@@ -10,7 +9,6 @@ from transformers import pipeline
10
  # =========================
11
  model = tf.keras.models.load_model("modelo_derm_real.h5")
12
 
13
- # ORDEN CORRECTO (TU class_indices)
14
  clases = ["carcinoma", "fibroma", "melanoma", "nevo", "precancer", "queratosis", "vascular"]
15
 
16
  map_clinico = {
@@ -29,34 +27,32 @@ map_clinico = {
29
  hf_model = pipeline("image-classification", model="nateraw/vit-base-beans")
30
 
31
  # =========================
32
- # 🧠 ABCDE CLÍNICO
33
  # =========================
34
  def analizar_abcde(image):
35
  img = np.array(image)
36
- gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
37
 
38
  # A: Asimetría
39
- h, w = gray.shape
40
- izquierda = gray[:, :w//2]
41
- derecha = np.fliplr(gray[:, w//2:])
42
  min_w = min(izquierda.shape[1], derecha.shape[1])
43
  asimetria = np.mean(np.abs(izquierda[:, :min_w] - derecha[:, :min_w]))
44
 
45
- # B: Bordes (irregularidad)
46
- edges = cv2.Canny(gray, 50, 150)
47
- bordes = np.sum(edges) / (h*w)
48
 
49
- # C: Color (variación)
50
  color_var = np.std(img)
51
 
52
- # D: Diámetro (aprox)
53
  diametro = max(h, w)
54
 
55
  score = 0
56
 
57
- if asimetria > 25:
58
  score += 1
59
- if bordes > 0.05:
60
  score += 1
61
  if color_var > 50:
62
  score += 1
@@ -81,53 +77,49 @@ def predict(image):
81
  idx = np.argmax(pred)
82
  confianza = float(pred[idx]) * 100
83
  dx = clases[idx]
84
-
85
  dx_clinico = map_clinico[dx]
86
 
87
  # ===== ABCDE =====
88
  score_abcde = analizar_abcde(image)
89
 
90
- # ===== MODELO HF =====
91
  hf = hf_model(image)
92
  hf_conf = hf[0]["score"] * 100
93
 
94
  # =========================
95
- # 🧠 FUSIÓN CLÍNICA REAL
96
  # =========================
97
  if score_abcde >= 3:
98
- riesgo = "🔴 ALTO"
99
  diagnostico = "Sospechoso de malignidad"
 
100
  elif score_abcde == 2:
101
- riesgo = "🟠 MODERADO"
102
  diagnostico = dx_clinico
 
103
  else:
104
- riesgo = "🟢 BAJO"
105
  diagnostico = "Nevo benigno"
 
106
 
107
- # 🔥 FILTRO ANTI FALSOS POSITIVOS
108
  if dx_clinico in ["Melanoma", "Carcinoma basocelular"] and score_abcde < 3:
109
  diagnostico = "Nevo benigno"
110
  riesgo = "🟢 BAJO"
111
 
112
- # =========================
113
- # 🧾 REPORTE
114
- # =========================
115
  return f"""
116
- 🏥 INFORME DERMATOLÓGICO IA
117
 
118
- Diagnóstico final: {diagnostico}
119
  Confianza modelo: {round(confianza,2)}%
120
  IA base: {round(hf_conf,2)}%
121
 
122
- Evaluación ABCDE: {score_abcde}/4
123
- Nivel de riesgo: {riesgo}
124
 
125
  🩺 Conducta:
126
- - 🔴 Alto → Biopsia urgente
127
- - 🟠 Moderado → Dermatoscopia
128
- - 🟢 Bajo → Seguimiento
129
 
130
- Sistema de apoyo clínico.
131
  """
132
 
133
  except Exception as e:
@@ -135,15 +127,15 @@ Nivel de riesgo: {riesgo}
135
 
136
 
137
  # =========================
138
- # 🎯 INTERFAZ PRO
139
  # =========================
140
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
141
  gr.Markdown("# 🧠 Derm-IA Clínico PRO")
142
- gr.Markdown("### IA dermatológica con análisis tipo ABCDE")
143
 
144
  with gr.Row():
145
- img = gr.Image(type="pil", label="📸 Lesión")
146
- out = gr.Textbox(lines=18)
147
 
148
  btn = gr.Button("🔍 Analizar")
149
  btn.click(fn=predict, inputs=img, outputs=out)
 
2
  import numpy as np
3
  from PIL import Image
4
  import tensorflow as tf
 
5
  from transformers import pipeline
6
 
7
  # =========================
 
9
  # =========================
10
  model = tf.keras.models.load_model("modelo_derm_real.h5")
11
 
 
12
  clases = ["carcinoma", "fibroma", "melanoma", "nevo", "precancer", "queratosis", "vascular"]
13
 
14
  map_clinico = {
 
27
  hf_model = pipeline("image-classification", model="nateraw/vit-base-beans")
28
 
29
  # =========================
30
+ # 🧠 ABCDE SIN OPENCV
31
  # =========================
32
  def analizar_abcde(image):
33
  img = np.array(image)
 
34
 
35
  # A: Asimetría
36
+ h, w, _ = img.shape
37
+ izquierda = img[:, :w//2]
38
+ derecha = np.fliplr(img[:, w//2:])
39
  min_w = min(izquierda.shape[1], derecha.shape[1])
40
  asimetria = np.mean(np.abs(izquierda[:, :min_w] - derecha[:, :min_w]))
41
 
42
+ # B: Bordes (simple)
43
+ bordes = np.std(img)
 
44
 
45
+ # C: Color
46
  color_var = np.std(img)
47
 
48
+ # D: Tamaño relativo
49
  diametro = max(h, w)
50
 
51
  score = 0
52
 
53
+ if asimetria > 20:
54
  score += 1
55
+ if bordes > 40:
56
  score += 1
57
  if color_var > 50:
58
  score += 1
 
77
  idx = np.argmax(pred)
78
  confianza = float(pred[idx]) * 100
79
  dx = clases[idx]
 
80
  dx_clinico = map_clinico[dx]
81
 
82
  # ===== ABCDE =====
83
  score_abcde = analizar_abcde(image)
84
 
85
+ # ===== HF fallback =====
86
  hf = hf_model(image)
87
  hf_conf = hf[0]["score"] * 100
88
 
89
  # =========================
90
+ # 🧠 LÓGICA CLÍNICA
91
  # =========================
92
  if score_abcde >= 3:
 
93
  diagnostico = "Sospechoso de malignidad"
94
+ riesgo = "🔴 ALTO"
95
  elif score_abcde == 2:
 
96
  diagnostico = dx_clinico
97
+ riesgo = "🟠 MODERADO"
98
  else:
 
99
  diagnostico = "Nevo benigno"
100
+ riesgo = "🟢 BAJO"
101
 
102
+ # 🔥 ANTI FALSOS POSITIVOS
103
  if dx_clinico in ["Melanoma", "Carcinoma basocelular"] and score_abcde < 3:
104
  diagnostico = "Nevo benigno"
105
  riesgo = "🟢 BAJO"
106
 
 
 
 
107
  return f"""
108
+ 🏥 INFORME DERM-IA PRO
109
 
110
+ Diagnóstico: {diagnostico}
111
  Confianza modelo: {round(confianza,2)}%
112
  IA base: {round(hf_conf,2)}%
113
 
114
+ ABCDE score: {score_abcde}/4
115
+ Riesgo: {riesgo}
116
 
117
  🩺 Conducta:
118
+ - 🔴 Biopsia urgente
119
+ - 🟠 Dermatoscopia
120
+ - 🟢 Seguimiento
121
 
122
+ Apoyo clínico.
123
  """
124
 
125
  except Exception as e:
 
127
 
128
 
129
  # =========================
130
+ # 🎯 INTERFAZ
131
  # =========================
132
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
133
  gr.Markdown("# 🧠 Derm-IA Clínico PRO")
134
+ gr.Markdown("### IA dermatológica (estable + sin errores)")
135
 
136
  with gr.Row():
137
+ img = gr.Image(type="pil")
138
+ out = gr.Textbox(lines=15)
139
 
140
  btn = gr.Button("🔍 Analizar")
141
  btn.click(fn=predict, inputs=img, outputs=out)