Добро пожаловать в NeeshAi!

Иногда вы видите что-то действительно крутое. Вы ловите момент. Проходят годы, и однажды ни с того ни с сего вам просто становится интересно узнать об этом. Вы понятия не имеете, как описать этот объект, но у вас есть образ. Что делать? Что ж, несколько лет назад Google придумал новый инструмент, который позволяет вам найти все эти воспоминания; у вас нет слов, чтобы описать.

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

Идея этой статьи состоит в том, чтобы познакомить вас с двумя наиболее распространенными алгоритмами поиска изображений — методом евклидова расстояния и методом сиамских признаков. Мы создадим «Приложение поиска изображений» или, так сказать, «Приложение сходства изображений», используя оба этих алгоритма. Как я уже говорил ранее и говорю это снова — возможно, это не лучший учебник, который вы прочитаете по «приложению поиска изображений» (а я уверен, что это не так), но что действительно важно и что сделает меня счастливым, так это — если это может помочь вам сделать свой первый шаг на территории «обработки изображений», может быть немного, просто может быть ☺. Так что, что бы я ни сказал, принимайте это с долей скептицизма.

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

В этой первой части статьи мы рассмотрим концепцию поиска сходства между цифровыми изображениями с использованием евклидова расстояния. Это будет не так хорошо, как поисковая система Google (конечно☺) из-за техники, которую мы будем использовать для поиска сходства между изображениями, но я обещаю, это будет довольно круто.

Подробная записная книжка с представленным кодом находится по следующему адресу: Github Repo.

Итак, приступим.

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

Да, верно. Прежде всего, давайте импортируем все необходимые модули. ☺

Теперь давайте возьмем изображение. Что мы хотим сделать, так это найти все другие похожие изображения из набора изображений (назовем его нашим набором данных).

Вот как выглядит наше тестовое изображение:

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

А вот как это выглядит:

Теперь мы перейдем в папку, где находится набор изображений (набор данных). Мы будем читать их один за другим и вычислять гистограмму (в основном одномерный массив чисел). Я взял 7 изображений в наборе данных, поэтому у нас будет 7 массивов.

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

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

Почему?

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

Это изображение с наименьшим расстоянием, и соответствующее изображение и гистограмма выглядят примерно так.

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

Нет, но если не считать шуток, такой простой алгоритм, дающий такие хорошие результаты, — это нечто.

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

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

Итак, далее мы собираемся использовать тензорный поток и применить метод извлечения сиамских признаков, чтобы найти сходство между изображениями. Что такое сиамская особенность? — Скоро увидим.

Функции сиамской сети для сопоставления изображений:

Второй алгоритм, который мы собираемся использовать, — это сиамская сеть признаков.

Что это?

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

Идея сверточной нейронной сети уже подробно обсуждалась (Ссылка на код здесь).

Итак, не теряя много времени, приступим:

Как обычно импортируем все необходимые модули:

Загрузите набор данных. Этот набор данных из индустрии моды. Подобно набору данных MNIST, он также подразделяется на 10 классов, таких как обувь, рубашки и т. д. Мы разделим набор данных на поезда и тестовые изображения.

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

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

Теперь у нас есть обучающие признаки, соответствующие всем изображениям в обучающем наборе. Затем возьмите случайное изображение из тестового набора и рассчитайте признаки с помощью сиамской сети.

Вот тестовое изображение, с которым мы собираемся найти сходство.

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

Мы не можем ясно видеть, похожи ли данные 5 изображений на оригинал или нет, из-за качества набора данных, но поверьте мне, так и должно быть. ☺ Даже если это не так, я считаю, что вы сделали первый шаг и бежите самостоятельно.

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

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

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

Итак, на сегодня все. Адиос пока.

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

Ссылки:

  1. https://fetch-info.blogspot.in/2017/01/image-search-engine-using-python.html
  2. https://arxiv.org/ftp/arxiv/papers/1709/1709.08761.pdf
  3. https://explosion.ai/blog/supervised-similarity-siamese-cnn