sciencellama's picture
Upload app.py with huggingface_hub
4883b49 verified
Raw
History Blame Contribute Delete
2.28 kB
"""
clip-embed-space β€” CLIP ViT-B/32 embedding service.
Exposes three API endpoints:
/embed_image : base64-encoded image β†’ 512-dim float list
/embed_text : text string β†’ 512-dim float list
/embed_image_url : image URL β†’ 512-dim float list
Runs on CPU (ViT-B/32 is small enough β€” no GPU needed).
Vectors are L2-normalised, matching the local embed_products.py pipeline.
"""
import base64
import io
import gradio as gr
import httpx
import numpy as np
from PIL import Image
from sentence_transformers import SentenceTransformer
MODEL_NAME = "clip-ViT-B-32"
print(f"Loading {MODEL_NAME}...")
model = SentenceTransformer(MODEL_NAME)
print("Model ready.")
def embed_image(image_base64: str) -> list[float]:
image = Image.open(io.BytesIO(base64.b64decode(image_base64))).convert("RGB")
return model.encode(image, normalize_embeddings=True).tolist()
def embed_text(text: str) -> list[float]:
return model.encode(text, normalize_embeddings=True).tolist()
def embed_image_url(image_url: str) -> list[float]:
resp = httpx.get(image_url, timeout=15, follow_redirects=True)
resp.raise_for_status()
image = Image.open(io.BytesIO(resp.content)).convert("RGB")
return model.encode(image, normalize_embeddings=True).tolist()
with gr.Blocks(title="CLIP Embed") as demo:
gr.Markdown("## CLIP ViT-B/32 Embedding Service β€” 512-dim L2-normalised vectors")
with gr.Row():
with gr.Column():
b64_in = gr.Textbox(label="image_base64", lines=3)
b64_btn = gr.Button("Embed image (base64)")
b64_out = gr.JSON(label="embedding [512]")
b64_btn.click(embed_image, b64_in, b64_out, api_name="embed_image")
with gr.Column():
text_in = gr.Textbox(label="text")
text_btn = gr.Button("Embed text")
text_out = gr.JSON(label="embedding [512]")
text_btn.click(embed_text, text_in, text_out, api_name="embed_text")
with gr.Column():
url_in = gr.Textbox(label="image_url")
url_btn = gr.Button("Embed image (URL)")
url_out = gr.JSON(label="embedding [512]")
url_btn.click(embed_image_url, url_in, url_out, api_name="embed_image_url")
demo.launch()