Простейшие способы выполнения поиска сходства изображения с изображением и текста с изображением

Колоссальные 90% данных, созданных с момента зарождения человеческой цивилизации, были созданы за последние два года! Скорость создания данных продолжает расти с распространением цифровых технологий, таких как социальные сети и Интернет вещей (IoT), а также все более быстрых технологий беспроводной связи, таких как 5G. Однако большинство новых создаваемых данных являются неструктурированными, такими как текст, изображения, аудио и видео [Источник].

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

Недавние достижения в области технологий искусственного интеллекта (ИИ) и машинного обучения (МО) создали способ масштабируемого извлечения полезной информации из неструктурированных источников данных с помощью встраивания. Преобразование неструктурированных данных во вложения и их хранение в векторной базе данных, такой как Milvus, позволило создать несколько отличных приложений, которые были невообразимы всего несколько лет назад. Некоторые примеры приложений: визуальный поиск изображений, семантический текстовый поиск, системы рекомендаций, борьба с дезинформацией, обнаружение наркотиков и т. д.!

В этом посте мы обсудим следующее. Нажмите на ссылку, чтобы перейти в раздел:

  1. Что такое вложение
  2. Загрузить некоторые данные с помощью Kaggle API
  3. Сведение необработанных значений пикселей
  4. Сверточные нейронные сети, предварительно обученные для целей классификации: Towhee от Zilliz
  5. Сверточные нейронные сети, предварительно обученные с целью Metric Learning: SimCLR от Google
  6. Мультимодальные нейронные сети «Изображение-текст, предварительно обученные с целью метрического обучения»: CLIP от OpenAI
  7. "Заключение"

В этом посте мы будем использовать набор данных Digikala Products Color Classification от Kaggle, доступный здесь, чтобы создать простой сервис поиска похожих продуктов на основе изображений для электронной коммерции. Набор данных находится под лицензией GPL 2.

Что такое вложение

Наши компьютеры не могут напрямую понимать изображения или текст так, как это делаем мы, люди. Однако компьютеры хорошо разбираются в числах! Таким образом, чтобы помочь нашим компьютерам понять содержание изображений или текста, нам необходимо преобразовать их в числовое представление. Например, если мы рассматриваем вариант использования изображения, мы, по сути, «кодируем» или «встраиваем» контекст и сцену нашего изображения в ряд чисел в форме вектора.

Вектор «встраивания» — это числовое представление данных изображения, позволяющее нашим компьютерам понимать контекст и место действия наших изображений.

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

  1. Библиотеки, которые предоставляют готовые API с предварительно обученными моделями: нам, вероятно, не нужно обучать какие-либо модели для многих реальных задач, связанных с изображениями повседневных предметов. Вместо этого мы можем положиться на множество высококачественных предварительно обученных моделей, открытых исследователями по всему миру. Исследователи обучили эти модели распознавать и группировать несколько повседневных объектов из набора данных ImageNet.
  2. Библиотеки, которые позволяют нам обучать и настраивать наши модели. Как следует из названия, для этих моделей мы можем использовать данные и обучать модели с нуля или настраивать предварительно обученные модели специально для наших целей. вариант использования. Нам нужно будет пойти по этому пути только в том случае, если предварительно обученные модели еще не обеспечивают хороших вложений для нашей проблемной области.

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

Загрузить некоторые данные

Сначала нам нужно загрузить некоторые данные изображения, чтобы протестировать различные стратегии встраивания. Для этого поста давайте воспользуемся набором данных Digikala Products Color Classification от Kaggle, доступным здесь. Набор данных содержит изображения более чем 6 000 продуктов электронной коммерции, что идеально подходит для тестирования службы поиска похожих продуктов на основе изображений электронной коммерции.

Шаг 1. Настройте среду Kaggle

  1. Создайте аккаунт на kaggle.com
  2. Нажмите на изображение своего профиля и выберите «Учетная запись» в раскрывающемся меню.
  3. Прокрутите вниз до раздела «API».
  4. Нажмите кнопку «Создать новый токен API», как показано на изображении ниже, чтобы загрузить новый токен в виде файла JSON с именем пользователя и ключом API.
  5. Если вы используете macOS или Linux, скопируйте файл JSON в каталог ~/.kaggle/. В системе Windows перейдите в корневой каталог, затем в папку .kaggle и скопируйте загруженный файл в эту папку. Если каталог .kaggle не существует, создайте его и скопируйте в него файл JSON.

Шаг 2. Загрузите данные из Kaggle

Мы будем использовать Anaconda для управления виртуальной средой в этом проекте. Установить Anaconda можно отсюда. После того, как вы загрузили и установили Anaconda, мы можем настроить новую среду под названием semantic_similarity, установить необходимые библиотеки, такие как kaggle и pandas, и загрузить весь набор данных с kaggle.com, выполнив приведенные ниже команды в окне терминала. Если вы не хотите использовать Anaconda, вы также можете использовать venv Python для создания и управления виртуальной средой для этого проекта.

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

Шаг 3: Переместите все изображения из каждой папки в родительскую папку.

Давайте создадим новый блокнот Jupyter в каталоге semantic_similarity/notebooks, чтобы протестировать различные стратегии встраивания. Во-первых, давайте импортируем необходимые библиотеки.

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

Шаг 4. Загрузите пути к изображениям в кадр данных pandas.

Затем давайте загрузим список всех путей к файлам изображений в кадр данных pandas.

Стратегии создания вложений

Недавние достижения в технологиях Computer Vision открыли множество способов преобразования изображений в числовые представления. Давайте посмотрим на некоторые из них. Нажмите на ссылку, чтобы перейти к соответствующему разделу.

  1. Сведение необработанных значений пикселей
  2. Сверточные нейронные сети, предварительно обученные для целей классификации
  3. Сверточные нейронные сети, предварительно обученные с целью Metric Learning
  4. Мультимодальные нейронные сети «Изображение-текст, предварительно обученные с целью Metric Learning»

Сведение необработанных значений пикселей

Цветные изображения состоят из трехмерных массивов пикселей. 1-е измерение — это высота изображения, 2-е измерение — ширина изображения, а последнее 3-е измерение — это цветовые каналы, известные под общим названием RGB, которые содержат красный, зеленый и синий цвета, как показано на рисунке ниже. Значение каждого пикселя представляет собой целое число от 0 до 255, где 255 — максимально возможная интенсивность.

Таким образом, значение RGB (0,0,0) представляет собой полностью темный или чисто черный пиксель, а (255,255,255) представляет собой полностью насыщенный чисто белый пиксель. Все остальные цвета, видимые на наших изображениях, состоят из различных комбинаций этих трех основных значений RGB. Таблица цветовых кодов RGB на веб-сайте RapidTables позволяет вам выбрать любой цвет, чтобы просмотреть его значения RGB, обязательно попробуйте!

Учитывая, что изображения представляют собой серию чисел в формате трехмерного массива, преобразование их в одномерный вектор с помощью операции reshape является тривиальным, как показано на рисунке ниже. Мы также можем нормализовать пиксели между 0 и 1, разделив значение каждого пикселя на 255. Мы сделаем это в коде.

Проблемы с этим подходом

Хотя этот метод прост для понимания и прост в реализации, у этого подхода «встраивания» изображений в векторы есть серьезные недостатки.

  1. Огромные векторы: изображения, которые мы скачали с Kaggle, имеют довольно маленький размер [224 x 224 x 3], что соответствует [высоте x ширине x каналов], и преобразование этого трехмерного массива в одномерный вектор приводит к в векторе размером 150 528! Это огромный вектор для такого маленького изображения! Мой компьютер несколько раз зависал при создании этого вектора для всего нашего набора данных. В итоге я запустил его только на меньшем подмножестве (1K строк), чтобы проиллюстрировать этот метод.
  2. Разреженные векторы с большим количеством пустого (белого) пространства. Визуально изучая изображения в нашем наборе данных о моде, мы замечаем на изображении большие белые области. Таким образом, многие элементы этого вектора из 150 528 элементов представляют собой просто значение 255 (для белого цвета) и не добавляют никакой информации, связанной с объектом на изображении. Другими словами, эта схема «встраивания» не обеспечивает эффективного кодирования объекта изображения, а вместо этого включает много бесполезного пустого пространства.
  3. Отсутствие локальной структуры. Наконец, при прямом сведении изображения теряется вся локальная структура изображения. Например, мы идентифицируем изображение человеческого лица по взаимному расположению глаз, ушей, носа и рта. Это различная информация уровня «функции», которую мы бы полностью упустили, если бы смотрели на один ряд пикселей за раз. Последствия этой потери заключаются в том, что перевернутое лицо будет иметь сильно отличающееся уплощенное вложение от лица, обращенного вверх ногами, даже несмотря на то, что оба являются изображениями одного и того же человеческого лица!

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

Сверточные нейронные сети, предварительно обученные на цели классификации

Возможно, одной из самых известных задач компьютерного зрения является классификация изображений по разным категориям. Как правило, для этой задачи мы будем использовать модель CNN, такую ​​​​как ResNet, в качестве кодировщика для преобразования изображения в вектор, а затем пропустить этот вектор через модель многослойного персептрона (MLP) для определения категории изображения. , как показано на изображении ниже. Исследователи будут обучать эту модель CNN + MLP, используя кросс-энтропийную потерю, чтобы точно классифицировать категорию изображения.

Такой подход обеспечил высочайшую точность, которая даже превосходит возможности большинства людей. После обучения такой модели мы можем исключить слой MLP и напрямую использовать выходные данные кодировщика CNN в качестве вектора встраивания для каждого входного изображения.

На самом деле нам не нужно обучать нашу собственную модель CNN с нуля для многих реальных проблем. Вместо этого мы напрямую загружаем и используем модели, уже обученные распознавать повседневные объекты, такие как категории в наборе данных ImageNet. Towhee — это библиотека Python, которая быстро создает вложения с использованием этих предварительно обученных моделей. Давайте посмотрим, как мы можем это сделать.

Трубопроводы Тауи

Towhee — это библиотека Python, которая предоставляет чрезвычайно простые в использовании конвейеры генерации встраивания. Мы можем использовать towhee для преобразования изображения во вложение менее чем за пять строк кода! Во-первых, давайте установим towhee, используя pip в окне терминала.

Затем в ячейке блокнота Jupyter давайте импортируем библиотеку и создадим экземпляр объекта конвейера.

Далее давайте конвертируем изображения во встраивания с помощью конвейера всего в одну строку кода! Вывод конвейера встраивания имеет несколько дополнительных измерений, которые мы можем убрать с помощью np.squeeze.

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

Теперь мы можем проверить качество вложений towhee, запросив случайные изображения из фрейма данных и отобразив k наиболее похожих изображений, используя приведенную выше вспомогательную функцию. Как показано ниже, вложения towhee довольно точны для каждого запроса, который мы запускаем, чтобы найти похожие изображения из всего набора изображений, содержащих несколько различных продуктов, таких как платья, часы, сумки и аксессуары! Это еще более впечатляет, учитывая, что мы сгенерировали эти встраивания всего с тремя строками кода!

Из результатов можно сделать вывод, что towhee — отличная отправная точка для быстрого создания вложений для приложений поиска сходства. Однако мы не обучали эти модели явно, чтобы убедиться, что похожие изображения имеют идентичные друг другу вложения. Таким образом, в контексте поиска подобия вложения из таких моделей могут быть не самыми точными для всех случаев использования. Естественный вопрос, который вы можете задать сейчас: "Есть ли способ обучить модели таким образом, чтобы похожие изображения имели вложения, которые также похожи друг на друга?" К счастью, он есть!

Сверточные нейронные сети, предварительно обученные с помощью метрической цели обучения

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

  1. Мы используем нейронную сеть, такую ​​как CNN или сеть Transformer, для преобразования изображений во встраивания.
  2. Мы строим эти вложения таким образом, чтобы семантически похожие изображения группировались ближе друг к другу, а разнородные — дальше друг от друга.

Обучение метрических моделей обучения требует инноваций в способах обработки данных и обучения модели.

  1. Данные. При изучении метрик для каждого исходного изображения, называемого якорным, нам требуется как минимум одно похожее изображение, называемое положительным. Мы также можем включить непохожее третье изображение, называемое негативом, чтобы улучшить представление встраивания. В недавних подходах к метрическому обучению для каждого исходного изображения мы синтетически генерируем привязку и положительное изображение, используя различные дополнения данных, как показано на изображении ниже. Поскольку оба изображения являются вариациями одного и того же исходного изображения, логично обозначить их как пару с положительной привязкой. С другой стороны, мы синтетически генерируем негативы, беря все изображения, кроме якоря, в одном пакете изображений.
  2. Модель. Метричные модели обучения в основном имеют архитектуру сиамской сети. Якорь, положительные и отрицательные изображения последовательно проходят через одну и ту же модель для создания вложений, которые мы затем сравниваем, используя специальные функции потерь. Одна из таких функций потерь называется контрастной потерей, где цель модели состоит в том, чтобы переместить вложения для привязки и положительных изображений ближе друг к другу, чтобы расстояние между ними было близко к 0. И наоборот, цель модели — переместить привязку и отрицательное изображение. вложения так далеко друг от друга, что расстояние между ними велико.

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

SimCLR: простое контрастное обучение

SimCLR означает Простая структура для контрастного обучения визуальным представлениям. Это один из популярных подходов к созданию встраивания изображений с использованием типа метрического обучения, называемого контрастным обучением. В контрастном обучении функция контрастных потерь сравнивает, являются ли два вложения похожими (0) или разными (1).

Отличительной особенностью SimCLR является то, что это простой самоконтролируемый алгоритм (нам не нужны никакие метки для классов изображений!), который достигает производительности наравне с некоторыми контролируемыми подходами, как показано на рисунке ниже!

Основная идея SimCLR заключается в следующем.

  1. Имея изображение, создайте две дополненные версии одного и того же изображения. Эти дополнения могут быть обрезкой и изменением размера, искажением цвета, вращением, добавлением шума и т. д. На изображении выше показаны некоторые примеры дополнений.
  2. Расширенные версии всех изображений в пакете проходят через кодировщик CNN, который преобразует изображения во вложения. Эти вложения CNN затем проходят через простой многослойный персептрон (MLP) только с одним скрытым слоем, чтобы преобразовать их в другое пространство.
  3. Наконец, вложения на выходе MLP сравниваются друг с другом с помощью косинусного расстояния. Модель ожидает, что увеличения от одного и того же изображения будут иметь косинусное расстояние 0, а увеличения от разных изображений имеют 1. Затем функция потерь обновляет параметры как CNN, так и MLP, чтобы вложения приближались к нашим ожиданиям.
  4. После завершения обучения нам больше не нужен MLP, и мы напрямую используем выходные данные кодировщика CNN в качестве наших вложений.

Изображение ниже объясняет весь процесс концептуально. Для получения более подробной информации, пожалуйста, взгляните на этот сообщение в блоге Google.

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

Как и Towhee, мы используем модели, предварительно обученные в ImageNet другими исследователями, непосредственно для извлечения вложений SimCLR. Однако на момент написания этой статьи для получения предварительно обученных вложений SimCLR нам нужно написать несколько строк кода с использованием библиотеки Pytorch Lightning Bolts. Я адаптировал приведенное ниже из официальной документации Lightning Bolts здесь. Сначала установите необходимые библиотеки с помощью pip в окне терминала.

Далее в ячейке ноутбука Jupyter импортируем необходимые библиотеки и устанавливаем для устройства значение cuda или cpu в зависимости от того, есть ли на вашем компьютере графический процессор.

Затем давайте загрузим модель SimCLR, предварительно обученную в ImageNet, и установим ее в режим eval, потому что мы хотим получить только вложения из модели и больше не хотим ее обучать.

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

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

Теперь самое интересное! Мы можем проверить качество встраивания SimCLR с помощью той же вспомогательной функции. Мы запрашиваем случайные изображения из фрейма данных и отображаем k наиболее похожих изображений. Как показано ниже, встраивания SimCLR также позволяют находить похожие изображения для каждого выполняемого нами запроса!

Мультимодальные нейронные сети «изображение-текст», предварительно обученные с помощью метрической цели обучения

Наконец, были внесены огромные улучшения в модели, которые встраивают как изображения, так и текст в единое пространство встраивания [Open AI’s CLIP Paper, Google ALIGN Paper, Microsoft PixelBERT Paper], что открывает несколько превосходных приложений, таких как Image-To. -Поиск сходства текста и текста с изображением. Одной из самых популярных моделей в этой парадигме является CLIP (Contrastive Language-Image Pre-Training).

CLIP — это нейронная сеть, основанная на системе метрического обучения. Вместо обучения исключительно на парах «привязка-положительное изображение» CLIP использует изображение в качестве привязки и соответствующее текстовое описание в качестве положительного для построения пар «изображение-текст». Мы можем использовать CLIP в нескольких приложениях, включая поиск сходства «текст-изображение», «изображение-к-тексту», «изображение-к-изображению» и «текст-к-тексту».

Изображения передаются через кодировщик ResNet или ViT для создания вложений изображений. Текстовые описания передаются через кодировщик на основе Transformer для создания текстовых вложений. CLIP совместно обучает кодировщики изображения и текста таким образом, чтобы в пакете из N пар изображение-текст встраивание i изображения имело наибольшее скалярное произведение с встраиванием текст ith, как показано на рисунке ниже.

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

Преобразователи предложений

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

Затем в ячейке блокнота Jupyter давайте импортируем библиотеку и создадим экземпляр модели CLIP.

Затем нам нужно перебрать более 10 000 изображений, чтобы обойти ограничение ОС на количество файлов, которые могут быть открыты одновременно. Мы загружаем все изображения во время каждой итерации и генерируем вложения CLIP.

Теперь, когда у нас есть вложения CLIP для всех наших изображений, мы можем использовать одну и ту же вспомогательную функцию для проверки качества вложений. Мы запрашиваем случайные изображения из фрейма данных и отображаем k наиболее похожих изображений. Как показано ниже, встраивания CLIP также позволяют находить похожие изображения для каждого запроса, который мы выполняем!

Хотя нам пришлось написать некоторый дополнительный код для создания вложений CLIP, одним из существенных преимуществ, которые он предоставляет, является поиск текста в изображение. Другими словами, мы можем искать все изображения, соответствующие заданному текстовому описанию. Давайте посмотрим на это ниже.

Поскольку мы уже преобразовали изображения во встраивание CLIP, теперь нам нужно только преобразовать текстовый запрос во встраивание CLIP. Затем мы можем искать похожие продукты, используя косинусное сходство между встраиванием текста и всеми вложениями изображений в фрейме данных. Мы напишем простую вспомогательную функцию, которая сделает все это за нас, как показано ниже. Наконец, мы нанесем все похожие k изображения товаров.

Теперь мы можем использовать нашу вспомогательную функцию для тестирования примеров текстовых запросов. Как показано на изображении ниже, если наш тестовый запрос — «фотография женского платья», то наиболее похожими товарами будут все платья для женщин! Несмотря на то, что в названии каждого продукта не указано слово «платье», модель CLIP смогла сделать вывод, что эти изображения больше всего связаны с запросом «фото женского платья» только из текста и встроенных изображений. Идите вперед и попробуйте с другими запросами!

Заключение

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

Говоря о производстве, набор данных, который мы использовали здесь, был игрушечным набором данных только с изображениями 6K. В реальных приложениях, таких как магазин электронной коммерции, у вас будут сотни миллионов изображений продуктов для встраивания, хранения и поиска ближайших соседей за доли секунды! Масштаб проблемы требует использования мощной базы данных векторного поиска, такой как Milvus! Подробнее о векторных базах данных вы можете узнать здесь.

Пожалуйста, посетите канал обучения Zilliz, чтобы узнать больше о различных интересных приложениях для встраивания и баз данных подобия векторов!

Первоначально опубликовано на https://zilliz.com 24 января 2022 г.