Spaces:
Build error
Build error
| # Import Libraries | |
| from pathlib import Path | |
| import pandas as pd | |
| import numpy as np | |
| import torch | |
| import pickle | |
| from PIL import Image | |
| from io import BytesIO | |
| import requests | |
| import gradio as gr | |
| import os | |
| import sentence_transformers | |
| from sentence_transformers import SentenceTransformer, util | |
| # check if CUDA available | |
| device = "cuda" if torch.cuda.is_available() else "cpu" | |
| IMAGES_DIR = Path("photos/") | |
| #Load CLIP model | |
| model = SentenceTransformer('clip-ViT-B-32') | |
| # pre-computed embeddings | |
| emb_filename = 'unsplash-25k-photos-embeddings.pkl' | |
| with open(emb_filename, 'rb') as emb: | |
| img_names, img_emb = pickle.load(emb) | |
| def display_matches(similarity, topk): | |
| best_matched_images = [] | |
| top_k_indices = torch.topk(similarity, topk, 0).indices | |
| for matched_image in top_k_indices: | |
| img = Image.open(IMAGES_DIR / img_names[matched_image]) | |
| best_matched_images.append(img) | |
| return best_matched_images | |
| def image_search(Option, topk, search_text, search_image): | |
| topk = topk+1 | |
| # Input Text Query | |
| if Option == "Text-To-Image" : | |
| # Encode the given Input text for Search & take it in tensor form | |
| text_emb = model.encode([search_text], convert_to_tensor=True) | |
| # Compute cosine similarities between encoded input text (in tensor) & encoded images from unsplash dataset | |
| similarity = util.cos_sim(img_emb, text_emb) | |
| #using the computed similarities, find the topk best matches | |
| return display_matches(similarity, topk) | |
| elif Option == "Image-To-Image": | |
| # Encode the given Input Image for Search & take it in tensor form | |
| image_emb = model.encode([Image.fromarray(search_image)], convert_to_tensor=True) | |
| # Compute cosine similarities between encoded input image (in tensor) & encoded images from unsplash dataset | |
| similarity = util.cos_sim(img_emb, image_emb) | |
| #using the computed similarities, find the topk best matches | |
| return display_matches(similarity, topk) | |
| gr.Interface(fn=image_search, title="Search Image", | |
| description="Enter the text or image to search for the most relevant images...", | |
| article=""" | |
| Instructions:- | |
| 1. Select the option - `Text to Image` OR `Image To Image`. | |
| 2. Select the no. of most relevant images you want to see. | |
| 3. Then accordingly enter the text or image. | |
| 4. Then you will get the images on right. To enter another text/image first clear it then follow steps 1-3. | |
| """, | |
| theme="huggingface", | |
| inputs=[gr.inputs.Dropdown(["Text-To-Image", "Image-To-Image"]), | |
| gr.inputs.Dropdown(["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"], type="index", default="1", label="Select Top K Images"), | |
| gr.inputs.Textbox(lines=3, label="Input Text", placeholder="Enter the text..."), | |
| gr.inputs.Image(optional=True) | |
| ], | |
| outputs=gr.outputs.Carousel([gr.outputs.Image(type="pil")]), | |
| enable_queue=True | |
| ).launch(debug=True,share=True) |