caissaa23 commited on
Commit
0d37bfe
·
verified ·
1 Parent(s): 27bd6fc

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +94 -76
app.py CHANGED
@@ -1,89 +1,107 @@
1
  import gradio as gr
2
- from transformers import pipeline
 
3
 
4
- # Modelo para reconocer comidas
5
- modelo = pipeline("image-classification", model="nateraw/food")
6
-
7
- # Variables globales
8
- estado = {
9
- "meta_diaria": 0,
10
- "restantes": 0,
11
- "quemas": 0
12
- }
13
-
14
- # Calorías promedio por comida
15
- calorias_promedio = {
16
- "pizza": 285,
17
- "hamburger": 354,
18
- "apple": 95,
19
- "banana": 105,
20
- "salad": 150,
21
- "pasta": 350,
22
- "rice": 200,
23
- "ice cream": 210,
24
- "donut": 195,
25
- }
26
-
27
- # Cálculo de TDEE (gasto diario total)
28
- def calcular_calorias(edad, peso, altura, sexo, actividad):
29
  if sexo.lower() == "hombre":
30
- bmr = 88.36 + (13.4 * peso) + (4.8 * altura) - (5.7 * edad)
31
  else:
32
- bmr = 447.6 + (9.2 * peso) + (3.1 * altura) - (4.3 * edad)
33
 
34
- niveles = {
35
- "Sedentario": 1.2,
36
- "Ligero": 1.375,
37
- "Moderado": 1.55,
38
- "Activo": 1.725,
39
- "Muy activo": 1.9
40
  }
41
- tdee = bmr * niveles.get(actividad, 1.2)
42
- estado["meta_diaria"] = round(tdee)
43
- estado["restantes"] = round(tdee)
44
- return f"Tu gasto calórico diario estimado es de {round(tdee)} calorías."
45
-
46
- def analizar_foto(img):
47
- if estado["meta_diaria"] == 0:
48
- return "⚠️ Primero calcula tu meta diaria con tus datos personales."
49
-
50
- resultado = modelo(img)
51
- nombre = resultado[0]['label'].lower()
52
- calorias = calorias_promedio.get(nombre, 250)
53
- estado["restantes"] = max(0, estado["restantes"] - calorias)
54
- return f"🍽️ {nombre.title()} ≈ {calorias} cal. Te quedan {estado['restantes']} de {estado['meta_diaria']} cal."
55
 
56
- def agregar_quemadas(cal):
57
- estado["restantes"] += cal
58
- estado["quemas"] += cal
59
- return f"🔥 Has quemado {cal} cal. Te quedan {estado['restantes']} de {estado['meta_diaria']} cal."
 
 
 
60
 
61
- # Interfaz
62
- with gr.Blocks() as demo:
63
- gr.Markdown("# 🍎 NutriBot Pro IA de Calorías Personalizada")
64
- gr.Markdown("Calcula tu meta diaria automáticamente y lleva el control de tus comidas 🍔")
 
 
65
 
66
- with gr.Tab("🧍 Tu perfil"):
67
- edad = gr.Number(label="Edad (años)")
68
- peso = gr.Number(label="Peso (kg)")
69
- altura = gr.Number(label="Altura (cm)")
70
- sexo = gr.Radio(["Hombre", "Mujer"], label="Sexo")
71
- actividad = gr.Dropdown(["Sedentario", "Ligero", "Moderado", "Activo", "Muy activo"], label="Nivel de actividad")
72
- btn_meta = gr.Button("Calcular meta calórica")
73
- salida_meta = gr.Textbox(label="Resultado")
74
- btn_meta.click(calcular_calorias, inputs=[edad, peso, altura, sexo, actividad], outputs=salida_meta)
75
 
76
- with gr.Tab("📸 Tu comida"):
77
- img = gr.Image(type="pil", label="Sube una foto de tu comida")
78
- btn_foto = gr.Button("Analizar comida")
79
- salida_foto = gr.Textbox(label="Resultado")
80
- btn_foto.click(analizar_foto, inputs=img, outputs=salida_foto)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
81
 
82
- with gr.Tab(" Calorías quemadas"):
83
- cal = gr.Number(label="Calorías quemadas (manual o desde reloj)")
84
- btn_quemar = gr.Button("Agregar calorías quemadas")
85
- salida_quemar = gr.Textbox(label="Estado actual")
86
- btn_quemar.click(agregar_quemadas, inputs=cal, outputs=salida_quemar)
87
 
88
- demo.launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
 
 
 
 
1
  import gradio as gr
2
+ from PIL import Image
3
+ import datetime
4
 
5
+ # Funciones básicas
6
+ def calcular_calorias_diarias(edad, sexo, peso, altura, nivel_actividad):
7
+ """
8
+ Calcula calorías diarias recomendadas usando la fórmula Mifflin-St Jeor
9
+ Nivel de actividad: 'sedentario', 'ligero', 'moderado', 'activo'
10
+ """
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  if sexo.lower() == "hombre":
12
+ bmr = 10*peso + 6.25*altura - 5*edad + 5
13
  else:
14
+ bmr = 10*peso + 6.25*altura - 5*edad - 161
15
 
16
+ factores = {
17
+ 'sedentario': 1.2,
18
+ 'ligero': 1.375,
19
+ 'moderado': 1.55,
20
+ 'activo': 1.725
 
21
  }
22
+ return int(bmr * factores.get(nivel_actividad, 1.2))
 
 
 
 
 
 
 
 
 
 
 
 
 
23
 
24
+ # Simula una base de datos de comidas y calorías
25
+ comidas_db = {
26
+ "manzana": 95,
27
+ "banano": 105,
28
+ "pollo a la plancha": 250,
29
+ "arroz cocido": 200,
30
+ }
31
 
32
+ # Lista de nutriólogos recomendados
33
+ nutriologos_db = [
34
+ {"nombre": "Dra. Ana Pérez", "ciudad": "Ciudad de México", "pais": "México"},
35
+ {"nombre": "Dr. John Smith", "ciudad": "New York", "pais": "USA"},
36
+ {"nombre": "Dra. Carla Gómez", "ciudad": "Madrid", "pais": "España"},
37
+ ]
38
 
39
+ # Registro de comidas
40
+ registro_comidas = []
 
 
 
 
 
 
 
41
 
42
+ def registrar_comida(imagen, calorias_comidas, calorias_quemadas, edad, sexo, peso, altura, nivel_actividad):
43
+ # Calorías recomendadas
44
+ calorias_diarias = calcular_calorias_diarias(edad, sexo, peso, altura, nivel_actividad)
45
+
46
+ # Sumar calorías de la foto (simulado)
47
+ calorias_tomadas = sum([comidas_db.get(c.lower(), 0) for c in calorias_comidas.split(",")])
48
+
49
+ # Ajustar con calorías quemadas
50
+ calorias_restantes = calorias_diarias - calorias_tomadas + calorias_quemadas
51
+
52
+ # Guardar registro
53
+ registro_comidas.append({
54
+ "fecha": datetime.datetime.now(),
55
+ "comida": calorias_comidas,
56
+ "calorias": calorias_tomadas,
57
+ "calorias_restantes": calorias_restantes
58
+ })
59
+
60
+ recomendacion = "Te recomendamos comer frutas y verduras frescas hoy."
61
+
62
+ return f"Calorías recomendadas para hoy: {calorias_diarias}\n" \
63
+ f"Calorías consumidas: {calorias_tomadas}\n" \
64
+ f"Calorías quemadas: {calorias_quemadas}\n" \
65
+ f"Calorías restantes: {calorias_restantes}\n\n" \
66
+ f"Recomendación: {recomendacion}"
67
 
68
+ def recomendar_nutriologo(ciudad="", pais=""):
69
+ resultados = [n for n in nutriologos_db if ciudad.lower() in n["ciudad"].lower() and pais.lower() in n["pais"].lower()]
70
+ if not resultados:
71
+ resultados = nutriologos_db # Si no encuentra, muestra todos
72
+ return "\n".join([f"{n['nombre']} - {n['ciudad']}, {n['pais']}" for n in resultados])
73
 
74
+ # Interfaz Gradio
75
+ with gr.Blocks() as demo:
76
+ gr.Markdown("# Bot de Nutrición Inteligente")
77
+
78
+ with gr.Tab("Registro de comida"):
79
+ with gr.Row():
80
+ imagen = gr.Image(label="Sube foto de tu comida")
81
+ calorias_input = gr.Textbox(label="Escribe la comida que comiste separada por comas")
82
+ edad = gr.Number(label="Edad")
83
+ sexo = gr.Dropdown(["Hombre", "Mujer"], label="Sexo")
84
+ peso = gr.Number(label="Peso en kg")
85
+ altura = gr.Number(label="Altura en cm")
86
+ nivel_actividad = gr.Dropdown(["sedentario", "ligero", "moderado", "activo"], label="Nivel de actividad")
87
+ calorias_quemadas = gr.Number(label="Calorías quemadas hoy (por smartwatch o ejercicio)")
88
+
89
+ boton_registrar = gr.Button("Registrar comida")
90
+ salida = gr.Textbox(label="Resultado")
91
+
92
+ boton_registrar.click(
93
+ registrar_comida,
94
+ inputs=[imagen, calorias_input, calorias_quemadas, edad, sexo, peso, altura, nivel_actividad],
95
+ outputs=salida
96
+ )
97
+
98
+ with gr.Tab("Nutriólogos recomendados"):
99
+ ciudad_input = gr.Textbox(label="Ciudad")
100
+ pais_input = gr.Textbox(label="País")
101
+ boton_nutri = gr.Button("Buscar nutriólogos")
102
+ salida_nutri = gr.Textbox(label="Nutriólogos")
103
+
104
+ boton_nutri.click(recomendar_nutriologo, inputs=[ciudad_input, pais_input], outputs=salida_nutri)
105
 
106
+ if __name__ == "__main__":
107
+ demo.launch()