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'])

не знаю на сколько эффективно это все работает, леопардов от водопадов отличило