Press "Enter" to skip to content

使用亚马逊Rekognition、亚马逊SageMaker基础模型和亚马逊OpenSearch服务进行文章的语义图像搜索

数字出版商不断寻求简化和自动化媒体工作流程的方法,以尽快生成和发布新内容。

出版商可能拥有包含数百万张图片的库,为了节省成本,他们需要能够在文章中重复使用这些图片。在这种规模的库中找到与文章最匹配的图片可能是一项费时、重复且需要手动操作的任务,但可以通过自动化来完成。这还依赖于库中的图片被正确标记,这也可以通过自动化来实现(有关客户成功案例,请参阅 Aller Media Finds Success with KeyCore and AWS)。

在本文中,我们将演示如何使用Amazon Rekognition、Amazon SageMaker JumpStart和Amazon OpenSearch Service来解决这个业务问题。Amazon Rekognition使您能够在应用程序中轻松添加图像分析功能,无需任何机器学习(ML)专业知识,并提供各种API来满足诸如对象检测、内容审核、人脸检测和分析、文本和名人识别等用例,我们在本示例中使用了这些功能。SageMaker JumpStart是一个低代码服务,提供了预构建的解决方案、示例笔记本和许多来自公开可用源的最先进的预训练模型,只需单击一次即可部署到您的AWS账户中。这些模型已经打包成安全且易于部署的Amazon SageMaker API。新的SageMaker JumpStart Foundation Hub使您能够轻松部署大型语言模型(LLM)并将其与您的应用程序集成。OpenSearch Service是一个完全托管的服务,可以简化OpenSearch的部署、扩展和运维。OpenSearch Service允许您将向量和其他数据类型存储在索引中,并提供丰富的功能,可以使用向量搜索文档并测量语义相关性,我们在本文中使用了这些功能。

本文的最终目标是展示如何展示一组与某些文本(例如文章或电视剧简介)在语义上相似的图片。

以下截图显示了一个示例,使用一个小型文章作为搜索输入,而不是使用关键词,可以显示语义上相似的图片。使用亚马逊Rekognition、亚马逊SageMaker基础模型和亚马逊OpenSearch服务进行文章的语义图像搜索 四海 第1张

解决方案概述

此解决方案分为两个主要部分。首先,使用Amazon Rekognition从图像中提取标签和名人元数据。然后,使用LLM生成元数据的嵌入。将名人姓名和元数据的嵌入存储在OpenSearch Service中。在第二个主要部分中,您可以使用OpenSearch的智能搜索能力查询OpenSearch Service索引中的图像,以找到与您的文本在语义上相似的图像。

此解决方案使用我们的事件驱动服务Amazon EventBridge、AWS Step Functions和AWS Lambda来协调使用Amazon Rekognition从图像中提取元数据的过程。Amazon Rekognition将执行两个API调用,提取标签和已知名人的信息。

Amazon Rekognition名人检测API在响应中返回多个元素。在本文中,您使用以下元素:

  • Name、Id和Urls – 名人姓名、唯一的Amazon Rekognition ID以及一些URL,例如名人的IMDb或维基百科链接,可用于获取更多信息。
  • MatchConfidence – 匹配置信度分数,可用于控制API行为。我们建议在应用程序中对此分数应用适当的阈值,以选择您首选的操作点。例如,通过设置99%的阈值,您可以排除更多的误报,但可能会错过一些潜在的匹配。

在您的第二个API调用中,Amazon Rekognition标签检测API在响应中返回多个元素。您使用以下元素:

  • Name – 检测到的标签名称
  • Confidence – 分配给检测到的对象的标签的置信水平

语义搜索中的一个关键概念是嵌入。词嵌入是一个词或一组词的数值表示,以向量的形式表示。当您有许多向量时,您可以测量它们之间的距离,距离接近的向量在语义上是相似的。因此,如果您生成所有图片元数据的嵌入,然后使用同一模型生成您的文本的嵌入,例如文章或电视剧简介,您可以找到与给定文本在语义上相似的图片。

在SageMaker JumpStart中有很多可用的模型来生成嵌入向量。对于这个解决方案,您使用了Hugging Face的GPT-J 6B Embedding模型。它生成高质量的嵌入向量,并且根据Hugging Face的评估结果,其性能指标排名前列。Amazon Bedrock是另一个选项,目前还在预览阶段,您可以选择Amazon Titan Text Embeddings模型来生成嵌入向量。

您使用SageMaker JumpStart中的GPT-J预训练模型来创建图像元数据的嵌入向量,并将其存储为k-NN向量,同时将名人名称存储在另一个字段中。

解决方案的第二部分是向用户返回与其文本语义相似的前10张图像,无论是文章还是电视剧简介,包括任何出现的名人。在选择一张与文章相关的图片时,您希望图片能与文章的要点产生共鸣。SageMaker JumpStart托管了许多摘要模型,可以将一篇长篇文章缩减为原始文章的主要要点。对于摘要模型,您使用了AI21 Labs Summarize模型。该模型可以提供高质量的新闻文章摘要,源文本的长度可以达到大约10,000个单词,这使得用户可以一次性地对整篇文章进行摘要。

您使用Amazon Comprehend来检测文本中是否包含任何名称,可能是已知的名人。Amazon Comprehend可以从文本字符串中提取关键实体。然后,您按照人物实体进行过滤,将其用作输入搜索参数。

然后,您获取摘要文章并生成一个嵌入向量,作为另一个输入搜索参数。重要的是要注意,您使用相同的模型部署在相同的基础设施上,来生成文章的嵌入向量,就像您为图像所做的那样。然后,您使用带有评分脚本的Exact k-NN,以便可以通过两个字段进行搜索:名人名称和捕捉文章语义信息的向量。关于Score脚本的可扩展性以及在大型索引上使用此方法可能导致高延迟的问题,请参考此帖子:Amazon OpenSearch Service的向量数据库功能解释。

解决方案架构

下图说明了解决方案的架构。

使用亚马逊Rekognition、亚马逊SageMaker基础模型和亚马逊OpenSearch服务进行文章的语义图像搜索 四海 第2张

按照编号进行解释:

  1. 您将图像上传到Amazon S3存储桶中
  2. Amazon EventBridge监听此事件,然后触发AWS Step Functions执行
  3. Step Functions接收图像输入,提取标签和名人元数据
  4. AWS Lambda函数接收图像元数据并生成嵌入向量
  5. 然后,Lambda函数将名人姓名(如果有)和嵌入向量作为k-NN向量插入到OpenSearch Service索引中
  6. Amazon S3托管了一个简单的静态网站,由Amazon CloudFront分发。前端用户界面(UI)允许您使用Amazon Cognito进行身份验证以搜索图像
  7. 您通过UI提交一篇文章或一些文本
  8. 另一个Lambda函数调用Amazon Comprehend来检测文本中的任何名称
  9. 该函数然后对文本进行摘要,以获取文章的要点
  10. 该函数生成摘要文章的嵌入向量
  11. 然后,该函数使用余弦相似度搜索OpenSearch Service图像索引,以查找与名人名称匹配的图像以及向量的k个最近邻
  12. Amazon CloudWatchAWS X-Ray使您能够观察端到端的工作流程,以便在出现任何问题时进行提醒。

提取并存储关键图像元数据

Amazon Rekognition的DetectLabels和RecognizeCelebrities API提供了图像的元数据,包括您可以用来生成嵌入向量的文本标签。文章提供了一个您可以用来生成嵌入向量的文本输入。

生成并存储词嵌入向量

下图演示了将图像的向量绘制在二维空间中,为了帮助可视化,我们根据其主要类别对嵌入向量进行了分类。

使用亚马逊Rekognition、亚马逊SageMaker基础模型和亚马逊OpenSearch服务进行文章的语义图像搜索 四海 第3张

您还可以生成这篇新写的文章的嵌入,以便您可以在此向量空间中搜索与文章最接近的图像。使用k最近邻(k-NN)算法,您可以定义要在结果中返回多少个图像。

放大到前面的图中,向量是根据与文章的距离进行排序的,然后返回K个最近的图像,其中K在此示例中为10。

使用亚马逊Rekognition、亚马逊SageMaker基础模型和亚马逊OpenSearch服务进行文章的语义图像搜索 四海 第4张

OpenSearch Service提供了将大型向量存储在索引中的能力,并且还提供了使用k-NN对索引运行查询的功能,以便您可以使用各种测量方法查询向量以返回距离接近的k个最近文档。对于此示例,我们使用余弦相似度。

检测文章中的名称

您使用Amazon Comprehend,一种AI自然语言处理(NLP)服务,从文章中提取关键实体。在此示例中,您使用Amazon Comprehend提取实体并按实体Person进行过滤,这将返回Amazon Comprehend在新闻报道中找到的任何名称,只需几行代码:

def get_celebrities(payload):
    response = comprehend_client.detect_entities(
        Text=' '.join(payload["text_inputs"]),
        LanguageCode="en",
    )
    celebrities = ""
    for entity in response["Entities"]:
        if entity["Type"] == "PERSON":
            celebrities += entity["Text"] + " "
    return celebrities

在此示例中,您将图像上传到Amazon Simple Storage Service(Amazon S3),这将触发一个工作流程,您可以从图像中提取包括标签和任何名人在内的元数据。然后,您将这些提取的元数据转换为嵌入,并将所有这些数据存储在OpenSearch Service中。

总结文章并生成嵌入

总结文章是一个重要的步骤,以确保词嵌入能够捕捉文章的要点,从而返回与文章主题相关的图像。

AI21 Labs Summarize模型非常简单易用,无需任何提示,只需几行代码:

def summarise_article(payload):
    sagemaker_endpoint_summarise = os.environ["SAGEMAKER_ENDPOINT_SUMMARIZE"]
    response = ai21.Summarize.execute(
        source=payload,
        sourceType="TEXT",
        destination=ai21.SageMakerDestination(sagemaker_endpoint_summarise)
    )
    response_summary = response.summary 
    return response_summary

然后,您使用GPT-J模型生成嵌入

def get_vector(payload_summary):
    sagemaker_endpoint = os.environ["SAGEMAKER_ENDPOINT_VECTOR"]
    response = sm_runtime_client.invoke_endpoint(
        EndpointName=sagemaker_endpoint,
        ContentType="application/json",
        Body=json.dumps(payload_summary).encode("utf-8"),
    )
    response_body = json.loads((response["Body"].read()))
    return response_body["embedding"][0]

然后,您在OpenSearch Service中搜索您的图像

以下是该查询的示例片段:

def search_document_celeb_context(person_names, vector):
    results = wr.opensearch.search(
        client=os_client,
        index="images",
        search_body={
            "size": 10,
            "query": {
                "script_score": {
                    "query": {
                        "match": {"celebrities": person_names }
                    },
                    "script": {
                        "lang": "knn",
                        "source": "knn_score",
                        "params": {
                            "field": "image_vector",
                            "query_value": vector,
                            "space_type": "cosinesimil"
                        }
                    }
                }
            }
        },
    )
    return results.drop(columns=["image_vector"]).to_dict()

该架构包含一个简单的Web应用程序,用于表示内容管理系统(CMS)。

对于一个示例文章,我们使用了以下输入:

“Werner Vogels喜欢驾驶他的丰田汽车周游世界。我们看到他驾车去各个客户的家乡会面,在许多场景中出现了他的丰田汽车。”

使用亚马逊Rekognition、亚马逊SageMaker基础模型和亚马逊OpenSearch服务进行文章的语义图像搜索 四海 第5张

这些图片中没有任何带有“丰田”一词的元数据,但是“丰田”一词的语义与汽车和驾驶是同义的。因此,通过这个例子,我们可以演示如何超越关键字搜索并返回语义上相似的图片。在上面的用户界面截图中,图像下方的标题显示了Amazon Rekognition提取的元数据。

您可以将此解决方案包含在一个更大的工作流程中,其中您可以使用已经从图像中提取的元数据与其他关键词(例如名人姓名)一起使用向量搜索,以返回最符合您搜索查询的图片和文档。

结论

在本文中,我们展示了如何使用Amazon Rekognition、Amazon Comprehend、SageMaker和OpenSearch Service从图像中提取元数据,然后使用机器学习技术自动发现这些元数据,包括名人和语义搜索。这在出版行业尤为重要,因为在快速发布新鲜内容并将其发布到多个平台上速度至关重要。

有关使用媒体资产的更多信息,请参阅《媒体智能化——借助Media2Cloud 3.0变得更智能》。

Leave a Reply

Your email address will not be published. Required fields are marked *