CLIP-Search-Edit / indexer.py
rusticolus's picture
Upload indexer.py
52f6d70 verified
Raw
History Blame Contribute Delete
1.74 kB
import torch
import clip
from torch.utils.data import DataLoader
from dataset import FlickrStreamer
from torchvision import transforms
from tqdm import tqdm
# --- SETTINGS ---
INDEX_LIMIT = 5000 # How many images to make searchable
BATCH_SIZE = 32
SAVE_PATH = "flickr_embeddings.pt"
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
# ----------------
def build_index():
print(f"Loading CLIP on {DEVICE}...")
model, preprocess = clip.load("ViT-B/32", device=DEVICE)
# We need the images resized for CLIP (224x224)
tf = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor()
])
# Load Dataset (Stream mode)
print(f"Connecting to Deep Lake (Limit: {INDEX_LIMIT})...")
dataset = FlickrStreamer(limit=INDEX_LIMIT, transform=tf)
loader = DataLoader(dataset, batch_size=BATCH_SIZE, shuffle=False, num_workers=0)
all_embeddings = []
print("Indexing images (calculating fingerprints)...")
with torch.no_grad():
for images in tqdm(loader):
images = images.to(DEVICE)
# Calculate features
features = model.encode_image(images)
# Normalize features (Crucial for Cosine Similarity later)
features /= features.norm(dim=-1, keepdim=True)
all_embeddings.append(features.cpu())
# Concatenate all batches into one big list
final_index = torch.cat(all_embeddings)
# Save to file
torch.save(final_index, SAVE_PATH)
print(f"\nSuccess! Saved {len(final_index)} image fingerprints to '{SAVE_PATH}'")
if __name__ == "__main__":
build_index()