Какой алгоритм использует Google для своего сайта «Поиск по картинке»?

45

Что вы думаете, как работает поиск картинок Google? Я могу загрузить фотографию и искать похожие изображения. Какой алгоритм он использует для идентификации похожих изображений?

Cory
источник
Они могут хранить гистограмму изображения. Это работает для разных масштабов одного и того же изображения и небольших различий из-за артефактов сжатия или чего-либо еще.
гелий
1
Гистограммы не фиксируют пространственную информацию; Вы получите ложные совпадения.
Эмре
Нейронные сети: research.googleblog.com/2015/06/...
эндолиты

Ответы:

29

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

Целое поле, относящееся к поиску-основанию-изображения-изображения, называется Content-Image Image Retrieval (CBIR) . Идея состоит в том, чтобы каким-то образом построить представление изображения (не обязательно понятное для людей), которое содержит информацию о содержании изображения .

Существуют два основных подхода:

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

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

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

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

Одним из недостатков этих методов является то, что они обычно неэффективны на изображениях с низкой текстурой.

Я уже дал и видел много ответов, детализирующих эти подходы, поэтому я просто предоставлю ссылки на эти ответы:

  • CBIR: 1 , 2
  • функция извлечения / описание: 1 , 2 , 3 , 4

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

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

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

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

Пенелопа
источник
22

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

Восприятие хэширования

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

В самой простой форме вы можете реализовать это следующим образом:

  1. Преобразовать изображение в оттенки серого

  2. Сделайте ваше изображение нулевым

  3. Сократите изображение до размера миниатюры, скажем, [32x32]
  4. Запустите двумерное дискретное косинусное преобразование
  5. Держите верхний левый [8 x 8], наиболее значимые низкочастотные компоненты
  6. Бинаризовать блок, основываясь на признаке компонентов

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

Перцептивное хеширование реализовано, например, с помощью phash

Модель слова

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

В его самой простой форме это можно сделать с помощью изображений следующим образом:

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

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

  1. Возьмите все дескрипторы SIFT и сгруппируйте их, например, с помощью алгоритма типа k-means. Это позволит найти заранее определенное количество кластеров с центроидами в ваших данных дескриптора. Эти центроиды - ваши новые визуальные слова.
  2. Теперь для каждого изображения и его оригинальных найденных дескрипторов вы можете посмотреть на кластеры, которым были назначены эти дескрипторы. Отсюда вы знаете, какие центроиды или визуальные слова «принадлежат» вашему изображению. Эти центроиды или визуальные слова становятся новым семантическим дескриптором вашего изображения, который может храниться в инвертированном файле.

Запрос изображения, например, найти мне похожие изображения с запросом изображения, затем разрешается следующим образом:

  1. Найти точки SIFT и их дескрипторы в изображении запроса
  2. Присвойте дескрипторы запросов центроидам, которые вы ранее обнаружили на этапе регистрации. Теперь у вас есть набор центроидов или визуальных слов, которые относятся к вашему запросу изображения
  3. Сопоставьте визуальные слова запроса с визуальными словами в вашем инвертированном файле и верните соответствующие изображения
Maurits
источник
1
Ваш подход к сумме слов в основном и заключается в том, к чему ведут мои ссылки на «локальный подход» :) Хотя это не совсем семантический характер: вы никогда бы не представили одну собаку с одной особенностью, и ее было бы не так легко идентифицировать. разные специи как собаки. Но перцептивное хэширование приятно, не знал об этом. Пояснения хороши. Что заставило меня задуматься ... есть ли у вас какие-либо предложения, как применить эту технику к непрямоугольной области? Или, может быть, приведу несколько ссылок на статьи, я мог бы немного их прочитать и, если вопрос имеет смысл, открыть его как отдельный вопрос.
Пенелопа
1
@penelope Я действительно читал в статье, несколько лет назад, где авторы разбили изображение на произвольные треугольники. И есть трансформация трассировки, которая также использовалась в качестве основы для перцептивного хэша. Я вернусь к вам.
Мориц
Все, что я хочу спросить вас об этом, выходит за рамки этого вопроса, поэтому я открыл новый. Любая информация / ссылки по базовой технике также были бы хорошими, как в этом, так и в этом ответе. Ждем :)
Пенелопа
2

Другой интересный подход, который, кажется, игнорируется в вышеприведенных ответах, это Глубокие Сверточные Нейронные Сети. Похоже, что Google использует его сейчас для своей системы поиска изображений и сервиса перевода . CNN чрезвычайно эффективны в когнитивных задачах, таких как поиск сходства. Кажется, что CNN выполняет аналогичную процедуру Bag-of-миров, которая встроена в ее сетевые уровни. Недостатком этой техники является невозможность отучиться и потребность в огромном наборе данных для обучения и, конечно, большие вычислительные затраты на этапе обучения.

Предлагаемый документ на этот счет:

и реализация открытого поиска изображений с глубоким обучением (более поздняя статья): https://github.com/paucarre/tiefvision

MimSaad
источник