Spaces:
Build error
Build error
File size: 5,999 Bytes
5c0c96a 538b4a9 2092c30 548dad1 f631343 a7603f9 2092c30 ec914f9 2092c30 f631343 2092c30 a9c5239 2092c30 f631343 2092c30 a7603f9 2092c30 392b7ca 2092c30 30e029e 2092c30 97ab7f8 a9c5239 2092c30 0f757cc 2092c30 0f757cc 2092c30 0f757cc 2092c30 0f757cc a9c5239 2092c30 0f757cc 2092c30 0f757cc 2092c30 0f757cc 2092c30 0f757cc 5c0c96a 2092c30 |
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 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
import gradio as gr
import torch
from transformers import (
Blip2Processor, Blip2ForConditionalGeneration,
AutoProcessor, AutoModelForCausalLM, AutoModelForVision2Seq
)
from PIL import Image
import numpy as np
class ModelManager:
def __init__(self):
self.current_model = None
self.current_processor = None
self.model_name = None
def load_blip2(self):
"""Carrega modelo BLIP-2"""
self.model_name = "Salesforce/blip2-opt-2.7b"
self.current_processor = Blip2Processor.from_pretrained(self.model_name)
self.current_model = Blip2ForConditionalGeneration.from_pretrained(
self.model_name,
torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
device_map="auto"
)
return "BLIP-2 carregado com sucesso!"
def load_llava(self):
"""Carrega modelo LLaVA"""
self.model_name = "llava-hf/llava-1.5-7b-hf"
self.current_processor = AutoProcessor.from_pretrained(self.model_name)
self.current_model = AutoModelForVision2Seq.from_pretrained(
self.model_name,
torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
device_map="auto"
)
return "LLaVA carregado com sucesso!"
def load_git(self):
"""Carrega modelo GIT"""
self.model_name = "microsoft/git-base-coco"
self.current_processor = AutoProcessor.from_pretrained(self.model_name)
self.current_model = AutoModelForCausalLM.from_pretrained(
self.model_name,
torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
device_map="auto"
)
return "GIT carregado com sucesso!"
def analyze_image(self, image, question, model_choice):
"""Analisa imagem com o modelo selecionado"""
try:
# Carrega o modelo apropriado se necessário
if model_choice == "BLIP-2" and (self.model_name != "Salesforce/blip2-opt-2.7b"):
status = self.load_blip2()
elif model_choice == "LLaVA" and (self.model_name != "llava-hf/llava-1.5-7b-hf"):
status = self.load_llava()
elif model_choice == "GIT" and (self.model_name != "microsoft/git-base-coco"):
status = self.load_git()
# Prepara a imagem
if isinstance(image, str):
image = Image.open(image)
elif isinstance(image, np.ndarray):
image = Image.fromarray(image)
# Processa a entrada
inputs = self.current_processor(
images=image,
text=question,
return_tensors="pt"
).to(self.current_model.device)
# Gera a resposta
outputs = self.current_model.generate(
**inputs,
max_new_tokens=150,
num_beams=5,
temperature=0.7,
top_p=0.9
)
response = self.current_processor.decode(outputs[0], skip_special_tokens=True)
return response
except Exception as e:
return f"Erro na análise: {str(e)}"
# Cria instância do gerenciador de modelos
model_manager = ModelManager()
# Interface Gradio
with gr.Blocks(theme=gr.themes.Soft()) as iface:
gr.Markdown("""
# 🤖 Análise Visual Multi-Modelo
Escolha o modelo que deseja usar para analisar sua imagem
""")
with gr.Row():
with gr.Column():
# Inputs
model_choice = gr.Radio(
choices=["BLIP-2", "LLaVA", "GIT"],
label="Escolha o Modelo",
value="BLIP-2"
)
with gr.Box():
gr.Markdown("""
### 📝 Características dos Modelos:
**BLIP-2:**
- Melhor para análise técnica
- Mais preciso em detalhes
- Respostas estruturadas
**LLaVA:**
- Mais conversacional
- Respostas naturais
- Bom para perguntas abertas
**GIT:**
- Mais rápido e leve
- Bom para descrições simples
- Menor uso de memória
""")
image_input = gr.Image(
type="pil",
label="Imagem para Análise"
)
question_input = gr.Textbox(
label="Sua Pergunta",
placeholder="Faça uma pergunta sobre a imagem..."
)
analyze_btn = gr.Button("🔍 Analisar", variant="primary")
with gr.Column():
# Output
with gr.Box():
gr.Markdown("### 📊 Resultado da Análise")
output_text = gr.Markdown()
with gr.Accordion("💡 Sugestões de Perguntas", open=False):
gr.Markdown("""
1. Quais alimentos você identifica na imagem?
2. Como os alimentos estão preparados?
3. Descreva a apresentação do prato.
4. Que tipo de culinária parece ser?
5. Quais são os ingredientes principais?
6. Como está a disposição dos elementos no prato?
7. Há algum detalhe de decoração ou finalização?
8. Qual parece ser o método de cocção utilizado?
""")
# Eventos
analyze_btn.click(
fn=model_manager.analyze_image,
inputs=[image_input, question_input, model_choice],
outputs=output_text
)
if __name__ == "__main__":
print(f"Dispositivo: {'CUDA' if torch.cuda.is_available() else 'CPU'}")
iface.launch() |