Munene1's picture
Update app.py
05efdb7 verified
Raw
History Blame Contribute Delete
3.95 kB
#Importing libraries
import chromadb
import time
from transformers import CLIPModel, CLIPProcessor
import gradio as gr
from sklearn.metrics.pairwise import cosine_similarity
import torch
import numpy
from PIL import Image
#create the client
client = chromadb.Client()
collection = client.create_collection('image_collection')
#define the model and the proccessor
model = CLIPModel.from_pretrained('openai/clip-vit-base-patch32')
processor = CLIPProcessor.from_pretrained ('openai/clip-vit-base-patch32')
image_paths = [
'image-01.jpg',
'image-02.jpg',
'image-03.jpeg'
]
images = [Image.open(image_path) for image_path in image_paths]
inputs = processor(images = images, return_tensors='pt', padding=True)
#Generate the embeddings
start_time = time.time()
with torch.no_grad():
image_embeddings = model.get_image_features(**inputs).numpy()
image_embeddings = [embedding.tolist() for embedding in image_embeddings]
end_time = time.time()
ingestion_time = end_time - start_time
collection.add(
embeddings = image_embeddings,
metadatas = [{'image':image} for image in image_paths],
ids = [str(i) for i in range(len(image_paths))]
)
print(f'image ingestion time {ingestion_time:.4f} seconds')
def calculate_accuracy(image_embedding, query_embedding):
similarity = cosine_similarity([image_embedding], [query_embedding])[0][0]
return similarity
def search_image(query):
if not query.strip():
return None, 'Ooopsy, you forgot to input something?, please try again ☠👻'
print(f'\nQuery: {query}')
start_query = time.time()
inputs = processor(text = query, return_tensors='pt', padding=True)
with torch.no_grad():
query_embeding = model.get_text_features(**inputs).numpy()
query_embeding = query_embeding.tolist()
end_query = time.time()
query_time = end_query - start_query
result = collection.query(query_embeddings = query_embeding, n_results=1)
result_image_path = result['metadatas'][0][0]['image']
result_image_index = int(result['ids'][0][0])
matched_image_embedding = image_embeddings[result_image_index]
accuracy_score = calculate_accuracy(matched_image_embedding, query_embeding[0])
result_image = Image.open(result_image_path)
file_name = result_image_path.split('/')[-1]
return result_image, f'Accuracy score: {accuracy_score:.4f}\nQuery Time: {query_time:.4f} seconds', file_name
queries = [
'A group of polar bears',
'A famous landmark in paris',
'A hot pizza fresh from the oven',
'food',
'A place',
'A structure in Europe',
'Animals'
]
def populate_queries(suggested_querries):
return suggested_querries
#defining a gradio interface
with gr.Blocks() as gr_interface:
gr.Markdown('# This is an image retrieval application Made by Allan Munene🤗😁🤑')
with gr.Row():
with gr.Column():
gr.Markdown(f'***Image Ingestion Time***: {ingestion_time:.4f} seconds')
gr.Markdown('## Input Panel')
custom_query = gr.Textbox(placeholder = 'Input your query here', label='What are you looking for?')
with gr.Row():
submit_button = gr.Button('Submit Query')
cancel_button = gr.Button('Cancel')
with gr.Row(elem_id='button-container'):
for query in queries:
gr.Button(query).click(fn=lambda q=query: q, outputs=custom_query)
with gr.Column():
gr.Markdown('Output Image')
Output_image = gr.Image(type='pil', label='Result_image')
accuracy = gr.Textbox(label='Performance')
f_name = gr.Textbox(label='File Name')
submit_button.click(fn=search_image, inputs=custom_query, outputs=[Output_image, accuracy, f_name])
cancel_button.click(fn=lambda: (None, ''), outputs=[Output_image, accuracy, f_name])
gr_interface.launch(share=True)