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)