Spaces:
Runtime error
Runtime error
import io | |
import tarfile | |
import numpy as np | |
import random as RAND | |
import torch | |
import torchvision.transforms as TRNSFM | |
import torchvision.models as MDLS | |
from PIL import Image as IMG | |
from scipy.spatial.distance import cosine | |
import streamlit as st | |
def similar(image): # Function for Streamlit App | |
pict = form(IMG.open(image).convert('RGB')) | |
pictFeats = mod(pict.unsqueeze(0)).detach().numpy().squeeze() | |
for na, feat in feats.items(): | |
s = 1 - cosine(pictFeats, feat) | |
simScores.append((na, s)) | |
simScores.sort(key=lambda x: x[1], reverse=True) | |
st.write("### Selected Image") | |
test = IMG.open(image) | |
test.show() | |
print('\n') | |
# 10 Most Similar Images from Dictionary | |
st.write("### 10 Most Similar Images") | |
for na in simScores[:10]: | |
for x in range(10): | |
st.write(f"### {x}") | |
new_na = na[:3] + "images/" + na[3:] | |
new_path = "http://vis-www.cs.umass.edu/" + new_na | |
simImages = IMG.open(new_path) | |
simImages.show() | |
mod = MDLS.resnet50(pretrained=True) | |
mod.eval() | |
mod = torch.nn.Sequential(*list(mod.children())[:-1]) | |
inFile = tarfile.open('./datasets/lfw.tar', 'r') | |
feats = {} | |
simScores = [] # Similarity Scores for Later | |
form = TRNSFM.Compose([ | |
TRNSFM.Resize(256), | |
TRNSFM.CenterCrop(224), | |
TRNSFM.ToTensor(), | |
TRNSFM.Normalize(mean=[0.485,0.456,0.406], std=[0.229,0.224,0.225]) | |
]) # Image Pre-processing | |
stuffs = inFile.getmembers() | |
for stuff in stuffs: # Going through the TAR file | |
f = inFile.extractfile(stuff) | |
if stuff.isdir(): | |
continue | |
if stuff.name.lower().endswith(('.jpg', '.jpeg', '.png')): | |
n = stuff.name | |
pic = form(IMG.open(io.BytesIO(f.read())).convert('RGB')) # Pre-processes the image before feeding it into the model | |
feats[n] = mod(pic.unsqueeze(0)).detach().numpy().squeeze() | |
# Stuff for App | |
st.title("Similar Image Finder") | |
upload = st.file_uploader("Upload an Image...", type=['.jpg', '.jpeg', '.png']) | |
if upload is not None: | |
similar(upload) | |
st.write("## OR") | |
# Random Image Selector from 5 Pictures | |
randImages = [ | |
'./datasets/random-images/img1.jpg', | |
'./datasets/random-images/img2.jpg', | |
'./datasets/random-images/img3.jpg', | |
'./datasets/random-images/img4.jpg', | |
'./datasets/random-images/img5.jpg' | |
] | |
if st.button("Surprise Me!"): # Button | |
imageOptOne = RAND.choice(randImages) | |
similar(imageOptOne) | |
inFile.close() | |