ZooClaw-FashionSigLIP2 is a fashion-specialized vision-language encoder fine-tuned from
SigLIP2-base-patch16-384.
It extracts aligned image and text embeddings optimized for fashion product search,
image-text retrieval, and text-to-image retrieval. The model is developed for the
ZooClaw AI agents platform and served via the
zoodata.ai data-agent API. See the
paper for the full recipe, ablations, and benchmark
results.
Three ready-to-run notebooks on the
ZooData platform — no model download, no GPU:
Sign up at
zoodata.ai/register — every new account includes
1,000 free credits.
1from transformers import AutoModel, AutoProcessor
2import torch
3from PIL import Image
4
5model = AutoModel.from_pretrained("srpone/zooclaw-fashionsiglip2")
6processor = AutoProcessor.from_pretrained("srpone/zooclaw-fashionsiglip2")
7model.eval()
8
9image = Image.open("your_image.jpg").convert("RGB")
10texts = [
11 "navy blue floral midi dress",
12 "black leather crossbody bag",
13 "white cotton oversized hoodie",
14]
15
16inputs = processor(images=image, text=texts, padding="max_length", return_tensors="pt")
17with torch.no_grad():
18 outputs = model(**inputs)
19
20# Aligned embeddings (already L2-normalized by SigLIP2)
21image_emb = outputs.image_embeds # [1, 768]
22text_emb = outputs.text_embeds # [3, 768]
23
24similarity = (image_emb @ text_emb.T).softmax(dim=-1)
25print(similarity)
1from torch.utils.data import DataLoader, Dataset
2
3class ImageDataset(Dataset):
4 def __init__(self, image_paths, processor):
5 self.image_paths = image_paths
6 self.processor = processor
7
8 def __len__(self):
9 return len(self.image_paths)
10
11 def __getitem__(self, idx):
12 image = Image.open(self.image_paths[idx]).convert("RGB")
13 return self.processor(images=image, return_tensors="pt")["pixel_values"][0]
14
15dataset = ImageDataset(your_image_paths, processor)
16loader = DataLoader(dataset, batch_size=64, num_workers=4)
17
18device = "cuda" if torch.cuda.is_available() else "cpu"
19model.to(device)
20
21all_embeddings = []
22with torch.no_grad():
23 for batch in loader:
24 emb = model.get_image_features(pixel_values=batch.to(device))
25 emb = torch.nn.functional.normalize(emb, dim=-1)
26 all_embeddings.append(emb.cpu())
27
28image_embeddings = torch.cat(all_embeddings, dim=0) # [N, 768]
1import torch.nn.functional as F
2
3text_inputs = processor(text=queries, padding="max_length", return_tensors="pt").to(device)
4with torch.no_grad():
5 text_embs = model.get_text_features(**text_inputs)
6 text_embs = F.normalize(text_embs, dim=-1)
7
8# image_embeddings: [N, 768] precomputed gallery
9similarity = text_embs @ image_embeddings.to(device).T
10top_k_indices = similarity.topk(k=10, dim=-1).indices
1@article{xue2026zooclaw,
2 title={ZooClaw-FashionSigLIP2: Distilled Fine-tuning for Robust Fashion Retrieval},
3 author={Siqiao Xue and Chunxue Xu},
4 year={2026},
5 url={https://arxiv.org/abs/2606.27708},
6 journal={arXiv preprint arXiv:2606.27708},
7}