Rahul Bhoyar commited on
Commit
e7e1d7b
1 Parent(s): 9e1d0b4

Initial Commit

Browse files
Files changed (5) hide show
  1. .dockerignore +3 -0
  2. .gitignore +162 -0
  3. LICENSE +21 -0
  4. app.py +109 -1
  5. requirements.txt +10 -0
.dockerignore ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ model_creation/
2
+ LICENSE
3
+ README.md
.gitignore ADDED
@@ -0,0 +1,162 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py,cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+ target/
77
+
78
+ # Jupyter Notebook
79
+ .ipynb_checkpoints
80
+
81
+ # IPython
82
+ profile_default/
83
+ ipython_config.py
84
+
85
+ # pyenv
86
+ # For a library or package, you might want to ignore these files since the code is
87
+ # intended to run in multiple environments; otherwise, check them in:
88
+ # .python-version
89
+
90
+ # pipenv
91
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
+ # install all needed dependencies.
95
+ #Pipfile.lock
96
+
97
+ # poetry
98
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
99
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
100
+ # commonly ignored for libraries.
101
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
102
+ #poetry.lock
103
+
104
+ # pdm
105
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
106
+ #pdm.lock
107
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
108
+ # in version control.
109
+ # https://pdm.fming.dev/#use-with-ide
110
+ .pdm.toml
111
+
112
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
113
+ __pypackages__/
114
+
115
+ # Celery stuff
116
+ celerybeat-schedule
117
+ celerybeat.pid
118
+
119
+ # SageMath parsed files
120
+ *.sage.py
121
+
122
+ # Environments
123
+ .env
124
+ .venv
125
+ env/
126
+ venv/
127
+ ENV/
128
+ env.bak/
129
+ venv.bak/
130
+
131
+ # Spyder project settings
132
+ .spyderproject
133
+ .spyproject
134
+
135
+ # Rope project settings
136
+ .ropeproject
137
+
138
+ # mkdocs documentation
139
+ /site
140
+
141
+ # mypy
142
+ .mypy_cache/
143
+ .dmypy.json
144
+ dmypy.json
145
+
146
+ # Pyre type checker
147
+ .pyre/
148
+
149
+ # pytype static type analyzer
150
+ .pytype/
151
+
152
+ # Cython debug symbols
153
+ cython_debug/
154
+
155
+ # PyCharm
156
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
157
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
158
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
159
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
160
+ #.idea/
161
+ uploaded_image.jpg
162
+ model_creation/
LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Rahul Bhoyar
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
app.py CHANGED
@@ -1 +1,109 @@
1
- print("Hello World")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import os
3
+ import matplotlib.pyplot as plt
4
+ from scipy.spatial.distance import cosine
5
+ from tensorflow.keras.preprocessing import image
6
+ from tensorflow.keras.applications.vgg16 import VGG16, preprocess_input
7
+ from tensorflow.keras.models import Model
8
+ import numpy as np
9
+ import pickle
10
+ from PIL import Image
11
+ import matplotlib.pyplot as plt
12
+ import glob
13
+ from tensorflow.keras.models import load_model
14
+
15
+ # Function for preprocessing image
16
+ def preprocess_image(img):
17
+ img = image.load_img(img, target_size=(224, 224))
18
+ img_array = image.img_to_array(img)
19
+ img_array_expanded = np.expand_dims(img_array, axis=0)
20
+ return preprocess_input(img_array_expanded)
21
+
22
+ # Function for extracting features
23
+ def extract_features(model, preprocessed_img):
24
+ features = model.predict(preprocessed_img)
25
+ flattened_features = features.flatten()
26
+ normalized_features = flattened_features / np.linalg.norm(flattened_features)
27
+ return normalized_features
28
+
29
+ # Function for recommending fashion items
30
+ def recommend_fashion_items_cnn(input_image, all_features, all_image_names, model, top_n=4):
31
+ # pre-process the input image and extract features
32
+ preprocessed_img = preprocess_image(input_image)
33
+ input_features = extract_features(model, preprocessed_img)
34
+
35
+ # calculate similarities and find the top N similar images
36
+ similarities = [1 - cosine(input_features, other_feature) for other_feature in all_features]
37
+ similar_indices = np.argsort(similarities)[-top_n:]
38
+
39
+ # filter out the input image index from similar_indices
40
+ similar_indices = [idx for idx in similar_indices]# if idx != all_image_names.index(input_image_path)]
41
+ # display the input image and recommended images
42
+ recommended_images = [] # Add input image as the first recommendation
43
+
44
+ for idx in similar_indices:
45
+ recommedneded_image_path = os.path.join('model_creation/women_fashion_data', all_image_names[idx])
46
+ recommended_images.append(recommedneded_image_path)
47
+
48
+ return recommended_images
49
+
50
+
51
+
52
+ # directory path containing your images
53
+ image_directory = 'model_creation/women_fashion_data'
54
+
55
+ image_paths_list = [file for file in glob.glob(os.path.join(image_directory, '*.*')) if file.endswith(('.jpg', '.png', '.jpeg', 'webp'))]
56
+
57
+
58
+ base_model = VGG16(weights='imagenet', include_top=False)
59
+ model = Model(inputs=base_model.input, outputs=base_model.output)
60
+
61
+ all_features = []
62
+ all_image_names = []
63
+
64
+ for img_path in image_paths_list:
65
+ preprocessed_img = preprocess_image(img_path)
66
+ features = extract_features(model, preprocessed_img)
67
+ all_features.append(features)
68
+ all_image_names.append(os.path.basename(img_path))
69
+
70
+ def main():
71
+ # Title and Description
72
+ st.title('Women Fashion Recommendation System')
73
+ st.subheader("Author : Rahul Bhoyar")
74
+ st.write("Upload an image of the clothing item you want recommendations for:")
75
+
76
+ # Upload image
77
+ uploaded_file = st.file_uploader("Choose an image...", type=["jpg", "jpeg", "png"])
78
+
79
+ if uploaded_file is not None:
80
+ # Display uploaded image
81
+ image = Image.open(uploaded_file)
82
+ st.image(image, caption='Uploaded Image', use_column_width=True)
83
+
84
+ # Get the path to the uploaded image
85
+ input_image_path = "uploaded_image.jpg" # Save the uploaded image temporarily
86
+ image.save(input_image_path)
87
+
88
+ # Display waiting message
89
+ with st.spinner("Please wait while we process your request..."):
90
+ # Display recommendation results
91
+ st.write("Here are the recommended images based on the uploaded image:")
92
+
93
+ # Call the recommend_fashion_items_cnn function
94
+ recommended_images = recommend_fashion_items_cnn(input_image_path, all_features, all_image_names, model)
95
+
96
+ # Display recommended images
97
+ col1, col2 = st.columns(2)
98
+ columns = [col1, col2]
99
+
100
+ for i, recommended_image_path in enumerate(recommended_images, start=1):
101
+ recommended_image = Image.open(recommended_image_path)
102
+ with columns[i % 2]:
103
+ st.image(recommended_image, caption=f"Recommendation {i}", width=200, use_column_width='auto')
104
+
105
+ # Footer Section
106
+ st.text('Powered by Streamlit')
107
+
108
+ if __name__ == '__main__':
109
+ main()
requirements.txt ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ jupyter
2
+ streamlit
3
+ matplotlib
4
+ scipy
5
+ tensorflow
6
+ numpy
7
+ Pillow
8
+ idna
9
+ huggingface-cli
10
+ huggingface_hub[cli]