Update app.py
Browse files
app.py
CHANGED
|
@@ -1,22 +1,89 @@
|
|
| 1 |
import gradio as gr
|
| 2 |
from transformers import pipeline
|
| 3 |
|
| 4 |
-
#
|
| 5 |
modelo = pipeline("image-classification", model="nateraw/food")
|
| 6 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 7 |
def analizar_foto(img):
|
|
|
|
|
|
|
|
|
|
| 8 |
resultado = modelo(img)
|
| 9 |
-
nombre = resultado[0]['label']
|
| 10 |
-
|
| 11 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 12 |
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
title="NutriBot 🍽️",
|
| 18 |
-
description="Sube una foto de tu comida y descubre cuántas calorías podría tener."
|
| 19 |
|
| 20 |
-
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
|
| 22 |
demo.launch()
|
|
|
|
|
|
| 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 |
+
|