图片向量相似检索服务(3)——基于ES实现

概述

检索场景

  • 推理流程:读取图片,算法生成特征向量
  • 特征入库:把特征向量存入ES中
  • 检索流程:线上实时向量检索
  • 具体流程如下图:

ES向量索引

  • Dense Vector:存储稠密向量,存储为单值字段数组,数组的最大长度不能超过2048,每个文档的数组长度可以不同
  • Sparse Vector:存储稀疏向量,存储为非嵌套类型的json对象,key是向量的位置,即integer类型的字符串,范围[0,65535],value是向量值。但7.6版本后不在支持稀疏向量,请谨慎使用

ES检索实现

  • 提供余弦、曼哈顿、欧式和点积四种距离方式,具体代码如下:
# 余弦距离
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"]}
    }
)

ES服务端安装

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`
  • 操作二:使用相似检索
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!

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
情感识别系统是一种可以自动判断和分类文本或语音中所表达的情感的算法。支持向量机(SVM)是一种常用的机器学习方法,在情感识别中也广泛应用。 SVM基于对数据进行特征映射,将数据从低维空间转化为高维空间,以便更好地进行分类。在情感识别中,我们可以将文本或语音数据转化为特征向量表示,然后使用SVM进行分类。通常选择常用的特征表示方法如词袋模型或者TF-IDF进行特征提取。 下面给出一个用Matlab实现情感识别系统的示例代码: ```matlab % 导入情感数据集 data = importdata('emotion_data.txt'); % 划分训练集和测试集 trainRatio = 0.8; trainSize = int32(length(data) * trainRatio); trainData = data(1:trainSize,:); testData = data(trainSize+1:end,:); % 提取特征和标签 trainFeatures = trainData(:,1:end-1); trainLabels = trainData(:,end); testFeatures = testData(:,1:end-1); testLabels = testData(:,end); % 创建SVM模型 svmModel = fitcsvm(trainFeatures, trainLabels); % 在测试集上进行预测 predictedLabels = predict(svmModel, testFeatures); % 计算准确率 accuracy = sum(predictedLabels == testLabels) / length(testLabels); disp(['准确率:' num2str(accuracy*100) '%']); ``` 以上代码中,我们首先导入情感数据集,然后将数据划分为训练集和测试集。接着我们提取特征和标签,即将文本数据转化为特征向量表示。 然后我们使用fitcsvm函数来创建SVM模型,并通过predict函数在测试集上进行预测。最后我们计算准确率来评估模型的性能。 这是一个简单的情感识别系统的实现示例,实际情感识别会有更多的特征提取方法和模型调参等工作。希望这个回答能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值