English
🎯 Цель: продемонстрировать логику работы поисковой системы изображений, использующей ResNet50 для выделения признаков и косинусное сходство для поиска похожих изображений.
Идея этого алгоритма поиска изображений заключается в вычислении сходства между данным изображением и всеми другими изображениями из основного набора данных для получения индексов k лучших кандидатов.
Чтобы оценить степень сходства между двумя изображениями, нам нужно преобразовать все изображения в объекты ~ набор числовых значений, называемых вложениями / векторами. Мы используем ResNet50 для извлечения объектов из изображений, коротко о ResNet50.
Сочетание вычислительной эффективности ResNet50, предварительной подготовки на крупномасштабном наборе данных (ImageNet) и универсальности делают его отличным выбором для извлечения признаков в широком спектре задач компьютерного зрения. Архитектура ResNet50 (автор: ВикиМедиа)

Косинусоидальное сходство используется для оценки степени сходства между двумя изображениями, поскольку оно эффективно измеряет выравнивание векторов их признаков, хорошо обрабатывает многомерные и разреженные данные и является эффективным с точки зрения вычислений. Формула косинусоидального сходства (источники: Википедия):

Код функции поиска изображений:
def search_similar_images(запрос_image_index, image_features, image_files, k=5):
query_feature = image_features[индекс_изображения].изменить форму(1, -1)
сходства = косинусоидальное сходство(query_feature, image_features).сгладить()
top_k_indices = сходства.argsort()[-k-1:-1][::-1] # ~ исключая само изображение из запроса
, возвращает top_k_indices
Ссылки:
1. https://www.tensorflow.org/api_docs/python/tf/keras/applications/resnet
2. https://en.wikipedia.org/wiki/Cosine_similarity
Записная книжка Kaggle: https://www.kaggle.com/code/armanzhalgasbayev/image-search-engine-demo-resnet-cossim
🎯 Goal: demonstrating the logic of an image search engine using ResNet50 for feature extraction and cosine similarity for searching similar images.
The idea behind of this Image Search Algorithm is to calculate similarities between a given image and all other images from the main dataset for returning the indices of the top k candidates.
For evaluating similarity score between 2 images, we need to convert all images into features ~ set of numeric values called embeddings / vectors. We use ResNet50 for extracting features from images, shortly about ResNet50.
ResNet50’s combination of computational efficiency, pre-training on a large-scale dataset (ImageNet), and versatility make it an excellent choice for feature extraction in a wide range of computer vision tasks. Architecture of ResNet50 (credits: WikiMedia)

Cosine similarity is used for evaluating the similarity score between two images because it effectively measures the alignment of their feature vectors, handles high-dimensional and sparse data well, and is computationally efficient. Formula of Cosine Similarity (credits: Wikipedia):

Image Search function Code:
def search_similar_images(query_image_index, image_features, image_files, k=5):
query_feature = image_features[query_image_index].reshape(1, -1)
similarities = cosine_similarity(query_feature, image_features).flatten()
top_k_indices = similarities.argsort()[-k-1:-1][::-1] # ~ exclude the query image itself
return top_k_indices
References:
1. https://www.tensorflow.org/api_docs/python/tf/keras/applications/resnet
2. https://en.wikipedia.org/wiki/Cosine_similarity
Kaggle Notebook: https://www.kaggle.com/code/armanzhalgasbayev/image-search-engine-demo-resnet-cossim