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

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

Поскольку и изображения, и текст попадают в одно и то же векторное пространство, поиск является zero-shot: тебе не нужны метки или категории, достаточно только данных изображений и хорошего промпта.
Link to this sectionЗапуск веб-приложения для семантического поиска#
Класс SearchApp запускает полноценный интерфейс Flask. При первом запуске он загружает набор примеров изображений, строит индекс эмбеддингов и открывает страницу, где ты можешь ввести запрос и просмотреть ранжированные результаты.
Предупреждение о пути к изображению
Если ты используешь собственные изображения, убедись, что указал абсолютный путь к директории с изображениями. В противном случае изображения могут не отобразиться на веб-странице из-за ограничений Flask при работе с файлами.
from ultralytics import solutions
app = solutions.SearchApp(
# data = "path/to/img/directory" # Optional, build 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 testingLink to this sectionПрограммный поиск изображений#
Класс VisualAISearch выполняет все операции на стороне бэкенда без участия веб-слоя:
- Загружает или строит индекс эмбеддингов из локальных изображений.
- Извлекает эмбеддинги изображений и текста с помощью CLIP.
- Выполняет поиск сходства с использованием косинусного сходства.
Вызови поисковик с запросом на естественном языке, чтобы получить список имен файлов соответствующих изображений, ранжированных по степени сходства:
from ultralytics import solutions
searcher = solutions.VisualAISearch(
# data = "path/to/img/directory" # Optional, build 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.2680Link to this sectionНастройка параметров VisualAISearch#
В таблице ниже приведены доступные параметры для VisualAISearch:
| Аргумент | Тип | По умолчанию | Описание |
|---|---|---|---|
data | str | 'images' | Путь к директории изображений, используемой для поиска по сходству. |
| Аргумент | Тип | По умолчанию | Описание |
|---|---|---|---|
device | str | None | Указывает устройство для вывода (например, cpu, cuda:0 или 0). Позволяет выбирать между CPU, конкретным GPU или другими вычислительными устройствами для выполнения модели. |
Чтобы выполнять поиск по коллекциям изображений в промышленном масштабе без необходимости управлять локальными файлами, ты можешь организовать и версионировать свои изображения на Ultralytics Platform перед их индексацией с помощью CLIP.
Link to this sectionЗаключение#
С помощью CLIP и Python-пакета Ultralytics ты можешь создать движок для zero-shot семантического поиска изображений всего за несколько строк кода, будь то веб-приложение Flask или программный поисковый бэкенд. Направь data на свой каталог изображений для индексации, а затем изучи другие решения Ultralytics, чтобы дополнить свои рабочие процессы компьютерного зрения.
Link to this sectionFAQ#
Link to this sectionКак CLIP понимает и изображения, и текст?#
CLIP (Contrastive Language Image Pretraining) — это модель, разработанная OpenAI, которая учится связывать визуальную и лингвистическую информацию. Она обучена на огромном наборе данных из изображений, сопоставленных с подписями на естественном языке. Такое обучение позволяет ей проецировать изображения и текст в общее пространство эмбеддингов, что дает возможность сравнивать их напрямую с помощью векторного сходства.
Link to this sectionПочему CLIP считается настолько мощным для задач ИИ?#
Что делает CLIP выдающимся, так это его способность к обобщению. Вместо того чтобы обучаться только на конкретных метках или задачах, он учится на самом естественном языке. Это позволяет ему обрабатывать гибкие запросы, такие как "мужчина, катающийся на гидроцикле" или "сюрреалистичный пейзаж сна", что делает его полезным для всего — от классификации до творческого семантического поиска, без необходимости дообучения.
Link to this sectionКак изображения ранжируются относительно текстового запроса?#
Как только CLIP превращает твои изображения в эмбеддинги, пакет Ultralytics выполняет их L2-нормализацию и сохраняет в одном массиве NumPy. Запрос ранжируется с помощью одного матричного умножения, которое вычисляет косинусное сходство между эмбеддингом запроса и каждым эмбеддингом изображения, а затем сортирует результаты. Этот поиск методом грубой силы точен и быстр для типичных коллекций изображений, при этом не требуется устанавливать или управлять дополнительными зависимостями векторных баз данных.
Link to this sectionWhy use the Ultralytics Python package if CLIP is from OpenAI?#
Хотя CLIP разработан OpenAI, Python-пакет Ultralytics объединяет генерацию эмбеддингов, индексацию и поиск по косинусному сходству в полноценный конвейер семантического поиска изображений, который работает всего за пару строк кода:
from ultralytics import solutions
searcher = solutions.VisualAISearch(
# data = "path/to/img/directory" # Optional, build 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.
- Создание и управление индексом эмбеддингов.
- Эффективный семантический поиск с использованием косинусного сходства.
- Загрузку изображений из директорий и визуализацию.
Link to this sectionМогу ли я настроить фронтенд этого приложения?#
Да. Текущая настройка использует Flask с базовым HTML-фронтендом, но ты можешь заменить его на свой собственный HTML или создать более динамичный пользовательский интерфейс с помощью React, Vue или другого фронтенд-фреймворка. Flask может служить бэкенд API для твоего пользовательского интерфейса.
Link to this sectionМожно ли искать по видео, а не только по статичным изображениям?#
Не напрямую. Простой обходной путь — извлекать отдельные кадры из твоих видео (например, один кадр в секунду), рассматривать их как отдельные изображения и подавать в систему. Таким образом, поисковая система сможет семантически индексировать визуальные моменты из твоих видео.