Что вы думаете, как работает поиск картинок Google? Я могу загрузить фотографию и искать похожие изображения. Какой алгоритм он использует для идентификации похожих изображений?
Что вы думаете, как работает поиск картинок Google? Я могу загрузить фотографию и искать похожие изображения. Какой алгоритм он использует для идентификации похожих изображений?
Ответы:
Я не знаю, какой алгоритм использует Google. Но, поскольку вы хотели получить лучшее предположение, позвольте мне дать несколько идей о том, как можно построить подобную систему .
Целое поле, относящееся к поиску-основанию-изображения-изображения, называется Content-Image Image Retrieval (CBIR) . Идея состоит в том, чтобы каким-то образом построить представление изображения (не обязательно понятное для людей), которое содержит информацию о содержании изображения .
Существуют два основных подхода:
Низкоуровневый локальный подход очень хорошо изучен. Наилучший из существующих подходов заключается в извлечении локальных объектов (здесь используется выбор алгоритма извлечения объектов) и использовании их локальных дескрипторов (опять же, выбор дескрипторов) для сравнения изображений.
В более новых работах локальные дескрипторы сначала кластеризуются, а затем кластеры обрабатываются как визуальные слова - метод очень похож на поиск документов в Google, но использует буквенные слова вместо буквенных слов.
Вы можете думать о визуальных словах как об эквивалентах корням слова в языке: например, слова « работа», «работа», « все работает» принадлежат одному корню слова.
Одним из недостатков этих методов является то, что они обычно неэффективны на изображениях с низкой текстурой.
Я уже дал и видел много ответов, детализирующих эти подходы, поэтому я просто предоставлю ссылки на эти ответы:
Семантические подходы обычно основаны на иерархических представлениях всего изображения. Эти подходы еще не усовершенствованы, особенно для общих типов изображений. Существует определенный успех в применении таких методов к конкретным областям изображений.
Поскольку я в настоящее время занимаюсь исследованиями этих подходов, я не могу сделать никаких выводов. Теперь, тем не менее, я объяснил общую идею, стоящую за этими методами в этом ответе .
Еще раз, коротко: общая идея состоит в том, чтобы представить изображение с древовидной структурой, где листья содержат детали изображения, а объекты можно найти в узлах, расположенных ближе к корню таких деревьев. Затем, так или иначе, вы сравниваете поддеревья, чтобы идентифицировать объекты, содержащиеся в разных изображениях.
Вот несколько ссылок на различные представления дерева. Я не прочитал все из них, и некоторые из них используют этот вид представлений для сегментации вместо CBIR, но все же, вот они:
В дополнение к ответу Пенелопы, есть два подхода: перцептивное хеширование и модель мешка слов, базовые функциональные возможности которых легко реализуются и с которыми приятно играть или учиться, прежде чем углубляться в более продвинутую территорию.
Восприятие хэширования
Алгоритмы перцептивного хеширования нацелены на создание хэша, который в отличие от криптографического хэша будет давать аналогичные или близкие к ним значения хеш-функции для идентичных изображений, которые были слегка искажены, например, при масштабировании или сжатии JPEG. Они служат полезной цели при обнаружении вблизи дубликатов в коллекции изображений.
В самой простой форме вы можете реализовать это следующим образом:
Преобразовать изображение в оттенки серого
Сделайте ваше изображение нулевым
В результате получается гибкий 64-битный хэш, поскольку он основан на низкочастотных компонентах изображения. Вариант на эту тему может состоять в том, чтобы разделить каждое изображение на 64 субблока и сравнить среднее значение изображения с локальным средним значением субблока и выписать 1 или 0 соответственно.
Перцептивное хеширование реализовано, например, с помощью phash
Модель слова
Модель мешка слов стремится семантически идентифицировать изображение, например, все изображения с собаками в них. Это достигается за счет использования определенных графических фрагментов в том же духе, что и при классификации определенных текстовых документов. Можно классифицировать слова, например, «собака» и «собаки», и сохранять их в качестве идентификатора в перевернутом файле, где категория «собака» теперь указывает на все документы, содержащие «собаку» или «собаки».
В его самой простой форме это можно сделать с помощью изображений следующим образом:
Теперь у вас есть огромная коллекция дескрипторов SIFT. Проблема в том, что даже из почти идентичных изображений между дескрипторами будет некоторое несоответствие. Вы хотите сгруппировать идентичные вместе более или менее так, как если бы некоторые слова рассматривались как «собака» и «собаки» как идентичные, и вам нужно компенсировать ошибки. Это где кластеризация вступает в игру.
Запрос изображения, например, найти мне похожие изображения с запросом изображения, затем разрешается следующим образом:
Другой интересный подход, который, кажется, игнорируется в вышеприведенных ответах, это Глубокие Сверточные Нейронные Сети. Похоже, что Google использует его сейчас для своей системы поиска изображений и сервиса перевода . CNN чрезвычайно эффективны в когнитивных задачах, таких как поиск сходства. Кажется, что CNN выполняет аналогичную процедуру Bag-of-миров, которая встроена в ее сетевые уровни. Недостатком этой техники является невозможность отучиться и потребность в огромном наборе данных для обучения и, конечно, большие вычислительные затраты на этапе обучения.
Предлагаемый документ на этот счет:
и реализация открытого поиска изображений с глубоким обучением (более поздняя статья): https://github.com/paucarre/tiefvision