Обзор
- Чтобы попытаться «поискать изображения по изображениям» в подобных сценариях поиска изображений, система поиска изображений разработана на основе расчета векторного индекса 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
Операция Введение
- Загрузите исходный код проекта:На GitHub.com/thhirty one есть...
- Операция 1: Создайте базовый индекс
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!