SergioI1991 commited on
Commit
446b8e6
verified
1 Parent(s): ed1aa2d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +63 -25
app.py CHANGED
@@ -2,21 +2,45 @@ import gradio as gr
2
  import tensorflow as tf
3
  import numpy as np
4
 
 
5
  IMG_SIZE = (224, 224)
6
- MODEL_PATH = "dental_classifier_model.keras"
7
  CLASS_NAMES = ['no_valido', 'valido']
8
 
9
- model = tf.keras.models.load_model(MODEL_PATH)
 
 
 
 
 
 
 
 
 
10
 
 
11
  def preprocess_image(img):
 
 
 
12
  img = tf.image.resize(img, IMG_SIZE)
13
  img_array = tf.expand_dims(img, 0)
14
- img_array = img_array / 255.0
15
  return img_array
16
 
17
  def predecir(rx_image):
 
 
 
 
18
  img_array = preprocess_image(rx_image)
19
- preds = model.predict(img_array)
 
 
 
 
 
 
20
  score = tf.nn.softmax(preds[0])
21
 
22
  predicted_index = np.argmax(score)
@@ -27,46 +51,60 @@ def predecir(rx_image):
27
  other_class = CLASS_NAMES[other_index]
28
  other_confidence = score[other_index] * 100
29
 
30
- color_texto = "#4CAF50" if predicted_class == "valido" else "#FF0000"
 
 
 
 
31
 
 
32
  resultado_texto = f"""
33
  <div style='
34
- font-size:36px;
35
- text-align:center;
36
- padding:40px;
37
- height:350px;
38
- border: 3px solid {color_texto};
39
- border-radius:25px;
40
- background-color:#ffffff; /* fondo blanco seguro */
41
- display:flex;
42
- flex-direction:column;
43
- justify-content:center;
44
- color:{color_texto};
45
  box-shadow: 0 4px 12px rgba(0,0,0,0.15);
46
  '>
47
  <div>Resultado: <b>{predicted_class.upper()}</b></div>
48
  <div>Confianza: {confidence:.2f}%</div>
49
- <div>Probabilidad {other_class}: {other_confidence:.2f}%</div>
 
 
50
  </div>
51
  """
52
 
53
  return resultado_texto
54
 
 
55
  with gr.Blocks(theme="default") as demo:
56
  # Forzar fondo claro en toda la app
57
- gr.HTML("<style>body{background-color:#ffffff;}</style>")
58
 
59
  gr.Markdown("## Clasificador RX LAB 馃Ψ V1(529NV-348V) TFG Marta B.")
60
 
61
  with gr.Row():
62
- with gr.Column():
63
- rx_input = gr.Image(type="numpy", label="Sube tu RX")
64
- boton_analizar = gr.Button("Analizar")
65
- boton_limpiar = gr.Button("Limpiar")
66
- with gr.Column():
 
 
 
67
  resultado = gr.HTML(label="Resultado")
68
-
 
69
  boton_analizar.click(fn=predecir, inputs=rx_input, outputs=resultado)
70
  boton_limpiar.click(lambda: (None, None), inputs=[], outputs=[rx_input, resultado])
71
 
72
- demo.launch()
 
 
 
2
  import tensorflow as tf
3
  import numpy as np
4
 
5
+ # --- Configuraci贸n ---
6
  IMG_SIZE = (224, 224)
7
+ MODEL_PATH = "dental_classifier_model.keras" # Aseg煤rate de que esta ruta sea correcta
8
  CLASS_NAMES = ['no_valido', 'valido']
9
 
10
+ # --- Cargar Modelo ---
11
+ # Manejo de errores b谩sico para la carga del modelo
12
+ try:
13
+ model = tf.keras.models.load_model(MODEL_PATH)
14
+ print("Modelo cargado exitosamente.")
15
+ except Exception as e:
16
+ print(f"Error cargando el modelo desde {MODEL_PATH}: {e}")
17
+ print("Aseg煤rate de que el archivo 'dental_classifier_model.keras' est茅 en el mismo directorio.")
18
+ # Salir o manejar el error como prefieras si el modelo no se carga
19
+ # Por ahora, Gradio mostrar谩 un error si 'model' no est谩 definido.
20
 
21
+ # --- Funciones de Procesamiento ---
22
  def preprocess_image(img):
23
+ """Preprocesa la imagen de entrada al formato que espera el modelo."""
24
+ if img is None:
25
+ return None
26
  img = tf.image.resize(img, IMG_SIZE)
27
  img_array = tf.expand_dims(img, 0)
28
+ img_array = img_array / 255.0 # Normalizar
29
  return img_array
30
 
31
  def predecir(rx_image):
32
+ """Realiza la predicci贸n y formatea la salida HTML."""
33
+ if rx_image is None:
34
+ return "<div style='color:red; text-align:center; padding-top:100px;'>Por favor, sube una imagen primero.</div>"
35
+
36
  img_array = preprocess_image(rx_image)
37
+
38
+ try:
39
+ preds = model.predict(img_array)
40
+ except Exception as e:
41
+ print(f"Error durante la predicci贸n: {e}")
42
+ return f"<div style='color:red; text-align:center; padding-top:100px;'>Error al procesar el modelo: {e}</div>"
43
+
44
  score = tf.nn.softmax(preds[0])
45
 
46
  predicted_index = np.argmax(score)
 
51
  other_class = CLASS_NAMES[other_index]
52
  other_confidence = score[other_index] * 100
53
 
54
+ # --- Modificaci贸n de Estilo ---
55
+ # El color del borde sigue siendo din谩mico (verde/rojo)
56
+ color_borde = "#4CAF50" if predicted_class == "valido" else "#FF0000"
57
+ # El color del texto ahora es siempre negro (#000000)
58
+ color_texto_resultado = "#000000"
59
 
60
+ # HTML para el resultado
61
  resultado_texto = f"""
62
  <div style='
63
+ font-size:36px;
64
+ text-align:center;
65
+ padding:40px;
66
+ height:350px;
67
+ border: 3px solid {color_borde}; /* Borde din谩mico */
68
+ border-radius:25px;
69
+ background-color:#ffffff;
70
+ display:flex;
71
+ flex-direction:column;
72
+ justify-content:center;
73
+ color:{color_texto_resultado}; /* Texto siempre negro */
74
  box-shadow: 0 4px 12px rgba(0,0,0,0.15);
75
  '>
76
  <div>Resultado: <b>{predicted_class.upper()}</b></div>
77
  <div>Confianza: {confidence:.2f}%</div>
78
+ <div style='font-size: 24px; margin-top: 15px;'>
79
+ (Probabilidad {other_class}: {other_confidence:.2f}%)
80
+ </div>
81
  </div>
82
  """
83
 
84
  return resultado_texto
85
 
86
+ # --- Interfaz de Gradio ---
87
  with gr.Blocks(theme="default") as demo:
88
  # Forzar fondo claro en toda la app
89
+ gr.HTML("<style>body{background-color:#ffffff !important;}</style>")
90
 
91
  gr.Markdown("## Clasificador RX LAB 馃Ψ V1(529NV-348V) TFG Marta B.")
92
 
93
  with gr.Row():
94
+ with gr.Column(scale=1):
95
+ rx_input = gr.Image(type="numpy", label="Sube tu RX")
96
+
97
+ with gr.Row():
98
+ boton_limpiar = gr.Button("Limpiar", variant="secondary")
99
+ boton_analizar = gr.Button("Analizar", variant="primary")
100
+
101
+ with gr.Column(scale=1):
102
  resultado = gr.HTML(label="Resultado")
103
+
104
+ # --- Conexiones de Eventos ---
105
  boton_analizar.click(fn=predecir, inputs=rx_input, outputs=resultado)
106
  boton_limpiar.click(lambda: (None, None), inputs=[], outputs=[rx_input, resultado])
107
 
108
+ # --- Lanzar la App ---
109
+ if __name__ == "__main__":
110
+ demo.launch()