Как создать семантический поиск изображений с помощью OpenAI CLIP#
В этом руководстве ты узнаешь, как создать движок семантического поиска изображений с помощью OpenAI CLIP и Flask. Сочетая визуально-языковые эмбеддинги CLIP с быстрым поиском по косинусному сходству на базе NumPy, ты сможешь создать веб-интерфейс, который находит релевантные изображения по запросам на естественном языке без необходимости в метках или категориях.
Смотри: Как работает поиск по сходству | Визуальный поиск с OpenAI CLIP и пакетом Ultralytics 🎉

Пакет 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", # замени на путь к каталогу с изображениями, чтобы создать поисковый движок на их основе
device="cpu", # укажи устройство для обработки, например "cpu" или "cuda"
)
app.run(debug=False) # Для тестирования также можно использовать аргумент `debug=True`Программный поиск изображений#
Класс VisualAISearch выполняет все серверные операции без веб-уровня:
- Загружает или создаёт индекс эмбеддингов по локальным изображениям.
- Извлекает эмбеддинги изображений и текста с помощью CLIP.
- Выполняет поиск по сходству, используя косинусное сходство.
Передай поисковому модулю запрос на естественном языке, чтобы получить список имён файлов подходящих изображений, отсортированный по степени сходства:
from ultralytics import solutions
searcher = solutions.VisualAISearch(
data="images", # замени на путь к каталогу с изображениями, чтобы создать поисковый движок на их основе
device="cpu", # укажи устройство для обработки, например "cpu" или "cuda"
)
results = searcher("a dog sitting on a bench")
# Ранжированные результаты:
# - 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 Platform, а затем индексировать их с помощью CLIP.
Заключение#
С помощью CLIP и пакета Ultralytics для Python можно всего в несколько строк создать движок семантического поиска изображений в режиме zero-shot — как веб-приложение Flask или программный поисковый бэкенд. Затем укажи собственный каталог изображений в data, чтобы проиндексировать его, и изучи другие решения Ultralytics Solutions, чтобы расширить возможности своих рабочих процессов компьютерного зрения.
Часто задаваемые вопросы#
CLIP (контрастивное предварительное обучение языка и изображений) — это модель, разработанная OpenAI, которая учится связывать визуальную и языковую информацию. Модель обучена на огромном наборе данных, содержащем изображения с подписями на естественном языке. Благодаря этому обучению она отображает изображения и текст в общее пространство эмбеддингов, позволяя напрямую сравнивать их с помощью векторного сходства.
CLIP выделяется способностью к обобщению. Вместо обучения только на конкретных метках или задачах модель учится непосредственно на естественном языке. Благодаря этому она обрабатывает гибкие запросы, например «мужчина катается на гидроцикле» или «сюрреалистичный мир сновидений», и подходит для самых разных задач — от классификации до творческого семантического поиска — без дополнительного обучения.
После того как CLIP преобразует изображения в эмбеддинги, пакет Ultralytics нормализует их по L2-норме и сохраняет в одном массиве NumPy. Запрос ранжируется за одно умножение матриц, которое вычисляет косинусное сходство между эмбеддингом запроса и эмбеддингом каждого изображения, после чего результаты сортируются по оценкам. Такой полный перебор даёт точные результаты и работает быстро для типичных коллекций изображений. При этом не нужно устанавливать или обслуживать дополнительную зависимость в виде векторной базы данных.
Хотя CLIP разработан OpenAI, пакет Ultralytics для Python объединяет генерацию эмбеддингов, индексирование и поиск по косинусному сходству в полноценный конвейер семантического поиска изображений. Для этого достаточно нескольких строк кода, которые сразу работают:
from ultralytics import solutions searcher = solutions.VisualAISearch( data="images", # замени на путь к каталогу с изображениями, чтобы создать поисковый движок на их основе device="cpu", # укажи устройство для обработки, например "cpu" или "cuda" ) results = searcher("a dog sitting on a bench")Эта высокоуровневая реализация выполняет следующие задачи:
- Генерация эмбеддингов изображений и текста на основе CLIP.
- Создание и управление индексом эмбеддингов.
- Эффективный семантический поиск по косинусному сходству.
- Загрузка изображений из каталогов и их визуализация.
Да. В текущей конфигурации используется Flask с простым интерфейсом на HTML, но ты можешь заменить его собственным HTML-кодом или создать более динамичный интерфейс на React, Vue или другом фронтенд-фреймворке. Flask может выступать в роли серверного API для твоего интерфейса.
Напрямую — нет. Простое решение — извлечь из видео отдельные кадры (например, по одному в секунду), рассматривать их как самостоятельные изображения и передавать в систему. Так поисковый движок сможет семантически индексировать визуальные фрагменты видео.