PedroM2626's picture
.
0cc754e
import os
import gradio as gr
from PIL import Image
import numpy as np
from image_recommender import recommend, index_images, load_index
# Configurações globais
IMAGE_DIR = os.getenv("IMAGE_DIR", "dataset")
INDEX_PATH = os.getenv("INDEX_PATH", "index.npz")
DEVICE = os.getenv("DEVICE", "cpu")
MODEL_NAME = os.getenv("MODEL_NAME", "resnet50")
SERVER_PORT = int(os.getenv("GRADIO_SERVER_PORT", 7860))
SERVER_NAME = os.getenv("GRADIO_SERVER_NAME", "0.0.0.0")
def initialize_index():
"""Garante que o índice exista antes de iniciar a interface."""
if not os.path.exists(INDEX_PATH):
if os.path.isdir(IMAGE_DIR):
print(f"Gerando índice inicial para {IMAGE_DIR}...")
index_images(IMAGE_DIR, INDEX_PATH, device=DEVICE, model_name=MODEL_NAME)
else:
print(f"Aviso: Diretório {IMAGE_DIR} não encontrado. O índice não pôde ser gerado.")
def predict(input_img, top_k):
"""Função de processamento para o Gradio."""
if input_img is None:
return None, "Por favor, envie uma imagem."
# Salva temporariamente a imagem enviada para processamento
temp_query = "temp_query.jpg"
input_img.save(temp_query)
try:
# Busca recomendações
results = recommend(INDEX_PATH, temp_query, topk=int(top_k), device=DEVICE, model_name=MODEL_NAME)
# Prepara a galeria de saída
gallery_items = []
for path, score in results:
# Carrega a imagem e adiciona o score como legenda
img = Image.open(path)
gallery_items.append((img, f"Score: {score:.4f}"))
return gallery_items, f"Encontradas {len(results)} imagens semelhantes."
except Exception as e:
return None, f"Erro: {str(e)}"
finally:
if os.path.exists(temp_query):
os.remove(temp_query)
# Inicializa o índice
initialize_index()
# Interface Gradio
with gr.Blocks(title="Recomendador de Imagens IA") as demo:
gr.Markdown("# 🖼️ Sistema de Recomendação de Imagens")
gr.Markdown("Envie uma imagem para encontrar outras visualmente semelhantes no nosso dataset.")
with gr.Row():
with gr.Column(scale=1):
input_image = gr.Image(type="pil", label="Imagem de Consulta")
top_k_slider = gr.Slider(minimum=1, maximum=10, value=5, step=1, label="Quantidade de Recomendações")
btn = gr.Button("Buscar Semelhantes", variant="primary")
with gr.Column(scale=2):
status_text = gr.Markdown("Aguardando consulta...")
output_gallery = gr.Gallery(label="Resultados", show_label=False, columns=3, rows=2, height="auto")
btn.click(fn=predict, inputs=[input_image, top_k_slider], outputs=[output_gallery, status_text])
gr.Examples(
examples=[os.path.join(IMAGE_DIR, f) for f in os.listdir(IMAGE_DIR) if f.endswith(('.png', '.jpg', '.jpeg'))][:5] if os.path.isdir(IMAGE_DIR) else [],
inputs=input_image,
label="Exemplos do Dataset"
)
if __name__ == "__main__":
print(f"Iniciando servidor em http://{SERVER_NAME}:{SERVER_PORT}")
demo.launch(server_name=SERVER_NAME, server_port=SERVER_PORT, share=True)