File size: 1,761 Bytes
b7f4238
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1ccce51
b7f4238
 
 
 
 
 
 
1ccce51
b7f4238
 
 
 
 
 
 
 
 
 
 
 
 
1ccce51
b7f4238
 
1ccce51
b7f4238
 
 
 
 
1ccce51
b7f4238
 
1ccce51
b7f4238
 
 
 
 
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
"""
CLIP Image Embedding Generator

A simple Gradio-based application for generating CLIP embeddings from uploaded images.
Uses OpenAI's CLIP model with proper preprocessing.
"""

import gradio as gr
from transformers import CLIPProcessor, CLIPModel
from PIL import Image
import torch
import numpy as np
import spaces

# Load model/processor
model: CLIPModel = CLIPModel.from_pretrained("openai/clip-vit-large-patch14")
processor: CLIPProcessor = CLIPProcessor.from_pretrained("openai/clip-vit-large-patch14")
model.eval()

@spaces.GPU
def get_embedding(image: Image.Image) -> str:
    """
    Generate CLIP embedding for an image.
    
    Args:
        image (Image.Image): PIL Image object to process
    
    Returns:
        str: The full embedding array as a string
    """
    device: str = "cuda" if torch.cuda.is_available() else "cpu"
    
    # Use CLIP's built-in preprocessing
    inputs = processor(images=image, return_tensors="pt").to(device)
    model_device = model.to(device)
    
    with torch.no_grad():
        emb: torch.Tensor = model_device.get_image_features(**inputs)
    
    # L2 normalize the embeddings
    emb = emb / emb.norm(p=2, dim=-1, keepdim=True)
    
    # Convert to numpy and return as string
    emb_numpy = emb.cpu().numpy().squeeze()
    
    return str(emb_numpy.tolist())

# Create Gradio interface
demo: gr.Interface = gr.Interface(
    fn=get_embedding,
    inputs=gr.Image(type="pil", label="Upload Image"),
    outputs=gr.Textbox(label="Embedding", lines=20, max_lines=30),
    allow_flagging="never",
    title="CLIP Image Embedding Generator",
    description="Upload an image to generate its CLIP embedding vector.",
    theme=gr.themes.Soft()
)

if __name__ == "__main__":
    demo.launch(mcp_server=True)