Spaces:
Sleeping
Sleeping
Download app.py from ashish-001/CLIP-based-Image-Search: direct link, hf CLI and curl.
- Browser
- Download file 4.08 kB
-
https://huggingface.co/spaces/ashish-001/CLIP-based-Image-Search/resolve/main/app.py
- Command line
-
hf download hf://spaces/ashish-001/CLIP-based-Image-Search/app.py
-
curl -L -o app.py https://huggingface.co/spaces/ashish-001/CLIP-based-Image-Search/resolve/main/app.py
4.08 kB
| import gradio as gr | |
| from Clustering import ClusteringData | |
| import numpy as np | |
| from PIL import Image | |
| import requests | |
| import tempfile | |
| import os | |
| import logging | |
| import json | |
| logging.basicConfig(level=logging.INFO) | |
| logger = logging.getLogger(__name__) | |
| cd = ClusteringData() | |
| cd.load_model_data() | |
| logger.info("Clustering data loaded") | |
| def search_images(text_query, uploaded_image, search_mode, top_k): | |
| preview = None | |
| results = [] | |
| if search_mode == "Text" and text_query.strip(): | |
| response = requests.get( | |
| f"https://ashish-001-clip-api.hf.space/embedding?text={text_query.strip()}") | |
| if response.status_code == 200: | |
| logger.info("Embedding returned successfully by text API") | |
| data = json.loads(response.content) | |
| embedding = data["embedding"] | |
| results = cd.find_similar_records(embedding, k=top_k) | |
| else: | |
| logger.info(f"{response.status_code} returned by the text API") | |
| results = [] | |
| results = [os.path.join("coco", "val2017", "val2017", fname) | |
| for i, fname in enumerate(results)] | |
| return None, results | |
| elif search_mode == "Image": | |
| if uploaded_image is not None: | |
| preview = uploaded_image | |
| tmp_path = uploaded_image | |
| # with tempfile.NamedTemporaryFile(delete=False, suffix=".jpg") as tmp_file: | |
| # uploaded_image.save(tmp_file.name) | |
| # tmp_path = tmp_file.name | |
| else: | |
| preview = 'Image.jpg' | |
| tmp_path = 'Image.jpg' | |
| url = "https://ashish-001-clip-api.hf.space/clip/process" | |
| files = {"file": open(tmp_path, "rb")} | |
| response = requests.post(url, files=files) | |
| if response.status_code == 200: | |
| embedding = np.array(response.json()['embedding']).squeeze() | |
| logger.info("Embedding returned successfully by image API") | |
| results = cd.find_similar_records(embedding, k=top_k) | |
| else: | |
| logger.info( | |
| f"{response.status_code} returned by the image API") | |
| results = [] | |
| results = [os.path.join("coco", "val2017", "val2017", fname) | |
| for i, fname in enumerate(results)] | |
| return preview, results | |
| with gr.Blocks() as demo: | |
| gr.Markdown("## Multimodal Image Search with CLIP") | |
| gr.Markdown("Search images using **text** or **image upload**.") | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| # Inputs | |
| search_mode = gr.Radio( | |
| ["Text", "Image"], label="Search Mode", value="Text") | |
| text_input = gr.Textbox( | |
| label="Enter text query", placeholder="Type something...", visible=True, value='Empty street') | |
| file_input = gr.Image( | |
| type="filepath", | |
| label="Upload image", | |
| value="Image.jpg", | |
| visible=False | |
| ) | |
| top_k = gr.Slider(1, 20, value=6, step=1, | |
| label="Number of results") | |
| submit_btn = gr.Button("Search") | |
| with gr.Column(scale=2): | |
| preview_img = gr.Image(label="Uploaded / Default Image") | |
| result_gallery = gr.Gallery( | |
| label="Results", columns=3, height="auto") | |
| def toggle_inputs(mode): | |
| if mode == "Text": | |
| return ( | |
| gr.update(visible=True), | |
| gr.update(visible=False, value=None), | |
| [], | |
| None | |
| ) | |
| else: | |
| return ( | |
| gr.update(visible=False), | |
| gr.update(visible=True, value=None), | |
| [], | |
| "Image.jpg" | |
| ) | |
| search_mode.change(toggle_inputs, inputs=search_mode, | |
| outputs=[text_input, file_input, result_gallery, preview_img]) | |
| submit_btn.click(fn=search_images, | |
| inputs=[text_input, | |
| file_input, search_mode, top_k], | |
| outputs=[preview_img, result_gallery,]) | |
| demo.launch() | |