Spaces:
Sleeping
Sleeping
| import io | |
| import numpy as np | |
| import onnxruntime as ort | |
| from PIL import Image | |
| from huggingface_hub import hf_hub_download | |
| from transformers import CLIPProcessor | |
| from ..config import MODEL_ID, PROCESSOR_ID, INTRA_OP_NUM_THREADS, INTER_OP_NUM_THREADS, DEVICE | |
| print(f"Loading CLIP processor '{PROCESSOR_ID}'...") | |
| processor = CLIPProcessor.from_pretrained(PROCESSOR_ID) | |
| print(f"Downloading ONNX model '{MODEL_ID}'...") | |
| model_file = hf_hub_download(repo_id=MODEL_ID, filename="onnx/vision_model.onnx") | |
| print("Initializing ONNX Runtime session...") | |
| # Limit intra-op and inter-op threads to match environment core count (typically 2 on free space CPU) | |
| ort_options = ort.SessionOptions() | |
| ort_options.intra_op_num_threads = INTRA_OP_NUM_THREADS | |
| ort_options.inter_op_num_threads = INTER_OP_NUM_THREADS | |
| session = ort.InferenceSession(model_file, sess_options=ort_options, providers=["CPUExecutionProvider"]) | |
| print("Model loaded successfully!") | |
| def get_image_embedding(contents: bytes) -> list[float]: | |
| image = Image.open(io.BytesIO(contents)).convert("RGB") | |
| image = image.resize((224, 224), Image.Resampling.BILINEAR) | |
| inputs = processor(images=image, return_tensors="np") | |
| pixel_values = inputs["pixel_values"] | |
| outputs = session.run(["image_embeds"], {"pixel_values": pixel_values}) | |
| image_embeds = outputs[0] | |
| norm = np.linalg.norm(image_embeds, axis=-1, keepdims=True) | |
| normalized_image_embeds = image_embeds / (norm + 1e-12) | |
| return normalized_image_embeds[0].tolist() | |