Spaces:
Build error
Build error
| 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) |