写点什么

使用 Amazon SageMaker 与 Amazon ES 构建一款视觉搜索应用程序

  • 2020-09-03
  • 本文字数:6762 字

    阅读完需:约 22 分钟

使用 Amazon SageMaker 与 Amazon ES 构建一款视觉搜索应用程序

AI 大模型超全落地场景&金融应用实践,8 月 16 - 19 日 FCon x AICon 大会联诀来袭、干货翻倍!

Original URL:https://aws.amazon.com/cn/blogs/machine-learning/building-a-visual-search-application-with-amazon-sagemaker-and-amazon-es/


有时候,我们可能很难找到合适的词汇来描述自己想要寻找的东西。正如俗语所言,“一图抵千言。”一般来说,展示真实示例或者图像,对于目标的表达效果确实要比纯文字描述好上不少。这一点,在使用搜索引擎查找所需内容时显得尤其突出。


在本文中,我们将在一个小时的演练中从零开始构建一款视觉图像搜索应用程序,其中包含用于提供视觉搜索结果的全栈 Web 应用程序。


视觉搜索能够提高客户在零售业务与电子商务中的参与度,这种功能对于时尚及家庭装饰零售商而言尤其重要。视觉搜索允许零售商向购物者推荐与主题或特定造型相关的商品,这是传统纯文本查询所无法做到的。根据 Gartner 公司的报告,“到 2021 年,重新设计网站以支持视觉及语音搜索的早期采用者品牌,将推动数字商务收入增长 30%。”

视觉搜索的高级示例

Amazon SageMaker 是一项全托管服务,可为每位开发人员及数据科学家提供快速构建、训练以及部署机器学习(ML)模型的能力。Amazon Elasticsearch Service (Amazon ES)同样为全托管服务,可帮助您轻松以符合成本效益的方式大规模部署、保护并运行 Elasticsearch。Amazon ES 还提供 k 最近邻(KNN)搜索,能够在相似性用例中增强搜索能力,适用范围涵盖产品推荐、欺诈检测以及图像、视频与语义文档检索。KNN 使用轻量化且效率极高的非度量空间库(NMSLIB)构建而成,可在数千个维度上对数十亿个文档进行大规模、低延迟最近邻搜索,且实现难度与常规 Elasticsearch 查询完全一致。


下图所示,为这套视觉搜索架构的基本形式。


解决方案概述

视觉搜索架构的实现分为两个阶段:


  • 通过示例图像数据集在 Amazon ES 上构建参考 KNN 索引。

  • 向 Amazon SageMaker 端点提交一份新图像,并由 Amazon ES 返回相似图像。

创建 KNN 推理索引

在此步骤中,托管在 Amazon SageMaker 当中、且经过预先训练的 Resnet50 模型将从每幅图像中提取 2048 个特征向量。每个向量都被存储在 Amazon ES 域的 KNN 索引当中。在本用例中,我们将使用来自 FEIDEGGER 的图像——FEIDEGGER 是一套 Zalando 研究数据集,其中包含 8732 张高分辨率时尚图像。以下截屏所示,为 KNN 索引的创建工作流程。



整个流程包含以下操作步骤:


  • 用户与 Amazon SageMaker noteoobk 实例上的 Jupyter notebook 进行交互。

  • 从 Keras 处下载经过预先训练的 Resnet50 深层神经网络,删除最后一个分类器层,并对新的模型工件进行序列化,而后存储在Amazon Simple Storage Service (Amazon S3)当中。该模型负责在 Amazon SageMaker 实时端点上启动 TensorFlow Serving API。

  • 将时尚图像推送至端点,端点通过神经网络运行图像以提取其中的特征(或称嵌入)。

  • Notebook 代码将图像嵌入写入至 Amazon ES 域中的 KNN 索引。

通过查询图像进行视觉搜索

在此步骤中,我们提供来自应用程序的查询图像,该图像通过 Amazon SageMaker 托管模型进行传递,并在期间提取 2048 项特征。您可以使用这些特征来查询 Amazon ES 中的 KNN 索引。Amazon ES 的 KNN 将帮助您在向量空间中搜索各点,并根据欧几里德距离或余弦相似度(默认值为欧几里德距离)找到这些点的“最近邻”。在找到给定图像的最近邻向量(例如 k=3 最近邻)时,它会将与之关联的 Amazon S3 图像返回至应用程序。下图所示,为视觉搜索全栈应用程序的基本架构。



整个流程包含以下操作步骤:


  • 终端用户通过自己的浏览器或移动设备访问 Web 应用程序。


  • 用户上传的图像以 base64 编码字符串的形式被发送至Amazon API GatewayAWS Lambda,并在 Lambda 函数中重新编码为字节形式。


  • 在该函数中,公开可读的图像 URL 以字符串形式传递,并可下载为字节形式。


  • 各字节作为载荷被发送至 Amazon SageMaker 实时端点,而后由模型返回图像嵌入的向量。


  • 该函数将搜索查询中的图像嵌入向量传递至 Amazon ES 域内索引中的 k 近邻,而后返回一份包含 k 相似图像及其对应 Amazon S3 URI 的列表。


  • 该函数生成经过预签名的 Amazon S3 URL 并返回至客户端 Web 应用程序,此 URL 用于在浏览器中显示相似图像。


  • 相关AWS服务



  • 要构建这样一款端到端应用程序,大家需要使用以下 AWS 服务:


  • AWS AmplifyAWS Amplify 是一套面向前端与移动开发人员的 JavaScript 库,用于构建云应用程序。关于更多详细信息,请参阅GitHub repo


  • Amazon API Gateway – 一项全托管服务,用于以任意规模创建、发布、维护、监控以及保护 API。


  • AWS CloudFormationAWS CloudFormation 为开发人员及企业提供一种简便易行的方法,借此创建各 AWS 与相关第三方资源的集合,并以有序且可预测的方式进行配置。


  • Amazon ES – 一项托管服务,能够帮助用户以任意规模轻松部署、运营以及扩展 Elasticsearch 集群。


  • AWS IAM – AWS 身份与访问管理(AWS Identity and Access Management,简称 IAM) 帮助用户安全地管理指向各 AWS 服务与资源的访问操作。


  • AWS Lambda – 一套事件驱动型、无服务器计算平台,可运行代码以响应事件,并自动管理代码所需的各项计算资源。


  • Amazon SageMaker – 一套全托管端到端机器学习平台,用于以任意规模构建、训练、调优以及部署机器学习模型。


  • AWS SAMAWS Serverless Application Model (AWS SAM)是一套开源框架,用于构建无服务器应用程序。


  • Amazon S3 – 一项对象存储服务,可提供具备极高持久性、可用性、成本极低且可无限扩展的数据存储基础设施。


  • 先决条件



  • 在本次演练中,您需要准备一个具有适当 IAM 权限的 AWS 账户,用于启动 CloudFormation 模板。


  • 部署您的解决方案



  • 在解决方案的部署方面,我们需要使用 CloudFormation 栈。请准备栈创建所涉及的一切必要资源,具体包括:


  • 一个 Amazon SageMaker notebook 实例,用于在 Jupyter notebook 中运行 Python 代码。


  • 一个与该 notebook 实例相关联的 IAM 角色。


  • 一个 Amazon ES 域,用于将图像嵌入向量存储在 KNN 索引内并进行检索。


  • 两个 S3 存储桶:其一用于存储源时尚图像,其二用于托管静态网站。


  • 在 Jupyter notebook 中,我们还需要部署以下几项:


  • Amazon SageMaker 端点,用于实时获取图像特征向量与嵌入。


  • 一套 AWS SAM 模板,用于通过 API Gateway 与 Lambda 建立一套无服务器后端。


  • 一个托管在 S3 存储桶上的静态前端网站,用于呈现端到端机器学习应用程序的使用界面。前端代码使用 ReactJS 与 Amplify JavaScript 库。


  • 首先,请完成以下操作步骤:


  • 使用您的 IAM 用户名与密码登录至 Amazon 管理控制台。


  • 选择 Launch Stack 并在新选项卡中将其打开:




  • Quick create stack 页面中,勾选复选框以确认创建 IAM 资源。


  • 选择 Create stack




  • 等待栈执行完成。


  • 大家可以在 Events 选项卡中的栈创建进度中查看各种事件。栈创建完成之后,您将看到状态转为 CREATE_COMPLETE。


  • 在 CloudFormation 模板创建完成后,您可以在 Resources 选项卡中看到所有资源。


  • 在 Outputs 选项卡中,选择 SageMakerNotebookURL 值。


  • 此超链接将在您的 Amazon SageMaker notebook 实例上打开 Jupyter notebook,供您用于完成选项卡中的其余部分。




  • 这时,您应该已经处于 Jupyter notebook 的登录页面中。


  • 选择 visual-image-search.ipynb




  • 在Amazon ES上构建KNN索引



  • 在此步骤中,我们应该在 notebook 开头的 Visual image search 标题位置。遵循 notebook 中的步骤并按次序运行各单元。


  • 这里,我们使用托管在 Amazon SageMaker 端点上的预训练 Resnet50 模型生成图像特征向量(嵌入)。嵌入将被保存在 CloudFormation 栈所创建的 Amazon ES 域中。关于更多详细信息,请参阅 notebook 中的 markdown 单元。


  • 找到 notebook 当中的 Deploying a full-stack visual search application单元。


  • 该 notebook 中包含多个重要单元。


  • 要加载预训练 ResNet50 模型,同时剔除最终 CNN 分类器层,请使用以下代码(此模型仅作为图像特征提取器使用):


  • 我们将模型另存为 TensorFlow SavedModel格式,其中包含完整的 TensorFlow 程序,包括权重与计算。详见以下代码:


  • 将模型工件(model.tar.gz)上传至 Amazon S3,具体代码如下:


  • 您可以使用 Amazon SageMaker Python SDK 将模型部署至基于 Amazon SageMaker TensorFlow Serving 的服务器当中。此服务器负责提供TensorFlow Serving REST API中的一套超集,详见以下代码:


  • 使用以下代码从 Amazon SageMaker 端点处提取参考图像特征:


  • 使用以下代码定义Amazon ES KNN索引映射:


  • 使用以下代码将图像特征向量与关联的 Amazon S3 图像 URI 导入至 Amazon ES KNN 索引:


  • 构建一款全栈视觉搜索应用程序



  • 现在,我们已经拥有了一个能够正常工作的 Amazon SageMaker 端点,并可以在 Amazon ES 上提取图像特征与 KNN 索引,接下来应该构建一款实际可用的全栈 ML 支持型 Web 应用程序了。我们使用 AWS SAM 模板通过 API Gateway 与 Lambda 部署无服务器 REST API。该 REST API 负责接收新图像、生成嵌入,并将得到的相似图像返回至客户端。接下来,我们将与新 REST API 交互的前端网站上传至 Amazon S3。前端代码使用 Amplify 与我们的 REST API 相集成。


  • 在以下单元中,预填充一套 CloudFormation 模板。此模板负责为全栈应用程序创建 API Gateway 与 Lambda 等必要资源:


  • 以下截屏所示,为预生成的 CloudFormation 模板链接。




  • 选择该链接。


  • 这时我们会跳转至 Quick create stack 页面


  • 选择复选框以确认创建 IAM 资源、各 IAM 资源自定义名称以及 CAPABILITY_AUTO_EXPAND


  • 选择 Create stack




  • 栈创建完成之后,我们会看到状态转为CREATE_COMPLETE。您可以在 Resources 选项卡中查看 CloudFormation 模板创建完成的全部资源。


  • 在栈创建完成之后,继续按后续单元执行。


  • 以下单元显示,我们的全栈应用程序(包括前端与后端代码)已经成功部署:


  • 以下截屏所示,为 URL 的输出结果。




  • 选择该链接。


  • 这时我们将跳转至应用程序页面,并可以在这里上传服饰图像服饰 URL 链接,借此获取相似服饰推荐。




  • 在完成对视觉搜索应用程序的测试与试验之后,请运行 notebook 下方的最后两个单元:


  • 这些单元会终止您的 Amazon SageMaker 端点并清空 S3 存储桶,为资源清理步骤做好准备。


  • 资源清理



  • 要删除其余 AWS 资源,请转至 AWS CloudFormation 控制台并删除其中的vis-search-apivis-search栈。




  • 总结



  • 在本文中,我们介绍了如何使用 Amazon SageMaker 与 Amazon ES KNN 索引创建基于机器学习的视觉搜索应用程序。我们还使用到在 ImageNet 数据集上经过预训练的 ResNet50 模型。当然,大家也可以使用其他预训练模型,例如 VGG、Inception 以及 MobileNet 等,并使用自己的数据集进行调优。


  • 对于大部分深度学习类用例,我们建议您使用 GPU 实例。在 GPU 实例上训练新模型,将带来远超 CPU 实例的训练速度。如果您拥有多个 GPU 实例,或者需要在多个 GPU 实例之间使用分布式训练,则可以进行次线性扩展。本用例中仅使用 CPU 实例,因此您可以在AWS Free Tier中通过免费资源完成演练。


  • 关于本文所使用代码示例的更多详细信息,请参阅GitHub repo。关于 Amazon ES 的更多详细信息,请参考以下扩展资源:


  • 如何提高 Elasticsearch集群上的索引性能?


  • Amazon Elasticseach Service最佳实践


  • 降低小型Amazon Elasticsearch Service域的使用成本


  • 作者介绍


  • Amit Mukherjee


  • AWS 公司高级合作伙伴解决方案架构师。他为各合作伙伴提供架构指导以帮助其在云端获得业务成功。他对 AI 及机器学习领域抱有浓厚兴趣。在业余时间,他喜欢与家人共度美好时光。


  • Laith Al-Saadoon


  • AWS 公司数据分析方向高级解决方案架构师。他长期专注于帮助客户设计规模化大数据处理架构。在业余时间,他一直在关注机器学习与人工智能技术的最新动向。


  • 本文转载自亚马逊 AWS 官方博客


  • 原文链接


  • 使用 Amazon SageMaker 与 Amazon ES 构建一款视觉搜索应用程序


  • 公众号推荐:

    AIGC 技术正以惊人的速度重塑着创新的边界,InfoQ 首期《大模型领航者AIGC实践案例集锦》电子书,深度对话 30 位国内顶尖大模型专家,洞悉大模型技术前沿与未来趋势,精选 10 余个行业一线实践案例,全面展示大模型在多个垂直行业的应用成果,同时,揭秘全球热门大模型效果,为创业者、开发者提供决策支持和选型参考。关注「AI前线」,回复「领航者」免费获取电子书。

    2020-09-03 14:071456

    评论

    发布
    暂无评论
    发现更多内容

    聚道云软件连接器助力某贸易公司实现付款流程自动化

    聚道云软件连接器

    案例分享

    MATLAB R2021b for mac(可视化数学分析软件) v9.11.0.1873467永久激活版

    mac

    苹果mac Windows软件 MATLAB R2021b 商业数学软件

    简便实用:在 ASP.NET Core 中实现 PDF 的加载与显示

    快乐非自愿限量之名

    一站式低代码开发平台JNPF初探

    这我可不懂

    软件开发 低代码 JNPF

    @PolarDB,你的动手体验搭子,来啦

    阿里云瑶池数据库

    数据库 阿里云 云原生

    从规则到神经网络:机器翻译技术的演化之路

    不在线第一只蜗牛

    神经网络 架构 机器翻译

    助力企业出海,Ogcloud提供一站式网络解决方案

    Ogcloud

    网络 网络加速 组网

    聚道云软件连接器助力某餐饮管理有限公司实现人力资源信息自动化

    聚道云软件连接器

    案例分享

    软件测试开发/全日制/测试管理丨App测试项目流程

    测试人

    软件测试

    10年工作经验老程序员推荐的7个开发类工具

    EquatorCoco

    程序员 开发工具

    JDK安装与配置教程来啦

    小魏写代码

    2024 年 Linux 和开源的六大趋势预测

    高端章鱼哥

    Linux 开源

    TDengine 被 Frost & Sullivan 评为全球最佳工业数据管理解决方案

    TDengine

    tdengine 时序数据库

    大语言模型训练数据常见的4种处理方法

    不在线第一只蜗牛

    软件测试开发/全日制/测试管理丨Web 兼容性测试

    测试人

    软件测试 测试开发

    软件测试开发/全日制/测试管理丨App移动测试体系

    测试人

    软件测试

    如何降低API接口的使用成本和提高效率?

    技术冰糖葫芦

    体育赛事直播系统源码,自主研发一手源码的重要性

    软件开发-梦幻运营部

    淘宝/天猫商品详情实时数据API技术实现

    Noah

    低代码通过图形化编程,快速构建应用程序

    高端章鱼哥

    低代码 可视化开发 JNPF 软件开卡

    实现数据一体化的有效措施

    RestCloud

    ETL 数据一体化

    苹果mac电脑 Photoshop 2024中文完美激活版

    影影绰绰一往直前

    如何在iOS手机上查看应用日志

    Geek_66e2f3

    如何在企业中实施自适应人工智能?

    这我可不懂

    人工智能 AI

    加密钱包监控:守护企业资产与信誉的利器

    Footprint Analytics

    区块链 加密钱包

    面向设计师的11个必备AI工具

    互联网工科生

    人工智能 AI

    精彩回顾 | 《国产数据库共话未来趋势》技术沙龙上海站成功举办!

    阿里云数据库开源

    数据库 阿里云 数据管理 国产数据库 polarDB

    提升测试自动化:ForEach 循环在API测试中的高级策略

    Apifox

    测试 自动化测试 foreach Apifox 测试工具

    Zoho 2023:种长期主义的因,越经济下行的谷

    ToB行业头条

    高防服务器、高防IP和高防CDN之间有什么区别?

    Finovy Cloud

    网络安全 网络攻击防御 高防主机 高防IP 高防IP服务

    【教程】代码混淆详解

    雪奈椰子

    使用 Amazon SageMaker 与 Amazon ES 构建一款视觉搜索应用程序_AI&大模型_亚马逊 AWS 官方博客_InfoQ精选文章