Служба поиска сходства векторов изображений (3) — на основе ES

Elasticsearch

Обзор

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

Сцена поиска

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

Индекс вектора ЭС

  • Плотный вектор: хранит плотный вектор, хранящийся в виде массива полей с одним значением, максимальная длина массива не может превышать 2048, а длина массива каждого документа может быть разной.
  • Разреженный вектор: хранит разреженный вектор, хранящийся как объект json не вложенного типа, ключ — это позиция вектора, то есть строка целочисленного типа, диапазон — [0, 65535], а значение — значение вектора. Но разреженные векторы больше не поддерживаются после версии 7.6, используйте их с осторожностью.

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

  • Предусмотрены четыре метода расстояний: косинусный, манхэттенский, евклидов и скалярный.Конкретные коды следующие:
# 余弦距离
script_query = {
    "script_score": {
        "query": {"match_all": {}},
        "script": {
            "source": "cosineSimilarity(params.query_vector, doc['image_vector']) + 1.0",
            "params": {"query_vector": query_vector}
        }
    }
}
# 曼哈顿距离
script_query = {
    "script_score": {
        "query": {"match_all": {}},
        "script": {
            "source": "1 / (1 + l1norm(params.queryVector, doc['image_vector']))", 
            "params": {
            "queryVector": query_vector
            }
        }
    }
}
# 欧几里德距离
script_query = {
    "script_score": {
        "query": {"match_all": {}},
        "script": {
            "source": "1 / (1 + l2norm(params.queryVector, doc['image_vector']))",
            "params": {
            "queryVector": query_vector
            }
        }
    }
}

# DotProduct实现
script_query = {
    "script_score": {
        "query": {"match_all": {}},
        "script": {
            "source": """
                double value = doc['image_vector'].size() == 0 ? 0 : dotProduct(params.query_vector, doc['image_vector']);
                return value;
                """,
            "params": {"query_vector": query_vector}
        }
    }
}
response = self.client.search(
    index=self.index_name,
    body={
        "size": search_size,
        "query": script_query,
        "_source": {"includes": ["id", "name", "face_vector"]}
    }
)

установка Эс сервера

docker run -it -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.5.0

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

python index.py
--train_data:自定义训练图片文件夹路径,默认为`<ROOT_DIR>/data/train`
--index_file:自定义索引文件存储路径,默认为`<ROOT_DIR>/index/train.h5`
  • Операция 2: Используйте поиск по сходству
python retrieval.py --engine=es
--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

Суммировать

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

That's all!