Keshavp08's picture
Update app.py
1055975
Raw
History Blame Contribute Delete
3.36 kB
import streamlit as st
import torch
import torch.nn as nn
import torchvision.models as models
import torchvision.transforms as transforms
from sklearn.neighbors import NearestNeighbors
from PIL import Image
# Define the path to the directory containing the images
IMAGE_DIR = "lfw"
# Define the path to the ResNet50 model checkpoint
MODEL_CHECKPOINT = "resnet50.pth"
# Define the number of nearest neighbors to retrieve
NUM_NEIGHBORS = 10
# Load the pretrained ResNet50 model
model = models.resnet50(pretrained=True)
# Remove the last layer (the classification layer) from the model
model = nn.Sequential(*list(model.children())[:-1])
# Load the saved ResNet50 model checkpoint
model.load_state_dict(torch.load(MODEL_CHECKPOINT, map_location=torch.device('cpu')))
# Set the model to evaluation mode
model.eval()
# Define a preprocessing transform to resize and normalize the images
transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))
])
# Load the image filenames and their corresponding feature vectors
image_filenames = []
features = []
with open("features.txt", "r") as f:
for line in f:
parts = line.strip().split(",")
image_filenames.append(parts[0])
feature = [float(x) for x in parts[1:]]
features.append(feature)
features = torch.tensor(features)
# Create a nearest neighbor model and fit it to the feature vectors
model = NearestNeighbors(n_neighbors=NUM_NEIGHBORS, metric='euclidean')
model.fit(features)
# Define a function to find the 10 most similar images to a query image
def find_similar_images(query_image_path):
# Load and preprocess the query image
query_image = Image.open(query_image_path)
query_image = transform(query_image)
# Extract the feature vector from the query image
query_feature = model(torch.unsqueeze(query_image, 0))
query_feature = query_feature.reshape(query_feature.shape[0], -1).detach().numpy()
# Find the indices of the 10 most similar images
distances, indices = model.kneighbors(query_feature)
# Return the paths to the 10 most similar images
similar_image_paths = [image_filenames[i] for i in indices[0]]
return similar_image_paths
# Define the Streamlit app
def app():
# Set the page title
st.set_page_config(page_title="Similarity Search App", page_icon=":mag_right:")
# Define the sidebar
st.sidebar.title("Similarity Search")
query_image_method = st.sidebar.radio("Select method:", ("Select image", "Upload image"))
# Define the main content
st.title("Similarity Search App")
if query_image_method == "Select image":
# List all the available images
image_files = [f"{IMAGE_DIR}/{name}" for name in os.listdir(IMAGE_DIR)]
selected_image = st.selectbox("Select an image", image_files)
# Display the selected image
st.image(selected_image, caption="Selected Image", use_column_width=True)
# Find the most similar images
similar_images = find_similar_images(selected_image)
# Display the most similar images
st.subheader("Similar Images")
for i, image_path in enumerate(similar_images):
image = Image.open(image_path)
st.image(image, caption=f"Rank {i+1}", width=150)