Главная / Статьи

Гибридный поиск изображений в масштабе: SigLIP, SPLADE, YOLOv8 и Gemini Captions

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

Издатель: REACTAPP.TOP6 мин чтения1358 слов

Источники: Building Image Search System Leveraging Modern AI Services

Поиск по ключевым словам в тегах имеет ограничения при работе с изображениями. Команды, создающие каталоги электронной коммерции, инструменты управления контентом или библиотеки цифровых ресурсов, нуждаются в поиске, способном понимать то, что изображает картинка, её стиль и эмоциональный оттенок, а не только слова, введённые в поле тегов. Приведённая ниже схема описывает гибридную систему поиска изображений, которая извлекает результаты из хранилища примерно в миллион изображений с использованием как визуального контента, так и текстовых запросов; она в основном построена на существующих сервисах ИИ, что позволяет сократить усилия по разработке.

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

Два моделя эмбеддингов

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

Для изображений используется SigLIP. После оценки моделей CLIP и ImageBind победу одержал SigLIP. Это контрастная модель изображений и текста, обучаемая с использованием функции потерь сигмоиды; по полученным результатам её точность в задаче zero-shot на наборе ImageNet составляет около 76%, что на несколько пунктов выше, чем у сопоставимых моделей CLIP. Кроме того, она требует меньше вычислительных ресурсов — примерно на 40% меньше по сравнению с упомянутыми здесь моделями — и способна к обобщению на новые домены без дополнительной настройки. Каждое изображение преобразуется в плотный вектор в пространстве, где близкие по значению точки считаются похожими.

Для текста используется SPLADE v2. SPLADE генерирует разреженные векторы, привязанные непосредственно к словарю, что приносит три преимущества:

  • Разреженный формат вывода сохраняет возможность интерпретации, поскольку каждая измеримая величина соответствует реальному термину.
  • Она самостоятельно расширяет запросы с точки зрения лексики, что снижает проблему несоответствия словаря, характерную для систем поиска (например, «sofa» вместо «couch»).
  • Поскольку размеры представляют собой термины, можно проследить соответствие до конкретных слов, которые его вызвали, что способствует объяснению результатов.
  • Понимание каждого изображения

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

    Обнаружение объектов с использованием YOLOv8. YOLO анализирует всё изображение за один проход сети, поэтому он гораздо быстрее, чем двухэтапные детекторы, такие как Faster R-CNN. В этой конфигурации крупная версия модели занимает примерно 50 мс на изображение, что достаточно для эффективной группировки. На тестах COCO с 80 распространёнными классами она достигает показателя mAP 53,9%, причём модель легко масштабируется на кластеры GPU.

    От общих классов к именованным сущностям. Детекция выдаёт метки вроде «человек», «автомобиль» и «здание». Для углублённого поиска требуются конкретные идентификаторы, поэтому веб-сервис сущностей их преобразует:

    Example Transformation:
    
    YOLO: "person" (coordinates: [120, 45, 220, 320])
    Web Extraction: "Elon Musk" (confidence: 0.96)
    
    YOLO: "building" (coordinates: [50, 100, 400, 600])
    Web Extraction: "Eiffel Tower" (confidence: 0.92)
    

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

    Метки из API визуального анализа. Общие понятия, действия и темы определяются с помощью обнаружения меток; в ходе тестирования было распознано более 10 000 различных понятий в рамках всего репозитория. Это помогает с тремя аспектами: действиями, такими как походы или приготовление пищи, сценами, такими как пляж или лес, а также объектами, слишком специфичными для категорий YOLO, например капучино, который в системе YOLO относится только к категории «чашка».

    Безопасный поиск. Контент отмечается по пяти критериям: взрослая тематика, насилие, медицинские вопросы, фейки (мемы и отредактированные изображения) и откровенный контент. Каждому критерию присваивается оценка уверенности, что позволяет настраивать фильтрацию в соответствии с политикой организации. Автоматизация этого процесса заменила большое количество ручных проверок.

    Gemini для метаданных и описаний

    Gemini генерирует структурированные метаданные. Благодаря тщательной настройке запросов была создана шаблонная форма, которая надежно извлекает 25 атрибутов, каждый из которых имеет оценку уверенности от 0 до 1, например уровень чувствительности и эмоции:

    System: You are an expert image analyzer. Extract the following attributes from the image, with a confidence score (0-1):
    
    1. sensitivity (none, low, medium, high)
    2. emotion (neutral, joy, sadness, surprise, etc.)
    3. emotion_triggered (yes/no)
    4. text_overlay (yes/no)
    5. has_frames (yes/no)
    6. has_religious_symbols (yes/no)
    7. has_scattered_objects (yes/no)
    8. style (photographic, illustrated, cartoon, abstract, etc.)
    9. has_crowd (yes/no)
    ...
    [full list of 25 attributes]
    
    Response format: JSON object with attributes as keys and values as described above.
    

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

    1. Богатыми ключевыми словами, что способствует поиску по тексту.
    2. Единообразными по структуре, чтобы их можно было надежно обрабатывать.
    3. Смысловыми в контексте, отражающими важность обнаруженных сущностей.
    4. Учитывающими атрибуты, такие как эмоции и стиль.
    5. Написанными с учетом вероятных запросов к поиску.

    Шаблон выглядит так:

    Generate a comprehensive, search-optimized description for this image based on the following data:
    
    [Entity data from object detection and recognition]
    [Label data from Vision API]
    [Structured metadata from previous Gemini analysis]
    
    Your description should:
    1. Begin with the most significant entities and their actions/relationships
    2. Include key visual attributes (colors, style, composition)
    3. Mention emotional tone and aesthetic qualities
    4. Incorporate likely search terms
    5. Be 3-5 sentences in length
    

    Сначала возьмите необработанные данные обнаружения:

    Objects: person (0.98), guitar (0.95), microphone (0.92)
    Entities: Taylor Swift (0.97)
    Labels: concert, performance, stage, entertainment
    Metadata: emotion=joy, has_crowd=yes, style=photographic, dominant_color=purple
    

    После обогащения она превращается в поисковую фразу:

    Taylor Swift performs energetically on stage with an acoustic guitar during a concert, singing into a microphone with passionate expression. The image captures the excitement of a live performance with purple stage lighting creating a vibrant atmosphere. This high-quality photograph conveys feelings of joy and excitement, with Swift's iconic performance style clearly visible. The composition includes partial views of an enthusiastic crowd in the foreground, making this suitable for music, entertainment, and celebrity content.
    

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

    Ответ на запрос

    Запросы проходят через шесть этапов:

    1. Анализ. Классификация намерения позволяет определить, нужны ли пользователю конкретные сущности, стили, эмоции или другие характеристики.
    2. Извлечение сущностей. Именованные сущности из запроса сопоставляются с базой данных сущностей, чтобы им был присвоен соответствующий вес.
    3. Вкладкация. Запрос вкладывается с использованием SPLADE v2 и SigLIP, аналогично тому, как представлялись изображения.
    4. Векторный поиск. Вкладка запроса позволяет найти наиболее близкие к нему векторные представления изображений в индексе.
  • Фильтрация политик. Применяются правила, специфичные для региона и организации: пороги безопасности, адаптированные к региону пользователя, защита бренда, фильтрация в соответствии с возрастом и лицензионные права.
  • Переупорядочивание. Несколько факторов влияют на порядок результатов первого прохода:
    • Разнообразие — с использованием алгоритма жадности, обеспечивающего минимальное косинусовое расстояние между выбранными изображениями.
    • Новизна — повышение приоритета более свежих элементов с учетом затухания во времени: score_boost = base_score * (1 + alpha * exp(-beta * days_old)).
    • Популярность — с использованием логарифмического затухания, чтобы элементы с чрезмерным использованием не доминировали.
    • Бизнес-правила для корректировок, специфичных для конкретной области.

    Два сложных вопроса

    Задержка. Использование нескольких сервисных стеков приводило к задержкам, и первоначальные измерения показывали, что время обработки одного изображения с начала до конца превышало четыре секунды. Для устранения этой проблемы были внедрены асинхронные параллельные вызовы, группировка операций в пакеты для неконфликтных процессов, размещение сервисов рядом друг с другом для сокращения времени передачи данных по сети, а также разделение работы в зависимости от сложности изображения. Среднее время обработки снизилось до 850 мс на изображение, причем 95% из них обрабатывались за менее чем 1,2 секунды.

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

    Результаты и следующие шаги

    Инвестиции в услуги управляемого ИИ оказались эффективными. Разработка заняла четыре месяца вместо прогнозируемых двенадцати месяцев для индивидуального решения; уровень удовлетворенности результатами поиска вырос на 40%, а объем ручной маркировки и категоризации сократился на 80%.

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