Как работает поиск похожих изображений: от эмбеддингов до FAISS
Как нейросети находят копии и дубликаты среди миллионов картинок? Разбираем эмбеддинги, Vision Transformer и косинусное сходство на примере датасета Beans. Простыми словами, без кода.
Представьте, что вам нужно найти в интернете оригинал фотографии, которая уже разошлась по сотням сайтов. Или отсеять дубликаты в фотобанке из десятков тысяч снимков. Для человека это часы рутинной работы. Для нейросети - доли секунды.
Поиск похожих изображений превращает картинку в набор чисел, который называют эмбеддингом. Этот вектор отражает ключевые признаки объекта: форму, текстуру, взаимное расположение частей. Два изображения с похожим содержанием получают близкие векторы, а значит, их можно сравнивать автоматически. Вся технология держится на трёх элементах: нейросеть для извлечения признаков, метрика для сравнения векторов и индекс для быстрого поиска среди миллионов записей.
Разберём каждый шаг на примере модели Vision Transformer и датасета Beans. Без кода, но с чёткими объяснениями.
Зачем нужен поиск похожих изображений?
Объём визуального контента растёт экспоненциально. По данным Statista, в 2025 году пользователи загружали более 3 миллиардов изображений в день только в социальные сети. В этом потоке теряются авторские права, плодятся копии и дубликаты, а поиск нужной картинки превращается в лотерею.
Технология решает конкретные задачи:
- Защита авторских прав. Фотограф загружает свой снимок и находит все сайты, где его использовали без разрешения.
- Обратный поиск товаров. Покупатель фотографирует понравившуюся вещь и получает ссылки на магазины с этим товаром.
- Модерация контента. Платформа автоматически блокирует повторные загрузки запрещённых изображений, даже если их обрезали или наложили фильтр.
- Организация фотоархивов. Приложение группирует снимки по людям, местам или объектам без ручной разметки.
Раньше такие задачи решали вручную или с помощью примитивных алгоритмов, которые ломались при малейшем изменении картинки. Нейросети изменили правила игры.
Как компьютер «видит» изображение: от пикселей к эмбеддингам
Для компьютера фотография - это матрица чисел. Каждый пиксель закодирован тремя значениями: интенсивностью красного, зелёного и синего. Изображение размером 1000 на 1000 пикселей - это 3 миллиона чисел. Проблема в том, что эти числа не несут смысла сами по себе.
Эмбеддинг решает эту проблему. Это компактный вектор фиксированной длины - например, 768 чисел, - который описывает содержание картинки. Числа в векторе не соответствуют конкретным пикселям. Они кодируют высокоуровневые признаки: «есть ли на фото животное», «какая текстура преобладает», «где расположен объект относительно фона». Эмбеддинг можно сравнить с отпечатком пальца: он уникален для каждого изображения, но два снимка одного объекта с разных ракурсов будут иметь похожие отпечатки.
Почему нельзя просто сравнить пиксели?
Попиксельное сравнение - самый очевидный, но бесполезный подход. Возьмите две фотографии одного стула: одну при дневном свете, другую в полумраке. Для человека это один и тот же объект. Для компьютера - две разные матрицы чисел, потому что изменился каждый пиксель.
Ещё хуже с геометрическими трансформациями. Поверните картинку на 10 градусов - и попиксельное сравнение покажет нулевое сходство, хотя содержание не изменилось. Добавьте сюда обрезку, изменение размера, водяные знаки - и станет ясно, что сравнивать нужно не пиксели, а смысл. Эмбеддинги как раз кодируют смысл, игнорируя несущественные вариации.
Vision Transformer: нейросеть, которая извлекает смысл из картинки
Vision Transformer (ViT) - это архитектура нейросети, которая пришла из обработки текста и отлично прижилась в компьютерном зрении. В отличие от свёрточных сетей, которые анализируют изображение через маленькие скользящие окна, ViT смотрит на картинку глобально.
Модель предобучена на миллионах изображений и умеет выделять признаки, которые важны для различения объектов. Она не «запоминает» конкретные картинки, а учится общим закономерностям: как выглядит край объекта, как сочетаются текстуры, какие формы характерны для разных классов предметов.
Как Vision Transformer превращает фото в вектор чисел
Процесс состоит из трёх шагов:
- Разбиение на патчи. Изображение делится на квадратные блоки - обычно 16 на 16 пикселей. Каждый блок превращается в вектор, как слова в тексте превращаются в токены.
- Анализ взаимосвязей. Все патчи проходят через несколько слоёв трансформера. На каждом слое модель вычисляет, как каждый блок связан с остальными. Это похоже на то, как человек рассматривает картину: взгляд перескакивает между деталями, собирая целостное впечатление.
- Формирование эмбеддинга. На выходе модель выдаёт вектор фиксированной длины - например, 768 чисел. Этот вектор и есть эмбеддинг, готовый для сравнения.
Важный момент: модель не хранит изображение. Она извлекает признаки и выбрасывает исходные пиксели. Эмбеддинг занимает в тысячи раз меньше места, чем оригинал, что критично для масштабирования.
Сравнение векторов: что такое косинусное сходство и почему оно работает
Два эмбеддинга - это два вектора в многомерном пространстве. Чтобы понять, насколько они близки, измеряют угол между ними. Если угол маленький, векторы смотрят почти в одном направлении - изображения похожи. Если угол близок к 90 градусам - картинки разные.
Косинусное сходство - это мера этого угла, выраженная числом от -1 до 1. Значение 1 означает идентичные векторы, 0 - полностью независимые, -1 - противоположные. Для поиска похожих изображений важны значения от 0.7 и выше.
Косинусное сходство предпочтительнее евклидова расстояния для высокоразмерных данных. Евклидово расстояние чувствительно к длине вектора, а длина может зависеть от яркости изображения или количества деталей. Косинус игнорирует длину и смотрит только на направление, то есть на соотношение признаков.
Пример: как косинусное сходство находит дубликаты
Возьмём три изображения: оригинал фотографии кота, её копию с изменённой яркостью и фотографию автомобиля. Модель вычисляет эмбеддинги для всех трёх. Косинусное сходство между оригиналом и копией - 0.94. Между оригиналом и автомобилем - 0.12. Система выстраивает результаты по убыванию сходства, и копия оказывается на первом месте.
Этот же принцип работает для поиска не только дубликатов, но и визуально похожих объектов: разных моделей кроссовок, зданий в одном архитектурном стиле, листьев растений одного вида.
Практический пример: строим поиск на датасете Beans с Hugging Face
Датасет Beans содержит 1290 изображений листьев фасоли, разделённых на три класса: здоровые, поражённые угловатой пятнистостью и поражённые ржавчиной. Это учебный набор данных, на котором удобно демонстрировать технологию. Hugging Face предоставляет готовые инструменты для работы: библиотеку Datasets для загрузки данных и библиотеку Transformers для использования предобученных моделей.
Этап 1: Загрузка данных и модели
Библиотека Datasets загружает датасет Beans одной командой. Все изображения автоматически приводятся к нужному размеру и формату. Модель Vision Transformer загружается из Hugging Face Hub - публичного репозитория, где хранятся тысячи предобученных моделей. Модель уже обучена на ImageNet и других крупных наборах данных, поэтому она готова к использованию без дообучения.
Если вам интересно, как Hugging Face развивает свою экосистему, почитайте наш разбор летних обновлений платформы - там мы рассказываем о новых инструментах для разработчиков и росте сообщества.
Этап 2: Получение эмбеддингов для всех изображений
Каждое изображение из датасета пропускается через ViT. Модель отбрасывает классификационную голову - последний слой, который предсказывает класс, - и возвращает вектор признаков. Этот процесс называется инференсом. Для 1290 изображений он занимает несколько секунд на обычном компьютере.
Результат - матрица размером 1290 на 768, где каждая строка соответствует одному изображению. Эта матрица сохраняется один раз и становится поисковой базой.
Этап 3: Поиск по запросу
Пользователь загружает новое изображение листа фасоли. Система вычисляет его эмбеддинг и сравнивает с каждой строкой сохранённой матрицы через косинусное сходство. Затем сортирует результаты по убыванию и возвращает, например, пять ближайших соседей.
Если запросный лист поражён ржавчиной, в топе окажутся другие листья с ржавчиной, даже если они отличаются по форме и размеру. Модель уловила паттерн заболевания, а не запомнила конкретные пиксели.
Для тех, кто хочет глубже разобраться в работе с эмбеддингами, рекомендуем статью о Sentence Transformers и интеграции с Hugging Face Hub - там мы показываем, как публиковать и использовать модели для семантического поиска.
Как искать среди миллионов изображений: знакомство с FAISS
Полный перебор работает для тысячи изображений. Для миллиона - уже нет. Сравнение одного запроса с миллионом векторов размерности 768 требует значительных вычислительных ресурсов. Если сервис обрабатывает сотни запросов в секунду, задержки становятся неприемлемыми.
FAISS (Facebook AI Similarity Search) - библиотека, которая решает проблему масштабирования. Она не перебирает все векторы подряд, а строит индекс - структуру данных, которая группирует похожие векторы и позволяет искать только в релевантных группах.
Индексация в FAISS: как ускорить поиск в 100 раз
Принцип работы напоминает библиотеку. Если книги расставлены по жанрам, вы ищете детектив только в соответствующем разделе, а не обходите все стеллажи. FAISS делает то же самое с векторами.
Самый простой метод - кластеризация. FAISS разбивает всё пространство векторов на области (кластеры) и для каждой области вычисляет центроид - средний вектор. При поиске запрос сравнивается сначала с центроидами, а затем - только с векторами внутри ближайших кластеров. Это сокращает количество сравнений в десятки и сотни раз.
Библиотека поддерживает и более сложные индексы: Product Quantization, который сжимает векторы для экономии памяти, и HNSW - графовый индекс для максимальной скорости. Выбор индекса зависит от соотношения точности и скорости, которое нужно конкретному проекту.
Если вас интересует, как оптимизировать инференс нейросетей в продакшене, загляните в статью о 100-кратном ускорении вывода моделей - там мы разбираем квантование, компиляцию и другие техники.
Где применяется поиск похожих изображений: от модерации до рекомендаций
Технология давно вышла за пределы исследовательских лабораторий. Вот несколько реальных сценариев:
- Поиск плагиата и дубликатов. Фотобанки и стоки автоматически проверяют новые загрузки на совпадение с существующей базой. Это защищает покупателей от покупки изображения, которое уже используется в других местах.
- Обратный поиск товаров. Маркетплейсы позволяют сфотографировать товар в офлайн-магазине и найти его в каталоге. Система сравнивает эмбеддинг фотографии с эмбеддингами товарных карточек.
- Организация личных фотоархивов. Приложения вроде Google Photos группируют снимки по людям, объектам и событиям. Поиск по запросу «собака на пляже» работает без ручной разметки.
- Детекция дипфейков. Система ищет визуальные артефакты, сравнивая подозрительное изображение с эталонными примерами подделок.
- Медицинская диагностика. Алгоритмы сравнивают рентгеновские снимки пациента с базой подтверждённых случаев и подсвечивают похожие патологии.
Похожий подход используется и для спутниковых снимков. Мы рассказывали, как энтузиасты дообучили CLIP на космических данных и подняли точность поиска с 57% до 88%. Текстовый запрос «аэропорт» или «пляж» находит нужный объект среди тысяч квадратных километров Земли.
Что дальше: как начать использовать поиск изображений уже сегодня
Для быстрого старта не нужно разворачивать собственную инфраструктуру. Google Images и TinEye предоставляют готовый обратный поиск: загружаете картинку - получаете список совпадений. Этого достаточно для разовых задач.
Если вы разработчик и хотите встроить поиск в свой продукт, экосистема Hugging Face даёт всё необходимое. Предобученные модели, датасеты и документация с примерами сокращают путь от идеи до прототипа до нескольких часов. Библиотека FAISS решает вопрос масштабирования.
Технология поиска похожих изображений - это не магия, а последовательность понятных шагов: извлечение признаков, сравнение векторов, индексация для скорости. Нейросети взяли на себя самую сложную часть - понимание содержания картинки. Всё остальное - инженерная задача с готовыми решениями.
Есть вопрос или заметили неточность? Напишите нам - разберёмся вместе.