dmedhi commited on
Commit
40a2cd4
·
1 Parent(s): 08d7be0

intial commit

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitignore +163 -0
  2. app.py +98 -0
  3. data/airplane/airplane_0000.jpg +0 -0
  4. data/airplane/airplane_0001.jpg +0 -0
  5. data/airplane/airplane_0002.jpg +0 -0
  6. data/airplane/airplane_0003.jpg +0 -0
  7. data/airplane/airplane_0004.jpg +0 -0
  8. data/airplane/airplane_0005.jpg +0 -0
  9. data/airplane/airplane_0006.jpg +0 -0
  10. data/airplane/airplane_0007.jpg +0 -0
  11. data/airplane/airplane_0008.jpg +0 -0
  12. data/airplane/airplane_0009.jpg +0 -0
  13. data/airplane/airplane_0010.jpg +0 -0
  14. data/airplane/airplane_0011.jpg +0 -0
  15. data/airplane/airplane_0012.jpg +0 -0
  16. data/airplane/airplane_0013.jpg +0 -0
  17. data/airplane/airplane_0014.jpg +0 -0
  18. data/airplane/airplane_0015.jpg +0 -0
  19. data/airplane/airplane_0016.jpg +0 -0
  20. data/airplane/airplane_0017.jpg +0 -0
  21. data/airplane/airplane_0018.jpg +0 -0
  22. data/airplane/airplane_0019.jpg +0 -0
  23. data/airplane/airplane_0020.jpg +0 -0
  24. data/airplane/airplane_0021.jpg +0 -0
  25. data/airplane/airplane_0022.jpg +0 -0
  26. data/airplane/airplane_0023.jpg +0 -0
  27. data/airplane/airplane_0024.jpg +0 -0
  28. data/airplane/airplane_0025.jpg +0 -0
  29. data/airplane/airplane_0026.jpg +0 -0
  30. data/airplane/airplane_0027.jpg +0 -0
  31. data/airplane/airplane_0028.jpg +0 -0
  32. data/airplane/airplane_0029.jpg +0 -0
  33. data/airplane/airplane_0030.jpg +0 -0
  34. data/car/car_0000.jpg +0 -0
  35. data/car/car_0001.jpg +0 -0
  36. data/car/car_0002.jpg +0 -0
  37. data/car/car_0003.jpg +0 -0
  38. data/car/car_0004.jpg +0 -0
  39. data/car/car_0005.jpg +0 -0
  40. data/car/car_0006.jpg +0 -0
  41. data/car/car_0007.jpg +0 -0
  42. data/car/car_0008.jpg +0 -0
  43. data/car/car_0009.jpg +0 -0
  44. data/car/car_0010.jpg +0 -0
  45. data/car/car_0011.jpg +0 -0
  46. data/car/car_0012.jpg +0 -0
  47. data/car/car_0013.jpg +0 -0
  48. data/car/car_0014.jpg +0 -0
  49. data/car/car_0015.jpg +0 -0
  50. data/car/car_0016.jpg +0 -0
.gitignore ADDED
@@ -0,0 +1,163 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+
162
+
163
+ models
app.py ADDED
@@ -0,0 +1,98 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import glob
2
+ import os
3
+
4
+ import streamlit as st
5
+ from datastore import ChromaStore
6
+ from embeddings import Embedding
7
+ from PIL import Image
8
+ from tqdm import tqdm
9
+
10
+ from utils import base64_to_image, image_to_base64
11
+
12
+ ##### Image database
13
+ root_dir = os.path.join(os.getcwd(), "data")
14
+ jpg_files = glob.glob(os.path.join(root_dir, "**", "*.jpg"), recursive=True)
15
+ IMAGE_DATABASE = [Image.open(f).resize((224, 224)) for f in jpg_files]
16
+
17
+
18
+ def display_image_database():
19
+ image_database_expander = st.expander(label="Image Database")
20
+ with image_database_expander:
21
+ st.image(IMAGE_DATABASE)
22
+
23
+
24
+ def display_sample_images():
25
+ sample_img_path = os.path.join(os.getcwd(), "sample_imgs")
26
+ sample_images = os.listdir(sample_img_path)
27
+
28
+ images = []
29
+ for i, img in enumerate(sample_images):
30
+ images.append(Image.open(os.path.join(sample_img_path, img)).resize((224, 224)))
31
+
32
+ st.image(images)
33
+
34
+
35
+ def main():
36
+ st.set_page_config(page_icon="🖼️", page_title="image-search-engine", layout="wide")
37
+ st.markdown(
38
+ """<h1 style="text-align: center;">🔍️ Image Search Engine</h1>""",
39
+ unsafe_allow_html=True,
40
+ )
41
+ st.markdown(
42
+ """<h3 style="text-align: center;">Image to Image search using transformer embeddings</h3>""",
43
+ unsafe_allow_html=True,
44
+ )
45
+
46
+ main_layout = st.columns(2)
47
+
48
+ with main_layout[0]:
49
+ with st.container(border=True, height=550):
50
+ st.markdown(
51
+ """<h3 style="text-align: center;">Search</h3>""",
52
+ unsafe_allow_html=True,
53
+ )
54
+ upload_img = st.file_uploader(
55
+ label="Query Image",
56
+ accept_multiple_files=False,
57
+ type=["jpg", "png", "jpeg"],
58
+ )
59
+
60
+ submit = st.button(label="Submit")
61
+ display_sample_images()
62
+
63
+ with main_layout[1]:
64
+ with st.container(border=True, height=550):
65
+ st.markdown(
66
+ """<h3 style="text-align: center;">Results</h3>""",
67
+ unsafe_allow_html=True,
68
+ )
69
+ top_k = st.slider(label="Search top k results", min_value=3, max_value=10)
70
+ if submit and upload_img:
71
+ ## encode uplaoded img
72
+ query_embedding = Embedding.encode_image(Image.open(upload_img))
73
+ ## query vectorstore
74
+ vectorstore = ChromaStore(collection_name="image_store")
75
+ collection = vectorstore.create()
76
+ # print(collection)
77
+ # print(vectorstore.collection_info(collection))
78
+ st.toast("Vectorstore loaded successfully", icon="✅")
79
+ results = vectorstore.query(
80
+ collection,
81
+ query_embedding,
82
+ top_k=top_k,
83
+ )
84
+ ## show results
85
+
86
+ res_images = []
87
+ for res in tqdm(results, desc="Results"):
88
+ res_images.append(res[0])
89
+
90
+ st.image(res_images)
91
+ else:
92
+ st.warning("Please upload an image")
93
+
94
+ display_image_database()
95
+
96
+
97
+ if __name__ == "__main__":
98
+ main()
data/airplane/airplane_0000.jpg ADDED
data/airplane/airplane_0001.jpg ADDED
data/airplane/airplane_0002.jpg ADDED
data/airplane/airplane_0003.jpg ADDED
data/airplane/airplane_0004.jpg ADDED
data/airplane/airplane_0005.jpg ADDED
data/airplane/airplane_0006.jpg ADDED
data/airplane/airplane_0007.jpg ADDED
data/airplane/airplane_0008.jpg ADDED
data/airplane/airplane_0009.jpg ADDED
data/airplane/airplane_0010.jpg ADDED
data/airplane/airplane_0011.jpg ADDED
data/airplane/airplane_0012.jpg ADDED
data/airplane/airplane_0013.jpg ADDED
data/airplane/airplane_0014.jpg ADDED
data/airplane/airplane_0015.jpg ADDED
data/airplane/airplane_0016.jpg ADDED
data/airplane/airplane_0017.jpg ADDED
data/airplane/airplane_0018.jpg ADDED
data/airplane/airplane_0019.jpg ADDED
data/airplane/airplane_0020.jpg ADDED
data/airplane/airplane_0021.jpg ADDED
data/airplane/airplane_0022.jpg ADDED
data/airplane/airplane_0023.jpg ADDED
data/airplane/airplane_0024.jpg ADDED
data/airplane/airplane_0025.jpg ADDED
data/airplane/airplane_0026.jpg ADDED
data/airplane/airplane_0027.jpg ADDED
data/airplane/airplane_0028.jpg ADDED
data/airplane/airplane_0029.jpg ADDED
data/airplane/airplane_0030.jpg ADDED
data/car/car_0000.jpg ADDED
data/car/car_0001.jpg ADDED
data/car/car_0002.jpg ADDED
data/car/car_0003.jpg ADDED
data/car/car_0004.jpg ADDED
data/car/car_0005.jpg ADDED
data/car/car_0006.jpg ADDED
data/car/car_0007.jpg ADDED
data/car/car_0008.jpg ADDED
data/car/car_0009.jpg ADDED
data/car/car_0010.jpg ADDED
data/car/car_0011.jpg ADDED
data/car/car_0012.jpg ADDED
data/car/car_0013.jpg ADDED
data/car/car_0014.jpg ADDED
data/car/car_0015.jpg ADDED
data/car/car_0016.jpg ADDED