Spaces:
Build error
Build error
import gradio as gr | |
import torch | |
from transformers import AutoModel, AutoProcessor | |
import pandas as pd | |
from PIL import Image | |
# Carrega o modelo | |
model = AutoModel.from_pretrained("openbmb/MiniCPM-o-2_6", trust_remote_code=True) | |
processor = AutoProcessor.from_pretrained("openbmb/MiniCPM-o-2_6", trust_remote_code=True) | |
# Base de dados nutricional | |
NUTRITION_DB = { | |
"arroz": {"calorias": 130, "proteinas": 2.7, "carboidratos": 28, "gorduras": 0.3}, | |
"feijão": {"calorias": 77, "proteinas": 5.2, "carboidratos": 13.6, "gorduras": 0.5}, | |
"carne": {"calorias": 250, "proteinas": 26, "carboidratos": 0, "gorduras": 17}, | |
"batata frita": {"calorias": 312, "proteinas": 3.4, "carboidratos": 41, "gorduras": 15}, | |
"salada": {"calorias": 15, "proteinas": 1.4, "carboidratos": 2.9, "gorduras": 0.2} | |
} | |
def process_image(image, progress=gr.Progress()): | |
"""Processa a imagem usando o modelo MiniCPM""" | |
try: | |
progress(0.3, desc="Processando imagem...") | |
# Prepara a imagem | |
if isinstance(image, str): | |
image = Image.open(image) | |
# Processa a imagem com o modelo | |
inputs = processor(images=image, text="What foods are in this image?", return_tensors="pt") | |
progress(0.6, desc="Analisando conteúdo...") | |
# Gera a descrição | |
outputs = model.generate(**inputs, max_length=100) | |
description = processor.decode(outputs[0], skip_special_tokens=True) | |
progress(1.0, desc="Concluído!") | |
return description | |
except Exception as e: | |
raise gr.Error(f"Erro no processamento: {str(e)}") | |
def analyze_nutrition(foods_list): | |
"""Analisa nutrientes dos alimentos identificados""" | |
total_nutrients = { | |
"calorias": 0, | |
"proteinas": 0, | |
"carboidratos": 0, | |
"gorduras": 0 | |
} | |
found_foods = [] | |
for food in NUTRITION_DB.keys(): | |
if food.lower() in foods_list.lower(): | |
found_foods.append(food) | |
for nutrient, value in NUTRITION_DB[food].items(): | |
total_nutrients[nutrient] += value | |
return total_nutrients, found_foods | |
def analyze_image(image): | |
"""Função principal de análise""" | |
try: | |
# Processa a imagem | |
description = process_image(image) | |
# Analisa nutrientes | |
total_nutrients, found_foods = analyze_nutrition(description) | |
# Prepara dados para visualização | |
table_data = [ | |
["Calorias", f"{total_nutrients['calorias']:.1f} kcal"], | |
["Proteínas", f"{total_nutrients['proteinas']:.1f}g"], | |
["Carboidratos", f"{total_nutrients['carboidratos']:.1f}g"], | |
["Gorduras", f"{total_nutrients['gorduras']:.1f}g"] | |
] | |
# Dados para o gráfico | |
plot_data = pd.DataFrame({ | |
'Nutriente': ['Proteínas', 'Carboidratos', 'Gorduras'], | |
'Quantidade': [ | |
total_nutrients['proteinas'], | |
total_nutrients['carboidratos'], | |
total_nutrients['gorduras'] | |
] | |
}) | |
# Monta o relatório | |
analysis = f"""### 🔍 Análise da Imagem: | |
{description} | |
### 🍽️ Alimentos Identificados: | |
{', '.join(found_foods)} | |
### 📊 Informação Nutricional: | |
• Calorias: {total_nutrients['calorias']:.1f} kcal | |
• Proteínas: {total_nutrients['proteinas']:.1f}g | |
• Carboidratos: {total_nutrients['carboidratos']:.1f}g | |
• Gorduras: {total_nutrients['gorduras']:.1f}g | |
### 💡 Recomendações: | |
{"⚠️ Alto teor calórico" if total_nutrients['calorias'] > 800 else "✅ Calorias adequadas"} | |
{"⚠️ Considere reduzir carboidratos" if total_nutrients['carboidratos'] > 60 else "✅ Carboidratos adequados"} | |
{"⚠️ Alto teor de gorduras" if total_nutrients['gorduras'] > 20 else "✅ Gorduras adequadas"} | |
""" | |
return analysis, table_data, plot_data | |
except Exception as e: | |
return str(e), None, None | |
# Interface Gradio | |
with gr.Blocks(theme=gr.themes.Soft()) as iface: | |
gr.Markdown("# 🍽️ Análise Nutricional com IA") | |
with gr.Row(): | |
with gr.Column(): | |
image_input = gr.Image( | |
type="pil", | |
label="Foto do Prato", | |
sources=["upload", "webcam"] | |
) | |
analyze_btn = gr.Button("📊 Analisar", variant="primary") | |
with gr.Column(): | |
output_text = gr.Markdown() | |
with gr.Row(): | |
output_table = gr.Dataframe( | |
headers=["Nutriente", "Quantidade"], | |
label="Informação Nutricional" | |
) | |
output_plot = gr.BarPlot( | |
x="Nutriente", | |
y="Quantidade", | |
title="Macronutrientes (g)", | |
height=300 | |
) | |
analyze_btn.click( | |
fn=analyze_image, | |
inputs=[image_input], | |
outputs=[output_text, output_table, output_plot] | |
) | |
if __name__ == "__main__": | |
print(f"Usando dispositivo: {'CUDA' if torch.cuda.is_available() else 'CPU'}") | |
iface.launch(share=False) |