有时候,我们可能很难找到合适的词汇来描述自己想要寻找的东西。正如俗语所言,“一图抵千言。”一般来说,展示真实示例或者图像,对于目标的表达效果确实要比纯文字描述好上不少。这一点,在使用搜索引擎查找所需内容时显得尤其突出。
在本文中,我们将在一个小时的演练中从零开始构建一款视觉图像搜索应用程序,其中包含用于提供视觉搜索结果的全栈 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 Gateway 与 AWS Lambda,并在 Lambda 函数中重新编码为字节形式。
在该函数中,公开可读的图像 URL 以字符串形式传递,并可下载为字节形式。
各字节作为载荷被发送至 Amazon SageMaker 实时端点,而后由模型返回图像嵌入的向量。
该函数将搜索查询中的图像嵌入向量传递至 Amazon ES 域内索引中的 k 近邻,而后返回一份包含 k 相似图像及其对应 Amazon S3 URI 的列表。
该函数生成经过预签名的 Amazon S3 URL 并返回至客户端 Web 应用程序,此 URL 用于在浏览器中显示相似图像。
相关AWS服务
要构建这样一款端到端应用程序,大家需要使用以下 AWS 服务:
AWS Amplify – AWS Amplify 是一套面向前端与移动开发人员的 JavaScript 库,用于构建云应用程序。关于更多详细信息,请参阅GitHub repo。
Amazon API Gateway – 一项全托管服务,用于以任意规模创建、发布、维护、监控以及保护 API。
AWS CloudFormation – AWS CloudFormation 为开发人员及企业提供一种简便易行的方法,借此创建各 AWS 与相关第三方资源的集合,并以有序且可预测的方式进行配置。
Amazon ES – 一项托管服务,能够帮助用户以任意规模轻松部署、运营以及扩展 Elasticsearch 集群。
AWS IAM – AWS 身份与访问管理(AWS Identity and Access Management,简称 IAM) 帮助用户安全地管理指向各 AWS 服务与资源的访问操作。
AWS Lambda – 一套事件驱动型、无服务器计算平台,可运行代码以响应事件,并自动管理代码所需的各项计算资源。
Amazon SageMaker – 一套全托管端到端机器学习平台,用于以任意规模构建、训练、调优以及部署机器学习模型。
AWS SAM – AWS 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-api
与 vis-search
栈。
总结
在本文中,我们介绍了如何使用 Amazon SageMaker 与 Amazon ES KNN 索引创建基于机器学习的视觉搜索应用程序。我们还使用到在 ImageNet 数据集上经过预训练的 ResNet50 模型。当然,大家也可以使用其他预训练模型,例如 VGG、Inception 以及 MobileNet 等,并使用自己的数据集进行调优。
对于大部分深度学习类用例,我们建议您使用 GPU 实例。在 GPU 实例上训练新模型,将带来远超 CPU 实例的训练速度。如果您拥有多个 GPU 实例,或者需要在多个 GPU 实例之间使用分布式训练,则可以进行次线性扩展。本用例中仅使用 CPU 实例,因此您可以在AWS Free Tier中通过免费资源完成演练。
关于本文所使用代码示例的更多详细信息,请参阅GitHub repo。关于 Amazon ES 的更多详细信息,请参考以下扩展资源:
作者介绍:
AWS 公司高级合作伙伴解决方案架构师。他为各合作伙伴提供架构指导以帮助其在云端获得业务成功。他对 AI 及机器学习领域抱有浓厚兴趣。在业余时间,他喜欢与家人共度美好时光。
AWS 公司数据分析方向高级解决方案架构师。他长期专注于帮助客户设计规模化大数据处理架构。在业余时间,他一直在关注机器学习与人工智能技术的最新动向。
本文转载自亚马逊 AWS 官方博客
原文链接:
评论