File size: 6,085 Bytes
dbd941d
e6a5fa4
dbd941d
 
123d916
 
 
 
 
 
 
dbd941d
e6a5fa4
123d916
 
 
 
 
 
 
 
 
ef7a048
e6a5fa4
123d916
 
 
 
 
 
 
dbd941d
 
 
 
 
 
e6a5fa4
dbd941d
e6a5fa4
dbd941d
 
 
 
73ef356
 
 
 
 
dbd941d
 
ef7a048
e6a5fa4
ef7a048
 
73ef356
ef7a048
73ef356
ef7a048
73ef356
 
 
 
 
 
 
ef7a048
 
 
 
e6a5fa4
ef7a048
73ef356
 
 
ef7a048
 
 
ae59519
 
 
 
 
 
 
 
 
 
 
ef7a048
ae59519
ef7a048
ae59519
 
ae8e572
ae59519
 
 
 
 
 
 
 
 
ef7a048
ae59519
 
 
ef7a048
ae59519
 
 
73ef356
ae59519
ef7a048
ae59519
 
 
 
 
 
 
73ef356
ae59519
ef7a048
73ef356
ae59519
 
 
 
 
 
 
 
 
 
 
 
ae8e572
 
 
 
 
 
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
import gradio as gr
from transformers import Blip2Processor, Blip2ForConditionalGeneration, pipeline
from PIL import Image
import requests
import os

# Função para verificar se o modelo existe localmente
def check_model_locally(model_name):
    cache_dir = os.path.expanduser("~/.cache/huggingface/transformers")
    model_path = os.path.join(cache_dir, model_name.replace("/", "--"))
    return os.path.exists(model_path)

# Carregar o modelo BLIP-2 para geração de descrições de imagens
model_blip2_name = "Salesforce/blip2-opt-2.7b"
if check_model_locally(model_blip2_name):
    print(f"Modelo {model_blip2_name} encontrado localmente.")
    processor = Blip2Processor.from_pretrained(model_blip2_name, local_files_only=True)
    model_blip2 = Blip2ForConditionalGeneration.from_pretrained(model_blip2_name, local_files_only=True)
else:
    print(f"Modelo {model_blip2_name} não encontrado localmente. Baixando...")
    processor = Blip2Processor.from_pretrained(model_blip2_name)
    model_blip2 = Blip2ForConditionalGeneration.from_pretrained(model_blip2_name)

# Carregar um modelo de linguagem para análise nutricional (exemplo: Flan-T5)
nutrition_model_name = "google/flan-t5-large"
if check_model_locally(nutrition_model_name):
    print(f"Modelo {nutrition_model_name} encontrado localmente.")
    nutrition_model = pipeline("text2text-generation", model=nutrition_model_name, local_files_only=True)
else:
    print(f"Modelo {nutrition_model_name} não encontrado localmente. Baixando...")
    nutrition_model = pipeline("text2text-generation", model=nutrition_model_name)

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)
    
    # Pós-processamento para melhorar a descrição
    description = description.strip().capitalize()
    if not description.endswith("."):
        description += "."
    
    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 refinado para análise nutricional
    prompt = (
        f"Com base na descrição do prato de comida abaixo, forneça uma análise nutricional detalhada.\n\n"
        f"Descrição do prato: {description}\n\n"
        f"Siga este formato:\n"
        f"- Calorias totais estimadas: [valor]\n"
        f"- Macronutrientes (em gramas):\n"
        f"  - Carboidratos: [valor]\n"
        f"  - Proteínas: [valor]\n"
        f"  - Gorduras: [valor]\n"
        f"- Recomendações para melhorar o prato: [sugestões]\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']
    
    # Pós-processamento para formatar a análise nutricional
    analysis = analysis.replace("Análise nutricional:", "").strip()
    
    # 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)
        
        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!
        """)
    
    # Adicionar exemplos pré-definidos
    examples = [
        "https://huggingface.co/spaces/DHEIVER/blip-image-captioning-base/blob/main/img.jpg"
    ]
    gr.Examples(examples, inputs=image_input)

# Iniciar o aplicativo
demo.launch()