Обзор
Yupoo Picture Manager обслуживает десятки миллионов пользователей и управляет десятками миллиардов изображений. Поскольку галерея пользователей становится все больше, Yupoo срочно понадобилось решение, способное быстро находить изображения. Другими словами, когда пользователь вводит изображение, система должна найти его оригинал и похожие изображения в галерее. Разработка сервиса поиска по изображениям обеспечивает эффективный подход к решению этой задачи.
Сервис поиска по изображениям прошел две эволюции:
- Начало первого технического исследования в начале 2019 года и запуск системы первого поколения в марте и апреле 2019 года;
- Начало исследования плана модернизации в начале 2020 года и начало общего обновления до системы второго поколения в апреле 2020 года.
В этой статье описывается выбор технологии и основные принципы работы двух поколений системы поиска по изображениям, основанные на моем собственном опыте работы над этим проектом.
Обзор
Что такое изображение?
Прежде чем работать с изображениями, мы должны знать, что такое изображение.
Ответ заключается в том, что изображение - это набор пикселей.
Например, деталь в красной рамке на этом изображении - это практически набор пикселей.
1-what-is-an-image.png
Предположим, что часть в красной рамке - это изображение, тогда каждый независимый маленький квадратик на изображении - это пиксель, основная единица информации. Тогда размер изображения составляет 11 x 11 px.
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
Суть обработки изображений заключается в обработке этих матриц пикселей.
Техническая проблема поиска по изображению
Если вы ищете оригинальное изображение, то есть изображение с точно такими же пикселями, то вы можете напрямую сравнить их MD5-значения. Однако изображения, загружаемые в Интернет, часто бывают сжаты или снабжены водяными знаками. Даже небольшое изменение в изображении может привести к другому результату MD5. Пока существует несоответствие пикселей, найти оригинальное изображение невозможно.
В системе поиска по изображению мы хотим искать изображения с похожим содержанием. Для этого необходимо решить две основные проблемы:
- Представить или абстрагировать изображение в виде формата данных, который может быть обработан компьютером.
- Данные должны быть сопоставимы для вычисления.
Более конкретно, нам нужны следующие функции:
- Извлечение признаков изображения.
- Вычисление признаков (вычисление сходства).
Система поиска по изображению первого поколения
Извлечение признаков - абстрагирование изображения
В системе поиска по изображению первого поколения для выделения признаков используется алгоритм Perceptual hash или pHash. Каковы основы этого алгоритма?
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
- Техническая проблема поиска по изображению
- Система поиска по изображению первого поколения
- Краткое описание системы первого поколения
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word