DHEIVER's picture
Update app.py
f631343 verified
raw
history blame
11.3 kB
import gradio as gr
import torch
from transformers import AutoModel, AutoProcessor
import pandas as pd
from PIL import Image
import numpy as np
# Carrega o modelo
model = AutoModel.from_pretrained("openbmb/MiniCPM-o-2_6", trust_remote_code=True)
processor = AutoProcessor.from_pretrained("openbmb/MiniCPM-o-2_6", trust_remote_code=True)
# Base de dados nutricional
NUTRITION_DB = {
"arroz": {"calorias": 130, "proteinas": 2.7, "carboidratos": 28, "gorduras": 0.3},
"feijão": {"calorias": 77, "proteinas": 5.2, "carboidratos": 13.6, "gorduras": 0.5},
"carne": {"calorias": 250, "proteinas": 26, "carboidratos": 0, "gorduras": 17},
"batata frita": {"calorias": 312, "proteinas": 3.4, "carboidratos": 41, "gorduras": 15},
"salada": {"calorias": 15, "proteinas": 1.4, "carboidratos": 2.9, "gorduras": 0.2},
"ovo": {"calorias": 155, "proteinas": 13, "carboidratos": 1.1, "gorduras": 11},
"peixe": {"calorias": 206, "proteinas": 22, "carboidratos": 0, "gorduras": 12},
"macarrão": {"calorias": 158, "proteinas": 5.8, "carboidratos": 31, "gorduras": 1.2}
}
def process_image(image, progress=gr.Progress()):
"""Processa a imagem usando o modelo MiniCPM"""
try:
progress(0.3, desc="Processando imagem...")
# Prepara a imagem
if isinstance(image, str):
image = Image.open(image)
elif isinstance(image, np.ndarray):
image = Image.fromarray(image)
# Processa a imagem com o modelo
inputs = processor(
images=image,
text="List all foods present in this image, including their preparation method if visible.",
return_tensors="pt"
)
progress(0.6, desc="Analisando conteúdo...")
# Gera a descrição
outputs = model.generate(
**inputs,
max_new_tokens=100,
num_beams=5,
temperature=0.7,
top_p=0.9
)
description = processor.decode(outputs[0], skip_special_tokens=True)
progress(1.0, desc="Concluído!")
return description
except Exception as e:
raise gr.Error(f"Erro no processamento: {str(e)}")
def analyze_nutrition(foods_list):
"""Analisa nutrientes dos alimentos identificados"""
total_nutrients = {
"calorias": 0,
"proteinas": 0,
"carboidratos": 0,
"gorduras": 0
}
found_foods = []
for food in NUTRITION_DB.keys():
if food.lower() in foods_list.lower():
found_foods.append(food)
for nutrient, value in NUTRITION_DB[food].items():
total_nutrients[nutrient] += value
# Calcula proporções de macronutrientes
total_cal = total_nutrients['calorias']
if total_cal > 0:
protein_pct = (total_nutrients['proteinas'] * 4 / total_cal) * 100
carb_pct = (total_nutrients['carboidratos'] * 4 / total_cal) * 100
fat_pct = (total_nutrients['gorduras'] * 9 / total_cal) * 100
else:
protein_pct = carb_pct = fat_pct = 0
return total_nutrients, found_foods, (protein_pct, carb_pct, fat_pct)
def get_recommendations(nutrients, percentages):
"""Gera recomendações baseadas nos valores nutricionais"""
protein_pct, carb_pct, fat_pct = percentages
recommendations = []
if nutrients['calorias'] > 800:
recommendations.append("⚠️ Valor calórico elevado - considere reduzir as porções")
if protein_pct < 15:
recommendations.append("⚠️ Baixo teor de proteínas - adicione mais fontes proteicas")
if carb_pct > 60:
recommendations.append("⚠️ Alto teor de carboidratos - considere reduzir")
if fat_pct > 30:
recommendations.append("⚠️ Alto teor de gorduras - opte por preparações mais leves")
if not recommendations:
recommendations.append("✅ Refeição bem balanceada! Continue assim!")
return recommendations
def analyze_image(image):
"""Função principal de análise"""
try:
# Processa a imagem
description = process_image(image)
# Analisa nutrientes
total_nutrients, found_foods, percentages = analyze_nutrition(description)
# Gera recomendações
recommendations = get_recommendations(total_nutrients, percentages)
# Prepara dados para visualização
table_data = [
["Calorias", f"{total_nutrients['calorias']:.1f} kcal"],
["Proteínas", f"{total_nutrients['proteinas']:.1f}g"],
["Carboidratos", f"{total_nutrients['carboidratos']:.1f}g"],
["Gorduras", f"{total_nutrients['gorduras']:.1f}g"]
]
# Dados para o gráfico
plot_data = pd.DataFrame({
'Nutriente': ['Proteínas', 'Carboidratos', 'Gorduras'],
'Quantidade': [
total_nutrients['proteinas'],
total_nutrients['carboidratos'],
total_nutrients['gorduras']
]
})
# Monta o relatório
analysis = f"""### 🔍 Análise da Imagem
{description}
### 🍽️ Alimentos Identificados
{', '.join(found_foods)}
### 📊 Informação Nutricional
• Calorias Totais: {total_nutrients['calorias']:.1f} kcal
• Proteínas: {total_nutrients['proteinas']:.1f}g ({percentages[0]:.1f}%)
• Carboidratos: {total_nutrients['carboidratos']:.1f}g ({percentages[1]:.1f}%)
• Gorduras: {total_nutrients['gorduras']:.1f}g ({percentages[2]:.1f}%)
### 💡 Recomendações
{chr(10).join(recommendations)}
"""
return analysis, table_data, plot_data
except Exception as e:
return str(e), None, None
# CSS personalizado para marketing
css = """
.marketing-header {
text-align: center;
margin-bottom: 2rem;
background: linear-gradient(120deg, #84fab0 0%, #8fd3f4 100%);
padding: 2rem;
border-radius: 1rem;
color: white;
text-shadow: 1px 1px 2px rgba(0,0,0,0.1);
}
.features {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1rem;
margin: 2rem 0;
}
.feature-card {
background: white;
padding: 1.5rem;
border-radius: 0.5rem;
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
text-align: center;
}
.benefits {
background: #f8f9fa;
padding: 1.5rem;
border-radius: 0.5rem;
margin: 1rem 0;
}
.testimonial {
font-style: italic;
color: #666;
background: #fff;
padding: 1rem;
border-left: 4px solid #84fab0;
margin: 1rem 0;
}
.cta-button {
background: linear-gradient(45deg, #84fab0, #8fd3f4);
padding: 1rem 2rem;
border: none;
border-radius: 2rem;
color: white;
font-weight: bold;
cursor: pointer;
transition: all 0.3s ease;
}
.cta-button:hover {
transform: translateY(-2px);
box-shadow: 0 4px 8px rgba(0,0,0,0.2);
}
.results-container {
background: white;
padding: 1.5rem;
border-radius: 0.5rem;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
"""
# Interface Gradio com Marketing
with gr.Blocks(theme=gr.themes.Soft(), css=css) as iface:
with gr.Row(elem_classes="marketing-header"):
gr.Markdown("""
# 🍽️ NutriAI - Sua Análise Nutricional Inteligente
### Transforme sua alimentação com o poder da Inteligência Artificial
Análise nutricional precisa e personalizada em segundos!
""")
with gr.Row(elem_classes="features"):
with gr.Column(elem_classes="feature-card"):
gr.Markdown("""
### 🎯 Análise Precisa
- Reconhecimento avançado de alimentos
- Cálculo nutricional detalhado
- Tecnologia de ponta
""")
with gr.Column(elem_classes="feature-card"):
gr.Markdown("""
### ⚡ Resultados Instantâneos
- Análise em segundos
- Relatório completo
- Recomendações personalizadas
""")
with gr.Column(elem_classes="feature-card"):
gr.Markdown("""
### 💡 Inteligência Artificial
- Modelo MiniCPM avançado
- Aprendizado contínuo
- Alta precisão
""")
with gr.Row(elem_classes="benefits"):
gr.Markdown("""
### 🌟 Benefícios
✓ **Controle sua alimentação** de forma inteligente
✓ **Monitore nutrientes** essenciais
✓ **Receba dicas** personalizadas
✓ **Economize tempo** na contagem de calorias
✓ **Melhore seus hábitos** alimentares
""")
with gr.Row():
with gr.Column():
gr.Markdown("## 📸 Analise seu Prato")
image_input = gr.Image(
type="pil",
label="Faça upload ou tire uma foto do seu prato",
sources=["upload", "webcam"]
)
analyze_btn = gr.Button("🔍 Analisar Agora", variant="primary", size="lg", elem_classes="cta-button")
with gr.Accordion("📝 Guia de Uso", open=False):
gr.Markdown("""
### Como obter os melhores resultados:
1. Use fotos bem iluminadas
2. Fotografe de cima para baixo
3. Mantenha todos os alimentos visíveis
4. Evite sombras ou reflexos
### Por que usar o NutriAI?
- Análise nutricional profissional
- Recomendações baseadas em ciência
- Interface intuitiva e fácil de usar
""")
with gr.Column(elem_classes="results-container"):
gr.Markdown("### Resultados da Análise")
output_text = gr.Markdown()
with gr.Row():
output_table = gr.Dataframe(
headers=["Nutriente", "Quantidade"],
label="Informação Nutricional"
)
output_plot = gr.BarPlot(
x="Nutriente",
y="Quantidade",
title="Macronutrientes (g)",
height=300
)
with gr.Row(elem_classes="testimonial"):
gr.Markdown("""
> "O NutriAI revolucionou minha forma de me alimentar. Agora consigo entender exatamente o que estou comendo e fazer escolhas mais saudáveis."
>
> *— Maria S., Nutricionista*
""")
gr.Markdown("""
### 🔒 Sua privacidade é importante
- Análise segura e privada
- Sem armazenamento de dados pessoais
- Tecnologia de ponta em segurança
### 📱 Disponível em qualquer dispositivo
Acesse pelo celular, tablet ou computador - em qualquer lugar, a qualquer momento!
### 🤝 Suporte ao cliente
Precisa de ajuda? Entre em contato com nossa equipe de suporte!
""")
# Eventos
analyze_btn.click(
fn=analyze_image,
inputs=[image_input],
outputs=[output_text, output_table, output_plot]
)
if __name__ == "__main__":
print(f"Usando dispositivo: {'CUDA' if torch.cuda.is_available() else 'CPU'}")
iface.launch(share=False)