alymbeks commited on
Commit
924f454
·
1 Parent(s): c5ad25d

intial commit

Browse files
Files changed (3) hide show
  1. .gitignore +4 -0
  2. app.py +79 -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,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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): # Download dataset if does not exist
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
+ with open(emb_filename, 'rb') as fIn:
35
+ img_names, img_emb = pickle.load(fIn)
36
+
37
+
38
+ img_folder = ".\\photos\\"
39
+ duplicates = util.paraphrase_mining_embeddings(img_emb)
40
+
41
+
42
+ def search_duplicates(threshold=100):
43
+
44
+ threshold /= 100
45
+ near_duplicates = [entry for entry in duplicates if entry[0] <= threshold]
46
+ images = []
47
+ for score, idx1, idx2 in near_duplicates[0:5]:
48
+ img1_path = os.path.join(img_folder, img_names[idx1])
49
+ img2_path = os.path.join(img_folder, img_names[idx2])
50
+ img1 = Image.open(img1_path)
51
+ img2 = Image.open(img2_path)
52
+ images.append((img1, ""))
53
+ images.append((img2, score))
54
+ return images
55
+
56
+
57
+ description = '''
58
+ Приложение для поиска одинаковых изображений - это мощный инструмент, который помогает пользователям выявлять одинаковые изображения и, например, управлять ими.
59
+ Это приложение использует передовые алгоритмы компьютерного зрения и машинного обучения для обнаружения похожих или идентичных изображений и представляет их в понятном и организованном виде.
60
+ Пользователи могут загружать изображения в приложение и быстро определять похожие изображения либо дупликаты, которые могут существовать в их коллекции.
61
+ Приложение может потенциально предоставить инструменты для управления дубликатами, например, возможность их удаления или объединения.
62
+ Приложение для поиска дубликатов изображений идеально подходит для тех, кому необходимо управлять большой коллекцией изображений, например, для фотографов, графических дизайнеров или менеджеров социальных сетей.
63
+ Выявляя дубликаты изображений и управляя ими, пользователи могут сэкономить время и оптимизировать свои рабочие процессы.
64
+ Благодаря удобному интерфейсу и мощным алгоритмам приложение для поиска дубликатов изображений является отличным примером того, как ИИ может быть использован для повышения производительности и оптимизации рабочих процессов.
65
+ '''
66
+
67
+ iface_duplicates = gr.Interface(
68
+ title="Поиск похожих изображений - d8a.ai",
69
+ description=description,
70
+ allow_flagging="never",
71
+ fn=search_duplicates,
72
+ inputs=[gr.inputs.Slider(91, 100, step=1, default=100,
73
+ label="Процент вероятности")],
74
+ outputs=gr.Gallery(
75
+ label="Найденные похожие изображения", elem_id="gallery"
76
+ ).style(grid=[2], height="auto")
77
+ )
78
+
79
+ iface_duplicates.launch()
requirements.txt ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ sentence-transformers
2
+ Pillow