🚀 Попробуйте Zilliz Cloud, полностью управляемый Milvus, бесплатно — ощутите 10-кратное увеличение производительности! Попробовать сейчас>

milvus-logo
LFAI

Обзор

  • Scenarios
August 04, 2020
Rife Wang

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

Сервис поиска по изображениям прошел две эволюции:

  1. Начало первого технического исследования в начале 2019 года и запуск системы первого поколения в марте и апреле 2019 года;
  2. Начало исследования плана модернизации в начале 2020 года и начало общего обновления до системы второго поколения в апреле 2020 года.

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

Обзор

Что такое изображение?

Прежде чем работать с изображениями, мы должны знать, что такое изображение.

Ответ заключается в том, что изображение - это набор пикселей.

Например, деталь в красной рамке на этом изображении - это практически набор пикселей.

1-what-is-an-image.png 1-what-is-an-image.png

Предположим, что часть в красной рамке - это изображение, тогда каждый независимый маленький квадратик на изображении - это пиксель, основная единица информации. Тогда размер изображения составляет 11 x 11 px.

2-what-is-an-image.png 2-what-is-an-image.png

Математическое представление изображений

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

Бинарные изображения

Пиксели бинарного изображения либо черные, либо белые, поэтому каждый пиксель может быть представлен 0 или 1. Например, матричное представление бинарного изображения 4 * 4:

0 1 0 1
1 0 0 0
1 1 1 0
0 0 1 0

RGB-изображения

Три основных цвета (красный, зеленый и синий) могут быть смешаны для получения любого цвета. Для RGB-изображений каждый пиксель содержит основную информацию трех каналов RGB. Аналогично, если каждый канал использует 8-битное число (в 256 уровнях) для представления своей серой шкалы, то математическое представление пикселя таково:

([0 .. 255], [0 .. 255], [0 .. 255])

Возьмем для примера RGB-изображение 4 * 4:

3-4-x-4-rgb-image.png 3-4-x-4-rgb-image.png

Суть обработки изображений заключается в обработке этих матриц пикселей.

Техническая проблема поиска по изображению

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

В системе поиска по изображению мы хотим искать изображения с похожим содержанием. Для этого необходимо решить две основные проблемы:

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

Более конкретно, нам нужны следующие функции:

  • Извлечение признаков изображения.
  • Вычисление признаков (вычисление сходства).

Система поиска по изображению первого поколения

Извлечение признаков - абстрагирование изображения

В системе поиска по изображению первого поколения для выделения признаков используется алгоритм Perceptual hash или pHash. Каковы основы этого алгоритма?

4-first-generation-image-search.png 4-first-generation-image-search.png

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

Расчет характеристик - расчет сходства

Как вычислить сходство между значениями pHash двух изображений? Ответ заключается в использовании расстояния Хэмминга. Чем меньше расстояние Хэмминга, тем больше сходство между изображениями.

Что такое расстояние Хэмминга? Это количество различных битов.

Например,

Value 1: 0 1 0 1 0
Value 2: 0 0 0 1 1

В двух приведенных выше значениях есть два разных бита, поэтому расстояние Хэмминга между ними равно 2.

Теперь мы знаем принцип расчета сходства. Следующий вопрос - как вычислить расстояние Хэмминга между 100-миллионными данными и 100-миллионными изображениями? Короче говоря, как искать похожие изображения?

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

Моя идея заключается в том, что если расстояние Хэмминга между двумя значениями pHash невелико, то я могу разрезать значения pHash, и соответствующие маленькие части, скорее всего, будут равны.

Например:

Value 1: 8 a 0 3 0 3 f 6
Value 2: 8 a 0 3 0 3 d 8

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

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

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

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

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

Краткое описание системы первого поколения

В качестве системы поиска по изображениям первого поколения выбрано решение pHash + ElasticSearch, которое обладает следующими особенностями:

  • Алгоритм pHash прост в использовании и может противостоять определенной степени сжатия, водяным знакам и шуму.
  • ElasticSearch использует существующие ресурсы проекта, не добавляя дополнительных затрат на поиск.
  • Но ограничение этой системы очевидно: алгоритм pHash - это абстрактное представление всего изображения. Как только мы нарушаем целостность изображения, например, добавляем черную рамку к оригиналу, практически невозможно оценить сходство между оригиналом и другими изображениями.

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

Эта статья написана rifewang, пользователем Milvus и инженером-программистом UPYUN. Если вам понравилась эта статья, заходите поздороваться! https://github.com/rifewang

Like the article? Spread the word

Продолжить чтение