File size: 4,379 Bytes
dbd941d
e6a5fa4
dbd941d
 
 
e6a5fa4
 
 
ef7a048
e6a5fa4
 
dbd941d
 
 
 
 
 
e6a5fa4
dbd941d
e6a5fa4
dbd941d
 
 
 
 
 
ef7a048
e6a5fa4
ef7a048
 
 
 
 
 
 
 
 
 
 
 
e6a5fa4
ef7a048
 
 
 
ae59519
 
 
 
 
 
 
 
 
 
 
ef7a048
ae59519
ef7a048
ae59519
 
2afab56
ae59519
 
 
 
 
 
 
 
 
ef7a048
ae59519
 
 
ef7a048
ae59519
 
 
 
 
ef7a048
ae59519
 
 
 
 
 
 
 
 
ef7a048
dbd941d
ae59519
 
 
 
 
 
 
 
 
 
 
 
 
dbd941d
ef7a048
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import gradio as gr
from transformers import Blip2Processor, Blip2ForConditionalGeneration, pipeline
from PIL import Image
import requests

# Carregar o modelo BLIP-2 para geração de descrições de imagens
processor = Blip2Processor.from_pretrained("Salesforce/blip2-opt-2.7b")
model_blip2 = Blip2ForConditionalGeneration.from_pretrained("Salesforce/blip2-opt-2.7b")

# Carregar um modelo de linguagem para análise nutricional (exemplo: Flan-T5)
nutrition_model = pipeline("text2text-generation", model="google/flan-t5-large")

def interpret_image(image):
    # Converter a imagem para o formato PIL se necessário
    if isinstance(image, str):
        image = Image.open(requests.get(image, stream=True).raw)
    
    # Processar a imagem e gerar a descrição usando BLIP-2
    inputs = processor(image, return_tensors="pt")
    out = model_blip2.generate(**inputs)
    
    # Decodificar a saída para texto
    description = processor.decode(out[0], skip_special_tokens=True)
    
    return description

def nutritional_analysis(image):
    # Passo 1: Gerar descrição da imagem usando BLIP-2
    description = interpret_image(image)
    
    # Passo 2: Criar um prompt para análise nutricional
    prompt = (
        f"Com base na descrição do prato de comida abaixo, forneça uma análise nutricional detalhada, "
        f"incluindo estimativas de calorias, macronutrientes (carboidratos, proteínas, gorduras), "
        f"e recomendações para melhorar o prato, se necessário.\n\n"
        f"Descrição do prato: {description}\n\n"
        f"Análise nutricional:"
    )
    
    # Passo 3: Usar o modelo de linguagem para gerar a análise nutricional
    analysis = nutrition_model(prompt, max_length=300)[0]['generated_text']
    
    # Retornar a descrição e a análise nutricional
    return description, analysis

# Interface Gradio com Design Avançado
with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue", secondary_hue="cyan")) as demo:
    # Cabeçalho com Marketing
    with gr.Row():
        gr.Markdown("""
        # 🍽️ Agente Nutricionista Inteligente
        ### Transforme suas refeições em escolhas saudáveis!
        - **Descrição automática** de pratos de comida com IA avançada.
        - **Análise nutricional detalhada** com estimativas de calorias e macronutrientes.
        - **Recomendações personalizadas** para melhorar sua dieta.
        """)
    
    # Seção de Upload de Imagem
    with gr.Row():
        with gr.Column(scale=1):
            gr.Markdown("### 📸 Carregue uma Imagem")
            image_input = gr.Image(type="pil", label="Upload de Imagem", height=300)  # Removido 'tool="editor"'
        
        with gr.Column(scale=2):
            gr.Markdown("### 🔍 Resultados")
            with gr.Tabs():
                with gr.TabItem("Descrição do Prato"):
                    description_output = gr.Textbox(label="Descrição Gerada", lines=3, interactive=False)
                
                with gr.TabItem("Análise Nutricional"):
                    analysis_output = gr.Textbox(label="Análise Nutricional", lines=8, interactive=False)
    
    # Botão de Ação
    with gr.Row():
        submit_button = gr.Button("✨ Analisar Prato", variant="primary")
    
    # Feedback do Usuário
    with gr.Row():
        feedback = gr.Markdown("")

    # Função para processar a imagem
    def process_image(image):
        try:
            description, analysis = nutritional_analysis(image)
            feedback.update("✅ Análise concluída com sucesso!")
            return description, analysis
        except Exception as e:
            feedback.update(f"❌ Erro ao processar a imagem: {str(e)}")
            return "", ""

    # Conectar botão aos outputs
    submit_button.click(process_image, inputs=image_input, outputs=[description_output, analysis_output])

    # Rodapé com Chamada à Ação
    with gr.Row():
        gr.Markdown("""
        ---
        ### 💡 Dicas para Melhores Resultados:
        - Use imagens claras e bem iluminadas.
        - Inclua todos os ingredientes visíveis no prato.
        - Experimente diferentes ângulos para capturar mais detalhes.
        
        ### 🌟 Entre em Contato
        - Quer saber mais? Visite nosso [site](https://example.com) ou nos siga nas redes sociais!
        """)

# Iniciar o aplicativo
demo.launch()