Ask-FashionDB / app.py
traopia
spacey
034236c
raw
history blame
3.9 kB
import gradio as gr
from src.generate_queries_alternative import main_generate_queries
import time
import pandas as pd
import spacy
# Try to load the model, and download it if missing
try:
nlp = spacy.load("en_core_web_sm")
except OSError:
from spacy.cli import download
download("en_core_web_sm")
nlp = spacy.load("en_core_web_sm")
from src.visual_qa import main_text_retrieve_images
def handle_structured_query(question, sort_by=""):
if not question:
return "Please ask something 🙂", pd.DataFrame(), []
try:
start = time.time()
result_query, sparql_query = main_generate_queries(question)
elapsed = round(time.time() - start, 2)
except Exception as e:
return f"⚠️ Query failed: {e}", pd.DataFrame(), []
if isinstance(result_query, str):
return result_query, pd.DataFrame(), []
if not result_query:
return f"No results for '{question}'. Try rephrasing. (⏱ {elapsed}s)", pd.DataFrame(), []
df = pd.DataFrame(result_query)
if sort_by and sort_by in df.columns:
df = df.sort_values(by=sort_by)
if "image_url" in df.columns:
columns_of_interest = ["image_url", "year","fashion_collectionLabel", "reference_URL"]
df = df[columns_of_interest]
# Create a gallery: each item is (image_url, metadata string)
gallery_items = []
for _, row in df.iterrows():
image_url = row.get("image_url")
if not image_url:
continue
# Caption from other fields
caption = " | ".join(f"{k}: {v}" for k, v in row.items() if k != "image_url" and pd.notnull(v))
gallery_items.append((image_url, caption))
return f"Query returned {len(gallery_items)} image(s) in {elapsed} seconds.", pd.DataFrame(), gallery_items
return f"Query returned a table with {len(df)} row(s) in {elapsed} seconds.", df, []
def handle_image_query(text):
if not text:
return []
try:
records = main_text_retrieve_images(text)
except Exception as e:
return [("https://via.placeholder.com/300x200?text=Error", f"Error: {e}")]
gallery_items = []
for item in records:
image_url = item.get("image_url")
if not image_url:
continue
# Build a simple caption from the remaining fields
caption = " | ".join(f"{k}: {v}" for k, v in item.items() if k != "image_url")
gallery_items.append((image_url, caption))
return gallery_items
# --- UI --- #
with gr.Blocks() as demo:
gr.Markdown("# 🧵 FashionDB Interface")
with gr.Tab("Structured Query"):
gr.Markdown("Ask FashionDB anything and view results with images + metadata.")
with gr.Row():
query_input = gr.Textbox(label="Your question")
sort_input = gr.Textbox(label="Sort by (optional column name)", placeholder="e.g. start_year")
query_submit = gr.Button("Submit")
query_text_output = gr.Textbox(label="Message", interactive=False)
query_table_output = gr.Dataframe(label="Tabular Result", interactive=False)
query_gallery_output = gr.Gallery(label="Image Gallery")
query_submit.click(
fn=handle_structured_query,
inputs=[query_input, sort_input],
outputs=[
query_text_output,
query_table_output,
query_gallery_output
]
)
with gr.Tab("Image Retrieval"):
gr.Markdown("Search for similar fashion show images based on a text description.")
image_text = gr.Textbox(label="Describe the kind of images you're looking for")
image_submit = gr.Button("Find Images")
image_gallery = gr.Gallery(label="Retrieved Images")
image_submit.click(handle_image_query, inputs=image_text, outputs=image_gallery)
demo.launch()