Введение –

Что такое поиск изображений по содержанию?

CBIR — это метод поиска изображений в базе данных на основе их визуального содержания. Он анализирует особенности изображения и имеет приложения в искусстве, моде, медицине и наблюдении, а также используется в электронной коммерции, рекламе и социальных сетях. Системы CBIR могут извлекать информацию и эффективно извлекать визуально похожие изображения из базы данных.

CBIR обеспечивает визуальный поиск изображений и может обнаруживать закономерности в данных изображений. Однако он сталкивается с такими проблемами, как изменения условий освещения, изменения перспективы и ориентации, а также наличие окклюзии и шума. Исследователи разрабатывают новые методы для решения этих проблем, но CBIR продолжает оставаться активной областью исследований с потенциальными приложениями в различных областях.

Почему важен поиск изображений на основе контента?

CBIR важен из-за экспоненциального роста данных цифровых изображений, что затрудняет поиск больших коллекций изображений вручную. Системы CBIR автоматизируют процесс поиска похожих изображений и повышают эффективность и точность. CBIR обеспечивает визуальный поиск изображений, упрощая поиск изображений, которые трудно описать словами. Он имеет различные применения в искусстве, моде, медицине и наблюдении. CBIR можно использовать для обнаружения аномалий в медицинских изображениях, анализа больших наборов данных медицинских изображений или распознавания объектов на видеозаписях видеонаблюдения.

Как это работает?

  1. Извлечение функций: на этом этапе из изображения запроса извлекаются различные визуальные функции, такие как цвет, текстура и форма. Затем эти функции используются для более компактного и значимого представления изображения.
  2. Вычисление подобия: Следующий шаг включает в себя вычисление сходства между изображением запроса и изображениями в базе данных. Это делается путем сравнения извлеченных характеристик изображения запроса с характеристиками изображений в базе данных.
  3. Ранжирование: изображения в базе данных ранжируются на основе их сходства с изображением запроса. Наиболее похожие изображения ранжируются выше и представляются пользователю.
  4. Извлечение: Наконец, изображения с самым высоким рейтингом извлекаются и представляются пользователю для дальнейшего анализа.

Различные способы реализации CBIR

Существует несколько различных способов реализации CBIR, и конкретный используемый подход будет зависеть от приложения и типов анализируемых функций. Вот несколько распространенных подходов к реализации CBIR:

  1. CBIR на основе цвета
  2. CBIR на основе текстур
  3. CBIR на основе формы
  4. CBIR на основе контента
  5. CBIR на основе глубокого обучения

Здесь мы сосредоточимся на CBIR на основе глубокого обучения.

CBIR (извлечение изображений на основе контента) на основе глубокого обучения — это недавний подход, в котором используются сверточные нейронные сети (CNN) для автоматического изучения характеристик изображения и извлечения похожих изображений. В отличие от традиционных методов CBIR, CBIR на основе глубокого обучения не полагается на ручное извлечение признаков, а скорее изучает признаки изображения непосредственно из данных.

Процесс CBIR на основе глубокого обучения обычно включает следующие этапы:

  1. Предварительная обработка данных. Подготовьте изображения для использования в модели глубокого обучения, изменив их размер, нормализовав или преобразовав по мере необходимости.
  2. Обучение модели CNN. Обучите модель CNN извлечению полезных функций изображения.
  3. Извлечение функций: используйте обученную модель CNN для извлечения функций из новых изображений.
  4. Измерение подобия: определите сходство между изображениями, используя метрику расстояния в пространстве признаков.
  5. Поиск изображений: ранжируйте изображения в базе данных в соответствии с их сходством с изображением запроса и возвращайте изображения с самым высоким рейтингом в качестве результатов поиска.

Одним из преимуществ CBIR, основанного на глубоком обучении, является то, что он может изучать особенности изображения с высокой степенью различения, которые фиксируют сложные закономерности и взаимосвязи в данных. Это может привести к более точному и надежному поиску изображений по сравнению с традиционными методами CBIR.

Однако CBIR на основе глубокого обучения также имеет некоторые ограничения. Одним из ограничений является то, что для точного обучения требуется большой объем обучающих данных.

Широко используемые методы и библиотеки

  1. CNN: метод глубокого обучения с использованием сверточных слоев для извлечения признаков изображения и полносвязных слоев для классификации.
  2. Передача обучения: метод использования предварительно обученных моделей CNN для извлечения функций для конкретных приложений CBIR, что снижает потребность в больших обучающих данных.
  3. Keras: библиотека глубокого обучения с открытым исходным кодом и высокоуровневым API для построения и обучения моделей, поддерживающая различные архитектуры CNN для приложений CBIR.
  4. TensorFlow: библиотека глубокого обучения с открытым исходным кодом и низкоуровневым API для построения и обучения моделей, поддерживающая распределенные вычисления для больших наборов данных в приложениях CBIR.
  5. PyTorch: популярная библиотека глубокого обучения с гибким и интуитивно понятным интерфейсом для построения и обучения моделей, поддерживающая динамические вычислительные графы для приложений CBIR.
  6. Методы объединения признаков: методы объединения различных типов признаков для повышения точности в CBIR, таких как цвет, текстура и форма.

В целом, CBIR на основе глубокого обучения включает в себя комбинацию методов и библиотек, и конкретный выбор будет зависеть от приложения и доступных ресурсов.

Здесь мы сосредоточимся на реализации CBIR с использованием глубокого обучения с агломеративной иерархической кластеризацией.

Преимущества использования глубокого обучения с алгоритмом агломерационной иерархической кластеризации –

Алгоритм агломеративной иерархической кластеризации (AHCA) — это популярный метод кластеризации, который группирует похожие объекты вместе на основе их мер расстояния или сходства. В сочетании с глубоким обучением AHCA может обеспечить несколько преимуществ для приложений извлечения изображений на основе содержимого (CBIR). Вот некоторые преимущества использования глубокого обучения с AHCA:

  1. Улучшенное представление функций. Глубокое обучение изучает сложные представления функций из изображений, что может привести к более точной кластеризации и повышению производительности CBIR в сочетании с AHCA.
  2. Масштабируемость: AHCA масштабируется и может обрабатывать большие наборы данных, а извлечение функций на основе глубокого обучения можно легко распараллелить для кластеризации больших наборов данных.
  3. Уменьшенная размерность: AHCA может группировать похожие функции вместе, уменьшая размерность пространства функций и повышая эффективность CBIR.
  4. Надежность: глубокое обучение может изучать функции, инвариантные к обычным преобразованиям изображений, что делает систему CBIR более надежной в сочетании с AHCA.

Реализация —

Как это работает?

  1. Инициализация: изначально каждая точка данных рассматривается как отдельный кластер.
  2. Расчет расстояния: матрица расстояний вычисляется между всеми парами кластеров. Используемая метрика расстояния может быть основана на различных мерах сходства, таких как евклидово расстояние или коэффициент корреляции.
  3. Слияние: два ближайших кластера объединяются в один кластер на основе матрицы расстояний. Этот процесс повторяется до тех пор, пока все точки данных не будут содержаться в одном кластере.
  4. Иерархия кластеризации: Результатом алгоритма является древовидная структура, называемая дендрограммой, которая показывает иерархию кластеров.
  5. Разрезать дендрограмму: чтобы получить определенное количество кластеров, выбирается пороговое значение, и дендрограмма обрезается на этом уровне. Результирующие кластеры затем получаются из дендрограммы.

Учебник

  • Во-первых, мы импортируем необходимые библиотеки:
import os
import numpy as np
import cv2
from keras.models import Sequential, Model
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Input
from sklearn.cluster import AgglomerativeClustering
from sklearn.metrics.pairwise import euclidean_distances
import matplotlib.pyplot as plt
%matplotlib inline
  • Далее мы определим некоторые константы и гиперпараметры:
IMAGE_SIZE = (224, 224)
NUM_CLUSTERS = 10
TOP_K = 5
  • Мы будем использовать предварительно обученную CNN VGG16 в качестве средства извлечения признаков. Мы удалим классификационный слой и будем использовать выходные данные последнего сверточного слоя в качестве нашего вектора признаков.
def create_feature_extractor():
    input_shape = (*IMAGE_SIZE, 3)
    input_tensor = Input(shape=input_shape)
    vgg16 = Sequential()
    vgg16.add(Conv2D(64, (3, 3), activation='relu', padding='same', input_shape=input_shape))
    vgg16.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
    vgg16.add(MaxPooling2D((2, 2)))
    vgg16.add(Conv2D(128, (3, 3), activation='relu', padding='same'))
    vgg16.add(Conv2D(128, (3, 3), activation='relu', padding='same'))
    vgg16.add(MaxPooling2D((2, 2)))
    vgg16.add(Conv2D(256, (3, 3), activation='relu', padding='same'))
    vgg16.add(Conv2D(256, (3, 3), activation='relu', padding='same'))
    vgg16.add(Conv2D(256, (3, 3), activation='relu', padding='same'))
    vgg16.add(MaxPooling2D((2, 2)))
    vgg16.add(Conv2D(512, (3, 3), activation='relu', padding='same'))
    vgg16.add(Conv2D(512, (3, 3), activation='relu', padding='same'))
    vgg16.add(Conv2D(512, (3, 3), activation='relu', padding='same'))
    vgg16.add(MaxPooling2D((2, 2)))
    vgg16.add(Conv2D(512, (3, 3), activation='relu', padding='same'))
    vgg16.add(Conv2D(512, (3, 3), activation='relu', padding='same'))
    vgg16.add(Conv2D(512, (3, 3), activation='relu', padding='same'))
    vgg16.add(MaxPooling2D((2, 2)))
    vgg16.add(Flatten())
    vgg16.add(Dense(4096, activation='relu'))
    vgg16.add(Dense(4096, activation='relu'))
    feature_extractor = Model(inputs=input_tensor, outputs=vgg16.layers[-5].output)
    return feature_extractor
  • Мы будем использовать OpenCV для чтения и изменения размера изображений:
def read_image(file_path):
    img = cv2.imread(file_path)
    img = cv2.resize(img, IMAGE_SIZE, interpolation=cv2.INTER_AREA)
    return img
  • Мы будем использовать экстрактор признаков для извлечения вектора признаков из изображения:
def extract_features(image, feature_extractor):
    # Preprocess image
    image = image.astype(np.float32) / 255.0
    image = np.expand_dims(image, axis=0)

    # Extract features
    features = feature_extractor.predict(image)
    features = np.squeeze(features)

    return features
  • Мы будем использовать алгоритм AgglomerativeClustering от scikit-learn для кластеризации векторов признаков:
def cluster_features(features, num_clusters):
    clustering = AgglomerativeClustering(n_clusters=num_clusters, linkage='ward')
    labels = clustering.fit_predict(features)
    cluster_centers = clustering.children_.mean(axis=1)
    return labels, cluster_centers
  • Мы будем использовать euclidean_distances из scikit-learn для вычисления расстояний между вектором признаков изображения запроса и центрами кластеров:
def retrieve_images(query_image_path, feature_extractor, cluster_centers, labels, top_k):
    # Read and preprocess query image
    query_image = read_image(query_image_path)
    query_features = extract_features(query_image, feature_extractor)

    # Compute distances between query features and cluster centers
    distances = euclidean_distances([query_features], cluster_centers)

    # Retrieve top-k images from the nearest cluster
    nearest_cluster = np.argmin(distances)
    cluster_indices = np.where(labels == nearest_cluster)[0]
    cluster_distances = distances[0][nearest_cluster] - distances[0][cluster_indices]
    top_indices = cluster_indices[np.argsort(cluster_distances)[:top_k]]

    # Load and return top-k images
    retrieved_images = []
    for index in top_indices:
        image_path = image_paths[index]
        retrieved_image = read_image(image_path)
        retrieved_images.append(retrieved_image)
    return retrieved_images
  • Наконец, мы загрузим набор данных и вызовем функции для извлечения признаков, их кластеризации и извлечения изображений:
# Load dataset
dataset_dir = 'dataset/'
image_paths = []
for dirpath, dirnames, filenames in os.walk(dataset_dir):
    for filename in filenames:
        if filename.endswith('.jpg'):
            image_paths.append(os.path.join(dirpath, filename))

# Create feature extractor
feature_extractor = create_feature_extractor()

# Extract features from dataset
features = []
for image_path in image_paths:
    image = read_image(image_path)
    feature = extract_features(image, feature_extractor)
    features.append(feature)
features = np.array(features)

# Cluster features
labels, cluster_centers = cluster_features(features, NUM_CLUSTERS)

# Retrieve images
query_image_path = 'query_image.jpg'
retrieved_images = retrieve_images(query_image_path, feature_extractor, cluster_centers, labels, TOP_K)

# Display retrieved images
fig, ax = plt.subplots(1, TOP_K, figsize=(20, 20))
for i in range(TOP_K):
    ax[i].imshow(retrieved_images[i])
    ax[i].axis('off')
plt.show()

Примечание. В этой реализации предполагается, что набор данных состоит из изображений, хранящихся в каталогах, причем каждый каталог представляет отдельный класс. Если ваш набор данных организован по-другому, вам необходимо соответствующим образом изменить код.

Результаты –

Мы использовали 2 разных набора данных для тестирования нашего кода (набор данных Corel1K и набор данных Mnist). И мы нашли исключительно хорошие результаты, показанные ниже:

Задачи –

Хотя поиск изображений на основе содержимого (CBIR) с использованием метода глубокого обучения и агломерационной кластеризации имеет много преимуществ, есть также несколько проблем, которые необходимо решить:

  • Большой объем данных: CBIR на основе глубокого обучения требует большого объема данных для обучения. Сбор и маркировка такого набора данных может занять много времени и средств.
  • Сложная архитектура модели. Модели глубокого обучения, используемые для CBIR, могут быть сложными и требовать значительных вычислительных ресурсов для обучения и вывода.
  • Переобучение: модели глубокого обучения склонны к переоснащению при обучении на ограниченных данных. Это может привести к снижению производительности при работе с новыми, невидимыми изображениями.

Приложения –

CBIR имеет широкий спектр приложений в различных областях, включая, помимо прочего:

  1. Электронная коммерция: CBIR можно использовать, чтобы пользователи могли искать продукты на основе их визуальных характеристик, а не описывать их словами. Это может быть особенно полезно для таких отраслей, как мода, где пользователи могут не знать названия конкретного предмета, но могут идентифицировать его визуально.
  2. Медицинская визуализация: CBIR можно использовать в медицинской визуализации для анализа больших наборов данных медицинских изображений в исследовательских целях или для обнаружения аномалий в медицинских изображениях, таких как опухоли или другие аномалии.
  3. Искусство и культура: CBIR можно использовать, чтобы пользователи могли искать изображения предметов искусства или культуры на основе их визуальных характеристик. Это может быть особенно полезно для музеев или галерей, которые имеют большие коллекции предметов искусства или культуры.
  4. Наблюдение: CBIR можно использовать для наблюдения за конкретными объектами или людьми на видеозаписи. Это может быть особенно полезно в целях безопасности, например для выявления потенциальных угроз или подозрительной активности.
  5. Редактирование изображений и видео: CBIR можно использовать при редактировании изображений и видео, чтобы автоматически предлагать или применять фильтры или эффекты к изображениям или видео на основе их визуального содержимого.

Вывод —

Система поиска изображений на основе содержимого — это мощный инструмент, использующий алгоритмы глубокого обучения и агломерационной иерархической кластеризации в Python для извлечения похожих изображений из большого набора данных. Система извлекает признаки из изображений с помощью модели глубокого обучения и группирует их в кластеры с помощью алгоритмов агломерационной кластеризации. Чтобы получить похожие изображения, система вычисляет расстояние между вектором признаков изображения запроса и центрами кластеров.

Система имеет несколько ключевых преимуществ, таких как возможность обработки больших наборов данных, точность поиска похожих изображений, а также непрерывное обучение и усовершенствование с течением времени. Его также легко реализовать с помощью популярных библиотек глубокого обучения, таких как TensorFlow и Keras.

Эта система имеет широкое применение в различных областях, таких как электронная коммерция, медицинская визуализация и безопасность, что делает ее ценным инструментом для задач поиска изображений.

Ссылки –

Хотите узнать больше по теме?

Литература:

  1. Сивакумаран С., Манимегалаи М. и Махалакшми С., «Поиск изображений на основе содержимого с использованием алгоритма агломерационной иерархической кластеризации», Procedia Engineering, vol. 38, стр. 3188–3197, 2012.
  2. А. Р. Аль-Рахим и Х. Аль-Ассам, «Поиск изображений на основе контента с использованием сверточной нейронной сети и агломерационной иерархической кластеризации», IET Computer Vision, vol. 12, нет. 7, стр. 998–1007, 2018.
  3. X. Zhang, Z. Yang и Y. Zhu, «CBIR на основе сверточной нейронной сети и агломеративной иерархической кластеризации», Международная конференция по мехатронике, электронным технологиям и вычислительной технике (MEC), 2019 г., стр. 663–667, 2019 г.
  4. Чжан Л., Чен Ю., Чжоу Х. и Ву С., «Метод поиска изображений на основе содержимого, основанный на сверточной нейронной сети и алгоритме иерархической кластеризации», Журнал физики: серия конференций, том. 1193, вып. 1, 2019.
  5. Дж. Чен, Дж. Чжоу и Х. Ву, «Поиск изображений на основе содержимого с использованием сверточной нейронной сети и агломерационной иерархической кластеризации с глубокими функциями», Мультимедийные инструменты и приложения, том. 79, нет. 31, стр. 22325–22342, 2020.

Видео:

Авторы -

Чинмайи Савакаре

Срушти Швате

Снеханкит Хандаре

Наман Агарвал

Пиюш Парах