English translation is not available yet. Showing Russian content.
Как вы делаете image retrieval с фильтрацией по метаданным (дата, местоположение, камера)?
Краткий тезис
Image retrieval с фильтрацией по метаданным — это поиск|гибридный поиск, где сначала применяется фильтр по структурированным полям (дата, локация, модель камеры), а затем — ANN-поиск (Approximate Nearest Neighbor) по векторным эмбеддингам изображений. Такой подход (pre-filtering) позволяет резко сократить область поиска и повысить точность, не теряя семантической близости. Ключевые инструменты — векторные БД с поддержкой фильтрации (Qdrant, Weaviate, Milvus, Elasticsearch) и предобученные модели для извлечения эмбеддингов (CLIP, SigLIP, DINOv2).
1. Терминология: image retrieval, метаданные, эмбеддинги
Image retrieval — задача поиска изображений по визуальному сходству или семантическому запросу. В современных системах изображения кодируются в векторные эмбеддинги — компактные числовые представления (обычно 512–1024 float), сохраняющие семантику.
Метаданные — структурированная информация об изображении: дата съёмки (timestamp), GPS-координаты, модель камеры, разрешение, теги и т.д. Они хранятся отдельно от эмбеддинга, но в той же записи векторной БД.
ANN (Approximate Nearest Neighbor) — алгоритм приближённого поиска ближайших соседей (HNSW, IVF, PQ), который находит топ-k векторов, наиболее близких к вектору запроса. ANN жертвует точностью ради скорости (обычно 99% recall при 10x ускорении).
Фильтрация по метаданным — наложение условий на структурированные поля до или после ANN-поиска. Различают pre-filtering (фильтр сначала, потом поиск) и post-filtering (поиск сначала, потом отсев).
2. Pre-filtering vs Post-filtering: сравнение подходов
| Характеристика | Pre-filtering | Post-filtering |
|---|---|---|
| Порядок операций | Сначала фильтр по метаданным, затем ANN по отфильтрованному подмножеству | Сначала ANN по всей коллекции, затем отсев по метаданным |
| Скорость | Быстрее при сильной фильтрации (мало объектов) | Медленнее при большом количестве результатов (нужно искать больше, чем k) |
| Точность | Высокая — ANN работает только с релевантным подмножеством | Может потерять релевантные объекты, если они не попали в top-k ANN |
| Реализация в БД | Требует поддержки filtered ANN (Qdrant, Weaviate, Milvus) | Проще — можно сделать на стороне приложения |
| Использование индекса | Индекс строится на всём наборе, фильтр применяется на уровне запроса | Индекс используется без фильтра, потом отсев |
| Риск | Если фильтр слишком строгий — пустой результат | Если фильтр слабый — много лишних вычислений |
Вывод Pre-filtering предпочтительнее для production, так как позволяет использовать ANN на релевантном подмножестве, экономя ресурсы. Post-filtering применяется, когда БД не поддерживает фильтрацию на уровне индекса или когда метаданные меняются редко.
3. Архитектура системы image retrieval с фильтрацией
[Пользователь] → [Запрос: текст/изображение + фильтры]
↓
[Encoder (CLIP)] → вектор запроса (query embedding)
↓
[Векторная БД (Qdrant)] → pre-filter по метаданным → ANN search
↓
[Результаты: top-k изображений + метаданные]
↓
[Пост-обработка: re-ranking, дедупликация]
↓
[Ответ пользователю]
Компоненты
- Encoder: модель для получения эмбеддингов изображений и текстовых запросов (CLIP ViT-B/32, SigLIP, DINOv2). Для image retrieval обычно используют единое пространство (joint embedding space).
- Векторная БД: хранит пары (эмбеддинг, метаданные). Поддерживает фильтрацию через DSL (Domain Specific Language).
- Фильтр: условия на поля (date > '2023-01-01', location = 'NYC', camera_model = 'Canon EOS R5').
- ANN-индекс: HNSW (Hierarchical Navigable Small World) — наиболее популярный алгоритм для высокоразмерных векторов.
4. Пример реализации на Qdrant (Python)
from qdrant_client import QdrantClient
from qdrant_client.http.models import Filter, FieldCondition, Range, MatchValue
import numpy as np
# Инициализация клиента
client = QdrantClient(host="localhost", port=6333)
# Предположим, коллекция 'images' уже создана с payload-полями:
# date (datetime), location (str), camera (str), embedding (vector 512d)
def search_images(query_embedding: np.ndarray,
date_from: str = None,
location: str = None,
camera: str = None,
top_k: int = 10):
# Строим фильтр
must_conditions = []
if date_from:
must_conditions.append(
FieldCondition(key="date", range=Range(gte=date_from))
)
if location:
must_conditions.append(
FieldCondition(key="location", match=MatchValue(value=location))
)
if camera:
must_conditions.append(
FieldCondition(key="camera", match=MatchValue(value=camera))
)
filter_obj = Filter(must=must_conditions) if must_conditions else None
# Pre-filtering + ANN search
results = client.search(
collection_name="images",
query_vector=query_embedding.tolist(),
query_filter=filter_obj,
limit=top_k,
with_payload=True
)
return results
# Пример использования
query_vec = clip_model.encode("sunset over bridge")
hits = search_images(query_vec, date_from="2023-06-01", location="San Francisco")
for hit in hits:
print(hit.payload["filename"], hit.score)
Пояснение Qdrant автоматически применяет фильтр перед ANN-поиском (pre-filtering). Если фильтр отсекает много записей, ANN ищет только среди оставшихся — это эффективно.
5. Выбор модели эмбеддингов для image retrieval
| Модель | Размерность | Особенности | Когда использовать |
|---|---|---|---|
| CLIP (OpenAI) | 512 | Joint text-image, хорош для zero-shot | Универсальный выбор, если запросы текстовые |
| SigLIP (Google) | 768 | Улучшенная loss-функция, лучше для fine-tuning | Когда нужна высокая точность на специфичных доменах |
| DINOv2 (Meta) | 384 | Self-supervised, силён в визуальном сходстве | Поиск похожих изображений без текста |
| BLIP-2 | 768 | Мультимодальный, понимает сложные запросы | Когда запросы содержат несколько объектов |
Для фильтрации по метаданным модель эмбеддингов не важна — метаданные обрабатываются отдельно. Главное, чтобы эмбеддинги хорошо отражали семантику изображения.
6. Индексация и хранение метаданных
Метаданные хранятся в payload (Qdrant) или properties (Weaviate) — это JSON-подобные структуры, привязанные к каждой точке (вектору). Для эффективной фильтрации поля должны быть проиндексированы:
# Qdrant: создание коллекции с payload-индексами
from qdrant_client.http.models import PayloadSchemaType
client.create_payload_index(
collection_name="images",
field_name="date",
field_schema=PayloadSchemaType.DATETIME
)
client.create_payload_index(
collection_name="images",
field_name="location",
field_schema=PayloadSchemaType.KEYWORD # для точного совпадения
)
client.create_payload_index(
collection_name="images",
field_name="camera",
field_schema=PayloadSchemaType.KEYWORD
)
Без индексов фильтрация будет выполняться полным сканированием — это медленно.
7. Проблемы и их решения
| Проблема | Причина | Решение |
|---|---|---|
| Pre-filtering слишком строгий → пустой результат | Пользователь задал узкий фильтр | Вернуть fallback (убрать часть фильтров) или показать сообщение |
| Post-filtering теряет релевантные изображения | ANN вернул мало кандидатов | Увеличить limit в ANN (например, top-100 вместо top-10), потом отфильтровать |
| Низкая скорость при большом количестве метаданных | Фильтр по неиндексированному полю | Создать payload-индексы; использовать битовые маски для категориальных полей |
| Разные типы запросов (текст vs изображение) | CLIP работает лучше для текстовых запросов | Использовать query expansion или мультимодальный encoder |
| Дрейф метаданных (например, переименование локации) | Метаданные устарели | Периодически обновлять payload через batch update |
8. Когда использовать pre-filtering, а когда post-filtering?
- Pre-filtering — стандартный выбор для production. Подходит, когда фильтры известны заранее и БД поддерживает filtered ANN.
- Post-filtering — когда БД не поддерживает фильтрацию на уровне индекса (например, FAISS без метаданных) или когда метаданные очень динамичны (часто меняются). Также полезен, если фильтр применяется редко и можно пожертвовать скоростью.
Гибридный подход сначала pre-filtering по грубым метаданным (год, страна), затем post-filtering по точным (модель камеры, GPS). Это баланс между скоростью и точностью.
9. Примеры применения в реальных задачах
- Фотогалереи (Google Photos, Apple Photos): поиск по объектам + фильтр по дате, месту, камере.
- Медицинская визуализация поиск снимков МРТ по патологии (эмбеддинг) + фильтр по дате исследования, типу аппарата, возрасту пациента.
- E-commerce поиск товаров по изображению + фильтр по цене, бренду, категории.
- Наблюдение (surveillance): поиск лица по базе + фильтр по времени и зоне камеры.
10. Связь с Agentic RAG
В контексте Agentic RAG image retrieval с фильтрацией может быть частью инструмента (tool), который агент вызывает для поиска визуальной информации. Например, агент получает запрос «Найди фотографии Эйфелевой башни, сделанные в 2024 году на iPhone» → формирует векторный запрос + фильтр → возвращает результаты агенту. Агент может дополнительно переспрашивать или комбинировать с текстовым поиском.
Пет-проект для закрепления
Задача Создать систему поиска изображений по семантическому запросу с фильтрацией по дате и местоположению.
Инструменты
- Python, Qdrant (или Weaviate) в Docker
- Модель CLIP (openai/clip-vit-base-patch32) через transformers
- Набор изображений (например, Flickr30k или собственные фото с EXIF)
Шаги:
- Установить Qdrant в Docker:
docker run -p 6333:6333 qdrant/qdrant - Извлечь эмбеддинги изображений с помощью CLIP (768-мерные).
- Создать коллекцию в Qdrant с payload-полями:
date(datetime),location(str),camera(str). - Загрузить векторы и метаданные (из EXIF или CSV).
- Реализовать функцию поиска с pre-filtering (как в примере выше).
- Написать простой CLI или Streamlit-интерфейс: ввод текста + фильтры → вывод изображений.
Ожидаемый результат Работающий поиск, где запрос "красивый закат" с фильтром date > 2023-01-01, location = "Paris" возвращает только релевантные фото из Парижа после 2023 года.
Усложнение Добавить re-ranking с помощью CLIP score или другой модели.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 561 | Гибридный поиск (векторный + keyword) |
| 562 | Выбор векторной БД (Qdrant, Weaviate, Milvus) |
| 564 | Re-ranking результатов retrieval |
| 565 | Использование агентов для multi-step поиска |
| 566 | Мультимодальный RAG (текст + изображения) |
| 568 | Обработка метаданных в RAG-пайплайне |
Навигация
- Предыдущий: 562
- Следующий: 564
- Индекс: 00. Индекс разборов