import torch from transformers import CLIPProcessor, CLIPModel from config.config import Config from PIL import Image class ImageEmbedder: _instance = None def __new__(cls, model_name=Config.CLIP_MODEL_NAME): if not cls._instance: cls._instance = super().__new__(cls) cls._instance.model = CLIPModel.from_pretrained(model_name) cls._instance.processor = CLIPProcessor.from_pretrained(model_name) return cls._instance def generate_embedding(self, image_path: str) -> torch.Tensor: """Generate embedding for an image using CLIP.""" image = Image.open(image_path).convert('RGB') inputs = self.processor(images=image, return_tensors="pt") with torch.no_grad(): image_embeddings = self.model.get_image_features(**inputs) return image_embeddings.squeeze().numpy()