File size: 2,669 Bytes
dbd941d
e6a5fa4
dbd941d
 
 
e6a5fa4
 
 
ef7a048
e6a5fa4
 
dbd941d
 
 
 
 
 
e6a5fa4
dbd941d
e6a5fa4
dbd941d
 
 
 
 
 
ef7a048
e6a5fa4
ef7a048
 
 
 
 
 
 
 
 
 
 
 
e6a5fa4
ef7a048
 
 
 
dbd941d
ef7a048
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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
with gr.Blocks() as demo:
    gr.Markdown("# Agente Nutricionista com Análise de Imagens")
    gr.Markdown("Carregue uma imagem de um prato de comida e receba uma descrição e uma análise nutricional detalhada.")
    
    with gr.Row():
        image_input = gr.Image(type="pil", label="Upload de Imagem")
        with gr.Column():
            description_output = gr.Textbox(label="Descrição do Prato")
            analysis_output = gr.Textbox(label="Análise Nutricional")
    
    submit_button = gr.Button("Analisar")
    
    def process_image(image):
        description, analysis = nutritional_analysis(image)
        return description, analysis
    
    submit_button.click(process_image, inputs=image_input, outputs=[description_output, analysis_output])

# Iniciar o aplicativo
demo.launch()