alymbeks commited on
Commit
66f8989
·
1 Parent(s): a193c86

initial commit

Browse files
Files changed (3) hide show
  1. .gitignore +4 -0
  2. app.py +97 -0
  3. requirements.txt +2 -0
.gitignore ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ photos/
2
+ .venv/
3
+ .vscode/
4
+ unsplash*
app.py ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from sentence_transformers import SentenceTransformer, util
2
+ from PIL import Image
3
+ import pickle
4
+ import os
5
+ import gradio as gr
6
+ import zipfile
7
+
8
+ # Load CLIP model
9
+ text_model = SentenceTransformer("clip-ViT-B-32-multilingual-v1")
10
+
11
+ image_model = SentenceTransformer("clip-ViT-B-32")
12
+ image_model.parallel_tokenization = False
13
+
14
+ img_folder = ".\\photos\\"
15
+ if not os.path.exists(img_folder) or len(os.listdir(img_folder)) == 0:
16
+ os.makedirs(img_folder, exist_ok=True)
17
+
18
+ photo_filename = "unsplash-25k-photos.zip"
19
+ if not os.path.exists(photo_filename):
20
+ util.http_get("http://sbert.net/datasets/" +
21
+ photo_filename, photo_filename)
22
+
23
+ # Extract all images
24
+ with zipfile.ZipFile(photo_filename, "r") as zf:
25
+ for member in zf.infolist():
26
+ zf.extract(member, img_folder)
27
+
28
+
29
+ emb_filename = ".\\unsplash-25k-photos-embeddings.pkl"
30
+ if not os.path.exists(emb_filename):
31
+ util.http_get(
32
+ "http://sbert.net/datasets/unsplash-25k-photos-embeddings.pkl", emb_filename
33
+ )
34
+
35
+ with open(emb_filename, "rb") as fIn:
36
+ img_names, img_emb = pickle.load(fIn)
37
+
38
+
39
+ img_folder = ".\\photos\\"
40
+ duplicates = util.paraphrase_mining_embeddings(img_emb)
41
+
42
+
43
+ def search_text(query, top_k=1):
44
+ """ " Search an image based on the text query.
45
+
46
+ Args:
47
+ query ([string]): [query you want search for]
48
+ top_k (int, optional): [Amount of images o return]. Defaults to 1.
49
+ Returns:
50
+ [list]: [list of images that are related to the query.]
51
+ """
52
+ # First, we encode the query.
53
+ query_emb = text_model.encode([query])
54
+
55
+ # Then, we use the util.semantic_search function, which computes the cosine-similarity
56
+ # between the query embedding and all image embeddings.
57
+ # It then returns the top_k highest ranked images, which we output
58
+ hits = util.semantic_search(query_emb, img_emb, top_k=top_k)[0]
59
+
60
+ image = []
61
+ for hit in hits:
62
+ object = Image.open(os.path.join(
63
+ ".\\photos\\", img_names[hit["corpus_id"]]))
64
+ image.append((object, img_names[hit["corpus_id"]]))
65
+
66
+ return image
67
+
68
+
69
+ iface_search = gr.Interface(
70
+ title="Семантический поиск по картинке - d8a.ai",
71
+ description="""Демо-версия семантического поиска изображений, использующая
72
+ современные алгоритмы искусственного интеллекта для получения высокоточных
73
+ результатов поиска. Пользователи могут искать изображения с помощью запросов
74
+ на естественном языке, просматривать и предварительно просматривать результаты.
75
+ Это приложение идеально подходит для создателей контента, маркетологов и менеджеров
76
+ социальных сетей и обеспечивает более интеллектуальный и интуитивно понятный
77
+ способ поиска и управления визуальным контентом.""",
78
+ fn=search_text,
79
+ allow_flagging="never",
80
+ inputs=[
81
+ gr.inputs.Textbox(
82
+ lines=4,
83
+ label="Поисковый текст",
84
+ placeholder="Что вы хотите найти?",
85
+ default="Горы Кыргызстана",
86
+ ),
87
+ gr.inputs.Slider(minimum=0, maximum=9, default=5,
88
+ step=1, label="Количество"),
89
+ ],
90
+ outputs=gr.Gallery(
91
+ label="Найденные изображения", show_label=False, elem_id="gallery"
92
+ ).style(grid=[5], height="auto"),
93
+ examples=[[("Горы Кыргызстана"), 5], [("Бишкек"), 5],
94
+ [("A boy with a ball"), 5]],
95
+ )
96
+
97
+ iface_search.launch()
requirements.txt ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ sentence_transformers
2
+ Pillow