File size: 4,999 Bytes
183ba69
471f43d
35c9642
389a29c
4273fa3
817e7fd
471f43d
817e7fd
 
35c9642
 
 
 
 
 
 
 
471f43d
35c9642
 
 
 
 
 
 
 
 
 
183ba69
35c9642
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
817e7fd
247c724
35c9642
389a29c
817e7fd
35c9642
 
 
 
817e7fd
35c9642
 
817e7fd
389a29c
35c9642
 
 
 
 
 
 
 
 
817e7fd
35c9642
 
 
 
 
 
247c724
389a29c
183ba69
817e7fd
35c9642
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
817e7fd
35c9642
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
import gradio as gr
from PIL import Image
from transformers import BlipProcessor, BlipForConditionalGeneration
import time

# Carregando o modelo BLIP para geração de legendas
processor = BlipProcessor.from_pretrained("Salesforce/blip-image-captioning-large")
model_blip = BlipForConditionalGeneration.from_pretrained("Salesforce/blip-image-captioning-large")

# Base de dados nutricionais simples (em português)
nutritional_database = {
    "bife": {"calorias": 250, "proteinas": 26, "carboidratos": 0, "gorduras": 15},
    "feijão": {"calorias": 120, "proteinas": 8, "carboidratos": 20, "gorduras": 1},
    "arroz": {"calorias": 130, "proteinas": 2.7, "carboidratos": 28, "gorduras": 0.3},
    "salada": {"calorias": 30, "proteinas": 1, "carboidratos": 5, "gorduras": 0.2},
    "tomate": {"calorias": 18, "proteinas": 0.9, "carboidratos": 3.9, "gorduras": 0.2},
}

# Função para gerar legenda da imagem usando BLIP
def generate_caption(img, min_len, max_len):
    try:
        raw_image = Image.open(img).convert('RGB')
        inputs = processor(raw_image, return_tensors="pt")
        out = model_blip.generate(**inputs, min_length=min_len, max_length=max_len)
        caption = processor.decode(out[0], skip_special_tokens=True)
        return caption
    except Exception as e:
        return f"Erro ao gerar legenda: {str(e)}"

# Função para gerar informações nutricionais com base na descrição
def generate_nutritional_info(food_description):
    try:
        # Dividir a descrição em palavras-chave
        keywords = food_description.lower().split(", ")
        
        total_calories = 0
        nutritional_summary = []
        
        for keyword in keywords:
            if keyword in nutritional_database:
                info = nutritional_database[keyword]
                total_calories += info["calorias"]
                nutritional_summary.append(
                    f"- {keyword.capitalize()}: {info['calorias']} calorias, "
                    f"{info['proteinas']}g proteínas, {info['carboidratos']}g carboidratos, "
                    f"{info['gorduras']}g gorduras"
                )
        
        if not nutritional_summary:
            return "Desculpe, não encontramos informações nutricionais detalhadas para este alimento."
        
        summary = "\n".join(nutritional_summary)
        return f"Informações Nutricionais:\n{summary}\n\nTotal de Calorias: {total_calories} kcal"
    except Exception as e:
        return f"Erro ao gerar informações nutricionais: {str(e)}"

# Função principal que combina tudo
def greet(img, min_len, max_len):
    start = time.time()
    
    # Passo 1: Gerar legenda para a imagem usando BLIP
    food_description = generate_caption(img, min_len, max_len)
    if "Erro" in food_description:
        return food_description  # Retorna mensagem de erro se houver falha no BLIP
    
    # Passo 2: Gerar informações nutricionais com base na legenda
    nutritional_info = generate_nutritional_info(food_description)
    
    end = time.time()
    total_time = str(round(end - start, 2))
    
    # Marketing agressivo
    marketing_message = (
        "🎉 OFERTA EXCLUSIVA! 🎉\n\n"
        "Inscreva-se AGORA para receber dicas diárias de nutrição e descontos exclusivos em nossos produtos premium!\n\n"
        "Compartilhe este resultado com seus amigos e ganhe 10% de desconto em nossa loja online.\n\n"
        "-----------------------------\n\n"
    )
    
    result = (
        f"{marketing_message}"
        f"Descrição do Alimento: {food_description}\n\n"
        f"{nutritional_info}\n\n"
        f"Gerado em {total_time} segundos."
    )
    
    return result

# Interface Gradio
with gr.Blocks(theme=gr.themes.Base(primary_hue="red", secondary_hue="orange", neutral_hue="slate")) as demo:
    gr.Markdown(
        """
        # 🔥 NutriScan Pro 🔥
        ### Descubra os Segredos Nutricionais dos Seus Alimentos Instantaneamente!
        
        🌟 **OFERTA LIMITADA:** Inscreva-se agora e receba acesso exclusivo a dicas diárias de nutrição e descontos especiais em nossos produtos premium!

        📸 **Como Funciona:**
        1. Faça upload de uma imagem do seu alimento.
        2. Receba informações detalhadas sobre nutrientes e calorias.
        3. Compartilhe com amigos e ganhe descontos!

        ⚡ **Apenas 24 Horas de Oferta!** Não perca essa oportunidade única!
        """
    )
    
    with gr.Row():
        img_input = gr.Image(type='filepath', label='Upload da Imagem')
        with gr.Column():
            min_len = gr.Slider(label='Tamanho Mínimo da Legenda', minimum=1, maximum=1000, value=30)
            max_len = gr.Slider(label='Tamanho Máximo da Legenda', minimum=1, maximum=1000, value=100)
    
    output = gr.Textbox(label='Resultado')
    
    submit_button = gr.Button("🔍 Analisar Agora! 🔍", variant="primary")
    
    submit_button.click(greet, inputs=[img_input, min_len, max_len], outputs=output)

demo.launch()