Семантический поиск изображений с OpenAI CLIP и Meta FAISS
Введение
В этом руководстве вы узнаете, как создать механизм семантического поиска изображений с помощью OpenAI CLIP, Meta FAISS и Flask. Объединив мощные визуально-языковые вложения CLIP с эффективным поиском ближайших соседей FAISS, вы можете создать полнофункциональный веб-интерфейс, в котором можно извлекать релевантные изображения с помощью запросов на естественном языке.
Смотреть: Как работает поиск по сходству | Визуальный поиск с использованием OpenAI CLIP, META FAISS и пакета Ultralytics 🎉
Визуальный предварительный просмотр семантического поиска изображений
Как это работает
- CLIP использует визуальный энкодер (например, ResNet или ViT) для изображений и текстовый энкодер (на основе Transformer) для языка, чтобы спроецировать их в одно и то же мультимодальное пространство встраивания. Это позволяет напрямую сравнивать текст и изображения с использованием косинусного сходства.
- FAISS (Facebook AI Similarity Search) создает индекс векторных представлений изображений и обеспечивает быстрый, масштабируемый поиск ближайших векторов к заданному запросу.
- Flask предоставляет простой веб-интерфейс для отправки запросов на естественном языке и отображения семантически соответствующих изображений из индекса.
Эта архитектура поддерживает поиск с нулевым количеством примеров, что означает, что вам не нужны метки или категории, только данные изображения и хороший запрос.
Семантический поиск изображений с использованием пакета Ultralytics python
Предупреждение о пути к изображению
Если вы используете свои собственные изображения, убедитесь, что указали абсолютный путь к каталогу изображений. В противном случае изображения могут не отображаться на веб-странице из-за ограничений 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 i.e "cpu" or "cuda"
)
app.run(debug=False) # You can also use `debug=True` argument for testing
VisualAISearch
класс
Этот класс выполняет все внутренние операции:
- Загружает или создает индекс FAISS из локальных изображений.
- Извлекает эмбеддинги изображений и текста с помощью CLIP.
- Выполняет поиск схожести, используя косинусное сходство.
Поиск похожих изображений
Предупреждение о пути к изображению
Если вы используете свои собственные изображения, убедитесь, что указали абсолютный путь к каталогу изображений. В противном случае изображения могут не отображаться на веб-странице из-за ограничений Flask на обслуживание файлов.
from ultralytics import solutions
searcher = solutions.VisualAISearch(
# data = "path/to/img/directory" # Optional, build search engine with your own images
device="cuda" # configure the device for processing i.e "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 |
None |
Указывает устройство для инференса (например, cpu , cuda:0 или 0 ). Позволяет пользователям выбирать между CPU, конкретным GPU или другими вычислительными устройствами для выполнения модели. |
Преимущества семантического поиска изображений с помощью CLIP и FAISS
Создание собственной системы семантического поиска изображений с помощью CLIP и FAISS дает несколько убедительных преимуществ:
-
Возможности Zero-Shot: Вам не нужно обучать модель на вашем конкретном наборе данных. Zero-shot обучение CLIP позволяет выполнять поисковые запросы по любому набору изображений, используя естественный язык в свободной форме, что экономит время и ресурсы.
-
Человекоподобное понимание: В отличие от поисковых систем, основанных на ключевых словах, CLIP понимает семантический контекст. Он может извлекать изображения на основе абстрактных, эмоциональных или реляционных запросов, таких как «счастливый ребенок на природе» или «футуристический городской пейзаж ночью».
-
Отсутствие необходимости в метках или метаданных: Традиционные системы поиска изображений требуют тщательно размеченных данных. Этот подход требует только необработанные изображения. CLIP генерирует embeddings без необходимости ручной аннотации.
-
Гибкий и масштабируемый поиск: FAISS обеспечивает быстрый поиск ближайших соседей даже с крупномасштабными наборами данных. Он оптимизирован для скорости и памяти, обеспечивая отклик в реальном времени даже с тысячами (или миллионами) векторных представлений.
-
Кросс-доменные приложения: Независимо от того, создаете ли вы личный фотоархив, инструмент для творческого вдохновения, поисковую систему продуктов или даже систему рекомендаций произведений искусства, этот стек адаптируется к различным доменам с минимальными настройками.
Часто задаваемые вопросы
Как CLIP понимает изображения и текст?
CLIP (Contrastive Language Image Pretraining) — это модель, разработанная OpenAI, которая учится связывать визуальную и лингвистическую информацию. Она обучена на огромном наборе данных изображений в паре с подписями на естественном языке. Это обучение позволяет сопоставлять как изображения, так и текст в общее пространство встраивания, поэтому вы можете сравнивать их напрямую, используя векторное сходство.
Почему CLIP считается таким мощным для задач ИИ?
Что отличает CLIP, так это его способность к обобщению. Вместо того чтобы обучаться только для определенных меток или задач, он учится на самом естественном языке. Это позволяет ему обрабатывать гибкие запросы, такие как «человек, катающийся на гидроцикле» или «сюрреалистический пейзаж сновидений», что делает его полезным для всего, от классификации до творческого семантического поиска, без переобучения.
Что именно делает FAISS в этом проекте (семантический поиск)?
FAISS (Facebook AI Similarity Search) — это набор инструментов, который помогает очень эффективно искать в многомерных векторах. После того, как CLIP превратит ваши изображения во встроенные представления, FAISS позволяет быстро и легко находить наиболее близкие соответствия текстовому запросу, что идеально подходит для поиска изображений в реальном времени.
Зачем использовать Python-пакет Ultralytics, если CLIP и FAISS от OpenAI и Meta?
В то время как CLIP и FAISS разрабатываются OpenAI и Meta соответственно, пакет Ultralytics Python упрощает их интеграцию в полный конвейер семантического поиска изображений в рабочем процессе из 2 строк, который просто работает:
Поиск похожих изображений
from ultralytics import solutions
searcher = solutions.VisualAISearch(
# data = "path/to/img/directory" # Optional, build search engine with your own images
device="cuda" # configure the device for processing i.e "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
Эта высокоуровневая реализация обрабатывает:
- Генерация вложений изображений и текста на основе CLIP.
- Создание и управление индексами FAISS.
- Эффективный семантический поиск с косинусным сходством.
- Загрузка изображений на основе каталогов и визуализация.
Могу ли я настроить внешний интерфейс этого приложения?
Да, безусловно. В текущей настройке используется Flask с базовым HTML-интерфейсом, но вы можете свободно заменить его своим собственным HTML или даже создать что-то более динамичное с помощью React, Vue или другого интерфейсного фреймворка. Flask может легко служить серверным API для вашего пользовательского интерфейса.
Возможен ли поиск по видео, а не по статическим изображениям?
Не напрямую, но есть простой обходной путь. Вы можете извлечь отдельные кадры из своих видео (например, по одному в секунду), рассматривать их как отдельные изображения и передавать их в систему. Таким образом, поисковая система может семантически индексировать визуальные моменты из ваших видео.