Семантический поиск изображений с помощью OpenAI CLIP и Meta FAISS
Введение
Это руководство поможет вам создать семантическую систему поиска изображений с помощью OpenAI CLIP, Meta FAISS и Flask. Объединив мощные визуально-языковые вкрапления CLIP с эффективным поиском ближайших соседей FAISS, вы сможете создать полнофункциональный веб-интерфейс, позволяющий извлекать релевантные изображения с помощью запросов на естественном языке.
Семантический поиск изображений Визуальный просмотр
Как это работает
- 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 дает несколько неоспоримых преимуществ:
-
Возможности "нулевого выстрела": Вам не нужно обучать модель на конкретном наборе данных. Обучение CLIP с нулевым результатом позволяет выполнять поисковые запросы по любому набору данных изображений с использованием естественного языка в свободной форме, что экономит время и ресурсы.
-
Человекоподобное понимание: В отличие от поисковых систем, основанных на ключевых словах, CLIP понимает семантический контекст. Он может получать изображения по абстрактным, эмоциональным или реляционным запросам, например "счастливый ребенок на природе" или "футуристический городской пейзаж ночью".
-
Отсутствие необходимости в метках и метаданных: Традиционные системы поиска изображений требуют тщательно промаркированных данных. Для этого подхода нужны только необработанные изображения. CLIP генерирует вкрапления, не требуя ручной аннотации.
-
Гибкий и масштабируемый поиск: FAISS обеспечивает быстрый поиск ближайших соседей даже в больших наборах данных. Он оптимизирован для скорости и памяти, что позволяет работать в реальном времени даже с тысячами (или миллионами) вкраплений.
-
Междоменные приложения: Создаете ли вы личный фотоархив, инструмент для творческого вдохновения, поисковую систему по товарам или даже систему рекомендаций по искусству - этот стек адаптируется к различным доменам с минимальными изменениями.
ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ
Как CLIP понимает изображения и текст?
CLIP (Contrastive Language Image Pretraining) - это модель, разработанная OpenAI, которая учится связывать визуальную и лингвистическую информацию. Она обучается на огромном наборе данных изображений, сопровождаемых подписями на естественном языке. Это обучение позволяет ей отображать изображения и текст в общее пространство встраивания, что позволяет сравнивать их напрямую, используя векторное сходство.
Почему CLIP считается таким мощным для задач искусственного интеллекта?
Отличительной особенностью CLIP является его способность к обобщению. Вместо того чтобы обучаться на конкретных метках или задачах, он учится на естественном языке. Это позволяет ему обрабатывать такие гибкие запросы, как "человек, катающийся на гидроцикле" или "сюрреалистический пейзаж сна", что делает его полезным для всего, от классификации до творческого семантического поиска, без необходимости переобучения.
Чем именно занимается FAISS в этом проекте (Семантический поиск)?
FAISS (Facebook AI Similarity Search) - это набор инструментов, который помогает очень эффективно искать по высокоразмерным векторам. После того как CLIP превратит ваши изображения в эмбеддинги, FAISS позволит быстро и легко найти наиболее близкие соответствия текстовому запросу, что идеально подходит для поиска изображений в режиме реального времени.
Почему стоит использовать Ultralytics Python , если CLIP и FAISS - от OpenAI и Meta?
Хотя CLIP и FAISS разработаны компаниями OpenAI и Meta соответственно, пакетUltralytics Python упрощает их интеграцию в полноценный семантический конвейер поиска изображений в виде двухстрочного рабочего процесса, который просто работает:
Поиск похожих изображений
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 для вашего пользовательского интерфейса.
Можно ли искать по видео, а не по статичным изображениям?
Не напрямую, но есть простой обходной путь. Вы можете извлекать из видео отдельные кадры (например, по одному в секунду), рассматривать их как самостоятельные изображения и передавать в систему. Таким образом, поисковая система сможет семантически индексировать визуальные моменты из ваших видео.