YOLO Vision 2026:

Как создать семантический поиск изображений с помощью OpenAI CLIP#

Это руководство проведет тебя через создание движка семантического поиска изображений с использованием OpenAI CLIP и Flask. Соединяя визуально-языковые эмбеддинги CLIP с быстрым поиском по косинусному сходству на базе NumPy, ты сможешь создать веб-интерфейс, который извлекает релевантные изображения по текстовым запросам на естественном языке, причем без каких-либо меток или категорий.



Watch: How Similarity Search Works | Visual Search Using OpenAI CLIP and the Ultralytics Package 🎉

Обзор веб-страницы Flask с результатами семантического поиска

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

Почему стоит использовать семантический поиск изображений?#

Создание собственной системы семантического поиска изображений с помощью CLIP дает несколько весомых преимуществ:

  • Возможности zero-shot: Тебе не нужно обучать модель на своем наборе данных. Обучение в условиях нулевой выборки (zero-shot) от CLIP позволяет запрашивать любую коллекцию изображений на произвольном естественном языке, экономя время и ресурсы.
  • Человеческое понимание: В отличие от поиска по ключевым словам, CLIP понимает семантический контекст и находит изображения по абстрактным, эмоциональным или описательным запросам, таким как "счастливый ребенок на природе" или "футуристический силуэт города ночью".
  • Без меток и метаданных: Для этого подхода нужны только исходные изображения. CLIP создает эмбеддинги без какой-либо ручной аннотации.
  • Легкость и точность поиска: Одно нормализованное матричное умножение в NumPy ранжирует каждое изображение по косинусному сходству, предоставляя точные результаты в реальном времени для тысяч эмбеддингов без необходимости устанавливать или настраивать дополнительные зависимости для поиска.
  • Межотраслевое применение: Строишь ли ты персональный фотоархив, инструмент для творческого вдохновения, систему поиска товаров или рекомендательную систему для произведений искусства — этот стек адаптируется с минимальными настройками.

Как работает семантический поиск изображений#

Конвейер объединяет три компонента, каждый из которых отвечает за один этап преобразования изображений и текста в ранжированные результаты:

  • CLIP использует визуальный энкодер (например, ResNet или ViT) для изображений и текстовый энкодер (на базе Transformer) для языка, чтобы проецировать их в одно и то же мультимодальное пространство эмбеддингов. Это позволяет напрямую сравнивать текст и изображения с помощью косинусного сходства.
  • NumPy хранит эмбеддинги изображений в виде единого массива и ранжирует их относительно эмбеддинга запроса с помощью одного матричного умножения, возвращая наиболее близкие векторы по косинусному сходству без дополнительных зависимостей для индексации.
  • Flask предоставляет простой веб-интерфейс для отправки запросов на естественном языке и отображения семантически подходящих изображений из индекса.

Рабочий процесс извлечения изображений OpenAI Clip

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

Запуск веб-приложения для семантического поиска#

Класс SearchApp запускает полноценный интерфейс Flask. При первом запуске он загружает набор примеров изображений, строит индекс эмбеддингов и открывает страницу, на которой ты можешь ввести запрос и просмотреть ранжированные результаты.

Предупреждение о пути к изображению

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

from ultralytics import solutions

app = solutions.SearchApp(
    data="images",  # replace with a path to build the search engine with your own images
    device="cpu",  # configure the device for processing, e.g., "cpu" or "cuda"
)

app.run(debug=False)  # You can also use `debug=True` argument for testing

Программный поиск изображений#

Класс VisualAISearch выполняет все операции бэкенда без веб-слоя:

  • Загружает или строит индекс эмбеддингов из локальных изображений.
  • Извлекает эмбеддинги изображений и текста с помощью CLIP.
  • Выполняет поиск сходства с использованием косинусного сходства.

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

from ultralytics import solutions

searcher = solutions.VisualAISearch(
    data="images",  # replace with a path to build the search engine with your own images
    device="cpu",  # configure the device for processing, e.g., "cpu" or "cuda"
)

results = searcher("a dog sitting on a bench")

# Ranked Results:
#     - 000000546829.jpg | Similarity: 0.3269
#     - 000000549220.jpg | Similarity: 0.2899
#     - 000000517069.jpg | Similarity: 0.2761
#     - 000000029393.jpg | Similarity: 0.2742
#     - 000000534270.jpg | Similarity: 0.2680

Настройка параметров VisualAISearch#

В таблице ниже описаны доступные параметры для VisualAISearch:

АргументТипПо умолчаниюОписание
datastr'images'Путь к директории изображений, используемой для поиска по сходству.
АргументТипПо умолчаниюОписание
devicestrNoneЗадает устройство для инференса (например, cpu, cuda:0 или 0). Позволяет пользователям выбирать между CPU, конкретным GPU или другими вычислительными устройствами для выполнения модели.
Управляй своими данными в облаке

Для поиска по коллекциям изображений в промышленных масштабах без управления локальными файлами ты можешь упорядочить и версионировать свои изображения на платформе Ultralytics перед их индексацией с помощью CLIP.

Заключение#

С помощью CLIP и пакета Python для Ultralytics ты можешь развернуть движок семантического поиска изображений в режиме zero-shot всего за несколько строк кода — либо как веб-приложение Flask, либо как программный поисковый бэкенд. Отсюда укажи data на свой собственный каталог изображений для его индексации, а затем изучи другие решения Ultralytics для создания надстроек над твоими рабочими процессами компьютерного зрения.

FAQ#

  • CLIP (Contrastive Language Image Pretraining) — это модель, разработанная OpenAI, которая учится связывать визуальную и лингвистическую информацию. Она обучена на огромном наборе данных изображений в паре с подписями на естественном языке. Такое обучение позволяет ей сопоставлять как изображения, так и текст в общем пространстве эмбеддингов, поэтому ты можешь сравнивать их напрямую с использованием векторного сходства.

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

  • Как только CLIP превращает твои изображения в эмбеддинги, пакет Ultralytics выполняет их L2-нормализацию и сохраняет их в едином массиве NumPy. Запрос ранжируется с помощью одного матричного умножения, которое вычисляет косинусное сходство между эмбеддингом запроса и эмбеддингом каждого изображения, после чего сортирует оценки. Такой брутфорс-поиск является точным и быстрым для типичных коллекций изображений, при этом не требуя установки или управления дополнительными зависимостями векторной базы данных.

  • Хотя CLIP разработана OpenAI, пакет Python для Ultralytics объединяет генерацию эмбеддингов, индексацию и поиск по косинусному сходству в единый конвейер семантического поиска изображений, работающий всего из нескольких строк кода:

    from ultralytics import solutions
    
    searcher = solutions.VisualAISearch(
        data="images",  # replace with a path to build the search engine with your own images
        device="cpu",  # configure the device for processing, e.g., "cpu" or "cuda"
    )
    
    results = searcher("a dog sitting on a bench")

    Эта высокоуровневая реализация берет на себя:

    • Генерацию эмбеддингов изображений и текста на основе CLIP.
    • Создание и управление индексом эмбеддингов.
    • Эффективный семантический поиск с использованием косинусного сходства.
    • Загрузка изображений на основе директорий и визуализация.
  • Да. Текущая настройка использует Flask с базовым HTML-фронтендом, но ты можешь заменить его на свой собственный HTML или создать более динамичный пользовательский интерфейс с помощью React, Vue или другого фронтенд-фреймворка. Flask может служить бэкенд API для твоего пользовательского интерфейса.

  • Не напрямую. Простой обходной путь — извлекать отдельные кадры из твоих видео (например, один кадр в секунду), рассматривать их как отдельные изображения и подавать в систему. Таким образом, поисковая система сможет семантически индексировать визуальные моменты из твоих видео.

Комментарии