Как создать семантический поиск изображений с помощью OpenAI CLIP#
В этом руководстве ты узнаешь, как создать движок семантического поиска изображений с использованием OpenAI CLIP и Flask. Объединив визуально-языковые эмбеддинги CLIP с быстрым поиском по косинусному сходству на основе NumPy, ты сможешь создать веб-интерфейс, который извлекает релевантные изображения по запросам на естественном языке без необходимости в метках или категориях.
Watch: How Similarity Search Works | Visual Search Using OpenAI CLIP and the Ultralytics Package 🎉

Пакет Ultralytics Python скрывает весь этот конвейер за двумя классами, поэтому ты можешь запустить рабочее приложение поиска или выполнять запросы программно всего в несколько строк. В этом руководстве рассматриваются преимущества семантического поиска, принцип его работы, запуск веб-приложения, программный поиск и настройка параметров.
Зачем нужен семантический поиск изображений?#
Создание собственной системы семантического поиска изображений с CLIP дает несколько важных преимуществ:
- Возможности zero-shot: Тебе не нужно обучать модель на своем наборе данных. Обучение без примеров CLIP позволяет выполнять запросы к любой коллекции изображений на естественном языке в свободной форме, экономя время и ресурсы.
- Понимание на уровне человека: В отличие от поиска по ключевым словам, CLIP понимает семантический контекст и извлекает изображения по абстрактным, эмоциональным или реляционным запросам, например «счастливый ребенок на природе» или «футуристический городской силуэт ночью».
- Без меток и метаданных: Для этого подхода нужны только исходные изображения. CLIP создает эмбеддинги без ручной разметки.
- Легковесный и точный поиск: Одно умножение нормализованных матриц в NumPy ранжирует каждое изображение по косинусному сходству, обеспечивая точные результаты и отклик в реальном времени для тысяч эмбеддингов без установки или управления дополнительной поисковой зависимостью.
- Применение в разных областях: Создаешь ли ты личный фотоархив, инструмент для поиска творческих идей, поисковую систему товаров или систему рекомендаций произведений искусства — один и тот же стек адаптируется с минимальными изменениями.
Как работает семантический поиск изображений#
Конвейер объединяет три компонента, каждый из которых отвечает за один этап преобразования изображений и текста в ранжированные результаты:
- CLIP использует визуальный энкодер (например, ResNet или ViT) для изображений и текстовый энкодер (на основе Transformer) для языка, проецируя оба типа данных в одно мультимодальное пространство эмбеддингов. Это позволяет напрямую сравнивать текст и изображения с помощью косинусного сходства.
- NumPy хранит эмбеддинги изображений в виде одного массива и сравнивает их с эмбеддингом запроса одним умножением матриц, возвращая ближайшие векторы по косинусному сходству без дополнительной зависимости для индексации.
- Flask предоставляет простой веб-интерфейс для отправки запросов на естественном языке и отображения семантически совпадающих изображений из индекса.

Поскольку изображения и текст попадают в одно и то же векторное пространство, поиск выполняется в режиме 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:
| Аргумент | Тип | По умолчанию | Описание |
|---|---|---|---|
data | str | 'images' | Путь к каталогу изображений для индексации и поиска. |
device | str | 'cpu' | Устройство, используемое для вывода CLIP (например, cpu, cuda, 0). |
Чтобы выполнять поиск по коллекциям изображений в производственном масштабе без управления локальными файлами, ты можешь организовать изображения и управлять их версиями на платформе Ultralytics, прежде чем индексировать их с помощью CLIP.
Заключение#
С помощью CLIP и пакета Ultralytics Python ты можешь создать zero-shot-движок семантического поиска изображений всего в несколько строк — либо как веб-приложение Flask, либо как программный сервер поиска. Затем укажи для data собственный каталог изображений, чтобы проиндексировать его, и изучи другие решения Ultralytics, чтобы развивать свои рабочие процессы компьютерного зрения.
Часто задаваемые вопросы#
CLIP (контрастивное предварительное обучение на языке и изображениях) — это модель, разработанная OpenAI, которая учится связывать визуальную и лингвистическую информацию. Она обучена на огромном наборе данных, состоящем из изображений с подписями на естественном языке. Благодаря этому обучению модель отображает изображения и текст в общее пространство эмбеддингов, что позволяет напрямую сравнивать их с помощью векторного сходства.
CLIP выделяется своей способностью к обобщению. Вместо обучения только для конкретных меток или задач он учится непосредственно на естественном языке. Благодаря этому он обрабатывает гибкие запросы вроде «мужчина катается на гидроцикле» или «сюрреалистический фантастический пейзаж», что делает его полезным для всего — от классификации до творческого семантического поиска — без повторного обучения.
После того как CLIP преобразует изображения в эмбеддинги, пакет Ultralytics выполняет их L2-нормализацию и сохраняет в одном массиве NumPy. Запрос ранжируется одним умножением матриц, которое вычисляет косинусное сходство между эмбеддингом запроса и каждым эмбеддингом изображения, после чего сортирует оценки. Такой переборный поиск точен и быстр для типичных коллекций изображений, при этом не требует установки или управления дополнительной зависимостью в виде векторной базы данных.
Хотя CLIP разработан OpenAI, пакет Ultralytics Python объединяет генерацию эмбеддингов, индексацию и поиск по косинусному сходству в полноценный конвейер семантического поиска изображений, который запускается всего несколькими рабочими строками кода:
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 для твоего пользовательского интерфейса.
Не напрямую. Простой обходной путь — извлечь отдельные кадры из видео (например, по одному кадру в секунду), рассматривать их как отдельные изображения и передать их в систему. Так поисковый движок сможет семантически индексировать визуальные моменты из твоих видео.