|
import streamlit as st
|
|
from PIL import Image
|
|
from feature_extractor import FeatureExtractor
|
|
from similarity_search import SimilaritySearchEngine
|
|
|
|
def main():
|
|
st.title('Image Similarity Search')
|
|
|
|
|
|
uploaded_file = st.file_uploader("Choose an image...", type=["jpg", "png", "jpeg"])
|
|
|
|
if uploaded_file is not None:
|
|
|
|
query_img = Image.open(uploaded_file)
|
|
|
|
|
|
query_img_resized = query_img.resize((263, 385))
|
|
st.image(query_img_resized, caption='Uploaded Image', use_container_width=False)
|
|
|
|
|
|
if st.button("Search Similar Images"):
|
|
with st.spinner("Analyzing query image..."):
|
|
try:
|
|
|
|
extractor = FeatureExtractor()
|
|
search_engine = SimilaritySearchEngine()
|
|
|
|
|
|
query_img_path = 'temp_query_image.jpg'
|
|
query_img.save(query_img_path)
|
|
|
|
|
|
query_embedding = extractor.extract_features(query_img_path)
|
|
|
|
|
|
similar_images, distances = search_engine.search_similar_images(query_embedding)
|
|
|
|
|
|
st.subheader('Similar Images')
|
|
cols = st.columns(len(similar_images))
|
|
for i, (img_path, dist) in enumerate(zip(similar_images, distances)):
|
|
with cols[i]:
|
|
similar_img = Image.open(img_path).resize((375, 550))
|
|
st.image(similar_img, caption=f'Distance: {dist:.2f}', use_container_width=True)
|
|
|
|
except Exception as e:
|
|
st.error(f"Error during similarity search: {e}")
|
|
|
|
if __name__ == '__main__':
|
|
main()
|
|
|