解读亚马逊云科技语义搜图检索方案

 图像检索(包括文搜图和图搜图)是各个行业中常见的一个应用场景。比如在电商场景中,基于以图搜图做相似商品查找;在云相册场景中,基于文搜图来找寻所需的图像素材。

 传统基于标签的图像检索方式,即先使用目标检测/图像分类产品(如亚马逊云科技Amazon Rekognation)产生图片标签,再存储标签并在检索时匹配标签,存在一些局限性。第一是该方法受限于产品本身支持的标签数量,比如Amazon Rekognation支持3000个左右的标签,对于标签之外的目标无法检测并检索。第二是标签检索对动词、数量、方位等信息不敏感。诸如“两个孩子在一栋房子前面奔跑”,会出现包含“孩子,房子”标签的图像,但容易忽略“两个,前面,奔跑”等信息。

 下文将将介绍两种基于语义的搜图检索方式以及部署方案,可以实际测试两种方式在特定应用场景下的搜索率以及搜索的准确性,并选择更加适合的方案使用。

 方案一:利用CLIP模型的文本编码器和图像编码器,将图像和文本放入同一维度的潜在向量空间中,找到与文本向量最相近的图像向量以实现基于语义的图像搜索。如下图所示,可以看到图像对应的Image embedding在向量空间的位置,不同文本会同样被编码至向量空间中,当图像和文字语义最相近时,其Image embedding和Text embedding的余弦距离最近。

 方案二:利用图生文模型(案例使用vit-gpt2-image-captioning模型,可替换)先对图像产生对应的文本描述,再将生成的图片描述文本与查询文本放入同一维度的潜在向量空间中,找到与查询文本向量最相近的描述文本向量所对应的图像,以实现基于语义的图像搜索。如下图所示,可以看到图像经过vit-gpt2-image-captioning模型后,产生“a black and white dog and a brown and white dog”的描述文本。对于语义最相近的文本,其Text embedding之间的余弦距离最近。

 CLIP模型介绍

 CLIP(Contrastive Language-Image Pre-Training)是由OpenAI于2021年推出的一种深度学习模型。它主要包含两个组成部分:一个用于图像编码的卷积神经网络(Convolutional Neural Network,CNN)和一个用于文本编码的Transformer模型。这两个编码器将图像和文本编码输入至相同的潜在向量空间中,并使得相似的图像和文本在潜在向量空间中的距离更近。

 vit-gpt2-image-captioning模型介绍

 vit-gpt2-image-captioning模型利用Vision Transformer(例如ViT、BEiT、DeiT、Swin)对图像进行编码,然后基于预训练的语言模型(例如RoBERTa、GPT2、BERT、DistilBERT)产生文本,从而实现“看图说话”的能力。

 OpenSearch k-NN介绍

 Amazon OpenSearch支持k-NN搜索,可让在向量空间中通过欧几里得距离或余弦距离查找点之间的“最近邻”。在语义搜图检索方案中,主要包括两个阶段:

  • 构建k-NN index——在此阶段,将产生的图像向量,或描述文本向量,保存到OpenSearch服务中的k-NN index中。k-NN的基本概念是相似数据点存在于嵌入空间中非常接近的位置。例如,文本“一朵红花”、文本“红玫瑰”和“红玫瑰”图像语义相似,因此这些文本和图像在潜在向量空间的位置是彼此接近的。

  • 查询k-NN index——在此阶段,通过实时机器学习模型对查询文本或者图像进行编码,形成向量。随后使用该文本向量来查询存储在OpenSearch服务中的k-NN index,k-NN index从潜在向量空间返回相似的向量。例如,如果您的查询文本是“一朵红花”,它将返回红玫瑰图像的向量作为类似的项目。

 方案架构

 整体方案架构及介绍如下:

  • 通过预训练的CLIP模型和vit-gpt2-image-captioning模型创建一个用来进行批量和实时推理的SageMaker模型。

  • 使用SageMaker批量转换作业生成图像Embedding或图像描述文本Embedding。

  • 使用SageMaker实时推理(或无服务器推理)来将图像和文本进行实时编码,产生图像Embedding或图像描述文本Embedding。

  • 使用Amazon Simple Storage Service(Amazon S3)作为主要存储服务,存储原始图像以及SageMaker批量转换作业产生的Embedding文件。

  • 使用OpenSearch服务来存储向量并查找相关的向量。

  • 使用一个查询函数来编排查询编码并执行k-NN搜索。

 该方案具有以下优势:

  • 灵活构建。可以非常方便的替换CLIP模型或vit-gpt2-image-captioning模型至其他模型,只需要在SageMaker上创建相关模型并部署终端节点即可;也可以替换OpenSearch使用其他的向量数据库。

  • 可快速构建大规模生产应用。该方案基于SageMaker,OpenSearch,S3等服务构建,生产应用时无需过多担心资源限制及拓展,帮助您在快速进行场景测试后进入大规模生产应用。

 结语

 综上所诉,探究了基于CLIP模型和图生文模型的语义搜图检索方案,适用于以图搜图做相似商品查找、基于文搜图来找寻所需的图像素材等众多场景。并且此方案具有灵活构建的特性,并可以快速构建大规模生产应用的优势,有助于客户提高生产效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/118015.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决FreeRTOS程序跑不起来,打印调试却提示“Error:..\FreeRTOS\port\RVDS\ARM_CM3\port.c,244“的方法

前言 今天来分享一个不会造成程序编译报错,但会使程序一直跑不起来,并且通过调试会发现有输出错误提示的错误例子分析,话不多说,我们就直接开始分析~ 首先,我们说过这个例子在编译时候没有明示的错误提示&#xff0c…

【C++习题集】-- 顺序表、链表

(用于复习) 目录 线性表 顺序表 链表 单链表 单向 \ 双向 带哨兵位 \ 不带哨兵位 循环 \ 非循环 无头单向非循环链表实现 oj题 203. 移除链表元素 206. 反转链表 快慢指针 141.环形链表 【解题思路】 带头双向循环链表 顺序表和链表的区…

【计算机网络】HTTP

文章目录 1.HTTP概念2. URLurlencode 和 urldecode转义规则 3. HTTP的宏观理解HTTP的请求HTTP的响应 4. 见一见HTTP请求和响应请求报头 1. 模拟一个简单的响应response响应报头 2. 从路径中获取内容ReadFile函数的实现 3.不同资源进行区分反序列化的实现ReadOneLine函数的实现P…

如何将两个pdf合并成一个?pdf合并技巧分享

在日常工作过程当中,我们经常需要处理一些文件,而文件的处理往往是琐碎的,想要提高工作效率,需要选择一些合适的方法,并掌握一定的技巧,那么,如何将两个pdf合并成一个?pdf合并技巧有哪些呢?接…

hadoop学习:mapreduce入门案例四:partitioner 和 combiner

先简单介绍一下partitioner 和 combiner Partitioner类 用于在Map端对key进行分区 默认使用的是HashPartitioner 获取key的哈希值使用key的哈希值对Reduce任务数求模决定每条记录应该送到哪个Reducer处理自定义Partitioner 继承抽象类Partitioner,重写getPartiti…

ELK日志收集系统集群实验(5.5.0版)

目录 前言 一、概述 二、组件介绍 1、elasticsearch 2、logstash 3、kibana 三、架构类型 四、ELK日志收集集群实验 1、实验拓扑 2、在node1和node2节点安装elasticsearch 3、启动elasticsearch服务 4、在node1安装elasticsearch-head插件 5、测试输入 6、node1服…

redis实战-实现优惠券秒杀解决超卖问题

全局唯一ID 唯一ID的必要性 每个店铺都可以发布优惠券: 当用户抢购时,就会生成订单并保存到tb_voucher_order这张表中,而订单表如果使用数据库自增ID就存在一些问题: id的规律性太明显,容易被用户根据id的间隔来猜测…

JavaScript关于函数的小挑战

题目 回到两个体操队,即海豚队和考拉队! 有一个新的体操项目,它的工作方式不同。 每队比赛3次,然后计算3次得分的平均值(所以每队有一个平均分)。 只有当一个团队的平均分至少是另一个团队的两倍时才会获胜。否则&…

排盘程序算法探寻举例(陆先生八字)

算法实现: 1.庚生未月,燥土不能生金,日支申金为日主墙根,月干辛金比劫透出傍身,月干强。年干甲木自做寅木强根,又得月支乙木中气,甲木强旺有力,时干丙火七杀得未土余气,…

Spring 中存取 Bean 的相关注解

目录 一、五大类注解 1、五大类注解存储Bean对象 1.1Controller(控制器储存) 1.2Service(服务存储) 1.3Repository(仓库存储) 1.4Component(组件存储) 1.5Configuration(配置存储) 2、五大类注解小结 2.1为什么要这么多类注解 2.2 五大类注解之间的关系 二、方法注解 1.方法注…

linux编程第一部分总结

C多线程安全原则 对象析构很复杂&#xff0c;我们采用shared_ptr和weak_ptr来做 enable_shared_from_this<>是用来做回调的&#xff0c;因为多线程中可能对象的生命周期比传出去的this指针短&#xff0c;同时为了不延长对象的生命周期&#xff0c;我们把shared_ptr转成we…

c++ vs2019 cpp20规范的STL库的map与multimap源码分析

map就是一个红黑树。 标准平衡二叉树&#xff0c;要求左右子树的高度差不超过1 。红黑树只要求左右子树的高度差不超过一倍即可。兼顾了树平衡与效率。避免了AVL树的频繁调整树平衡。 b站 的“可雷曼土”大师&#xff0c;讲红黑树的理论讲的很透彻&#xff0c;再结合看代码&…

Linux-安装redis6.2.1及主备复制模式(replication)

Linux-安装redis6.2.1 下载redis6.2.1资源上传至安装目录解压及编译解压修改名称编译 修改配置文件主节点从节点 启动及测试启动主节点从节点 测试 下载redis6.2.1资源 地址》https://redis.io/download/ 上传至安装目录 例&#xff1a;/data/replication/ 解压及编译 解…

二进制安全虚拟机Protostar靶场 安装,基础知识讲解,破解STACK ZERO

简介 pwn是ctf比赛的方向之一&#xff0c;也是门槛最高的&#xff0c;学pwn前需要很多知识&#xff0c;这里建议先去在某宝上买一本汇编语言第四版&#xff0c;看完之后学一下python和c语言&#xff0c;python推荐看油管FreeCodeCamp的教程&#xff0c;c语言也是 pwn题目大部…

Jupyter lab 配置

切换jupyterlab的默认工作目录 在终端中输入以下命令 PS C:\Users\Administrator> jupyter-lab --generate-config Writing default config to: C:\Users\Administrator\.jupyter\jupyter_lab_config.py它就会生成JupyterLab的配置文件&#xff08;如果之前有这个文件的话…

(笔记五)利用opencv进行图像几何转换

参考网站&#xff1a;https://docs.opencv.org/4.1.1/da/d6e/tutorial_py_geometric_transformations.html &#xff08;1&#xff09;读取原始图像和标记图像 import cv2 as cv import numpy as np from matplotlib import pyplot as pltpath r"D:\data\flower.jpg&qu…

【数据结构】 二叉树面试题讲解->叁

文章目录 &#x1f30f;引言&#x1f332;[根据二叉树创建字符串](https://leetcode.cn/problems/construct-string-from-binary-tree/submissions/)&#x1f431;‍&#x1f464;题目描述&#xff1a;&#x1f431;‍&#x1f409;示例&#xff1a;&#x1f4cc;示例一&#x…

Flutter小功能实现-咖啡店

1 导航栏实现 效果图&#xff1a; 1.Package google_nav_bar: ^5.0.6 使用文档&#xff1a; google_nav_bar | Flutter Package 2.Code //MyBottomNavBar class MyBottomNavBar extends StatelessWidget {void Function(int)? onTabChange;MyBottomNavBar({super.key, …

iOS swift5 扫描二维码

文章目录 1.生成二维码图片2.扫描二维码&#xff08;含上下扫描动画&#xff09;2.1 记得在info.plist中添加相机权限描述 1.生成二维码图片 import UIKit import CoreImagefunc generateQRCode(from string: String) -> UIImage? {let data string.data(using: String.En…

若依 vue中el-radio无法默认选中

网上看了很多方法都不管用, 即便是element官方示例方法也不行 解决方法: html <el-form-item label"是否公开" prop"isOpen"><el-radio-group v-model"form.isOpen"><el-radio :label"0">不公开</el-radio>…