在云搜索服务的 ML 服务中,支持创建 Image Embedding 模型,该模型是将图像转换为低维的向量表示,以便于在各种机器学习任务中进行处理、分析和比较。本文介绍基于云搜索服务 Image Embedding 模型,快速搭建一套以图搜图和以文搜图的图文检索应用。
图文检索在电商、广告、设计、搜索引擎等热门领域被广泛应用。常见的图文检索包括以图搜图和以文搜图,用户通过输入文字描述或上传图片就可以在海量的图片库中快速找到同款或者相似图片。
输入的文本描述和图片作为检索对象,分别对 image 和 text 进行特征提取,并在模型中对文本和图片建立相关联系,然后在海量图片数据库进行特征向量检索,返回与检索对象最相关的记录集合。其中特征提取部分采用 CLIP 模型,向量检索采用火山引擎云搜索服务在海量图片特征中进行快速搜索。
目前仅 OpenSearch 2.9.0 版本实例支持 ML 服务。如何创建 OpenSearch 实例。具体操作,请参见创建实例。
在构建图文检索应用前,您需要提前准备好图片数据集,将这些图片文件上传到 TOS Bucket 中。
picture
。opensearch-remote-inference
插件本文通过在 Ingest Pipeline 中指定使用的 Image Embedding 模型,实现将指定字段(图片信息)转换为向量后嵌入回去。
在创建 Ingest Pipeline 前,需要提前在实例中安装opensearch-remote-inference
插件,否则会报错。安装插件会触发重启集群,建议在业务低峰期操作。如果已经安装该插件,则无需执行以下步骤。
opensearch-remote-inference
插件的操作列中勾选安装并选择需要安装的插件版本,然后单击批量提交。说明
安装插件会触发重启集群,建议在业务低峰期操作。
OpenSearch 实例创建后,您可以在实例中创建 ML 服务,用于后续的模型创建和部署。
说明
1:4
资源比例,能够保障模型服务应用的性能更佳。您可以在 ML 服务中创建 Image Embedding 模型。Image Embedding 模型类型支持 CLIP 和 ChineseCLIP 及其衍生模型。
云搜索服务为您提供了模型示例文件(model),您可以自行下载上传。
上传 Image Embedding 模型文件到 TOS Bucket。
创建模型。
登录云搜索服务控制台,在左侧导航栏选择 ML 服务,查找并单击目标服务名称。
在左侧导航栏选择模型管理,然后选择我的模型页签,再单击创建模型。
选择创建 Image Embedding 模型,然后设置模型相关参数,再单击确定。
参数 | 说明 |
---|---|
模型名称 | 自定义设置模型名称,比如 说明 Image Embedding 模型具备以下两种能力:
|
模型类型 | 此处需要选择创建 Image Embedding 模型。 |
选择存储桶 | 从下拉列表中选择存放模型文件的对象存储桶。 |
模型文件 | 选择对象存储文件,表示从选择的对象存储桶中选择模型文件,此时还需要设置对象存储文件夹,即从该文件夹中读取已经存在的模型文件。 |
描述 | 设置模型的描述语句。 |
创建并启动推理服务。
您可以创建一个推理服务,关联新建的 Image Embedding 模型,并根据业务需求配置网络、资源和自定义参数等信息。
在左侧导航栏选择推理服务,然后单击创建推理服务。
在创建推理服务面板,配置推理服务相关参数,然后单击确定。
配置 | 说明 |
---|---|
服务名称 | 自定义设置推理服务的名称,比如“image-search”。
|
选择模型 | 从拉列表框选择新建的 Image Embedding 模型。 |
可用区 | 选择需要部署推理服务的可用区。
|
是否开启高可用区 | 单可用区部署推理服务时,支持为推理服务开启高可用。 |
资源类型 | 从下拉列表中选择推理服务使用的资源类型,您可以选择 CPU 类型和 GPU 两种资源类型。 |
规格 | 从下拉列表中选择规格。 |
节点数量 | 设置推理服务的节点数量。
|
网络配置 | 是否开通私网访问。 |
描述 | 自定义设置推理服务的描述信息。 |
高级选项 | 为推理服务配置自定义参数,默认提供 |
启动推理服务。
获取 Image Embedding 模型调用信息。
推理服务启动后,在推理服务详情页面单击查看调用信息,然后获取模型的调用信息。
创建 Ingest Pipeline,需要指定使用的 Image Embedding 模型,可以将指定字段(图片信息)转换为向量后嵌入回去。
image_remote_embedding
的 Ingest Pipeline。url
:设置为从模型服务的调用信息中获取模型的url
。model
:设置从模型服务的调用信息中获取模型的model
,比如ImageSearch-Demo
。"vector_source_image": "vector"
:索引中的vector_source_image
字段含义为图片的 TOS Bucket 存放路径,该配置表示将vector_source_image
字段转为向量存储到vector
中。PUT _ingest/pipeline/image_remote_embedding { "description": "image embedding pipeline for remote inference", "processors": [ { "remote_text_embedding": { "remote_config": { "method": "POST", "url": "http://d-182800***-serve-svc.r-00g**:8000/v1/embeddings", "params": {}, "headers": { "Content-Type": "application/json" }, "advance_request_body": { "model": "ImageSearch-Demo" } } , "field_map":{ "vector_source_image": "vector" } } } ] }
创建 Search Pipeline,需要指定使用的 Image Embedding 模型。
image_remote_embedding_search_pipeline
的 Search Pipeline。url
:设置为从模型服务的调用信息中获取模型的url
。model
:设置从模型服务的调用信息中获取模型的model
,比如ImageSearch-Demo
。PUT _search/pipeline/image_remote_embedding_search_pipeline { "description": "image embedding pipeline for remote inference", "request_processors": [ { "remote_embedding": { "remote_config": { "method": "POST", "url": "http://d-1828002***-serve-svc.r-00g***:8000/v1/embeddings", "params": {}, "headers": { "Content-Type": "application/json" }, "advance_request_body": { "model": "ImageSearch-Demo" } } } } ] }
OpenSearch 实例创建后,您可以在实例中创建一个索引,用于存储图片的向量信息。
image_search
的索引。
default_pipeline
为新建的 Ingest Pipeline,ID 为image_remote_embedding
。vector
设置为knn_vector
,dimension
需要和使用的模型保持相同维度,比如512
。PUT imagesearch { "settings": { "default_pipeline": "image_remote_embedding", "index": { "refresh_interval": "60s", "number_of_shards": "3", "knn.space_type": "cosinesimil", "knn": "true", "number_of_replicas": "1" } }, "mappings": { "properties": { "id": { "type": "text" }, "vector_source_image": { "type": "text" }, "vector": { "type": "knn_vector", "dimension": 512, "method": { "name": "hnsw", "engine": "nmslib", "space_type": "cosinesimil" } } } } }
完成实例中的索引创建后,您可以将 TOS Bucket 中的图片写入到索引中。
登录可视化工具,进入命令行。
执行以下命令,将 TOS Bucket 中的图片写入到imagesearch
索引中。
POST _bulk { "index" : { "_index" : "imagesearch" } } { "id": "0a655b1f2c18632a534796bbf46a4ff7", "vector_source_image" : "tos://doc-test/picture/image_temp/0a655b1f2c18632a534796bbf46a4ff7.jpg" } { "index" : { "_index" : "imagesearch" } } { "id": "0a6854edd10ed7bf0aea33f49f6bf340", "vector_source_image" : "tos://doc-test/picture/image_temp/0a6854edd10ed7bf0aea33f49f6bf340.jpg" } { "index" : { "_index" : "imagesearch" } } { "id": "0ad4ea74a741352eb24dd12b1a3becfc", "vector_source_image" : "tos://doc-test/picture/image_temp/0ad4ea74a741352eb24dd12b1a3becfc.jpg" } { "index" : { "_index" : "imagesearch" } } { "id": "0ae481e0fba3fefae791a32f0432580a", "vector_source_image" : "tos://doc-test/picture/image_temp/0ae481e0fba3fefae791a32f0432580a.jpg" } { "index" : { "_index" : "imagesearch" } } { "id": "0b11ced2ae68745b38e5fd252c11384f", "vector_source_image" : "tos://doc-test/picture/image_temp/0b11ced2ae68745b38e5fd252c11384f.jpg" }
(可选)图片写入后,可以通过查询接口,判断是否已经写入图片数据。
POST imagesearch/_search { "query": { "match_all": {} } }
完成图文检索应用构建,并写入图片数据后,您可以进行以文搜图和以图搜图的操作。在 Dev Tools 中,执行以下命令,根据检索关键字查询图片。
说明
通过在query_text
中填入不同信息来区分以文搜图和以图搜图。
White T-shirt
。tos://doc-test/picture/image_temp/aaa.jpg
。data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgA....
。POST imagesearch/_search?search_pipeline=image_remote_embedding_search_pipeline { "query": { "bool": { "must": [ { "remote_neural": { "vector": { "query_text": "White T-shirt", "k": 1 } } } ] } } }
完成图文检索应用构建,并写入图片数据后,您可以进行以文搜图和以图搜图的操作。在 Dev Tools 中,执行以下命令,根据输入的图片信息来查询图片。
说明
通过在query_text
中填入不同信息来区分以文搜图和以图搜图。
tos://doc-test/picture/image_temp/aaa.jpg
。data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgA....
。White T-shirt
。POST imagesearch/_search?search_pipeline=image_remote_embedding_search_pipeline { "query": { "bool": { "must": [ { "remote_neural": { "vector": { "query_text": "tos://doc-test/picture/image_temp/aaa.jpg", "k": 1 } } } ] } } }
本文中创建的 Image Embedding 模型,支持直接对图片和文字进行向量化,返回向量化结果。
您可以在相同 VPC 环境的 ECS 中,通过调用 Image Embedding 模型的私网访问地址,获取图片和文字的向量化结果。具体操作流程,请参见调用 Embedding 模型。