Spaces:
Sleeping
Sleeping
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() |