Служба поиска сходства векторов изображений (5) - на основе milvus

поисковый движок

Обзор

  • Чтобы попытаться «поискать изображения по изображениям» в подобных сценариях поиска изображений, система поиска изображений разработана на основе расчета векторного индекса ES и модели извлечения признаков изображения VGG16.
  • Адрес в открытом доступе:На GitHub.com/thhirty one есть...

Сцена поиска

  • Процесс рассуждения: прочитайте изображение, и алгоритм сгенерирует вектор признаков.
  • Хранилище признаков: хранить векторы признаков в Milvus
  • Процесс поиска: онлайн-поиск векторов в реальном времени
  • Конкретный процесс выглядит следующим образом:

Установка сервера Milvus

  mkdir -p milvus/conf && cd milvus/conf
  wget https://raw.githubusercontent.com/milvus-io/milvus/0.10.6/core/conf/demo/server_config.yaml
  • запуск службы
  docker run -d --name milvus_cpu_0.11.0 \
  -p 19530:19530 \
  -p 19121:19121 \
  -v <ROOT_DIR>/milvus/db:/var/lib/milvus/db \
  -v <ROOT_DIR>/milvus/conf:/var/lib/milvus/conf \
  -v <ROOT_DIR>/milvus/logs:/var/lib/milvus/logs \
  -v <ROOT_DIR>/milvus/wal:/var/lib/milvus/wal \
  milvusdb/milvus:0.10.6-cpu-d022221-64ddc2

База данных построения векторного индекса Milvus

  • Здесь для построения библиотеки используется векторная библиотека h5py, которая была размещена на диске.
  • Тип извлечения — внутренний продукт: MetricType.IP.
  # 1. 读取索引
  h5f = h5py.File(index_dir, 'r')
  self.retrieval_db = h5f['dataset_1'][:]
  self.retrieval_name = h5f['dataset_2'][:]
  h5f.close()
  # 2. 入库Milvus
  if self.index_name in self.client.list_collections()[1]:
      self.client.drop_collection(collection_name=self.index_name)
  self.client.create_collection({'collection_name': self.index_name, 'dimension': 512, 'index_file_size': 1024, 'metric_type': MetricType.IP})
  self.id_dict = {}
  status, ids = self.client.insert(collection_name=self.index_name, records=[i.tolist() for i in self.retrieval_db])
  for i, val in enumerate(self.retrieval_name):
      self.id_dict[ids[i]] = str(val)
  self.client.create_index(self.index_name, IndexType.FLAT, {'nlist': 16384})
  # pprint(self.client.get_collection_info(self.index_name))
  print("************* Done milvus indexing, Indexed {} documents *************".format(len(self.retrieval_db)))

Реализация поиска Milvus

  • В соответствии с определением при загрузке индекса здесь для извлечения используется метод расчета расстояния скалярного произведения.Конкретный код выглядит следующим образом:
_, vectors = self.client.search(collection_name=self.index_name, query_records=[query_vector], top_k=search_size, params={'nprobe': 16})
  • Переключение на евклидово: MetricType.L2

Операция Введение

python index.py
--train_data:自定义训练图片文件夹路径,默认为`<ROOT_DIR>/data/train`
--index_file:自定义索引文件存储路径,默认为`<ROOT_DIR>/index/train.h5`
  • Операция 2: Используйте поиск по сходству
python retrieval.py --engine=milvus
--test_data:自定义测试图片详细地址,默认为`<ROOT_DIR>/data/test/001_accordion_image_0001.jpg`
--index_file:自定义索引文件存储路径,默认为`<ROOT_DIR>/index/train.h5`
--db_name:自定义ES或者Milvus索引库名,默认为`image_retrieval`
--engine:自定义检索引擎类型,默认为`numpy`,可选包括:numpy、faiss、es、milvus

Суммировать

  • Простое для понимания управление на основе библиотеки
  • Используйте позу, похожую на ES, но лучше, чем ES.
  • Поскольку Milvus в настоящее время поддерживает только векторный поиск и не поддерживает скалярную корреляцию, если задействована скалярная фильтрация, вам необходимо создать собственную бизнес-библиотеку.
  • Сообщество Milvus в будущем будет поддерживать распределенные системы, которые смогут легче справляться со сценариями с большими индексами.

That's all!