Rahul Bhoyar
Initial Commit
e7e1d7b
raw
history blame
4.31 kB
import streamlit as st
import os
import matplotlib.pyplot as plt
from scipy.spatial.distance import cosine
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.vgg16 import VGG16, preprocess_input
from tensorflow.keras.models import Model
import numpy as np
import pickle
from PIL import Image
import matplotlib.pyplot as plt
import glob
from tensorflow.keras.models import load_model
# Function for preprocessing image
def preprocess_image(img):
img = image.load_img(img, target_size=(224, 224))
img_array = image.img_to_array(img)
img_array_expanded = np.expand_dims(img_array, axis=0)
return preprocess_input(img_array_expanded)
# Function for extracting features
def extract_features(model, preprocessed_img):
features = model.predict(preprocessed_img)
flattened_features = features.flatten()
normalized_features = flattened_features / np.linalg.norm(flattened_features)
return normalized_features
# Function for recommending fashion items
def recommend_fashion_items_cnn(input_image, all_features, all_image_names, model, top_n=4):
# pre-process the input image and extract features
preprocessed_img = preprocess_image(input_image)
input_features = extract_features(model, preprocessed_img)
# calculate similarities and find the top N similar images
similarities = [1 - cosine(input_features, other_feature) for other_feature in all_features]
similar_indices = np.argsort(similarities)[-top_n:]
# filter out the input image index from similar_indices
similar_indices = [idx for idx in similar_indices]# if idx != all_image_names.index(input_image_path)]
# display the input image and recommended images
recommended_images = [] # Add input image as the first recommendation
for idx in similar_indices:
recommedneded_image_path = os.path.join('model_creation/women_fashion_data', all_image_names[idx])
recommended_images.append(recommedneded_image_path)
return recommended_images
# directory path containing your images
image_directory = 'model_creation/women_fashion_data'
image_paths_list = [file for file in glob.glob(os.path.join(image_directory, '*.*')) if file.endswith(('.jpg', '.png', '.jpeg', 'webp'))]
base_model = VGG16(weights='imagenet', include_top=False)
model = Model(inputs=base_model.input, outputs=base_model.output)
all_features = []
all_image_names = []
for img_path in image_paths_list:
preprocessed_img = preprocess_image(img_path)
features = extract_features(model, preprocessed_img)
all_features.append(features)
all_image_names.append(os.path.basename(img_path))
def main():
# Title and Description
st.title('Women Fashion Recommendation System')
st.subheader("Author : Rahul Bhoyar")
st.write("Upload an image of the clothing item you want recommendations for:")
# Upload image
uploaded_file = st.file_uploader("Choose an image...", type=["jpg", "jpeg", "png"])
if uploaded_file is not None:
# Display uploaded image
image = Image.open(uploaded_file)
st.image(image, caption='Uploaded Image', use_column_width=True)
# Get the path to the uploaded image
input_image_path = "uploaded_image.jpg" # Save the uploaded image temporarily
image.save(input_image_path)
# Display waiting message
with st.spinner("Please wait while we process your request..."):
# Display recommendation results
st.write("Here are the recommended images based on the uploaded image:")
# Call the recommend_fashion_items_cnn function
recommended_images = recommend_fashion_items_cnn(input_image_path, all_features, all_image_names, model)
# Display recommended images
col1, col2 = st.columns(2)
columns = [col1, col2]
for i, recommended_image_path in enumerate(recommended_images, start=1):
recommended_image = Image.open(recommended_image_path)
with columns[i % 2]:
st.image(recommended_image, caption=f"Recommendation {i}", width=200, use_column_width='auto')
# Footer Section
st.text('Powered by Streamlit')
if __name__ == '__main__':
main()