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-filteringPost-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)512Joint text-image, хорош для zero-shotУниверсальный выбор, если запросы текстовые
SigLIP (Google)768Улучшенная loss-функция, лучше для fine-tuningКогда нужна высокая точность на специфичных доменах
DINOv2 (Meta)384Self-supervised, силён в визуальном сходствеПоиск похожих изображений без текста
BLIP-2768Мультимодальный, понимает сложные запросыКогда запросы содержат несколько объектов

Для фильтрации по метаданным модель эмбеддингов не важна — метаданные обрабатываются отдельно. Главное, чтобы эмбеддинги хорошо отражали семантику изображения.


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» → формирует векторный запрос + фильтр → возвращает результаты агенту. Агент может дополнительно переспрашивать или комбинировать с текстовым поиском.


Пет-проект для закрепления

Задача Создать систему поиска изображений по семантическому запросу с фильтрацией по дате и местоположению.

Инструменты

Шаги:

  1. Установить Qdrant в Docker: docker run -p 6333:6333 qdrant/qdrant
  2. Извлечь эмбеддинги изображений с помощью CLIP (768-мерные).
  3. Создать коллекцию в Qdrant с payload-полями: date (datetime), location (str), camera (str).
  4. Загрузить векторы и метаданные (из EXIF или CSV).
  5. Реализовать функцию поиска с pre-filtering (как в примере выше).
  6. Написать простой CLI или Streamlit-интерфейс: ввод текста + фильтры → вывод изображений.

Ожидаемый результат Работающий поиск, где запрос "красивый закат" с фильтром date > 2023-01-01, location = "Paris" возвращает только релевантные фото из Парижа после 2023 года.

Усложнение Добавить re-ranking с помощью CLIP score или другой модели.


Связь с другими вопросами

ВопросТема
561Гибридный поиск (векторный + keyword)
562Выбор векторной БД (Qdrant, Weaviate, Milvus)
564Re-ranking результатов retrieval
565Использование агентов для multi-step поиска
566Мультимодальный RAG (текст + изображения)
568Обработка метаданных в RAG-пайплайне

Навигация