import glob import numpy as np from PIL import Image from sentence_transformers import SentenceTransformer, util model = SentenceTransformer('clip-ViT-B-32') def get_image_embedding(image_path): '''возвращает векторное представление изображения''' image = Image.open(image_path) encoded_image = model.encode(image, show_progress_bar=True) return encoded_image def compare_image(image_path: str, another_image_paths: list, threshold=0.9): """ :param image_path: изображение которое нужно сравнить :param another_image_paths: другие изображения :param threshold: порог, на сколько похожие изображения, 1 - полное совпадение :return: путь к сравниваемому изображению: str, пути похожих изображений : list """ out = [] target_img = get_image_embedding(image_path) another_imgs = np.array([get_image_embedding(img) for img in another_image_paths]) # k = util.cos_sim(target_img, another_imgs) for path, k in zip(another_image_paths, k[0]): if k > threshold: out.append(path) # return image_path, out def main(): image_paths = glob.glob('/home/xam/Документы/for_forum/*') res = compare_image(image_paths[0], image_paths) print(res) if __name__ == '__main__': main()
Batches: 100%|██████████| 1/1 [00:00<00:00, 21.80it/s]
Batches: 100%|██████████| 1/1 [00:00<00:00, 22.29it/s]
Batches: 100%|██████████| 1/1 [00:00<00:00, 17.10it/s]
Batches: 100%|██████████| 1/1 [00:00<00:00, 16.99it/s]
Batches: 100%|██████████| 1/1 [00:00<00:00, 19.33it/s]
Batches: 100%|██████████| 1/1 [00:00<00:00, 14.46it/s]
('/home/xam/Документы/for_forum/3.jpg', ['/home/xam/Документы/for_forum/3.jpg', '/home/xam/Документы/for_forum/4.jpg', '/home/xam/Документы/for_forum/5.jpeg'])
не знаю на сколько эффективно это все работает, леопардов от водопадов отличило